简介
转载于:TF-IDF文本表示方法与词云图。
一种应用常见和广泛的词袋模型表示方式。
TF-IDF
TF-IDF为词频-逆文档频率(term frequence - inverse document frequence) 的简称。首先需要明白的是TF-IDF实际上是TF与IDF两者的乘积。之所以出现TF-IDF的原因在于,通常来说在一个样本中一次词出现的频率越高,其重要性应该对应越高,即考虑到词频对文本向量的影响;但是如果仅仅只是考虑到这一个因素则同样会带来一个新的弊端,即有的词不只是在某个样本中出现的频率高,其实它在整个数据集中的出现频率都很高,而这样的词往往也是没有意义的。因此,TF-IDF的做法是通过词的逆文档频率来加以修正调整。
计算步骤
词频TF
考虑到每个样本有长短之分,我们对”词频”进行一个标准化处理:
或者
逆文档频率IDF
可以发现,如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)的平滑处理。log表示对得到的值取对数(此处为自然对数)。
然后将计算得到的TF乘以IDF便得到了一个词的TF-IDF权重值。接着,对于数据集中的每个词都进行计算对应的TF-IDF值,最后将所有的值组合成一个矩阵。
注:如果这个词没有出现在词表中,那么其对应的TF-IDF则为0
计算示例
假定某训练文本长度为1000个词,“中国”、“蜜蜂”、“养殖”各出现20次,则这三个词的”词频”(TF)都为0.02。然后,搜索Google发现,包含”的”字的网页共有250亿张,假定这就是中文网页总数(即总样本数)。包含”中国”的网页共有62.3亿张,包含”蜜蜂”的网页为0.484亿张,包含”养殖”的网页为0.973亿张。则它们的逆文档频率(IDF)和TF-IDF如下:
包含该词的文档数(亿) | TF | IDF | TF-IDF | |
---|---|---|---|---|
中国 | 62.3 | 0.02 | 0.603 | 0.0121 |
蜜蜂 | 0.484 | 0.02 | 2.713 | 0.0543 |
养殖 | 0.973 | 0.02 | 2.410 | 0.0482 |
如:
从上表可见,”蜜蜂”的TF-IDF值最高,”养殖”其次,”中国”最低。所以,如果只选择一个词,”蜜蜂”就是这篇文章的关键词。
实现
上面我们已经介绍完了TF-IDF的计算原理,下面我们再通过sklearn中实现的TfidfVectorizer
类方法来做一个具体的文本处理示例。
1 | from sklearn.feature_extraction.text import TfidfVectorizer |
关于TfidfVectorizer
的使用有几点注意:
(1)参数stopword=['用于','文本']
为自定义一个停用词表。如果不指定停用词表,则默认将所有单个汉字视为停用词,即通过设置参数token_pattern=r"(?u)\b\w\w+\b"
来进行控制。
(2)可以设token_pattern=r"(?u)\b\w+\b"
,即不考虑停用词,将所有的词都加入到词表中。
(3)参数max_features=k
用来选择出现频率最高的前k
个词作为词表。
结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19vocabulary list:
[('分词', 0), ('处理', 1), ('工具', 2), ('常见', 3), ('文本', 4), ('用于', 5)]
IFIDF词频矩阵:
[[0.60302269 0.30151134 0.30151134 0. 0.60302269 0.30151134]
[0.31661852 0.63323704 0.31661852 0.44499628 0.31661852 0.31661852]]
-------这里输出第 0 个文本的词语tf-idf权重------
分词 0.6030226891555273
处理 0.30151134457776363
工具 0.30151134457776363
常见 0.0
文本 0.6030226891555273
用于 0.30151134457776363
-------这里输出第 1 个文本的词语tf-idf权重------
分词 0.3166185217347375
处理 0.633237043469475
工具 0.3166185217347375
常见 0.44499628487896004
文本 0.3166185217347375
用于 0.3166185217347375