训练阶段,计算机根据训练集中的文档,使用特征提取找出最具代表性的词典向量(仍然是不太严格的说法),然后参照这个词典向量把这些训练集文档转化为向量表示,之后的所有运算便都使用这些向量进行,不再理会原始的文本形式的文档了。
(五)训练2
将样本数据成功转化为向量表示之后,计算机才算开始真正意义上的“学习”过程。
再重复一次,所谓样本,也叫训练数据,是由人工进行分类处理过的文档集合,计算机认为这些数据的分类是绝对正确的,可以信赖的(但某些方法也有针对训练数据可能有错误而应对的措施)。接下来的一步便是由计算机来观察这些训练数据的特点,来猜测一个可能的分类规则(这个分类规则也可以叫做分类器,在机器学习的理论著作中也叫做一个“假设”,因为毕竟是对真实分类规则的一个猜测),一旦这个分类满足一些条件,我们就认为这个分类规则大致正确并且足够好了,便成为训练阶段的最终产品——分类器!再遇到新的,计算机没有见过的文档时,便使用这个分类器来判断新文档的类别。
举一个现实中的例子,人们评价一辆车是否是“好车”的时候,可以看作一个分类问题。我们也可以把一辆车的所有特征提取出来转化为向量形式。在这个问题中词典向量可以为:
D=(价格,最高时速,外观得分,性价比,稀有程度)
则一辆保时捷的向量表示就可以写成
vp=(200万,320,9.5,3,9)
而一辆丰田花冠则可以写成
vt=(15万,220,6.0,8,3)
找不同的人来评价哪辆车算好车,很可能会得出不同的结论。务实的人认为性价比才是评判的指标,他会认为丰田花冠是好车而保时捷不是;喜欢奢华的有钱人可能以稀有程度来评判,得出相反的结论;喜欢综合考量的人很可能把各项指标都加权考虑之后才下结论。
可见,对同一个分类问题,用同样的表示形式(同样的文档模型),但因为关注数据不同方面的特性而可能得到不同的结论。这种对文档数据不同方面侧重的不同导致了原理和实现方式都不尽相同的多种方法,每种方法也都对文本分类这个问题本身作了一些有利于自身的假设和简化,这些假设又接下来影响着依据这些方法而得到的分类器最终的表现,可谓环环相连。
比较常见,家喻户晓,常年被评为国家免检产品的分类算法有一大堆,什么决策树,Rocchio,朴素贝叶斯,神经网络,支持向量机,线性最小平方拟合,k-NN,遗传算法,最大熵,Generalized Instance Set等等等等。在这里只挑几个最具代表性的算法侃一侃。
Rocchio算法
Rocchio算法应该算是人们思考文本分类问题时最先能想到,也最符合直觉的解决方法。基本的思路是把一个类别里的样本文档各项取个平均值(例如把所有“体育”类文档中词汇“篮球”出现的次数取个平均值,再把“裁判”取个平均值,依次做下去),可以得到一个新的向量,形象的称之为“质心”,质心就成了这个类别最具代表性的向量表示。再有新文档需要判断的时候,比较新文档和质心有多么相像(八股点说,判断他们之间的距离)就可以确定新文档属不属于这个类。稍微改进一点的Rocchio算法不尽考虑属于这个类别的文档(称为正样本),也考虑不属于这个类别的文档数据(称为负样本),计算出来的质心尽量靠近正样本同时尽量远离负样本。Rocchio算法做了两个很致命的假设,使得它的性能出奇的差。一是它认为一个类别的文档仅仅聚集在一个质心的周围,实际情况往往不是如此(这样的数据称为线性不可分的);二是它假设训练数据是绝对正确的,因为它没有任何定量衡量样本是否含有噪声的机制,因而也就对错误数据毫无抵抗力。