本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、简述
TF-IDF(term frequency–inverse document frequency)是一种统计方法,用来衡量字词对于文本的重要程度。字词的重要性随着它在当前文本中出现的频率成正比,随着它在语料库中其他文本中出现的频率成反比,因此TD-IDF也经常被用来提取文本的特征。 本文主要讲解什么是TF-IDF以及TF-IDF提取词向量的实现过程。
二、公式
三、TF
TF顾名思义就是词频,即
表示某词在一个文本中出现的频率,一般而言,某词在文本中出现的频率越高,那么可以认为该词对于文本的重要程度比较高(当然,类似于啊/了/的之类的停用词不算,本次讨论的词中假设已经去除了停用词),比如在本篇文章中反复提到TF,那么可以直观的认可TF对于本文的重要性。但是...但是...请考虑如下场景: 有三个文本构成一个语料库,需要提取每一个文本的特征,假设
按照TF的理论:
那么问题来了 只对比较重要,也就是具有唯一性,可以较好的作为的特征,而对和都比较重要,都可以作为和的特征,即没有体现其特别之处(大家都有,也就意味着普通,而不是独特),那这样还能作为特征词吗?
能!那如何处理这种脚踏两只船的情况呢?权重!没毛病,就是权重,也就是下文的IDF。
四、IDF
IDF((inverse document frequency),叫做逆文档频率,用来衡量词在语料库中的常见程度。通俗的来讲,就是衡量词在语料库中的权重,比如上文提到脚踏两只船的家伙,权重就可以少一点,更为甚者,就更少一点,反之,如果一夫一妻的,作为嘉奖,给予最大权重,算是满分。下面亮出公式:
- 如何理解公式?
如果一个词在本文中出现,在其他文中也出现,那么它的权重就会随着其他文中出现的次数增加而降低
- 为什么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. ]]
'''
六、优缺点
- 优点
- 简单快捷
- 缺点
- 向量稀疏度较高
- 假设了文本中词与词之间相互独立,上下文没有关联性