当前位置:   article > 正文

【机器学习】详解 TF-IDF 与 TF-IWF

tf-iwf

目录

一、理论

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 中出现的总次数为 Nd,t,且文档 d 的总词数为 Nd,则词 t 相对于文档 d 的词频 TF 为:


1.3 逆文档频率 IDF

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

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

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

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

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

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


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

综上,词 t 的词频-逆文档频率 TF\raisebox0mmIDF 为:

以使用 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 中出现的总次数为 Nd,t,且文档 d 的总词数为 Nd,则词 t 相对于文档 d 的 TF 为:

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

从而,词 t 相对于文档 d 的 TF\raisebox0mmIWF 为:

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

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


二、实现

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

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

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

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

  1. from sklearn.feature_extraction.text import TfidfVectorizer
  2. tfidfvec = TfidfVectorizer()
  3. word_embedding = tfidfvec.fit_transform(corpus)
  4. print word_embedding

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

  1. from sklearn.feature_extraction.text import TfidfVectorizer
  2. # 另一个自定义语料库 (4 篇文档)
  3. corpus = [
  4. 'This is not the first document.',
  5. 'This document is not the second document.',
  6. 'And this is not the third one.',
  7. 'Is this the fourth document?',
  8. ]
  9. tfidf_vectorizer = TfidfVectorizer()
  10. tfidf = tfidf_vectorizer.fit_transform(corpus)
  11. # 查看 TF-IDF 矩阵, 其中每个元组表示 (文档 index, TF-IDF 矩阵特征列 index), 浮点数表示 TF-IDF值
  12. print(tfidf)
  13. # 查看 特征词与 TF-IDF 矩阵的对应关系字典, 其中每对 key:value 表示 特征词:TF-IDF 矩阵特征列 index
  14. print(tfidf_vectorizer.vocabulary_)
  15. # 查看 特征词列表 (特征列)
  16. print(tfidf_vectorizer.get_feature_names())
  1. (0, 1) 0.3934518068245154
  2. (0, 2) 0.6164182855290015
  3. (0, 8) 0.3216726331114366
  4. (0, 5) 0.3934518068245154
  5. (0, 4) 0.3216726331114366
  6. (0, 10) 0.3216726331114366
  7. (1, 7) 0.509382158560758
  8. (1, 1) 0.6502640669651994
  9. (1, 8) 0.26581674173343006
  10. (1, 5) 0.3251320334825997
  11. (1, 4) 0.26581674173343006
  12. (1, 10) 0.26581674173343006
  13. (2, 6) 0.4865407641485108
  14. (2, 9) 0.4865407641485108
  15. (2, 0) 0.4865407641485108
  16. (2, 8) 0.2538971545683301
  17. (2, 5) 0.3105526673072801
  18. (2, 4) 0.2538971545683301
  19. (2, 10) 0.2538971545683301
  20. (3, 3) 0.6704970632809761
  21. (3, 1) 0.4279695901493821
  22. (3, 8) 0.34989318276628206
  23. (3, 4) 0.34989318276628206
  24. (3, 10) 0.34989318276628206
  25. {'this': 10, 'is': 4, 'not': 5, 'the': 8, 'first': 2, 'document': 1, 'second': 7, 'and': 0, 'third': 9, 'one': 6, 'fourth': 3}
  26. ['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与余弦相似性的应用(一):自动提取关键词 - 阮一峰的网络日志

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/412755
推荐阅读
相关标签
  

闽ICP备14008679号