文本分类是自然语言处理领域比较常见的一类任务,一般是给定多个文档类别,将文档或语句归类到某个类别中。其本质是文本特征提取+机器学习的多分类问题。解决此问题,最终实现文本分类预测的一般步骤总结如下。
1. 文档标注
文本分类任务可使用机器学习的多分类算法的思路解决,为了满足训练模型的需要,首先要将样本文档库中的所有文档打标签,将每个文档标注为待预测类别。若文档库中的文档已做好分类,此步骤可以省略。文档打标签的工作一般由人工完成,由于机器学习算法对训练样本数据的规模有要求,一般来说,训练出较准确的模型,至少需要5000以上的样本数据。所以文档标注工作是在5000以上的样本文档库中进行的,需要花费大量的重复劳动才能完成。
为减少标注工作量,可以借鉴半监督学习的思路,先尝试文本聚类的方式对样本库中的部分文档进行聚类,然后再人工修正聚类结果中分类错误的样本,最后对所有文档进行聚类。
2. 文档格式转换
样本文档库中的数据一般为Word、PDF、Excel等格式,为方便后期做向量化处理,需要将文档转换为Txt格式,转换后的文档中不含图片、不含格式,是纯文本。
3. 生成词典
提取文档中的特征,首先要针对整个文档库构建词典,构建词典的步骤如下。
(1) 中文分词
使用中文分词技术可以将文档切割成词汇,常用的中文分词工具包是结巴分词器,该分词器支持全模式、精确模式、搜索引擎模式、基于 TF-IDF算法的关键词抽取模式共四种分词方式。建议使用精确模式或关键词抽取模式。
(2) 去停用词
停用词是指文档中的连接字、标点符号、数字等,停用词在中文文档中大篇幅存在,且不能代表文档的关键含义,对分类无价值。去掉停用词可以减少文档分词后的词汇量,提高计算效率。
(3) 去低频词
低频词是指文档中出现次数小于5次的词汇,与停用词相同,低频词对文档分类亦无价值,去掉低频词有利于缩短文档分类的建模时间。
(4) 构建词典
所有文档经过以上三步处理后,即可加入词典,词典中每个词汇只出现一次。使用开源工具包Gensim可以实现词典的构建。
4. 计算词语权重
如果某个词或短语在一篇文章中出现的频率很高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。通过计算词语的权重,可以找出文档中的关键词,从而确定分类的依据。常用的词语权重计算方法为TF-IDF算法。开源工具包Gensim可以实现基于TF-IDF算法的词语权重计算。
TF-IDF = 词频(TF) * 逆文档频率(IDF)
词频(TF) = 某个词在文档中的出现次数/文章的总词数
逆文档频率(IDF) = log(语料库的文档总数/(包含该词的文档数+1))
5. 主题建模
主题建模是一种提取文档中隐含主题特征的方法,通过提取文档中重要的主题或主题的概率分布,过滤次要的主题,从而确定文档分类的依据。常用的主题模型有潜在语义索引(Latent Semantic Index,LSI)、概率潜在语义分析(Probabilistic Latent Semantic Analysis,PLSA)、潜在的狄利克雷分布(Latent Dirichlet Allocation,LDA)。开源工具包Gensim可以实现LSI、PLSA、LDA的主题建模。
LSI基于矩阵奇异值分解的原理提取文档的主题特征,因为涉及到高维度矩阵的SVD计算,所以适合小规模的文档分类任务,在使用LSI时,K值的选取直接影响到最终分类模型的准确率,K值越大,计算复杂度越高,建议测试不同K值下的分类准确率,从而确定最佳K值,经测试,K值取在200-500区间内,分类效果最佳,但建模时间较长。
PLSA与LDA都是基于统计学中概率分布的原理提取文档的主题特征,提取主题的准确率与计算效率有待验证。
6. 训练分类模型
经过1-5步的处理,样本文档已经转换为了高维矩阵,再使用机器学习中解决分类问题的套路即可训练出样本文档库的分类模型。使用开源工具包Scikit-Learn可实现分类模型训练任务。
(1)首先将样本文档按照6:2:2的比例切分为训练集、验证集、测试集。
(2)基于训练集、使用不同的多分类算法可训练出多个模型,在验证集上测试这些模型的错误率,选择错误率最低的模型作为预测模型。
(3)基于测试集,使用步骤(2)中确定的预测模型预测数据,通过观察预测错误率判断是否欠拟合或过拟合。针对欠拟合与过拟合情况,做出相应调整(更换文档特征提取方法、更换机器学习分类算法等),降低预测错误率,直至达到预期目标。
笔者基于160W文档规模的新闻公开数据集,使用LSI提取文档主题,并使用不同分类算法的预测错误率如下表所示。
| SVM | LR | LRCV | LRCV(multinomial) | BernoulliNB | GaussianNB |
K=50 | 0.122 | 0.137 | 0.124 | 0.118 | 0.181 | 0.24 |
K=200 | 0.087 | -- | -- | -- | -- | -- |
当K=200,使用SVM分类器时,误差较小,但训练时间最长,约4小时。
7. 预测
针对预测文档,进行中文分词、去停用词与低频词、词语权重计算、主题建模处理后,即可使用分类模型进行预测。