基于传统特征工程的文本分析技术,首先把文档表示成矢量,然后从中提取文档特征,最后使用传统的分类算法如贝叶斯算法等对文本进行分类。
文档表示模型中用到的数学方法主要分为三类:集合论模型,代数论模型,概率统计模型。以基于代数论的矢量空间模型为例,一份文档可以表示如下:
每个文档由N个特征项表示,对应N个权重,则这具有权重的N维矢量表示该文档。
矢量空间模型应用于文本分类时,支持近似内容匹配和部分内容匹配。矢量空间模型的问题在于,它假设特征项之间互相独立,但这个假设在大多数情况下不成立,这制约了该模型的实际应用。
特征提取包括特征项选择和特征权重计算两个步骤。
特征项选择:对所有特征项按照评价指标进行排序,选出靠前作为文章的特征项。
特征权重计算:一个词的代表程度与类内词频正相关(也就是说明这个词是否具有代表性),一个词的区别程度与所有类别中出现的次数相关(也就是说明这个词相较于其他类别是否具有区分度)。
一般采用评估函数这种数学方法进行特征提取。常见评估函数如下:
(1)词频(TF)。即词出现于文本中的次数。将词频小于某一阈值的词删除进行筛除。但是对于专业性很强的文档来说,频率低的词反映出的行业有效信息更多,因此,这个特征提取方法并不适用。
(2)文档频次法(DF)。计算整个数据集中包含这个特征文本数量,并根据阈值去掉不具有代表性和不具有区分度的特征,即频次特别低和特别高的特征。
(3)TF-IDF。这实际上是TF*IDF即(词频)*(逆向文档频率),可以用来判定词语的类别区分能力。
(4)互信息方法(Mutual information)。它能表现特征对于主题的辨别度以及词与类别之间的统计独立关系。互信息大表明该词在指定类别频次高,在其余类别频次低。互信息分类效果一般都很差,因为它会受到容词边缘概率的影响。
(5)其他方法。这包括期望交叉熵函数,信息增益函数,卡方校验函数,二次信息熵等。
1.K近邻算法
K近邻算法(k-nearest neighbor,K-NN)是1967年由Cover T和Hart P 提出的一种基本分类与回归方法。它是非常典型的分类监督学习算法,可以解决多分类的问题。它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后根据算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前K个最相似的数据,这就是K近邻算法中K的出处,通常K是不大于20的整数。最后,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。
K近邻算法的优点在于:(1)它是一种lazy-learning算法,分类器不需要使用训练集进行训练。(2)K近邻算法理论简单,容易实现。(3)对异常值和噪声有较高的容忍度。(4)K近邻算法天生就支持多分类。
K近邻算法的缺点在于:(1)基本的K近邻算法每预测一个“点”的分类都会重新进行一次全局运算,对于样本容量大的数据集计算量比较大。(2)K近邻算法容易导致维度灾难,在高维空间中计算距离的时候,就会变得非常慢。(3)样本不平衡时,预测偏差比较大,K值大小的选择得依靠经验或者交叉验证得到。K的值越大,模型的偏差越大,对噪声数据越不敏感,当K的值很大的时候,可能造成模型欠拟合。K的值越小,模型的方差就会越大,当K的值很小的时候,就会造成模型的过拟合。(4)可解释性差,无法看出哪个变量更重要,无法给出决策树那样的规则。
2.K均值算法
在有监督学习中,我们把对样本进行分类的过程称为分类(Classification);而在无监督学习中,我们将物体被划分到不同集合的过程称为聚类(Clustering)。“聚”这个动词十分精确,它传神地描绘了各个物体自主地向属于自己的集合靠近的过程。
在聚类中,我们把物体所在的集合称为簇(cluster)。
K均值算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。
K均值算法的基本步骤如下:
(1)根据设定的聚类数K,随机地选择K个聚类中心(Cluster Centroid)。
(2)评估各个样本到聚类中心的距离,如果样本距离第i个聚类中心更近,则认为其属于第i簇。
(3)计算每个簇中样本的平均(Mean)位置,将聚类中心移动至该位置。
(4)重复以上步骤直至各个聚类中心的位置不再发生改变。
综上,K均值算法步骤能够简单概括为:(1)分配:样本分配到簇。(2)移动:移动聚类中心到簇中样本的平均位置。需要注意的是:某些聚类中心可能没有被分配到样本,这样的聚类中心就会被淘汰(意味着最终的类数可能会减少)。
K均值算法的优点在于:擅长处理球状分布的数据,当结果聚类是密集的,而且类和类之间的区别比较明显时,K均值的效果比较好。对于处理大数据集,这个算法是相对可伸缩的和高效的,它的复杂度是O(nkt),n是对象的个数,k是簇的数目,t是迭代的次数。相比其他的聚类算法,K均值算法比较简单、容易掌握,这也是其得到广泛使用的原因之一。
K均值算法的缺点在于:(1)算法的初始中心点选择与算法的运行效率密切相关,而随机选取中心点有可能导致迭代次数很大或者限于某个局部最优状态;通常k n,且t n,所以算法经常以局部最优收敛。(2)K均值的最大问题是要求用户必须事先给出k的个数,k的选择一般都基于一些经验值和多次试验的结果,对于不同的数据集,k的取值没有可借鉴性。(3)对异常偏离的数据敏感——离群点;K均值对“噪声”和孤立点数据是敏感的,少量的这类数据就能对平均值造成极大的影响。
3.朴素贝叶斯算法
贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。
贝叶斯定理如下:
P ( A | B )表示事件 B 已经发生的前提下,事件 A 发生的概率,叫作事件 B 发生下事件 A 的条件概率,其基本求解公式为: P ( A | B ) = 。
贝叶斯定理之所以有用,是因为我们在生活中经常遇到这种情况:我们可以很容易直接得出 P ( A | B ), P ( B | A )则很难直接得出,但我们更关心 P ( B | A ),贝叶斯定理就为我们打通从 P ( A | B )获得 P ( B | A )的道路,其计算公式为: P ( B | A ) = 。
朴素贝叶斯分类分为三个阶段:
第一阶段:准备工作阶段。这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。
第二阶段:分类器训练阶段。这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。
第三阶段:应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。
4.支持矢量机算法
(1)支持矢量机两分类法
经典的SVM算法设计的初衷是解决如何寻找一个最优超平面进行两个类的区分。它的目的就是使得两类的间隔最大。距离最优超平面最近的样本矢量,称为支持矢量,如图3-1中的黑色方块和黑色圆。
图3-1 典型的SVM的二分类问题
SVM解决分类问题的方法是:如果在低维空间里难以找到一个线性分类面把两个样本有效划分,那么就将数据由不可分的低维空间,在经过某种映射后,转换为线性可分的高维空间。从低维到高维的过程,实际上就是将目标的特征提取出来进行划分,其区分度不够明显时(或者说无法线性划分时),在得到了更多的特征之后,其划分就会容易(可以进行线性划分)。这种划分的方法就是线性分类。所谓线性函数,就是满足 f ( a + b ) = f ( a )+ f ( b )且 f ( k a ) = kf ( a )这种映射关系的函数,可以简单地认为是一维中的点,二维中的直线,三维中的平面。对于所有维数,这种线性函数可称为超平面。最优超平面就是一个可将某种特征划分开来的函数。一般来说,如果数据是线性可分,那么就会存在一个线性函数能够将样本分成两类;如果没有这样一个线性函数,就称为非线性可分的。
目前为止的假设都默认有一个超平面可以把两类训练样本线性可分地划分开来。然而,这种理想的超平面在一般任务中几乎是不可能存在的,也就是说,这是一种理想的情况。很多实际问题在低维线性是不可分的。支持矢量机通过核技巧(kernel trick)来解决样本不是线性可分的情况,即之前所说的将一个低维的问题转换到高维,找到线性可分的解。
显而易见,在支持矢量机理论中,把特征矢量映射到高维后,其总是以成对内积的形式存在,以形成最优间隔。当特征被映射到非常高维的空间时会产生很大的存储和计算负担。核技巧的目的就是在将特征映射和内积这两步运算压缩为一步,即得到低维空间的特征值,就能推算出高维空间的内积值。
之后还需考虑这样一个问题,在现实中很难找到一个完全匹配的核函数。且由于环境噪声的存在,个别数据可能会导致整体似乎线性不可分。因此,需要对样本进行筛选,使其可以容许出现少量的错误样本,并且对间隔不会有过大的影响,即防止由于过拟合造成的所得模型适用性不广泛(或者根本无法得到模型)的问题。
支持向量机中常用的核函数如表3-1所示:
表3-1 常用的支持矢量机核函数及其特点
续表
(2)支持矢量机多分类法
以上方法都是二分类的方法,实际问题中会涉及多个待分类项,接下来介绍一下SVM的两种多分类的方法。
一对所有:如果设置有m类,那么就需要产生m个二类分类器。其中,某类分类器将该类设为正类,其他所有类都认为是负类。由于每一类都需要一个分类器来分类,最终能够得到m个分类器。之后使用计数的方式来确定x的类别。假设某一二分类器a对某一样本分类,若判定其是正类,则a类计数1,否则对其他所有类计数1,以此类推,对所有m个分类器都进行这样的计数后,计数最高的即认为是这一类。
一对一:给定m个类,m类中每两两之间都需要一个分类器,因此一共产生m(m-1)/2个二类分类器个数。比如a,b,c三个类,那么就需要a和b类,a和c类,b和c类,一共三个二分类器。对于一个需要分类的数据在经过所有分类器的分类并计数后,也可以实现分类(是一种更像谁的方法)。与一对多的方法相比,此方法产生的分类器更多,并且因为在某些极端情况,可能存在几个类计数相同的情况。不过,这种极端情况几乎不会出现,一对一的方法所得的结果会更加准确。