TF-IDF文本表示方法

简介

转载于: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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from sklearn.feature_extraction.text import TfidfVectorizer

s = ['文本 分词 工具 可 用于 对 文本 进行 分词 处理',
'常见 的 用于 处理 文本 的 分词 处理 工具 有 很多']
tfidf = TfidfVectorizer(stop_words=None,
token_pattern=r"(?u)\b\w\w+\b", max_features=6)
weight = tfidf.fit_transform(s).toarray()
word = tfidf.get_feature_names()

print('vocabulary list:\n')
vocab = tfidf.vocabulary_.items()
vocab = sorted(vocab, key=lambda x: x[1])
print(vocab)
print('IFIDF词频矩阵:')
print(weight)

for i in range(len(weight)):
# 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,
# 第二个for便利某一类文本下的词语权重
print(u"-------这里输出第", i, u"类文本的词语tf-idf权重------")
for j in range(len(word)):
print(word[j], weight[i][j]) # 第i个文本中,第j个次的tfidf值

关于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
19
vocabulary 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

一分一毛,也是心意。