目录

一、理论

1.1 概述

1.2 词频 TF

1.3 逆文档频率 IDF

1.4 词频-逆文档频率 TF-IDF

1.5 特点

1.6 改进方法 TF-IWF (Term Frequency-Inverse Word Frequency​​​​​​)

二、实现


一、理论

1.1 概述

TF-IDF (Term Frequency - Inverse Document Frequency) 词频-逆文档频率

是一种针对 关键词 的统计分析方法,涉及数据挖掘、文本处理、信息检索等多个领域。其中,TF 表示 词频 (Term Frequency)IDF 表示 逆文档频率 (Inverse Document Frequency)

TF-IDF作用:评估某个 词 (Term) 对一个 文档集 / 语料库 (包含了若干文档) 中的某篇 文章 / 文档 (Document) 的重要程度。

TF-IDF 的 核心思想:一个词的重要程度,与其在某篇文档中出现的次数成正比,与带有该词的文档总数成反比。换言之,一个词在某篇文档中出现的次数越多 (频率越高),但在所有其他文档中出现的频率越低 (次数越少),则该词与该文档的相关性越强、越能代表/刻画该文档的主题、越能使文档具有区分度


1.2 词频 TF

TF-IDF 中的 TF 表示 词频 (Term Frequency),即 某个词在某篇文档中出现的总次数 (频数)。通常,需要对其进行归一化统一量纲 (词频 = 词频数 / 文档总词数),以避免词频因文档长度不同而产生偏差 (词频 因长文档具有的词数多就相对高、因短文档具有的词数少就相对低,将导致无法真正衡量词的重要性)。

设某个词 t 在文档 d 中出现的总次数为 N_{d, t},且文档 d 的总词数为 N_d,则词 t 相对于文档 d 的词频 TF 为:


1.3 逆文档频率 IDF

事实上,一些 高频出现的常见词 对与刻画主题可能并无太大贡献 (如 “的”、“了” 等停顿词(Stopwords) 没有实际意义但 IF 却很高),反倒是一些 低频出现的特定词 可能才能表达文档的主题 (如一些区别度高的专有名词、人物地点 IF 却很低),故 仅单纯使用 TF 并不恰当

为此,衡量一个词的重要性,应满足:一个词预测 / 刻画 / 代表主题的能力越强,则其权重越大;反之,权重越小。例如,在文档集/语料库中,若某些词只在很少的几篇文档中出现过,那么这样的词将被认为对刻画文档主题的作用很大,从而这些词应具有更大的权重。IDF 正是在完成这样的工作。

TF-IDF 中的 IDF 表示 逆文档频率 (Inverse Document Frequency),被用作 IF 的权重,其大小与一个词的常见程度成反比。

设某一文档集/语料库共有 M 篇文档,其中包含词 t 的文档数为 M_t,则词 t 的逆文档频率 IDF 为:

其中,分母部分加 1 避免除 M_t = 0,即预防没有文档包含词 t 的特殊情况。

可见,IDF 倾向于滤除常见的词,而保留重要的词。


1.4 词频-逆文档频率 TF-IDF

综上,词 t 的词频-逆文档频率 TF \raisebox{0mm}{-} IDF 为:

以使用 TF-IDF 提取关键词 为例,设某文包含 1000 个词。其中,“亚洲”、“网络”、“技术” 在该文中均出现 20 次,则三者对该文均有 TF = 0.02。然后,假设根据网页搜索统计得知,包含 “” 字的网页数共 250 亿,并将其设为 中文网页总数;同时,包含 “亚洲”、“网络”、“技术” 的中文网页数分别为 62.3 亿、0.484 亿、0.973 亿。那么,根据公式,三者的 IDF 及 TF-IDF 分别如下所示:

可见,TF-IDF 值中,“网络”,“技术” 次之,“亚洲” 最低 (若计算 “” 字的 TF-IDF 还将得到一个近似为 0 的值)。所以,若需要选择一个关键词代表/刻画/突出该文的主题,那么根据 TF-IDF 算法首选 “网络”。

此外,除了自动提取关键词,TF-IDF 算法还有许多应用。例如,信息检索时,对每个文档均可分别计算 一组搜索词 (如 “亚洲”、“网络”、“技术” ) 的 TF-IDF,然后将它们相加,得到 整篇文档的 TF-IDF。此时,该值最高的文档 将被视为 与搜索词相关性最高的文档。 或者,通过对文档 所有词 计算 TF-IDF,得到一种 词嵌入 (Word Embedding),使用 距离度量 (如余弦相似度) 衡量嵌入的相似度,从而根据相似度得分可得相似文档。以上即为 文本相似性度量 的简单例子。


1.5 特点

TF-IDF 的优点

  1. 容易理解,概念简单
  2. 实现便捷、快速
  3. 有一定实际效果,性价比高

TF-IDF 的缺点

  1. 用 TF 衡量词的重要性不够合理,例如,有时对主题刻画具有代表性的词,其在某篇文档的出现次数不多将导致 TF 低,但其重要性实际并不低 (如具有代表性但出现次数不多的专业名词、人物地点等,但可能通篇都围绕其阐述和解释);反之,许多如没有实际意义的语气词、助词 (停顿词) 却因出现次数多导致 IF 高 (一种解决方法:将停顿词排除在计算范围外,提高精确性)
  2. 用 IDF 衡量词的重要性不够合理,例如,有时对主题刻画不具有代表性的词,其在所有文档的出现频率较低将导致 IDF 高,但其重要性实际并不高 (如某些意义不大的生僻字词,却被误以为很重要);反之,某些因重要性高而被大量文档提及的词,却因出现频率高导致 IDF 低
  3. 忽略了词在同一类别中、不同类别间的分布情况,仅考虑了词与其出现的文档之间的关系,过于单纯简单
  4. 并未考虑词的语义信息,无法处理一词多义 / 一义多词等各种语义相关的复杂情况
  5. 无法体现词的位置信息,出现靠前和靠后的词很可能具有不同的重要性/区分度,不应等同视之 (一种解决方法:对全文首段和每段首句给予较大权重)

TF-IDF 的应用

  1. 搜索引擎检索
  2. 关键词提取
  3. 文本相似性度量
  4. 文本摘要提取

1.6 改进方法 TF-IWF (Term Frequency-Inverse Word Frequency​​​​​​)

已知,IDF 因结构简单,无法反映特征词的重要程度和分布情况,导致难以较好地实现对 TF 权值调整的功能。尤其是同类语料库中,弊端很大,一些同类文本的关键词往往会被掩盖,导致召回率不足。例如:某文档集/语料库中医学类文章偏多,设当前文档是一篇属于医学类的文章,那么医学类相关词的 IDF 将因整体出现频率高偏小,使提取文本关键词的召回率偏低。因此,研究者提出了改进的加权算法 TF−IWF (Term Frequency - Inverse Word Frequency)

一方面,设某个词 t 在文档 d 中出现的总次数为 N_{d, t},且文档 d 的总词数为 N_d,则词 t 相对于文档 d 的 TF 为:

另一方面,设某一文档集/语料库所有词的频数为 W_c,其中词 t 在文档集/语料库所有词中的频数为 W_{c, t},则词 t 相对于文档集/语料库的 IWF 为:

从而,词 t 相对于文档 d 的 TF \raisebox{0mm}{-} IWF 为:

可见,TF \raisebox{0mm}{-} IWF 这种加权方法 降低了文档集/语料库中同类文本对词权重的影响,更加精确地表达了词在待查文档中的重要程度

传统 TF \raisebox{0mm}{-} IDF 所求的权值一般很小,甚至接近于 0,精确度也不高,而 TF \raisebox{0mm}{-} IWF 的计算结果恰能解决权值过小的问题。


二、实现

在 sklearn 中,有两种方法进行 TF-IDF 预处理。

一是 先用 CountVectorizer 类向量化后,再调用 TfidfTransformer 类预处理,例如:

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer  # 自定义语料库 (4 个文档)
corpus = ["I come to China to travel", "This is a car polupar in China",          "I love tea and Apple",   "The work is to write some papers in science"] # 实例化 CountVectorizer 对象
vectorizer = CountVectorizer()# 实例化 TfidfTransformer 对象
transformer = TfidfTransformer()# 向量化 + TF-IDF 预处理
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))  # 输出各文档、各词的 TF-IDF
print(tfidf)
  (0, 4)   0.442462137895(0, 15)   0.697684463384(0, 3)    0.348842231692(0, 16)   0.442462137895(1, 3)    0.357455043342(1, 14)   0.453386397373(1, 6)    0.357455043342(1, 2)    0.453386397373(1, 9)    0.453386397373(1, 5)    0.357455043342(2, 7)    0.5(2, 12)  0.5(2, 0)   0.5(2, 1)   0.5(3, 15)  0.281131628441(3, 6)    0.281131628441(3, 5)    0.281131628441(3, 13)   0.356579823338(3, 17)   0.356579823338(3, 18)   0.356579823338(3, 11)   0.356579823338(3, 8)    0.356579823338(3, 10)   0.356579823338

二是直接用 TfidfVectorizer 完成向量化与 TF-IDF 预处理,例如:

from sklearn.feature_extraction.text import TfidfVectorizertfidfvec = TfidfVectorizer()
word_embedding = tfidfvec.fit_transform(corpus)
print word_embedding

最常用且推荐的是使用 TfidfVectorizer。更进一步地,展示 TfidfVectorizer 的更多细节:

from sklearn.feature_extraction.text import TfidfVectorizer# 另一个自定义语料库 (4 篇文档)
corpus = ['This is not the first document.','This document is not the second document.','And this is not the third one.','Is this the fourth document?',
]tfidf_vectorizer = TfidfVectorizer()
tfidf = tfidf_vectorizer.fit_transform(corpus)# 查看 TF-IDF 矩阵, 其中每个元组表示 (文档 index, TF-IDF 矩阵特征列 index), 浮点数表示 TF-IDF值
print(tfidf)
# 查看 特征词与 TF-IDF 矩阵的对应关系字典, 其中每对 key:value 表示 特征词:TF-IDF 矩阵特征列 index
print(tfidf_vectorizer.vocabulary_)
# 查看 特征词列表 (特征列)
print(tfidf_vectorizer.get_feature_names())
  (0, 1)   0.3934518068245154(0, 2)    0.6164182855290015(0, 8)    0.3216726331114366(0, 5)    0.3934518068245154(0, 4)    0.3216726331114366(0, 10)   0.3216726331114366(1, 7)    0.509382158560758(1, 1) 0.6502640669651994(1, 8)    0.26581674173343006(1, 5)   0.3251320334825997(1, 4)    0.26581674173343006(1, 10)  0.26581674173343006(2, 6)   0.4865407641485108(2, 9)    0.4865407641485108(2, 0)    0.4865407641485108(2, 8)    0.2538971545683301(2, 5)    0.3105526673072801(2, 4)    0.2538971545683301(2, 10)   0.2538971545683301(3, 3)    0.6704970632809761(3, 1)    0.4279695901493821(3, 8)    0.34989318276628206(3, 4)   0.34989318276628206(3, 10)  0.34989318276628206{'this': 10, 'is': 4, 'not': 5, 'the': 8, 'first': 2, 'document': 1, 'second': 7, 'and': 0, 'third': 9, 'one': 6, 'fourth': 3}['and', 'document', 'first', 'fourth', 'is', 'not', 'one', 'second', 'the', 'third', 'this']

其中,常用属性/方法有:

  • vocabulary_:特征词在 TD-IDF 中的位置关系,由上输出可见每个特征词和 TD-IDF 矩阵特征列的对应关系
  • stop_words:停用词集合,当为 'english' 时,ENGLISH_STOP_WORDS 中定义的词会被忽略;若为 list,list 中的词即为要忽略的词;
  • max_df: 设定当某词超过一个 df(document frequency) 上限时,就忽略该词;当为 0~1 的 float 时表示 df 的比例,当为 int 时表示 df 数量;
  • get_feature_names():返回特征词列表
  • fit:加载数据,并计算 TF-IDF 值;
  • transform:将数据转换为 Matrix 格式;
  • fit_transform:加载数据,并计算 TF-IDF 值,然后转换为 Matrix 格式,等价于 fit + trasform;

官方文档:sklearn.feature_extraction.text.TfidfVectorizer — scikit-learn 1.0.2 documentation


参考资料:

TF-IDF算法计算公式及含义_SEO技术

TF-IDF与余弦相似度 - 云+社区 - 腾讯云

tf-idf_百度百科

TF-IDF算法介绍及实现_Asia-Lee的博客-CSDN博客_tf-idf

https://blog.mokundong.cn/?p=29

TF-IDF算法原理及其使用详解 - 知乎

TF-IDF与余弦相似性的应用(一):自动提取关键词 - 阮一峰的网络日志

【机器学习】详解 TF-IDF 与 TF-IWF相关推荐

  1. 二分类最优阈值确定_机器学习 | 详解GBDT在分类场景中的应用原理与公式推导...

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第31篇文章,我们一起继续来聊聊GBDT模型. 在上一篇文章当中,我们学习了GBDT这个模型在回归问题当中的原理.GBD ...

  2. Tensorflow BatchNormalization详解:4_使用tf.nn.batch_normalization函数实现Batch Normalization操作...

    使用tf.nn.batch_normalization函数实现Batch Normalization操作 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 吴恩达deeplearnin ...

  3. 详解ROS中的TF使用

    个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-107.html 之前写过一篇博文<ROS-坐标转换> ...

  4. 强的离谱, Transformer 模型与联邦机器学习详解!

    Transformer 作为一种基于注意力的编码器 - 解码器架构,不仅彻底改变了自然语言处理(NLP)领域,还在计算机视觉(CV)领域做出了一些开创性的工作.与卷积神经网络(CNN)相比,视觉 Tr ...

  5. 机器学习--详解基于梯度下降的Logistic回归算法原理

    先给出Logistic回归的sigmod函数数学表达式: 很简单的表达式,再看看它的性质,当时,,因此 当时,,因此 Logistic回归之所以称为Logistic是因为只有两个状态即0和1,这也是数 ...

  6. 机器学习——详解KD-Tree原理

    今天是机器学习的第15篇文章,之前的文章当中讲了Kmeans的相关优化,还讲了大名鼎鼎的EM算法.有些小伙伴表示喜欢看这些硬核的,于是今天上点硬菜,我们来看一个机器学习领域经常用到的数据结构--KD- ...

  7. 机器学习--详解贝叶斯公式、朴素贝叶斯的来龙去脉(附上多方式代码实现)

    贝叶斯公式: 提到贝叶斯公式,首先需要从条件概率说起,因为他们都是基于条件概率发展而来的,既然条件概率那么重要,那么什么是条件概率呢? 条件概率是概率论中的一个重要而时用的概念,生活中我们总是无意识的 ...

  8. 机器学习--详解人脸对齐算法SDM-LBF

    https://www.cnblogs.com/Anita9002/p/7095380.html 引自:http://blog.csdn.net/taily_duan/article/details/ ...

  9. 【机器学习详解】SVM解回归问题

    转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/51121767 CSDN−勿在浮沙筑高台 \color{Blue}{CSDN-勿 ...

  10. 搜索引擎:文本分类——TF/IDF算法

    原理 TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类.TFIDF实际上是:TF * IDF,TF ...

最新文章

  1. 一口气管理几十个中断不是问题
  2. 手把手教你搭建Mac环境微信小程序的本地测试服务器
  3. ZOJ 3228(AC自动机+修改的匹配)
  4. java treetable_在Swing中创建TreeTable | 学步园
  5. 用vim + xdebug 来追踪thinkphp的执行过程
  6. 记录一次redis数据库搭建过程并详细说明配置
  7. indesign教程,如何创建和编辑图形元素的框架?
  8. PMC 任命Edward Sharp为首席战略及技术官
  9. Axure_RP8.0软件+汉化包
  10. 国资委定调联通电信前景:“共享竞合”的铁塔模式翻版
  11. python如何退出while循环_python如何跳出while循环
  12. banne图怎么设计才会有更多的点击率
  13. 8大预测分析工具比较
  14. [附源码]计算机毕业设计Python+uniapp作业批改系统APP4238p(程序+lw+APP+远程部署)
  15. linux 下的lsb_release -a 命令查询系统版本
  16. 百度网盘限速的解决办法
  17. 关于 git 的用法
  18. 使用cpolar发布群晖NAS上的网页 上篇(7.X版)
  19. 织梦DedeCMS后台模块管理列表不显示 【终极解决办法】
  20. 基于JSP的IQ智力测试系统

热门文章

  1. jupyter notebook 之 pandas
  2. 如何用一台普通相机拍照红蓝立体3D图片
  3. 苹果支付Java后台总结
  4. 【云图】如何制作AMF生态鱼缸实体店分布图
  5. Paper再现:MD+AI自动编码机探测蛋白变构(四):DIO的生成和聚类
  6. 项目经理论坛_项目经理晋升之路:诚信、自信、韧性
  7. JSP文件过大 exceeding 65535 bytes limit
  8. 小兔 —— 「 洛谷 」P2768 珍珠项链
  9. 恶意软件隐身术:把可执行文件隐藏在注册表里
  10. win10 按用户名访问计算机,win7访问win10系统时需要输入用户名密码的两种解决方法...