NLP-如何理解TF-IDF?

462 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


一、简述

TF-IDF(term frequency–inverse document frequency)是一种统计方法,用来衡量字词对于文本的重要程度。字词的重要性随着它在当前文本中出现的频率成正比,随着它在语料库中其他文本中出现的频率成反比,因此TD-IDF也经常被用来提取文本的特征。 本文主要讲解什么是TF-IDF以及TF-IDF提取词向量的实现过程。

二、公式

>TFIDF=某词wi在文本di中出现的次数文本di中出现的词数log语料库的所有文档数包含某词wi的文档数+1>TF * IDF=\frac{某词w_i在文本d_i中出现的次数}{文本d_i中出现的词数} *log\frac{语料库的所有文档数}{包含某词w_i的文档数+1}

三、TF

TF顾名思义就是词频,即

TF=某词wi在文本di中出现的次数文本di中出现的词数TF =\frac{某词w_i在文本d_i中出现的次数}{文本d_i中出现的词数}

表示某词在一个文本中出现的频率,一般而言,某词在文本中出现的频率越高,那么可以认为该词对于文本的重要程度比较高(当然,类似于啊/了/的之类的停用词不算,本次讨论的词中假设已经去除了停用词),比如在本篇文章中反复提到TF,那么可以直观的认可TF对于本文的重要性。但是...但是...请考虑如下场景: 有三个文本d1d2d3d_1、d_2、d_3构成一个语料库dd,需要提取每一个文本的特征,假设

w1w2经常在d1中出现w1、w2经常在d_1中出现 w1w3经常在d2中出现w1、w3经常在d_2中出现 w3w4经常在d3中出现w3、w4经常在d_3中出现

按照TF的理论:

w1w2对于d1比较重要w1、w2对于d_1比较重要 w1w3对于d2比较重要w1、w3对于d_2比较重要 w3w4对于d3比较重要w3、w4对于d_3比较重要

那么问题来了 w2w2只对d1d_1比较重要,也就是w2w_2具有唯一性,可以较好的作为d1d_1的特征,而w2w_2d1d_1d2d_2都比较重要,都可以作为d1d_1d2d_2的特征,即没有体现其特别之处(大家都有,也就意味着普通,而不是独特),那这样w2w2还能作为特征词吗?

能!那如何处理这种脚踏两只船的情况呢?权重!没毛病,就是权重,也就是下文的IDF。

四、IDF

IDF((inverse document frequency),叫做逆文档频率,用来衡量词在语料库中的常见程度。通俗的来讲,就是衡量词在语料库中的权重,比如上文提到脚踏两只船的家伙,权重就可以少一点,更为甚者,就更少一点,反之,如果一夫一妻的,作为嘉奖,给予最大权重,算是满分。下面亮出公式:

IDF=log语料库的所有文档数包含某词wi的文档数+1IDF=log\frac{语料库的所有文档数}{包含某词w_i的文档数+1}
  • 如何理解公式?

如果一个词在本文中出现,在其他文中也出现,那么它的权重就会随着其他文中出现的次数增加而降低

  • 为什么log函数的分母要加1?

做一个平滑处理,防止包含某词的文档数为0,数学中分母为0是不允许的

  • 为什么是log?

关于这个问题idf的提出者没有给出理论的解释,有点小尴尬。从信息论的角度解释,这里有篇文章可以参考coolshell.cn/articles/84…

五、TF-IDF代码实现

以TF-IDF方式提取词向量

from sklearn.feature_extraction.text import TfidfVectorizer

corpus = ['我们 去 唱歌',
            '我们 去 爬山',
            '小名 喜欢 打球']

tfidf_vector = TfidfVectorizer()
X = tfidf_vector.fit_transform(corpus)
print(X.toarray())
'''
[[0.79596054 0.         0.         0.60534851 0.         0.        ]
 [0.         0.         0.         0.60534851 0.         0.79596054]
 [0.         0.57735027 0.57735027 0.         0.57735027 0.        ]]
'''

六、优缺点

  • 优点
  • 简单快捷
  • 缺点
  • 向量稀疏度较高
  • 假设了文本中词与词之间相互独立,上下文没有关联性