"文本分类入门"摘要

搞自"文本分类入门"http://blog.csdn.net/yangliuy/article/details/7316494 

source: http://www.blogjava.net/zhenandaci/category/31868.html?Show=All

统计学习方法: 

基本思想

让机器像人类一样自己来通过对大量同类文档的观察来自己总结经验,作为今后分类的依据。(也有人把这一大类方法称为机器学习,两种叫法只是涵盖范围大小有些区别,均无不妥)。

训练集:

统计学习方法所使用的文档(由人工进行了准确分类的文档). 

训练及分类器:

计算机从这些文档重挖掘出一些能够有效分类的规则,这个过程被形象的称为训练,而总结出的规则集合常常被称为分类器。

训练完成之后,需要对计算机从来没有见过的文档进行分类时,便使用这些分类器来进行。


文档表示模型

向量模型(VSM,向量空间模型), 一篇文章被看作特征项集合来看,利用加权特征项构成向量进行文本表示. 

词典

把所有文档都要用到的词从向量中抽离出来,形成共用的数据结构(也可以仍是向量的形式),这个数据结构就叫做词典,或者特征项集合

向量权重

TF/IDF值作为权重。(关于TF/IDF的详细解释,Google的吴军研究员写了非常通俗易懂的文章,发布于Google黑板报,链接地址是http://googlechinablog.com/2006/06/blog-post_27.html,有兴趣不妨一读)TF/IDF作为一个词对所属文档主题的贡献程度来说,是非常重要的度量标准,也是将文档转化为向量表示过程中的重要一环。


特征提取(降维)

先去停止词

再如何选取那些最具代表性的词汇(更严格的说法应该是,那些最具代表性的特征,为了便于理解,可以把特征暂时当成词汇来想象).


特征提取方法:

1, 特征选择(Term Selection),指的是从原有的特征(那许多有用无用混在一起的词汇)中提取出少量的,具有代表性的特征,但特征的类型没有变化(原来是一堆词,特征提取后仍是一堆词,数量大大减少了而已)。

2, 特征抽取(Term Extraction)的方法则有所不同,它从原有的特征中重构出新的特征(原来是一堆词,重构后变成了别的,例如LSI将其转为矩阵,文档生成模型将其转化为某个概率分布的一些参数),新的特征具有更强的代表性,并耗费更少的计算资源。(特征提取的各种算法会有专门章节讨论)


分类算法:

Rocchio算法

质心: 把一个类别里的样本文档各项取个平均值(例如把所有“体育”类文档中词汇“篮球”出现的次数取个平均值,再把“裁判”取个平均值,依次做下去),可以得到一个新的向量,形象的称之为“质心”,质心就成了这个类别最具代表性的向量表示。

再有新文档需要判断的时候,比较新文档和质心有多么相像(八股点说,判断他们之间的距离)就可以确定新文档属不属于这个类。稍微改进一点的Rocchio算法不尽考虑属于这个类别的文档(称为正样本),也考虑不属于这个类别的文档数据(称为负样本),计算出来的质心尽量靠近正样本同时尽量远离负样本。

Rocchio算法做了两个很致命的假设,使得它的性能出奇的差。一是它认为一个类别的文档仅仅聚集在一个质心的周围,实际情况往往不是如此(这样的数据称为线性不可分的);二是它假设训练数据是绝对正确的,因为它没有任何定量衡量样本是否含有噪声的机制,因而也就对错误数据毫无抵抗力。

不过Rocchio产生的分类器很直观,很容易被人类理解,算法也简单,还是有一定的利用价值的,常常被用来做科研中比较不同算法优劣的基线系统(Base Line)。

朴素贝叶斯算法(Naive Bayes)

关注的是文档属于某类别概率,即文档中每个词, 属于该类别的概率的综合表达式。

而每个词属于该类别的概率又在一定程度上可以用这个词在该类别训练文档中出现的次数(词频信息)来粗略估计,因而使得整个计算过程成为可行的。使用朴素贝叶斯算法时,在训练阶段的主要任务就是估计这些值。

      朴素贝叶斯算法的公式只有一个

wps_clip_image-20922

其中P(d| Ci)=P(w1|Ci) P(w2|Ci) …P(wi|Ci) P(w1|Ci) …P(wm|Ci) (式1)

      P(wi|Ci)就代表词汇wi属于类别Ci的概率。

这其中就蕴含着朴素贝叶斯算法最大的两个缺陷。

1, P(d| Ci)之所以能展开成(式1)的连乘积形式,就是假设一篇文章中的各个词之间是彼此独立的,其中一个词的出现丝毫不受另一个词的影响,但这显然不对,词语之间有明显的所谓“共现”关系,在不同主题的文章中,可能共现的次数或频率有变化,但彼此间绝对谈不上独立。

2, 使用某个词在某个类别训练文档中出现的次数来估计P(wi|Ci)时,只在训练样本数量非常多的情况下才比较准确(考虑扔硬币的问题,得通过大量观察才能基本得出正反面出现的概率都是二分之一的结论,观察次数太少时很可能得到错误的答案),而需要大量样本的要求不仅给前期人工分类的工作带来更高要求(从而成本上升),在后期由计算机处理的时候也对存储和计算资源提出了更高的要求。

kNN算法

      在kNN算法看来,训练样本就代表了类别的准确信息(因此此算法产生的分类器也叫做“基于实例”的分类器),而不管样本是使用什么特征表示的。

其基本思想是在给定新文档后,计算新文档特征向量和训练文档集中各个文档的向量的相似度,得到K篇与该新文档距离最近最相似的文档,根据这K篇文档所属的类别判定新文档所属的类别(注意这也意味着kNN算法根本没有真正意义上的“训练”阶段)。

这种判断方法很好的克服了Rocchio算法中无法处理线性不可分问题的缺陷,也很适用于分类标准随时会产生变化的需求(只要删除旧训练文档,添加新训练文档,就改变了分类的准则)。

       kNN唯一的也可以说最致命的缺点就是判断一篇新文档的类别时,需要把它与现存的所有训练文档全都比较一遍,这个计算代价并不是每个系统都能够承受的(比如我将要构建的一个文本分类系统,上万个类,每个类即便只有20个训练样本,为了判断一个新文档的类别,也要做20万次的向量比较!)。

一些基于kNN的改良方法比如Generalized Instance Set就在试图解决这个问题

SVM算法

支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中[10]。

支持向量机方法是建立在统计学习理论的VC 维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力[14](或称泛化能力)。

SVM 方法有很坚实的理论基础,SVM 训练的本质是解决一个二次规划问题(Quadruple Programming,指目标函数为二次函数,约束条件为线性约束的最优化问题),得到的是全局最优解,这使它有着其他统计学习技术难以比拟的优越性。SVM 分类器的文本分类效果很好,是最好的分类器之一。同时使用核函数将原始的样本空间向高维空间进行变换,能够解决原始样本线性不可分的问题。其缺点是核函数的选择缺乏指导,难以针对具体问题选择最佳的核函数;另外SVM 训练速度极大地受到训练集规模的影响,计算开销比较大,针对SVM 的训练速度问题,研究者提出了很多改进方法,包括Chunking 方法、Osuna 算法、SMO 算法和交互SVM 等等[14]。

      SVM分类器的优点在于通用性较好,且分类精度高、分类速度快、分类速度与训练样本个数无关,在查准和查全率方面都优于kNN及朴素贝叶斯方法[8]。

算法比较

F1 测度: 一种综合了查准率与召回率的指标,只有当两个值均比较大的时候,对应的F1测度才比较大,因此是比单一的查准或召回率更加具有代表性的指标。

在中文语料上的试验,文献[6]使用了复旦大学自然语言处理实验室提供的基准语料对当前的基于词向量空间文本模型的几种分类算法进行了测试,这一基准语料分为20个类别,共有9804篇训练文档,以及9833篇测试文档。在经过统一的分词处理、噪声词消除等预处理之后,各个分类方法的性能指标如下。

wps_clip_image-23468


由比较结果不难看出,SVM和kNN明显优于朴素贝叶斯方法(但他们也都优于Rocchio方法,这种方法已经很少再参加评测了)。

在英文语料上,路透社的Reuters-21578 “ModApt´e”是比较常用的测试集,在这个测试集上的测试由很多人做过,Sebastiani在文献[23]中做了总结,相关算法的结果摘录如下:

分类算法在Reuters-21578 “ModApt´e”上的F1测度:

Rocchio  0.776

朴素贝叶斯  0.795

kNN  0.823

SVM  0.864

仅以F1测度来看,kNN是相当接近SVM算法的,但F1只反映了分类效果(即分类分得准不准),而没有考虑性能(即分类分得快不快)。

综合而论,SVM是效果和性能均不错的算法。


相关概念总结

学习方法:使用样例(或称样本,训练集)来合成计算机程序的过程称为学习方法[22]。

监督学习:学习过程中使用的样例是由输入/输出对给出时,称为监督学习[22]。最典型的监督学习例子就是文本分类问题,训练集是一些已经明确分好了类别文档组成,文档就是输入,对应的类别就是输出。

非监督学习:学习过程中使用的样例不包含输入/输出对,学习的任务是理解数据产生的过程 [22]。典型的非监督学习例子是聚类,类别的数量,名称,事先全都没有确定,由计算机自己观察样例来总结得出。

TSR(Term Space Reduction):特征空间的压缩,即降维,也可以叫做特征提取。包括特征选择和特征抽取两大类方法。

分类状态得分(CSV,Categorization Status Value):用于描述将文档归于某个类别下有多大的可信度。

准确率(Precision):在所有被判断为正确的文档中,有多大比例是确实正确的。

召回率(Recall):在所有确实正确的文档中,有多大比例被我们判为正确。

假设:计算机对训练集背后的真实模型(真实的分类规则)的猜测称为假设。可以把真实的分类规则想像为一个目标函数,我们的假设则是另一个函数,假设函数在所有的训练数据上都得出与真实函数相同(或足够接近)的结果。

泛化性:一个假设能够正确分类训练集之外数据(即新的,未知的数据)的能力称为该假设的泛化性[22]。

一致假设:一个假设能够对所有训练数据正确分类,则称这个假设是一致的[22]。

过拟合:为了得到一致假设而使假设变得过度复杂称为过拟合[22]。想像某种学习算法产生了一个过拟合的分类器,这个分类器能够百分之百的正确分类样本数据(即再拿样本中的文档来给它,它绝对不会分错),但也就为了能够对样本完全正确的分类,使得它的构造如此精细复杂,规则如此严格,以至于任何与样本数据稍有不同的文档它全都认为不属于这个类别!

超平面(Hyper Plane):n维空间中的线性函数唯一确定了一个超平面。一些较直观的例子,在二维空间中,一条直线就是一个超平面;在三维空间中,一个平面就是一个超平面。

线性可分和不可分:如果存在一个超平面能够正确分类训练数据,并且这个程序保证收敛,这种情况称为线形可分。如果这样的超平面不存在,则称数据是线性不可分的[22]。

正样本和负样本:对某个类别来说,属于这个类别的样本文档称为正样本;不属于这个类别的文档称为负样本。

规划:对于目标函数,等式或不等式约束都是线性函数的问题称为线性规划问题。对于目标函数是二次的,而约束都是线性函数的最优化问题称为二次规划问题[22]。

对偶问题

给定一个带约束的优化问题

目标函数:min f(x)

约束条件:C(x) ≥0

可以通过拉格朗日乘子构造拉格朗日函数

      L(x,λ)=f(x)- λTC(x)

令g(λ)= f(x)- λTC(x)

则原问题可以转化为

目标函数:max g(λ)

约束条件:λ≥0

这个新的优化问题就称为原问题的对偶问题(两个问题在取得最优解时达到的条件相同)。


分类问题

类别之间的关系

都是可以表示成树形结构,这意味着一个类有多个子类,而一个子类唯一的属于一个父类

文档与类别间的关系

一般来说,在分类系统中,我们倾向于让一篇文档唯一的属于一个类别(更严格的说,是在同一层次中仅属于一个类别,因为属于一个类别的时候,显然也属于这个类别的父类别),这使得我们只适用一个标签就可以标记这个文档的类别,而一旦允许文档属于多个类别,标签的数目便成为大小不定的变量,难于设计成高效的数据结构。

这种“属于多个”类的想法更糟的地方在于文档类别表示的语义方面,试想,如果姚明给灾区捐款的新闻即属于灾区新闻,也属于体育新闻的话,当用户使用这个系统来查找文档,指定的条件是要所有“属于灾区新闻但不属于体育新闻的新闻”,这篇姚明的报道是否应该包含在查询结果中呢?

硬分类(Hard Categorization)

如果一个分类算法在一次分类判断时,仅仅输出一个真假值用来表示待分类的文档是否属于当前类别的话,这样的系统就可以叫做基于二元分类器的分类系统。有些分类算法天然就是独立二元的,例如支持向量机,它只能回答这个文档是或不是这个类别的。

排序分类(Ranking Categorization)

有的算法在一次判断后就可以输出文档属于多个类别的得分(假设说,得分越大,则说明越有可能属于这个类别),这类算法称为“排序分类”的算法(Ranking Categorization),也叫做m元分类算法。kNN就是典型的m元分类算法(因为kNN会找出与待分类文档最相近的训练样本,并记录下这些样本所属的分类)。


特征选择算法之开方检验
最基本的思想就是通过观察实际值与理论值的偏差来确定理论的正确与否. 

变量确实是独立的(行话就叫做“原假设”),然后观察实际值(也可以叫做观察值)与理论值(这个理论值是指“如果两者确实独立”的情况下应该有的值)的偏差程度. 

如果偏差足够小,我们就认为误差是很自然的样本误差,是测量手段不够精确导致或者偶然发生的,两者确确实实是独立的,此时就接受原假设;

如果偏差大到一定程度,使得这样的误差不太可能是偶然产生或者测量不精确所致,我们就认为两者实际上是相关的,即否定原假设,而接受备择假设. 
衡量方法:

1, 假设理论值为E(这也是数学期望的符号哦),实际值为x,如果仅仅使用所有样本的观察值与理论值的差值x-E之和

 wps_clip_image-23014

2, 当有多个观察值x1,x2,x3的时候,很可能x1-E,x2-E,x3-E的值有正有负,因而互相抵消,使得最终的结果看上好像偏差为0,但实际上每个都有偏差,而且都还不小!此时很直接的想法便是使用方差代替均值,这样就解决了正负抵消的问题,即使用

wps_clip_image-13177

3, 对于500的均值来说,相差5其实是很小的(相差1%),而对20的均值来说,5相当于25%的差异,这是使用方差也无法体现的。因此应该考虑改进上面的式子,让均值的大小不影响我们对差异程度的判断

wps_clip_image-28843

上式即 差值衡量公式



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值