什么是TF-IDF
TF-IDF是一种用于信息检索与数据挖掘的常用加权技术,常用于挖掘关键词。TF-IDF值表示一个关键词在一篇文章中的关键程度。
TF-IDF的特点
假设我们现在有一片长文叫做《量化系统架构设计》词频高在文章中往往是停用词,“的”,“是”,“了”等,这些在文档中最常见但对结果毫无帮助、需要过滤掉的词,用TF可以统计到这些停用词并把它们过滤。当高频词过滤后就只需考虑剩下的有实际意义的词。
但这样又会遇到了另一个问题,我们可能发现"量化"、“系统”、"架构"这三个词的出现次数一样多。这是不是意味着,作为关键词,它们的重要性是一样的?事实上系统应该在其他文章比较常见,所以在关键词排序上,“量化”和“架构”应该排在“系统”前面,这个时候就需要IDF,IDF会给常见的词较小的权重,它的大小与一个词的常见程度成反比。
当有TF(词频)和IDF(逆文档频率)后,将这两个词相乘,就能得到一个词的TF-IDF的值。某个词在文章中的TF-IDF越大,那么一般而言这个词在这篇文章的重要性会越高,所以通过计算文章中各个词的TF-IDF,由大到小排序,排在最前面的几个词,就是该文章的关键词。
公式
- TF-IDF(term frequency–inverse document frequency)
T F − I D F = T F ∗ I D F TF-IDF = TF * IDF TF−IDF=TF∗IDF - TF:(Term Frequency 词频)
- 衡量一个词(term)在文档中出现的有多频繁
T F = 某 个 词 在 文 章 中 出 现 的 次 数 文 章 总 词 数 TF = \frac{某个词在文章中出现的次数}{文章总词数} TF=文章总词数某个词在文章中出现的次数
- 衡量一个词(term)在文档中出现的有多频繁
- IDF: (Inverse Document Frequency 逆文档频率)
- ‘词在语料库的全部文档中出现的频率’越大,该值越小。
- 该值用来排除掉’了’、‘的’、'呢’之类的停用词。
I D F = ln ( 语 料 库 的 文 档 总 数 包 含 该 词 的 文 档 数 + 1 ) IDF = \ln(\frac{语料库的文档总数}{包含该词的文档数+1}) IDF=ln(包含该词的文档数+1语料库的文档总数)
缺点
用词频衡量一个词的重要性不够全面
代码举例
使用Python的scikit-learn库来测试
#引用相关库
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
#corpus语料库(已经完成分词)
corpus = ['我 来 到 北京 大学','他 来到 了 网易 杭研 大厦','小明 硕士 毕业 与 中国 科学院','我 爱 北京 天安门']
result = tfidf.fit_transform(corpus).toarray()
#统计关键词
word = tfidf.get_feature_names()
print(word)
#输出每个关键字在每个句子中的TF-IDF
print(result)
输出内容:
['中国', '北京', '大厦', '大学', '天安门', '小明', '来到', '杭研', '毕业', '硕士', '科学院', '网易']
[[0. 0.6191303 0. 0.78528828 0. 0.
0. 0. 0. 0. 0. 0. ]
[0. 0. 0.5 0. 0. 0.
0.5 0.5 0. 0. 0. 0.5 ]
[0.4472136 0. 0. 0. 0. 0.4472136
0. 0. 0.4472136 0.4472136 0.4472136 0. ]
[0. 0.6191303 0. 0. 0.78528828 0.
0. 0. 0. 0. 0. 0. ]]
其他代码部分(不贴输出了)
#统计关键词出现的次数
for k,v in tfidf.vocabulary_.items():
print(k,v)
for i in range(len(result)):
print('-----',i,'-----')
for j in range(len(word)):
print(word[j],result[i][j])
参考文章:https://zhuanlan.zhihu.com/p/31197209