赞
踩
目录
1.6 改进方法 TF-IWF (Term Frequency-Inverse Word Frequency)
TF-IDF (Term Frequency - Inverse Document Frequency) 词频-逆文档频率
是一种针对 关键词 的统计分析方法,涉及数据挖掘、文本处理、信息检索等多个领域。其中,TF 表示 词频 (Term Frequency),IDF 表示 逆文档频率 (Inverse Document Frequency)。
TF-IDF 的 作用:评估某个 词 (Term) 对一个 文档集 / 语料库 (包含了若干文档) 中的某篇 文章 / 文档 (Document) 的重要程度。
TF-IDF 的 核心思想:一个词的重要程度,与其在某篇文档中出现的次数成正比,与带有该词的文档总数成反比。换言之,一个词在某篇文档中出现的次数越多 (频率越高),但在所有其他文档中出现的频率越低 (次数越少),则该词与该文档的相关性越强、越能代表/刻画该文档的主题、越能使文档具有区分度。
TF-IDF 中的 TF 表示 词频 (Term Frequency),即 某个词在某篇文档中出现的总次数 (频数)。通常,需要对其进行归一化统一量纲 (词频 = 词频数 / 文档总词数),以避免词频因文档长度不同而产生偏差 (词频 因长文档具有的词数多就相对高、因短文档具有的词数少就相对低,将导致无法真正衡量词的重要性)。
设某个词 在文档 中出现的总次数为
事实上,一些 高频出现的常见词 对与刻画主题可能并无太大贡献 (如 “的”、“了” 等停顿词(Stopwords) 没有实际意义但 IF 却很高),反倒是一些 低频出现的特定词 可能才能表达文档的主题 (如一些区别度高的专有名词、人物地点 IF 却很低),故 仅单纯使用 TF 并不恰当。
为此,衡量一个词的重要性,应满足:一个词预测 / 刻画 / 代表主题的能力越强,则其权重越大;反之,权重越小。例如,在文档集/语料库中,若某些词只在很少的几篇文档中出现过,那么这样的词将被认为对刻画文档主题的作用很大,从而这些词应具有更大的权重。IDF 正是在完成这样的工作。
TF-IDF 中的 IDF 表示 逆文档频率 (Inverse Document Frequency),被用作 IF 的权重,其大小与一个词的常见程度成反比。
设某一文档集/语料库共有
其中,分母部分加 1 避免除
可见,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),使用 距离度量 (如余弦相似度) 衡量嵌入的相似度,从而根据相似度得分可得相似文档。以上即为 文本相似性度量 的简单例子。
TF-IDF 的优点:
- 容易理解,概念简单
- 实现便捷、快速
- 有一定实际效果,性价比高
TF-IDF 的缺点:
- 用 TF 衡量词的重要性不够合理,例如,有时对主题刻画具有代表性的词,其在某篇文档的出现次数不多将导致 TF 低,但其重要性实际并不低 (如具有代表性但出现次数不多的专业名词、人物地点等,但可能通篇都围绕其阐述和解释);反之,许多如没有实际意义的语气词、助词 (停顿词) 却因出现次数多导致 IF 高 (一种解决方法:将停顿词排除在计算范围外,提高精确性)
- 用 IDF 衡量词的重要性不够合理,例如,有时对主题刻画不具有代表性的词,其在所有文档的出现频率较低将导致 IDF 高,但其重要性实际并不高 (如某些意义不大的生僻字词,却被误以为很重要);反之,某些因重要性高而被大量文档提及的词,却因出现频率高导致 IDF 低
- 忽略了词在同一类别中、不同类别间的分布情况,仅考虑了词与其出现的文档之间的关系,过于单纯简单
- 并未考虑词的语义信息,无法处理一词多义 / 一义多词等各种语义相关的复杂情况
- 无法体现词的位置信息,出现靠前和靠后的词很可能具有不同的重要性/区分度,不应等同视之 (一种解决方法:对全文首段和每段首句给予较大权重)
TF-IDF 的应用:
- 搜索引擎检索
- 关键词提取
- 文本相似性度量
- 文本摘要提取
已知,
一方面,设某个词 在文档 中出现的总次数为
另一方面,设某一文档集/语料库所有词的频数为
从而,词 相对于文档 的
可见,
传统
在 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算法介绍及实现_Asia-Lee的博客-CSDN博客_tf-idf
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。