TaskThree-20190307

特征选择

1、TF-IDF原理
  TF-IDF(Term Frequency-Inverse Document Frequency)是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
  在一份给定的文件里,词频 (Term Frequency, TF)指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(分子一般小于分母 区别于IDF),以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)
    TF(w) = \frac{在某一类中词条w出现的次数}{该类中所有的词条数目}
  逆向文件频率 (Inverse Document Frequency, IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。
    IDF(w) = log(\frac{语料库的文档总数}{包含词条w的文档数})
  上面的公式已经可以使用了,但是在一些特殊的情况会有一些小问题,比如某一个生僻词在语料库中没有,这样我们的分母为0, IDF没有意义了。所以常用的IDF我们需要做一些平滑,使语料库中没有出现的词也可以得到一个合适的IDF值。平滑的方法有很多种,最常见的IDF平滑后的公式之一为:
    IDF(w) = log\frac{N+1}{N(w)+1} + 1
  有了IDF的定义,我们就可以计算某一个词的TF-IDF值了:
    TF-IDF(w) = TF(w)*IDF(w)

2、互信息
  一般地,两个离散随机变量 X 和 Y 的互信息可以定义为:
    I(X;Y) = \sum_{y \in Y} \sum_{x \in X} p(x,y) \log{ \left(\frac{p(x,y)}{p(x)\,p(y)} \right) }, \,\!
p(x,y)是X和Y的联合概率分布函数p(x)p(y)分别是X和Y的边缘概率分布函数
  在连续随机变量的情形下,求和被替换成了二重积分:
    I(X;Y) = \int_Y \int_X p(x,y) \log{ \left(\frac{p(x,y)}{p(x)\,p(y)} \right) } \; dx \,dy
p(x,y)是X和Y的联合概率密度函数p(x)p(y)分别是X和Y的边缘概率密度函数。如果对数以 2 为基底,互信息的单位是bit
  直观上,互信息度量 XY 共享的信息:它度量知道这两个变量其中一个,对另一个不确定度减少的程度。例如,如果 XY 相互独立,则知道 X 不对 Y 提供任何信息,反之亦然,所以它们的互信息为零。在另一个极端,如果 XY 的一个确定性函数,且 Y 也是 X 的一个确定性函数,那么传递的所有信息被 XY 共享:知道 X 决定 Y 的值,反之亦然。因此,在此情形互信息与 Y(或 X)单独包含的不确定度相同,称作 Y(或 X)的。而且,这个互信息与 X 的熵和 Y 的熵相同。(这种情形的一个非常特殊的情况是当 XY 为相同随机变量时。)
  互信息是 XY 的联合分布相对于假定 XY 独立情况下的联合分布之间的内在依赖性。 于是互信息以下面方式度量依赖性:I(X; Y) = 0 当且仅当XY 为独立随机变量。从一个方向很容易看出:当 XY 独立时,p(x,y) = p(x) p(y),因此:
    \log{ \left( \frac{p(x,y)}{p(x)\,p(y)} \right) } = \log 1 = 0. \,\!
此外,互信息是非负的(即 I(X;Y) ≥ 0),而且是对称的(即 I(X;Y) = I(Y;X))。
互信息又可以等价地表示成:
\begin{align} I(X;Y) & {} = H(X) - H(X|Y) \\ & {} = H(Y) - H(Y|X) \\ & {} = H(X) + H(Y) - H(X,Y) \\ & {} = H(X,Y) - H(X|Y) - H(Y|X) \end{align}
其中H(X)和H(Y)是边缘熵H(X|Y) 和 H(Y|X) 是条件熵,而 H(X,Y) 是 XY联合熵。注意到这组关系和并集、差集和交集的关系类似,于是用Venn图表示。

在互信息定义的基础上使用琴生不等式,我们可以证明 I(X;Y) 是非负的,因此
\ H(X) \ge H(X|Y)
。这里我们给出
I(X;Y) = H(Y) - H(Y|X)
的详细推导:
\begin{align} I(X;Y) & {} = \sum_{x,y} p(x,y) \log \frac{p(x,y)}{p(x)p(y)}\\ & {} = \sum_{x,y} p(x,y) (\log \frac{p(x,y)}{p(x)}) - \sum_{x,y} p(x,y) \log p(y) \\ & {} = \sum_{x,y} p(x)p(y|x) \log p(y|x) - \sum_{x,y} p(x,y) \log p(y) \\ & {} = \sum_x p(x) \left(\sum_y p(y|x) \log p(y|x)\right) - \sum_y \log p(y) \left(\sum_x p(x,y)\right) \\ & {} = -\sum_x p(x) H(Y|X=x) - \sum_y \log p(y) p(y) \\ & {} = -H(Y|X) + H(Y) \\ & {} = H(Y) - H(Y|X). \\ \end{align}

3、TF-IDF代码应用
在scikit-learn中,有两种方法进行TF-IDF的预处理。第一种方法是在用CountVectorizer类向量化之后再调用TfidfTransformer类进行预处理。

from sklearn.feature_extraction.text import TfidfTransformer  
from sklearn.feature_extraction.text import CountVectorizer  

corpus=["I come to China to travel", 
    "This is a car polupar in China",          
    "I love tea and Apple ",   
    "The work is to write some papers in science"] 

vectorizer=CountVectorizer()

transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))  
print(tfidf)

第二种方法是直接用TfidfVectorizer完成向量化与TF-IDF预处理。

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf2 = TfidfVectorizer()
re = tfidf2.fit_transform(corpus)
print(re)

参考链接:
https://www.cnblogs.com/pinard/p/6693230.html
https://zh.wikipedia.org/wiki/%E4%BA%92%E4%BF%A1%E6%81%AF

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容