基于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

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
tf-idf是一种用于文本向量化技术,它可以将文本转换成一个向量,以便进行机器学习和文本挖掘等任务。 tf-idf是“词频-逆文档频率”(term frequency-inverse document frequency)的缩写。它是一种用于评估一个词在文档中的重要性的方法。tf-idf值越高,说明该词在文档中越重要。 tf指的是词频(term frequency),即该词在文档中出现的次数。而idf指的是逆文档频率(inverse document frequency),它是用来衡量该词在整个文档集合中的重要性的。idf值越高,说明该词在整个文档集合中越不常见,因此在文档中出现的次数越少,但是对于文档的区分能力越强。 通过将每个文档中的词汇按照tf-idf值进行加权,并将每个文档表示成一个向量,就可以将文本转换成数值型的特征向量,以便进行机器学习和文本挖掘等任务。 具体来说,tf-idf的计算公式为: tf-idf = tf * idf 其中,tf表示词频,计算公式为: tf = (词汇在文档中出现的次数) / (文档中词汇总数) idf表示逆文档频率,计算公式为: idf = log(文档总数 / 包含该词汇的文档数) 将所有文档中的词汇按照tf-idf值进行加权,就可以得到一个向量表示每个文档。这个向量的维度是所有词汇的数量,每个维度对应一个词汇的tf-idf值。由于大多数文档中只包含某些词汇,因此这个向量是非常稀疏的。 tf-idf文本向量化可以用于文本分类文本聚类、信息检索等任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值