数据竞赛-“达观杯”文本智能处理-Day2:TF-IDF实践
tf-idf(英语:term frequency–inverse document frequency)是一种用于信息检索与文本挖掘的常用加权技术。tf-idf是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。tf-idf加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。
1.原理
在一份给定的文件里,词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语
t
i
t_i
ti来说,它的重要性可表示为:
t
f
i
,
j
=
n
i
,
j
∑
k
n
k
,
j
tf_{i,j}=\frac{n_{i,j}}{\sum_kn_{k,j}}
tfi,j=∑knk,jni,j
以上式子中
n
i
,
j
n_{i,j}
ni,j是该词在文件
d
j
d_j
dj中的出现次数,而分母则是在文件
d
j
d_j
dj中所有字词的出现次数之和。
逆向文件频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到:
i
d
f
i
=
l
g
∣
D
∣
∣
{
j
:
t
i
ϵ
d
j
}
∣
idf_i=lg\frac{|D|}{|\{j:t_i\epsilon d_j\}|}
idfi=lg∣{j:tiϵdj}∣∣D∣
其中:
- ∣ D ∣ |D| ∣D∣:语料库中的文件总数
- ∣ { j : t i ϵ d j } ∣ |\{j:t_i\epsilon d_j\}| ∣{j:tiϵdj}∣:包含词语 t i t_i ti的文件数目, 如果词语不在数据中,就导致分母为零,因此一般情况下使用1 + ∣ { j : t i ϵ d j } ∣ |\{j:t_i\epsilon d_j\}| ∣{j:tiϵdj}∣
然后
t
d
i
d
f
i
,
j
=
t
f
i
,
j
∗
i
d
f
i
tdidf_{i,j}=tf_{i,j}*idf_i
tdidfi,j=tfi,j∗idfi
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的tf-idf。因此,tf-idf倾向于过滤掉常见的词语,保留重要的词语。
2.tf-idf的理论依据及不足
tf-idf算法是创建在这样一个假设之上的:对区别文档最有意义的词语应该是那些在文档中出现频率高,而在整个文档集合的其他文档中出现频率少的词语,所以如果特征空间坐标系取tf词频作为测度,就可以体现同类文本的特点。另外考虑到单词区别不同类别的能力,tf-idf法认为一个单词出现的文本频数越小,它区别不同类别文本的能力就越大。因此引入了逆文本频度idf的概念,以tf和idf的乘积作为特征空间坐标系的取值测度,并用它完成对权值tf的调整,调整权值的目的在于突出重要单词,抑制次要单词。但是在本质上idf是一种试图抑制噪声的加权,并且单纯地认为文本频率小的单词就越重要,文本频率大的单词就越无用,显然这并不是完全正确的。idf的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以tf-idf法的精度并不是很高。
此外,在tf-idf算法中并没有体现出单词的位置信息,对于Web文档而言,权重的计算方法应该体现出HTML的结构特征。特征词在不同的标记符中对文章内容的反映程度不同,其权重的计算方法也应不同。因此应该对于处于网页不同位置的特征词分别赋予不同的系数,然后乘以特征词的词频,以提高文本表示的效果。
3.实践
接上篇
from sklearn.feature_extraction.text import TfidfVectorizer
from time import time
t0 = time()
tfidf = TfidfVectorizer()
vectorizer = tfidf.fit(x_train['word_seg'])
x_train = vectorizer.fit_transform(x_train['word_seg'])
x_valid = vectorizer.fit_transform(x_valid['word_seg'])
duration = time() - t0
print("done in %fs" % (duration))
print("%d documents, %d features" % x_train.shape)
print("%d documents, %d features" % x_valid.shape)
运行结果:
# done in 237.123385s
# 92049 documents, 826647 features
# 10228 documents, 250299 features
参考文献及补充阅读: