基于TF-IDF对文本向量化

##1.TF-IDF原理
       TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。
       在一份给定的文件里,词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语来说,它的重要性可表示为:
t f i , j = n i , j ∑ k = 1 k n k , j tf_i,_j=\dfrac{n_i,_j}{\sum_{k=1}^kn_k,_j} tfi,j=k=1knk,jni,j
       以上式子中 是该词在文件中的出现次数,而分母则是在文件中所有字词的出现次数之和。
       逆向文件频率(inverse document frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到:
i d f i = l o g n d d f ( d , i ) idf_i=log\dfrac{n_d}{df(d,i)} idfi=logdf(d,i)nd
其中,
n d n_d nd:语料库中的文件总数
d f ( d , i ) df(d,i) df(d,i):包含词语t的文件数目如果该词语不在语料库中,就会导致被除数为零,因此一般情况下使用 1 + d f ( d , i ) 1+df(d,i) 1+df(d,i)
然后
t f i d f i , j = t f i , j ∗ i d f i tfidf_i,_j=tf_i,_j*idf_i tfidfi,j=tfi,jidfi
       某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
总之,通过TF-IDF的向量化方法,可以将每个词向量化成一个表示权重的小数,而不是0,1向量了,它已经带有了文本的信息了(每个词都带上了TF-IDF信息,而TF-IDF的作用就是保留词在文档中的权重信息,这就相当于保留了文本的信息)。
##2.IF-IDF实例计算
使用以下4个文件内容为例:

文件 分词结果
网络无法连接 网络,无法,连接
无法连接网络 无法,连接,网络
所有网页速度慢 所有,网页,速度慢
网络连接掉线 网络,连接,掉线

IF(网络)=1/3
IDF(网络)=ln(4/3)
TF-IDF(网络)=1/3 * ln(4/3) = 1/3 * 0.287682 = 0.095894024
IF(掉线)=1/3
IDF(掉线)=ln(4/1)
TF-IDF(掉线)=1/3 * ln(4/1) = 1/3 * 1.386294361 = 0.46209812
经计算,得到:
|词语|网络|无法|连接|所有|网页|速度慢|掉线
| ------------- |:-------------? -----?
|IF-IDF|0.0959|0.2310|0.0959|0.4621|0.4621|0.4621|0.4621|
得到矩阵:
|词语/文件|所有|掉线|无法|网络|网页|连接|速度慢|
| ------------- |:-------------? -----?
|网络无法连接|0 |0 |0.2310 |0.0959|0|0.0959 |0 |
|无法连接网络|0 |0 |0.2310|0.0959 |0|0.0959 | 0|
|所有网页速度慢|0.4621 |0 |0 |0|0.4621|0|0.4621 |
|网络连接掉线|0 |0.4621|0 |0.0959|0 |0.0959 |0 |
针对上述的计算结果,再使用如下公式进行规范化矩阵
v n o r m = v ∣ ∣ v ∣ ∣ 2 = v v 1 2 + v 2 2 + … … + v n 2 v_{norm}=\dfrac{v}{||v||^2}=\dfrac{v}{\sqrt{v_1^2+v_2^2+……+v_n^2}} vnorm=v2v=v12+v22++vn2 v
如“网络无法连接”中的词“网络”进行规范后的值为:
0.0959 ( 0 2 + 0 2 + 0.231 0 2 + 0.095 9 2 + 0 2 + 0.095 9 2 + 0 2 ) = 0.358 \dfrac{0.0959}{\sqrt{(0^2+0^2+0.2310^2+0.0959^2+0^2+0.0959^2+0^2 )}}=0.358 (02+02+0.23102+0.09592+02+0.09592+02) 0.0959=0.358
得到各短语的向量:
|词语/文件|所有|掉线 |无法|网络| 网页|连接|速度慢|
| ------------- |:-------------? -----?
|网络无法连接|0|0|0.862|0.358|0|0.358|0|
|无法连接网络|0|0|0.862|0.358|0|0.358|0|
|所有网页速度慢|0.577|0|0|0|0.577|0|0.577|
|网络连接掉线|0|0.960|0|0.199|0|0.199|0|
上述计算使用的IDF计算公式是 i d f ( t ) = l o g n d d f ( d , t ) idf(t)=log\dfrac{n_d}{df(d,t)} idf(t)=logdf(d,t)nd,为对应后续sklearn的计算,使用公式 i d f ( t ) = l o g 1 + n d 1 + d f ( d , t ) + 1 idf(t)=log\dfrac{1+n_d}{1+df(d,t)}+1 idf(t)=log1+df(d,t)1+nd+1再次进行计算:
得各词语的tf-idf为:
|词语|网络|无法|连接|所有|网页|速度慢|掉线
| ------------- |:-------------? -----?
|IF-IDF|0.408|0.504|0.408|0.639|0.639|0.639|0.639|
各短语的矩阵:
|词语/文件|所有|掉线 |无法|网络| 网页|连接|速度慢|
| ------------- |:-------------? -----?
|网络无法连接|0|0|0.504|0.408|0|0.408|0|
|无法连接网络|0|0|0.504|0.408|0|0.408|0|
|所有网页速度慢|0.639|0|0|0|0.639|0|0.639|
|网络连接掉线|0|0.639|0|0.408|0|0.408|0|
规范后的结果:
|词语/文件|所有|掉线 |无法|网络| 网页|连接|速度慢|
| ------------- |:-------------? -----?
|网络无法连接|0|0|0.658|0.533|0|0.533|0|
|无法连接网络|0|0|0.658|0.533|0|0.533|0|
|所有网页速度慢|0.577|0|0|0|0.577|0|0.577|
|网络连接掉线|0|0.742|0|0.474|0|0.474|0|

##3.利用sklearn实现对文本向量化

'''
TF-IDF的实现过程
'''
import pandas as pd
text =pd.DataFrame(["网络,无法,连接",
	                     "无法,连接,网络",
                         "所有,网页,速度慢",
                         "网络,连接,掉线",
                         ])
##方法一:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer  
vectorizer=CountVectorizer()
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(text[0]))
tfidf=tfidf.toarray()

#方法二:
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(min_df=1,binary = False,decode_error = 'ignore')
vectorizer_2 = vectorizer.fit_transform(text[0]).toarray()

通过TF-IDF计算,得到各短语的向量矩阵:
网络无法连接 -->[0,0,0.658,0.533,0,0.533,0]
无法连接网络–>[0,0,0.658,0.533,0,0.533,0]
所有网页速度慢–>[0.577,0,0,0, 0.577,0,0.577]
网络连接掉线–>[0,0.742,0,0.474,0,0.474,0]
       这里词频的计算使用的是sklearn的TfidfVectorizer。这个类继承于CountVectorizer,在后者基本的词频统计基础上增加了如TF-IDF之类的功能。
       最后需要说明的是,我们会发现这里计算的结果跟我们之前计算不太一样。由于函数 TfidfVectorizer() 有很多参数,不同的参数计算idf的公式不一样,我们这里仅仅采用了默认的形式,所以输出的结果可能与采用前面介绍的(最基本最原始的)算法所得出之结果有所差异(但数量的大小关系并不会改变)。
1)参数(默认设置):

TfidfTransformer(norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False)

使用的计算公式为:
i d f ( t ) = l o g 1 + n d 1 + d f ( d , t ) + 1 idf(t)=log\dfrac{1+n_d}{1+df(d,t)}+1 idf(t)=log1+df(d,t)1+nd+1
(公式中的log表示以e为底的对数)
2)参数设置:smooth_idf=False
使用的计算公式为:
i d f ( t ) = l o g n d d f ( d , t ) + 1 idf(t)=log\dfrac{n_d}{df(d,t)}+1 idf(t)=logdf(d,t)nd+1

参考文献:
[1] http://scikit-learn.org/stable/modules/feature_extraction.html
[2] http://www.cnblogs.com/biyeymyhjob/archive/2012/07/17/2595249.html

你可能感兴趣的:(基于TF-IDF对文本向量化)