【机器学习】详解 TF-IDF 与 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 中出现的总次数为 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 TfidfVectorizer

tfidfvec = 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与余弦相似性的应用(一):自动提取关键词 - 阮一峰的网络日志

  • 12
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值