文本分类问题与其它分类问题没有本质上的区别,其方法可以归结为根据待分类数据的某些特征来进行匹配,当然完全的匹配是不太可能的,因此必须(根据某种评价标准)选择最优的匹配结果,从而完成分类。
后来人们意识到,究竟依据什么特征来判断文本应当隶属的类别这个问题,就连人类自己都不太回答得清楚,有太多所谓“只可意会,不能言传”的东西在里面。
人类的判断大多依据经验以及直觉,因此自然而然的会有人想到何让机器像人类一样自己来通过对大量同类文档的观察来自己总结经验,作为今后分类的依据。这便是统计学习方法的基本思想。
统计学习方法需要一批由人工进行了准确分类的文档作为学习的材料(称为训练集,注意由人分类一批文档比从这些文档中总结出准确的规则成本要低得多),计算机从这些文档中挖掘出一些能够有效分类的规则,这个过程被形象的称为训练,而总结出的规则集合常常被称为分类器。
训练完成之后,需要对计算机从来没有见过的文档进行分类时,便使用这些分类器来进行。
这些训练集包括sogou文本分类分类测试数据、中文文本分类分类语料库,包含Arts、Literature等类别的语料文本、可用于聚类的英文文本数据集、网易分类文本分类文本数据、tc-corpus-train(语料库训练集,适用于文本分类分类中的训练)、2002年中文网页分类训练集CCT2002-v1.1等。
现如今,统计学习方法已经成为了文本分类领域绝对的主流。主要的原因在于其中的很多技术拥有坚实的理论基础(相比之下,知识工程方法中专家的主观因素居多),存在明确的评价标准,以及实际表现良好。
统计分类算法将样本数据成功转化为向量表示之后,计算机才算开始真正意义上的“学习”过程。
常用的分类算法为:决策树,Rocchio,朴素贝叶斯,神经网络,支持向量机,线性最小平方拟合,kNN,遗传算法,最大熵,Generalized Instance Set等。
在这里只挑几个最具代表性的算法侃一侃。Rocchio算法Rocchio算法应该算是人们思考文本分类问题时最先能想到,也最符合直觉的解决方法。
基本的思路是把一个类别里的样本文档各项取个平均值(例如把所有 “体育”类文档中词汇“篮球”出现的次数取个平均值,再把“裁判”取个平均值,依次做下去),可以得到一个新的向量,形象的称之为“质心”,质心就成了这 个类别最具代表性的向量表示。
再有新文档需要判断的时候,比较新文档和质心有多么相像(八股点说,判断他们之间的距离)就可以确定新文档属不属于这个类。
稍微改进一点的Rocchio算法不仅考虑属于这个类别的文档(称为正样本),也考虑不属于这个类别的文档数据(称为负样本),计算出来的质心尽量靠近正样本同时尽量远离负样本。
Rocchio算法做了两个很致命的假设,使得它的性能出奇的差。
一是它认为一个类别的文档仅仅聚集在一个质心的周围,实际情况往往不是如此(这样的数据称为线性不可分的);二是它假设训练数据是绝对正确的,因为它没有任何定量衡量样本是否含有噪声的机制,因而也就对错误数据毫无抵抗力。
不过Rocchio产生的分类器很直观,很容易被人类理解,算法也简单,还是有一定的利用价值的,常常被用来做科研中比较不同算法优劣的基线系统(Base Line)。
朴素贝叶斯算法贝叶斯算法关注的是文档属于某类别概率。文档属于某个类别的概率等于文档中每个词属于该类别的概率的综合表达式。
而每个词属于该类别的概率又在一定程度上 可以用这个词在该类别训练文档中出现的次数(词频信息)来粗略估计,因而使得整个计算过程成为可行的。使用朴素贝叶斯算法时,在训练阶段的主要任务就是估计这些值。
朴素贝叶斯算法的公式并不是只有一个。首先对于每一个样本中的元素要计算先验概率。其次要计算一个样本对于每个分类的概率,概率最大的分类将被采纳。
所以其中P(d| Ci)=P(w1|Ci) P(w2|Ci) …P(wi|Ci) P(w1|Ci) …P(wm|Ci) (式1)P(w|C)=元素w在分类为C的样本中出现次数/数据整理后的样本中元素的总数(式2)这其中就蕴含着朴素贝叶斯算法最大的两个缺陷。
首先,P(d| Ci)之所以能展开成(式1)的连乘积形式,就是假设一篇文章中的各个词之间是彼此独立的,其中一个词的出现丝毫不受另一个词的影响(回忆一下概率论中变 量彼此独立的概念就可以知道),但这显然不对,即使不是语言学专家的我们也知道,词语之间有明显的所谓“共现”关系,在不同主题的文章中,可能共现的次数 或频率有变化,但彼此间绝对谈不上独立。
其二,使用某个词在某个类别训练文档中出现的次数来估计P(wi|Ci)时,只在训练样本数量非常多的情况下才比较准确(考虑扔硬币的问题,得通过大量观 察才能基本得出正反面出现的概率都是二分之一的结论,观察次数太少时很可能得到错误的答案),而需要大量样本的要求不仅给前期人工分类的工作带来更高要求 (从而成本上升),在后期由计算机处理的时候也对存储和计算资源提出了更高的要求。
但是稍有常识的技术人员都会了解,数据挖掘中占用大量时间的部分是数据整理。在数据整理阶段,可以根据词汇的情况生成字典,删除冗余没有意义的词汇,对于单字和重要的词组分开计算等等。
这样可以避免朴素贝叶斯算法的一些问题。其实真正的问题还是存在于算法对于信息熵的计算方式。朴素贝叶斯算法在很多情况下,通过专业人员的优化,可以取得极为良好的识别效果。
最为人熟悉的两家跨国软件公司在目前仍采用朴素贝叶斯算法作为有些软件自然语言处理的工具算法。
kNN算法最近邻算法(kNN):在给定新文档后,计算新文档特征向量和训练文档集中各个文档的向量的相似度,得到K篇与该新文 档距离最近最相似的文档,根据这K篇文档所属的类别判定新文档所属的类别(注意这也意味着kNN算法根本没有真正意义上的“训练”阶段)。
这种判断方法很 好的克服了Rocchio算法中无法处理线性不可分问题的缺陷,也很适用于分类标准随时会产生变化的需求(只要删除旧训练文档,添加新训练文档,就改变了 分类的准则)。
kNN唯一的也可以说最致命的缺点就是判断一篇新文档的类别时,需要把它与现存的所有训练文档全都比较一遍,这个计算代价并不是每个系统都能够承受的(比 如我将要构建的一个文本分类系统,上万个类,每个类即便只有20个训练样本,为了判断一个新文档的类别,也要做20万次的向量比较!
)。一些基于kNN的 改良方法比如Generalized Instance Set就在试图解决这个问题。
kNN也有另一个缺点,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。
SVM(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。
支持向量机方法是建立在统计学习理论的VC维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力(或称泛化能力)。
SVM 方法有很坚实的理论基础,SVM 训练的本质是解决一个二次规划问题(Quadruple Programming,指目标函数为二次函数,约束条件为线性约束的最优化问题),得到的是全局最优解,这使它有着其他统计学习技术难以比拟的优越性。
SVM分类器的文本分类效果很好,是最好的分类器之一。同时使用核函数将 原始的样本空间向高维空间进行变换,能够解决原始样本线性不可分的问题。
其缺点是核函数的选择缺乏指导,难以针对具体问题选择最佳的核函数;另外SVM 训练速度极大地受到训练集规模的影响,计算开销比较大,针对SVM 的训练速度问题,研究者提出了很多改进方法,包括Chunking 方法、Osuna算法、SMO 算法和交互SVM 等。
SVM分类器的优点在于通用性较好,且分类精度高、分类速度快、分类速度与训练样本个数无关,在查准和查全率方面都略优于kNN及朴素贝叶斯方法。
谷歌人工智能写作项目:神经网络伪原创
BP算法的基本思想是:学习过程由信号正向传播与误差的反向回传两个部分组成;正向传播时,输入样本从输入层传入,经各隐层依次逐层处理,传向输出层,若输出层输出与期望不符,则将误差作为调整信号逐层反向回传,对神经元之间的连接权矩阵做出处理,使误差减小好文案。
经反复学习,最终使误差减小到可接受的范围。具体步骤如下:1、从训练集中取出某一样本,把信息输入网络中。2、通过各节点间的连接情况正向逐层处理后,得到神经网络的实际输出。
3、计算网络实际输出与期望输出的误差。4、将误差逐层反向回传至之前各层,并按一定原则将误差信号加载到连接权值上,使整个神经网络的连接权值向误差减小的方向转化。
5、対训练集中每一个输入—输出样本对重复以上步骤,直到整个训练样本集的误差减小到符合要求为止。