Kiwee的NLP学习笔记——TF-IDF算法

什么是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 TFIDF=TFIDF
  • TF:(Term Frequency 词频)
    • 衡量一个词(term)在文档中出现的有多频繁
      T F = 某 个 词 在 文 章 中 出 现 的 次 数 文 章 总 词 数 TF = \frac{某个词在文章中出现的次数}{文章总词数} TF=
  • 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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值