一.概述
文本分类在文本处理中是很重要的一个模块,它的应用也非常广泛,比如:垃圾过滤,新闻分类,词性标注等等。它和其他的分类没有本质的区别,核心方法为首先提取分类数据的特征,然后选择最优的匹配,从而分类。但是文本也有自己的特点,根据文本的特点,文本分类的流程为:1.预处理;2.文本表示及特征选择;3.构造分类器;4.分类。下面分别介绍每个模块。
1. 预处理
大家知道,中文书写时,不像英文,中间用空格隔开,而是字和字连着的,这样的话,第一步就要进行分词,把文本分成词(或字),而且分词的好坏对后续操作影响较大(分词方法有词典法,统计方法等,见我的概率统计模型在搜索引擎中的应用)。紧接着第二步就是要去掉常用且意义不大的词(称之为去停用词),比如:的、是、了等等。这样,我们的预处理阶段就完成了。
2. 文本表示及特征选择
目前常用的文本表示是向量空间模型,即把文本分词后的每个词看成一个向量中的一个元素。但是,用什么表示这个元素呢?最先想到的就是词出现的频率,比如:“走进/搜索引擎,学习/搜索引擎”,我们就可以表示成(0,…,2,…,0,1,…,0,1,0…)。为什么向量里面那么多…呢,那是因为我们必须把所有的向量都要统一起来,意思就是说,哪个词在向量的哪个位置上,都必须是确定的。要想确定,那就必须把所有的汉字都按字典序排出来,然后各个词对号入座。假设汉字有10000个,那么我要分类“走进搜索引擎,学习搜索引擎”这个短文本,我至少要给它生成一个10000维的向量,而且这10000维的向量只用到3个位置。但是用频率会出现不公平的现象,比如,“我们”这个词,它出现的频率就比较高,那它的向量就比较大,所以,词频几乎不用做特征,常用的特征有TF/IDF,互信息量,信息增益,χ2统计量等方法。刚才提到我们的向量维数很大,就算去掉停用词也是很大的,既然,维数太大,我们的处理方法一般有两种:特征选择和特征提取,特征选择就是选择一部分具有代表性的特征来表示文本,比如,用TF/IDF时,去掉很大的和一些很小的值,剩下的作为特征。特征提取是从现在的特征重构出来一个新的特征,当然,这个新的特征维数要小于原特征维数,就是降维,最常用的方法就是潜在语义分析,用的是奇异值分解(SVD),我们知道在信号处理中一种常用的处理方法,就是把空间域的信号映射到频率域(比如FFT,wavelet),到了频率域,信号能量更集中,便于处理。它的思想和信号处理其实一样。
3. 构造分类器
接下来的工作就是要构造分类规则,也就是分类器,主要就是对许多数据进行训练,产生一套模型。常用的方法有kNN,朴素贝叶斯,支持向量机,神经网络,决策树,Rocchio,线性最小平方拟合等等。
4. 分类
分类器模型产生后,我们只要来一个文本,往分类器一仍,它就会产生该文本的类别。
二.特征选择
上面对文本分类进行了概要性的介绍,下面深入文本分类中的每个模块,从特征选择开始,常用的特征计算有TF/IDF,互信息量,信息增益,χ2统计量等方法。
1、 TF/IDF
TF/IDF的思想就是越是出现次数多(词频高)且罕见的词汇(文档频率低)贡献越大。
具体请看Google黑板报上吴军写的通俗易懂的介绍TF/IDF的文章吧,如果还看不懂的话,那就没辙了。
2、 信息增益
信息增益的思想就是看特征能够为分类系统带来多少信息量,带来的信息量越多,该特征越重要。信息量的多少由熵来衡量,一个变量X,取值有n中,每种的概率为Pi,则X的熵为:H(X) = -∑Pi·log2 Pi。
对分类系统来说,类别C是变量,它可能的取值是C1,C2,……,Cn,而每一个类别出现的概率是P(C1),P(C2),……,P(Cn), n就是类别的总数。此时分类系统的熵为:H(C) = -∑P(Cj)·log2 P(Cj)。信息增益是针对一个一个的特征而言的,就是看一个特征ti,系统考虑它和不考虑它的时候信息量各是多少,两者的差值就是这个特征给系统带来的信息量。显然,不考虑任何特征的信息量就是H(C),而考虑某特征又分两种情况:该特征出现和该特征没有出现。
该特征ti出现的信息量为:P(ti)H(C|ti)
该特征ti不出现的信息量为:P(ti’)H(C|ti’)
因此,考虑该特征ti的信息量为:
H(C|ti)= P(ti)H(C|ti)+ P(ti’)H(C|ti’)
= -P(ti) ∑P(Cj|ti)·log2 P(Cj|ti) - P(ti’) ∑P(Cj|ti)·log2 P(Cj|ti’)
其中,∑是j从1…n。
最后,特征ti的信息增益:
IG=H(C)-H(C|ti)
=-∑P(Cj)·log2 P(Cj) –{P(ti) ∑P(Cj|ti)·log2 P(Cj|ti) + P(ti’) ∑P(Cj|ti)·log2 P(Cj|ti’)}
有了以上公式,其他的就比较好计算了,P(Ci),表示类别Ci在语料库中出现的概率,其实只要用1除以类别总数n就得到了(前提是每个类别平等);P(ti),就是特征ti在语料库中出现的概率,只要用出现过ti的文档数除以总文档数就可以了,再比如P(Ci|ti)表示出现ti的时候,类别Ci出现的概率,只要用出现了ti并且属于类别Ci的文档数除以出现了ti的文档数就可以了;P(ti’) 表示语料中不包含特征项ti的文档的概率;P(Cj|ti’)表示文档不包含特征项ti时属于Ci的条件概率。
3、χ2统计量
χ2统计量衡量的是特征值ti和类别Cj之间的相关联程度,并假设ti和Cj之间符合具有一阶自由度的χ2分布。特征对于某类的χ2统计值越高,它与该类之间的相关性越大,携带的类别信息也就较多。
现假设N为训练语料文档总数,A表示包含特征ti且属于Cj类的文档数;B表示包含特征ti且不属于Cj类的文档数;C表示不包含特征ti且属于Cj类的文档数;D表示既不包含特征ti且不属于Cj类的文档数。那么,可以计算一下,理论上包含特征ti且属于Cj类的文档数是多少:EA=(A+C)(A+B)/N,(A+C为属于Cj类的文档数,(A+B)/N为特征ti的出现概率),则其开方检验DA=(A-EA)2/EA。同理,可以算出其他三种情况的开方检验,则
χ2(ti,Cj) = DA+DB+DC+DD= { N×(A×D-C×B) } / { (A+C)×(B+D)×(A+B)×(C+D) }
4、互信息量
互信息(MI)的思想是:互信息量越大,特征值ti和类别Cj之间的共现的程度越大。
I(ti, Cj) = log{P(ti, Cj) / P(ti)P(Cj)}
=log{P(ti|Cj) / P(ti)}
≈log{(A×N) / (A+C)×(A+B)}
其中,符号表示同上。
最常用的选择特征的方法就是:对每个词根据以上四种方法之一计算一个值,并且从大到小排序,然后设定一个阈值,取出所有大于阈值的词作为特征值组成特征向量。
三.分类器
下面来说说文本分类中的分类器,常用的方法有kNN,朴素贝叶斯,支撑向量机,神经网络,决策树,Rocchio,线性最小平方拟合等等,在这里只介绍性能比较好的四个分类器:kNN,朴素贝叶斯,Rocchio,支撑向量机(SVM)。
1.k-近邻算法(kNN)
kNN算法的基本思想是:给定一个测试文档,系统在训练集中查找离它最近(最相似)的k个文档,然后根据这k个文档的类别来判定测试文档的类别。具体步骤如下:
(1)对训练文档和测试文档进行特征选择,将它们表示成文本向量。
(2)在训练集中选出与测试文档最相似的k个文本,公式如下(cos):
Sim(T, D)= ∑i=1..N(Ti×Di) / {(∑i=1..N Ti2)×( ∑i=1..N Di2)}1/2
其中T为测试文档,D为训练文档。
(3)在计算得到的k个最近邻文档中,依次计算每类的权重,公式如下:
p(T, Cj) = ∑di∈kNNSim(T, d i) y(d i,Cj)
其中T为测试文档,d i为选出的k个训练文档中的第i个,y(d i,Cj)为隶属函数,如果文档d i,属于Cj类,则其值为1,反之为0。
(4)比较类的权重,将文本分到权重最大的那一类。
2.朴素贝叶斯
朴素贝叶斯分类器的基本思想是利用特征项和类别的联合概率来估计给定文档的类别概率。而且假设文本是基于词的一元模型,也就是说,词与词之间是独立的。根据贝叶斯公式,文档D属于Cj类的概率为:
P(Cj|D) = P(D|Cj)×P(Cj) / P(D)
又,P(D|Cj)= P(D(t1)|Cj)×…×P(D(tn)|Cj),P(D)是个常数,P(Cj)=N(Cj)/N,P(D(ti)|Cj)=(N(ti, Cj)+1) / (N(Cj)+M),其中N(Cj)表示训练文本中属于Cj类的文本数量,N为训练文本集总数量,N(ti, Cj)表示类别Cj中包含特征ti的训练文本数量,M表示训练文本集中特征项的总个数。
只要计算出所有类别的P(Cj|D),然后哪个大,该文档就属于哪一类了。
3.Rocchio分类器
Rocchio分类器的基本思想是,首先为每一个训练文本D建立一个特征向量,然后使用训练文本的特征向量为每个类建立一个原型向量。当给定一个待分类文本时,计算待分类文本与各个类别的原型向量之间的距离,其距离可以是向量点积、向量之间夹角的余弦值或其他函数,根据计算出来的距离值来决定待分类文本属于哪一类别。这个原型向量的计算方法有几种,其中最简单的就是把该类的所有文本的特征向量求平均值。该分类器的效果仅次于kNN和SVM方法。
4.支撑向量机(SVM)
SVM的分类方法的基本思想是在向量空间中找到一个决策平面,这个平面能最好地分割两个分类中的数据点。