在文本分类中,需要先对文本分词,原始的文本中可能由几十万个中文词条组成,维度非常高。另外,为了提高文本分类的准确性和效率,一般先剔除决策意义不大的词语,这就是特征词提取的目的。本文将简单介绍几种文本特征词提取算法。
信息增益(IG)
对于一个系统,其信息熵为\(H(S)=-\sum_{i}^{C}P_ilog_2(P_i)\).\(C\)表示类别个数,\(P_i\)表示第\(i\)的类别的概率。某个特征\(F\),有该特征和没有该特征,信息量的变化,就是信息增益。
对特征\(F\),它的取值有\(n\)种(\(x_1\), \(x_2\), ... , \(x_n\)),计算每个值的条件熵,并取均值
$$H(C|F) = \sum_i^nP_{i}H(C|X=x_i)$$
在分类中,特征词\(f\)只有存在(取值1)和不存在(取值为0)。那么\(H(C|f)=P(f=0)H(C|f=0) + P(f=1)H(C|f=1)\)。所以信息增益为
$$IG(F)=H(F)-H(C|F)=-\sum_{i=1}^{n}P(C_i)log(P(C_i) + $$
$$\quad \qquad P(f=1)\sum_{i=1}^{n}P(C_i|f=1)logP(C_i|f=1)+P(f=0)\sum_{i=1}^{n}P(C_i|f=0)logP(C_i|f=0)$$
信息增益提取特征词步骤:
1,统计正负分类的文档数,记为\(N_1\), \(N_2\).
2, 统计每个词在正文档出现的频率(A),负文档出现的频率(B),正文档不出现的频率(C),负文档不出现的频率(D).
3,计算信息熵
$$H(S)=-(\frac{N_1}{N_2+N_1}log(\frac{N_1}{N_1+N_2})+\frac{N_2}{N_1+N_2}log(\frac{N_1}{N_1+N_2}))$$
4,计算每个词\(w\)的信息增益
$$IG(w) = H(S)+\frac{A+B}{N_1+N_2}(\frac{A}{A+B}log(\frac{A}{A+B})+\frac{B}{A+B}log(\frac{B}{A+B}))$$
$$\qquad\qquad +\frac{A+B}{N_1+N_2}(\frac{A}{A+B}log(\frac{A}{A+B})+\frac{B}{A+B}log(\frac{B}{A+B}))$$
5,按照信息增益的大小排序,取topxx就行。
卡方校验(chi-square)
卡方检验最基本的思想就是通过观察实际值与理论值的偏差来确定理论的正确与否。具体做的时候常常先假设两个变量确实是独立的(“原假设”),然后观察实际值(观察值)与理论值(这个理论值是指“如果两者确实独立”的情况下应该有的值)的偏差程度,如果偏差足够小,我们就认为误差是很自然的样本误差,是测量手段不够精确导致或者偶然发生的,两者确确实实是独立的,此时就接受原假设;如果偏差大到一定程度,使得这样的误差不太可能是偶然产生或者测量不精确所致,我们就认为两者实际上是相关的,即否定原假设,而接受备择假设。
假设理论值是\(E\),实际值是\(x\),偏差程度的计算公式为:
$$\sum_{i}^{n}\frac{(x_i-E)^2}{E}$$
这个公式就是卡方检验使用的差值衡量公式,\(x_i\)表示样本。如果差值很大,则认为与原假设不符合,认为词与类别很相关。现在有N篇文章,分类有体育和非体育两类,考察“足球”和体育类别的关系:
特征选择 | 属于体育 | 不属于体育 | 总计 |
包含“足球”单词 | A | B | A+B |
不包含“足球”单词 | C | D | C+D |
总计 | A+C | B+D | N |
如果“足球”与体育不相关,则体育类文章包含“足球”的比例等同于所有文章包含“足球”的比例,所以A的理论值是
$$E_{11}=(A+C)\frac{A+B}{N}$$
卡方差值
$$D_{11}=\frac{(A-E_{11})^2}{E_{11}}$$
同样可以求出\(D_{12}, D_{21}, D_{22}\),最后求出“足球”与“体育”类的卡方值
$$\chi^2(足球,体育)=D_{11}+D_{12}+D_{21}+D_{22}=\frac{N(AD-BC)^2}{(A+C)(A+B)(B+D)(C+D)}$$
卡方检验的缺点:只考虑了词是否出现,而没有考虑出现了多少次,容易夸大低频词的价值。如一个单词a在一类文章中都出现一次,而另外一个单词b在该类99%的文章中都出现了10次,但是b计算出来的卡方值要小于a,所以,在筛选的时候,容易筛掉单词b,这就是“低频词缺陷”,通常,考虑也需要考虑词频。
卡方提取特征词步骤:
1,统计正负分类的文档数,记为\(N_1\), \(N_2\).
2, 统计每个词在正文档出现的频率(A),负文档出现的频率(B),正文档不出现的频率(C),负文档不出现的频率(D).
3,计算卡方
$$\chi^2=D_{11}+D_{12}+D_{21}+D_{22}=\frac{N(AD-BC)^2}{(A+C)(A+B)(B+D)(C+D)}$$
5,按照卡方值从大到小,取topxx就行。
http://www.pycpp.com/2015/06/27/%E6%96%87%E6%9C%AC%E7%89%B9%E5%BE%81%E8%AF%8D%E6%8F%90%E5%8F%96%E7%AE%97%E6%B3%95/