继上一篇《这5个例子,小学生都能秒懂分类算法》(点击查看详情)初步分享了几种常见的分类算法是什么,今天和大家聊聊做好中文文本分类的10项关键点。
文本分类指的是计算机通过算法对输入的文本按照一定的类目体系进行自动化归类的过程。在人工智能浪潮席卷全球的今天,文本分类技术已经被广泛地应用在文本审核、广告过滤、情感分析和反黄识别等NLP领域。本文从达观数据中文文本分类的实践出发,总结了从数据预处理到特征工程、算法选择再到后处理和评价指标等流程中的10项关键内容,希望能对读者有所帮助。
在实际的中文文本分类问题中,我们面对的原始中文文本数据经常会存在许多影响最终分类效果的部分,这部分数据或文本都需要在文本分类最开始的时候就被清洗干净,否则很容易导致所谓的“Trash in,trash out”问题。除了一般分类问题的数据清洗都包含的缺失值处理、去重处理和噪声处理等步骤之外,中文文本分类还应该做到以下的清洗与处理以下数据:
(1) 非文本数据
(2) 长串数字或字母
(3) 无意义文本
变形词问题除了能让我们感叹中文博大精深之外,也时时刻刻困扰文本分类工作者,极大地增加了广告识别、涉黄涉政等特殊的文本分类场景下的分类难度。对中文词的变形通常采用的方法有:特殊符号替换、同音近型替换、简繁替换等。
要做到变形词的识别和替换,除了建立常见变形词的映射表以外,还可以尝试用拼音首字母的方法来鉴别同音替换的变形词;以及用 Word2vec词向量来对比变形词与上下文的语意关联度,从而识别出该词是否经过了变形。
停用词指的是诸如代词、介词、连接词等不包含或包含极少语义的词,另外标点符号也可以被认为是一种停用词。通常情况下,在文本中去掉这些停用词能够使模型更好地去拟合实际的语义特征,从而增加模型的泛化能力。
但值得注意的是,停用词表并不是一成不变的。针对不同的文本分类情景,所采用的停用词表也应该作出针对性的调整。例如书名号“《”和“》”往往比书名本身更能代表书名的特征、冒号“:”通常出现在人物访谈类文章的标题中,以及人称代词“他”和“她”在情感类文章标题中的频繁使用等。根据情景灵活地使用停用词表,往往能够起到意想不到的效果。
由于计算机无法识别自然语言,我们自然也就无法直接将原始文本直接扔到分类算法当中得到分类结果。因此我们需要先将文本转化为一定格式的特征编码,文本分类区别于其他文类问题的特点在于此。显然,转化后的特征编码能够携带越多的文本特征,就越能帮助分类算法预测出对于的类别。
中文文本分类最常用的特征提取的方法就是分词。区别于英文天然的存在空格符作为词与词之间的间隔标志,中文文本中词的提取必须通过基于序列预测等方法的分词技术来实现。在提取了特征值之后,再采用One-hot或TF-IDF等方法将每个样本转化为固定长度的特征编码作为分类算法的输入。
除了分词,N-gram模型也完全值得你去尝试。分词产生的特征丢失了原文本中词与词之间的的位置和顺序信息,以至于对于“我爱你”、“你爱我”这样的短语,分词得到的特征完全相同。同样的例子,若采用二元的Bi-gram模型则能提取出“我爱”、“爱你”以及“你爱”、“爱我”两组完全不同的特征,更清晰得表达的原文的原意。
在在中文文本分类中,另一个N-gram模型相对分词的优势在于:N-gram模型不受分词准确率的影响。并且当N取足够大时,字符级别的N-gram模型总是能完全覆盖分词+词袋模型的特征集合,同时能极大得召回其他特征,这一点在短文本分类中效果格外明显。
在工程实践中,为了不让特征集合过于庞大从而拖累分类速度,一般同时采用N为1到3的N-gram就能取得较好的效果。
另一个值得一试的模型叫做Skip-gram模型。有别于word2vec中获得词向量的Skip-gram模型,这里中的Skip-gram模型表示的是一种衍生自N-gram模型的语言模型。对于例句“小明去学校上自习”,常用的1-skip-bi-gram得到的特征为{“小明_学校”,“去_上”,“学校_自习”}。一般情况下,Skip-gram可以做为N-gram的补充,从而提取一些可能遗漏的有效特征。
前面介绍了三种不同的提取文本特征的方法,再加上举例的长串数字布尔特征,我们已经有了许多不同来源的特征。尝试这些特征方法中的一种或多种,并对来自不同方法的特征进行组合产生新的特征,能在特定的复杂文本分类场景下获得意想不到的效果。
例如将文本特征和结构特征进行组合是一种常见的做法:首先将文本按一定的长度阈值划分为两类,假设文本长度大于20的为长文本,否则为短文本。则可以将获得的长度结构特征和分词提取的文本特征进行组合,从而得到形如“长文本_小明”、“短文本_学校”等新生成的组合特征。诸如此类的特征组合方法,能够使得模型从非线性的角度进行分类,大大提升模型处理复问题的能力。
另外,假如你同时采用了多种特征方法,不妨对这些特征进行分桶标记。如对分词特征“小明”标记为“wordseg:小明”、对skip-gram特征“小明_学校”标记为“skipgram:小明_学校”。这样,就能在后续的特征选择和特征排序等步骤中,清楚的知道哪些特征方法起到了较好的效果。
在用上述方法对文本提取了特征之后,如果我们直接将所有特征直接丢入分类器,那么最终训练得到的模型的效果往往并不尽如人意。特别是在模型的训练和预测速度上,由于经过多个特征提取和组合方法之后的特征空间会极度膨胀,模型需要学习的参数数量也因此暴涨,从而大大地增加了训练和预测过程的耗时。因此,在候选特征集合中选择保留最有效的部分就显得尤为重要。常用的特征选择方法有卡方检验和信息增益等。
卡方检验的目的是计算每个特征对分类结果的相关性,相关性越大则越有助于分类器进行分类,否则就可以将其作为无用特征抛弃。卡方检验是一种常用的统计检验方法,但是其缺点在于仅考虑特征是否出现对于分类结果的影响,而忽略了词频的重要性,因此卡方检验往往夸大了低频词的作用。信息增益用来计算一个特征对整个分类系统带来的信息的多少,带来的信息越多意味着该特征对分类越重要。此外一些分类算法本身也有特征选择的作用,例如C4.5决策树就是采用信息增益的方法来计算最佳的划分特征、逻辑回归模型训练后可以得到特征权重等。
值得一提的是,TF-IDF并不是一种真正意义上的特征选择方法。通过TF-IDF算法可以得到特征在每一篇文章中重要性,但是却没有考虑特征在类间的分布情况。也就是说,假如类别A中的所有文章都包含词t,类别B中均不包含,但可能由于类别A样本在总样本中占比较极高,原本显著的分类特征t却因为计算得到的TF-IDF值较小而被过滤掉了,这显然没有起到特征选择的目的。
对于各种算法内部的原理和实现,本文并不打算深入探讨。在机器学习算法库趋于成熟的今天,无论是在单机还是分布式甚至GPU集群上,所有你需要做的就是调用和调参即可。因此,在条件允许的情况下,建议尽可能多的在各种数据集上测试不同算法,并且记录其在各项指标上的效果,从而清楚地了解各种算法的特点。
下表总结了各个常用分类算法在中文文本分类情景下的对比情况,可供参考。
*注:TextCNN和LSTM模型的训练一般需要通过GPU加速。
事实上分类算法并没有绝对的好坏之分,在合适的场合才用适当的算法才是关键。如果是在线分类场景,那么预测速度较快的算法应该成为首选;如果需要快速迭代,那么训练速度快且调参难度小的算法更合适;若不考虑时间开销,那么尝试对多个模型进行集成(Ensemble)是最常用的提升分类效果的方法。
许多人将多标签分类(Multi-labelClassification)与多类分类(Multi-classClassification)混淆。后者主要区别于二分类问题,指的是在类别数大于2的候选集合中互斥地选取一个类别作为输出,例如将一条评论按情感倾向分类到{“正面”、“中立”、“负面”}当中的一个。而多标签分类则表示在类别数大于等于2的候选集合中非互斥地选取任意个类别作为输出,例如一篇标题为“国务院决定设立河北雄安新区”的新闻文章可以同时被分为政治、经济两个类别。
多标签分类算法通常被分为两类,一类将多标签分类问题转化为多个单标签二分类问题,被成为问题转化模型(Problem Transformation);另一类则将原来的单标签分类算法修改为支持多标签分类的算法,被称为适应性方法(Adapted Method)。问题转化模型中最常用的一种叫做Binary Relevance,其思想类似于多类分类中的One-Vs-Rest,即对每一个候选类别均训练一个二元分类器来判别样本是否属于该类。因此在类别数目很大的情况下,应尽量选择训练和预测速度较快的算法来训练内部的二元分类器。而在适应性方法中,基于决策树的算法和k最近邻的算法都能够较容易地修改为支持多标签分类的环境。
在面对实际中文文本分类问题时,谁都无法保证自己的模型能够100%分类准确。后处理旨在对模型输出的预测结果进行人工干预,从而保证最后的结果的可靠性。
关键词规则是最常用的后处理方法,其特点在于能够直接地将领域知识引入到分类系统当中。关键词规则不仅可以实现一个或多个关键词对应一个类别,更可以在上层算法给出概率输出的情况下实现一对多和多对多的规则映射。并且,我们可以根据实际情况对不同的关键词规则设定作用强度和优先级,从而更加灵活地调整得到预测结果。值得注意的是要控制关键词规则的粒度大小,粒度过大可能导致其它原本正确的样本被误操作而使得总体的准确性降低;粒度过小会使每条的作用范围变小,极大地增加设置后处理规则的工作量。
在最后输出阶段,还有一个实用的后处理方法就是对概率或置信度较低的预测结果归为“其他”类别,即让模型学会说:“我不知道”。这样做可以提高分类系统的使用体验,而不致于让使用者迷失在错误的猜测结果中。
关于评价指标,一般最先想到的就是分类准确率(Precision),但准确率并不是全部。如果一个分类模型的准确率很高而召回率很低(Recall),那么反而意味着模型没能把其他本该预测出来的类别给预测出来。这常常在两种情况下发生:
一是在非均衡样本中,模型由于学习不到足够的小类的特征而倾向于把大部分小类样本预测为大类类别,虽然预测为小类的部分准确率较高,但是更多的小类样本却没有被召回。面对这种情况,应该关注小类类别的F1值情况,即准确率与召回率调和平均值;
二是在多标签分类中,如果一个模型偏向于保守,那么其可能只对某个多标签的样本预测出最有把握的一个标签,虽然保证了预测准确性,但是仍然没有召回其它的有效标签。此时,可以适当降低内部的二元分类器的预测阈值。如假设原来只有预测得分高于0.5的候选标签被输出,则将阈值降低到0.3时可以得到更多的预测标签,从而提高分类的召回率。
在互联网技术极速发展的今天,文本信息越来越多地以不同的形式出现在我们的视野内。达观数据将文本分类始终作为文本挖掘和NLP领域的关键技术,应用在广泛的场景之中。
王子豪:达观数据高级NLP算法工程师,负责达观数据文本挖掘和NLP算法的开发及应用,在文本分类、观点挖掘和情感分析等领域有丰富实践经验。