文本分类入门(二)——训练

文本分类入门(二)——训练


1.定义

训练,简单的说就是让计算机从给定的一堆文档中自己学习分类的规则。

开始训练之前,再多说几句关于VSM这种文档表示模型的话。

举个例子,假设说把我正在写的“文本分类入门”系列文章的第二篇抽出来当作一个需要分类的文本,则可以用如下的向量来表示这个文本,以便于计算机理解和处理。
w 2 = ( 文 本 , 5 , 统 计 学 习 , 4 , 模 型 , 0 , … … ) w_{2}=(文本,5,统计学习,4,模型,0,……) w2=540
  这个向量表示在 w 2 w_{2} w2所代表的文本中,“文本”这个词出现了5次(这个信息就叫做词频),“统计学习”这个词出现了4次,而“模型”这个词出现了0次,依此类推,后面的词没有列出。

而系列的第三篇文章可以表示为:
w 3 = ( 文 本 , 9 , 统 计 学 习 , 4 , 模 型 , 10 , … … ) w_{3}=(文本,9,统计学习,4,模型,10,……) w3=9410
  其含义同上。如果还有更多的文档需要表示,我们都可以使用这种方式。

只通过观察 w 2 w_{2} w2 w 3 w_{3} w3我们就可以看出实际上有更方便的表示文本向量的方法,那就是把所有文档都要用到的词从向量中抽离出来,形成共用的数据结构(也可以仍是向量的形式),这个数据结构就叫做词典,或者特征项集合。

例如我们的问题就可以抽离出一个词典向量
D = ( 文 本 , 统 计 学 习 , 模 型 , … … ) D=(文本,统计学习,模型,……) D=
  所有的文档向量均可在参考这个词典向量的基础上简化成诸如
w 2 = ( 5 , 4 , 0 , … … ) w_{2}=(5,4,0,……) w2=540

w 3 = ( 9 , 4 , 10 , … … ) w_{3}=(9,4,10,……) w3=9410

的形式,其含义没有改变。

5,4,10这些数字分别叫做各个词在某个文档中的权重,实际上单单使用词频作为权重并不多见,也不十分有用,更常见的做法是使用地球人都知道的TF/IDF值作为权重。TF/IDF作为一个词对所属文档主题的贡献程度来说,是非常重要的度量标准,也是将文档转化为向量表示过程中的重要一环。

在这个转化过程中隐含了一个很严重的问题。注意看看词典向量D,你觉得它会有多大?或者说,你觉得它会包含多少个词?

假设我们的系统仅仅处理汉语文本,如果不做任何处理,这个词典向量会包含汉语中所有的词汇,我手头有一本商务印书馆出版的《现代汉语词典》第5版(2005年5月出版),其中收录了65,000个词,D大致也应该有这么大,也就是说,D是一个65,000维的向量,而所有的文本向量 w 2 w_{2} w2, w 3 w_{3} w3, w n w_{n} wn也全都是65,000维的!(这是文本分类这一问题本身的一个特性,称为“高维性”)想一想,大部分文章仅仅千余字,包含的词至多几百,为了表示这样一个文本,却要使用65,000维的向量,这是对存储资源和计算能力多大的浪费呀!(这又是文本分类问题的另一个特性,称为“向量稀疏性”,后文会专门谈论这些特性,并指出解决的方法)

这么多的词汇当中,诸如“体育”,“经济”,“金融”,“处理器”等等,都是极其能够代表文章主题的,但另外很多词,像“我们”,“在”,“事情”,“里面”等等,在任何主题的文章中都很常见,根本无法指望通过这些词来对文本类别的归属作个判断。这一事实首先引发了对文本进行被称为“去停止词”的预处理步骤(对英文来说还有词根还原,但这些与训练阶段无关,不赘述),与此同时,我们也从词典向量D中把这些词去掉。

但经过停止词处理后剩下的词汇仍然太多,使用了太多的特征来表示文本,就是常说的特征集过大,不仅耗费计算资源,也因为会引起“过拟合问题”而影响分类效果。

这个问题是训练阶段要解决的第一个问题,即如何选取那些最具代表性的词汇(更严格的说法应该是,那些最具代表性的特征,为了便于理解,可以把特征暂时当成词汇来想象)。对这个问题的解决,有人叫它特征提取,也有人叫它降维。

特征提取实际上有两大类方法:

  • 一类称为特征选择(Term Selection),指的是从原有的特征(那许多有用无用混在一起的词汇)中提取出少量的,具有代表性的特征,但特征的类型没有变化(原来是一堆词,特征提取后仍是一堆词,数量大大减少了而已)。
  • 另一类称为特征抽取(Term Extraction)的方法则有所不同,它从原有的特征中重构出新的特征(原来是一堆词,重构后变成了别的,例如LSI将其转为矩阵,文档生成模型将其转化为某个概率分布的一些参数),新的特征具有更强的代表性,并耗费更少的计算资源。(特征提取的各种算法会有专门章节讨论)

训练阶段,计算机根据训练集中的文档,使用特征提取找出最具代表性的词典向量(仍然是不太严格的说法),然后参照这个词典向量把这些训练集文档转化为向量表示,之后的所有运算便都使用这些向量进行,不再理会原始的文本形式的文档了。

将样本数据成功转化为向量表示之后,计算机才算开始真正意义上的“学习”过程。

再重复一次,所谓样本,也叫训练数据,是由人工进行分类处理过的文档集合,计算机认为这些数据的分类是绝对正确的,可以信赖的(但某些方法也有针对训练数据可能有错误而应对的措施)。接下来的一步便是由计算机来观察这些训练数据的特点,来猜测一个可能的分类规则(这个分类规则也可以叫做分类器,在机器学习的理论著作中也叫做一个“假设”,因为毕竟是对真实分类规则的一个猜测),一旦这个分类满足一些条件,我们就认为这个分类规则大致正确并且足够好了,便成为训练阶段的最终产品——分类器!再遇到新的,计算机没有见过的文档时,便使用这个分类器来判断新文档的类别。

举一个现实中的例子,人们评价一辆车是否是“好车”的时候,可以看作一个分类问题。我们也可以把一辆车的所有特征提取出来转化为向量形式。在这个问题中词典向量可以为:

D = ( 价 格 , 最 高 时 速 , 外 观 得 分 , 性 价 比 , 稀 有 程 度 ) D=(价格,最高时速,外观得分,性价比,稀有程度) D=

则一辆保时捷的向量表示就可以写成

v p = ( 200 万 , 320 , 9.5 , 3 , 9 ) v_{p}=(200万,320,9.5,3,9) vp=2003209.539

而一辆丰田花冠则可以写成

v t = ( 15 万 , 220 , 6.0 , 8 , 3 ) v_{t}=(15万,220,6.0,8,3) vt=152206.083

找不同的人来评价哪辆车算好车,很可能会得出不同的结论。务实的人认为性价比才是评判的指标,他会认为丰田花冠是好车而保时捷不是;喜欢奢华的有钱人可能以稀有程度来评判,得出相反的结论;喜欢综合考量的人很可能把各项指标都加权考虑之后才下结论。

可见,对同一个分类问题,用同样的表示形式(同样的文档模型),但因为关注数据不同方面的特性而可能得到不同的结论。这种对文档数据不同方面侧重的不同导致了原理和实现方式都不尽相同的多种方法,每种方法也都对文本分类这个问题本身作了一些有利于自身的假设和简化,这些假设又接下来影响着依据这些方法而得到的分类器最终的表现,可谓环环相连,丝丝入扣。

2.不同种类的分类算法介绍

比较常见,家喻户晓,常年被评为国家免检产品的分类算法有一大堆,什么决策树,Rocchio,朴素贝叶斯,神经网络,支持向量机,线性最小平方拟合,kNN,遗传算法,最大熵,Generalized Instance Set等等,在这里只挑几个最具代表性的算法侃一侃:

  • Rocchio算法

Rocchio算法应该算是人们思考文本分类问题时最先能想到,也最符合直觉的解决方法。基本的思路是把一个类别里的样本文档各项取个平均值(例如把所有“体育”类文档中词汇“篮球”出现的次数取个平均值,再把“裁判”取个平均值,依次做下去),可以得到一个新的向量,形象的称之为“质心”,质心就成了这个类别最具代表性的向量表示。再有新文档需要判断的时候,比较新文档和质心有多么相像(八股点说,判断他们之间的距离)就可以确定新文档属不属于这个类。稍微改进一点的Rocchio算法不尽考虑属于这个类别的文档(称为正样本),也考虑不属于这个类别的文档数据(称为负样本),计算出来的质心尽量靠近正样本同时尽量远离负样本。Rocchio算法做了两个很致命的假设,使得它的性能出奇的差。一是它认为一个类别的文档仅仅聚集在一个质心的周围,实际情况往往不是如此(这样的数据称为线性不可分的);二是它假设训练数据是绝对正确的,因为它没有任何定量衡量样本是否含有噪声的机制,因而也就对错误数据毫无抵抗力。

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

  • 朴素贝叶斯算法(Naive Bayes)

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

朴素贝叶斯算法的公式只有一个
P ( C i ∣ d ) = P ( d ∣ C i ) P ( C i ) P ( d ) P(C_{i}|d)=\frac{P(d|C_{i})P(C_{i})}{P(d)} PCid=P(d)P(dCi)P(Ci)
  其中 P ( d ∣ C i ) = P ( w 1 ∣ C i ) P ( w 2 ∣ C i ) … P ( w i ∣ C i ) P ( w 1 ∣ C i ) … P ( w m ∣ C i ) P(d| C_{i})=P(w_{1}|C_{i}) P(w_{2}|C_{i}) …P(w_{i}|C_{i}) P(w_{1}|C_{i}) …P(w_{m}|C_{i}) P(dCi)=P(w1Ci)P(w2Ci)P(wiCi)P(w1Ci)P(wmCi)(式1)

P ( w i ∣ C i ) P(w_{i}|C_{i}) P(wiCi)就代表词汇 w i w_{i} wi属于类别 C i C_{i} Ci的概率。

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

首先, P ( d ∣ C i ) P(d| C_{i}) P(dCi)之所以能展开成(式1)的连乘积形式,就是假设一篇文章中的各个词之间是彼此独立的,其中一个词的出现丝毫不受另一个词的影响(回忆一下概率论中变量彼此独立的概念就可以知道),但这显然不对,即使不是语言学专家的我们也知道,词语之间有明显的所谓“共现”关系,在不同主题的文章中,可能共现的次数或频率有变化,但彼此间绝对谈不上独立。

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

  • 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及朴素贝叶斯方法。与其它算法相比,SVM算法的理论基础较为复杂,但应用前景很广。

3.比较不同算法的优劣势

​ 介绍过了几个很具代表性的算法之后,不妨用国内外的几组实验数据来比较一下他们的优劣。

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

分类算法召回率准确率 F 1 F_{1} F1测度
支持向量机(SVM)80.2%90.2%84.9%
K近邻算法(KNN)82.3%86.3%84.3%
线性最小平方拟合算法(LISF)84.2%85.3%84.8%
神经网络分类算法(NNet)75.3%79.8%77.5%
朴素贝叶斯概率分类算法73.4%78.3%75.8%

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

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

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

分类算法在Reuters-21578“ModApt‘e”上的 F 1 F_{1} F1测度
Rocchio0.776
朴素贝叶斯0.795
kNN0.823
SVM0.864

​ 仅以 F 1 F_{1} F1测度来看,kNN是相当接近SVM算法的,但 F 1 F_{1} F1只反映了分类效果(即分类分得准不准),而没有考虑性能(即分类分得快不快)。综合而论,SVM是效果和性能均不错的算法。

前面也提到过,训练阶段的最终产物就是分类器,分类阶段仅仅是使用这些分类器对新来的文档分类而已,没有过多可说的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值