NLP文本分类——豆瓣图书分类实践

文章大纲:
1.从0到1分类系统搭建流程介绍
2.相关技术背景和知识原理
3.分类测评结果

前言

有一段时间没有重新写文章了,这次主要写的内容是自己刚入门的机器学习领域中的文本分类。起初做这个的目的是考虑到一个问题,就是当我想去学习一个新的领域的知识或者尝试了解一些不同方向的东西时,我都需要去寻找这一领域的入门的资料或者书籍(途径之一,不绝对)。那我第一的想法就是去询问这一方面的朋友或者网络上查找有什么这一块入门的书籍推荐。所以想尝试通过大数据训练的方式来完成这个分类和筛选。

新手入门,如果有技术上的错误或者更正的地方,请多多指教。文章中说的大部分模块都放在了我的Github页面上,欢迎各种star和交流,提出issue等,非常感谢。

分类系统流程图

豆瓣图书分类系统

总结了一下整个工作的过程,然后用导图的形式给出来。

稍微的解释一下,第一部分我需要去豆瓣上抓取书籍数据,这里我抓取了书籍的基本信息和书籍的评论(根据书籍的受欢迎程度不同,有的书几百条,有的书有10万条),这里主要依靠的是免费髙匿代理IP框架来进行网络请求,因为目标网站反爬虫的原因,所以需要源源不断有新鲜的IP血液。针对豆瓣图书我已经编写好了爬虫规则,同时对里面的异常做了处理还有详细的日志,感兴趣数据抓取部分的可以移步这里,为了以后方便使用将数据存储在MongoDB中

第二部分就是数据的一些预处理阶段,需要对数据进行分词,使用了比较流行的中文分词的Python库jieba分词,之后清洗的阶段就需要对词进行一些过滤,把没用的词汇给剔除出去。

第三部分训练前的准备,就是需要对训练和测试集进行划分,我是把整个数据集中拿出40%作为测试集,这个比例你可以自己定义,我是大概规定了,没有什么学术的依据。然后进入比较重要的一步,就是特征降维和特征选择,其实特征的选择目的一个是为了达到特征降维的目的,还有就是可以将有效的或者其关键作用的特征筛选出来,提高分类器的效果和效率。

常用的特征选择函数有图中的几种,我在下面会具体介绍。这次也是使用了图中的那些来进行测试,选择效果最好的一种来为分类器做准备。

第四部分就是开始训练了,训练的时候就是将我们的训练数据和分类标签给到分类器,它就会开始训练了。这里拿了四个分类器进行测试,然后这里我测试的时候是直接一次性训练完成的。那么在实际的应用中可能需要使用增量学习,因为数据在不断的变化和更替,而且一次性训练过大的数据也不能达到memory-friendly的要求。

第五部分就是对结果进行评估,看看准确率、召回率、F值等。

技术背景

互信息(Mutual Information)

互信息(Mutual Information)衡量的是某个词和类别之间的统计独立关系,某个词t和某个类别Ci传统的互信息定义如下:互信息是计算语言学模型分析的常用方法,它度量两个对象之间的相互性。在过滤问题中用于度量特征对于主题的区分度。

信息增益方法(Information Gain)

信息增益方法是机器学习的常用方法,在过滤问题中用于度量已知一个特征是否出现于某主题相关文本中对于该主题预测有多少信息。通过计算信息增益可以得到那些在正例样本中出现频率高而在反例样本中出现频率低的特征,以及那些在反例样本中出现频率高而在正例样本中出现频率低的特征。信息增益G(w)的训算公式如下:其中P(w)是词w出现的概率,P(Ci)是取第i个目录时的概率,P(Ci|w) 是假定w出现时取第i个目录的概率。

TF-IDF

其中TF 称为词频,用于计算该词描述文档内容的能力。IDF 称为反文档频率,用于计算该词区分文档的能力。TF-IDF法是以特征词在文档d中出现的次数与包含该特征词的文档数之比作为该词的权重,即其中,Wi表示第i个特征词的权重,TFi(t,d)表示词t在文档d中的出现频率,N表示总的文档数,DF(t)表示包含t的文档数。用TF-IDF算法来计算特征词的权重值是表示当一个词在这篇文档中出现的频率越高,同时在其他文档中出现的次数越少,则表明该词对于表示这篇文档的区分能力越强,所以其权重值就应该越大。

word2vec词向量

一种最简单的词向量是one-hot representation,就是用一个很长的向量来表示一个词,向量的长度是词典D的大小N,向量的分量只有一个为1,其他全为0,1的位置对应该词在词典中的索引。这种词向量表示有一些缺点:容易受维数灾难的困扰。另一种词向量是Distributed Representation,它最早是Hinton于1986年提出来的,可以克服one-hot representation的上述缺点。其基本想法是:通过训练将某种语言中的每个词映射成一个固定长度的短向量。所有这些向量构成一个词向量空间,每个向量是该空间中的一个点,在这个空间上引入距离,就可以根据词之间的距离来判断它们之间的(词法、语义上的)相似性了。如何获取Distributed Representation的词向量呢?有很多不同的模型可以用来估计词向量,包括有名的LSA、LDA和神经网络算法。Word2Vec就是使用度比较广的一个神经网络算法实现的词向量计算工具。

各种分类器

篇幅有限,请翻阅周志华的《机器学习》西瓜书或者网上查阅相关理论。
这里链接一篇朴素贝叶斯的
算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)

测评结果

这里我使用了pycharm为我的IDE,然后分别选取了200本入门书籍和200本非入门书籍进行测试。

先将各个特征选择的选择结果大概放出来看一下,有个直观的印象。


WLLR特征选择前10位特征
MI特征选择前10位特征
IG特征选择前10位特征
word2vec特征选择前10位特征

从这里可以看出特征选择上,word2vec的优势,在于能够更好的理解语义,不仅从概率上来选择。避免了低频词和部分文档信息的丢失。

WLLR特征选择下的四种分类器测评结果
MI特征选择下的四种分类器测评结果
IG特征选择下的四种分类器测评结果
词向量特征选择下的四种分类器测评结果

结论:WLLR和word2vec下的MultinomialNB分类器效果最接近。

最后我在项目中,还是使用了词向量模型,主要是觉得它更能理解语义,相信通过对模型的优化和调参(没错,我就是网友戏称的调参民工!)能够在这一块提高准确率。

使用300本入门和300本非入门,然后进行简单的词向量模型的调参之后的结果。

WLLR和词向量的对比

还是有一点变化的,词向量的特征选择出来的分类器结果有了一些改变。

最后提一下,我使用的机器学习库是Python的scikit-learn,然后在github上也训练了一个word2vec词向量中文模型,使用的是搜狗全网新闻语料(70多万词汇)。可以下载下来直接尝试一下词向量语义理解能力的强大

参考文献:
文本数据的机器学习自动分类方法(上)
文本数据的机器学习自动分类方法(下)
强烈推荐上面两篇infoQ的文章,我就是从这里入门了解整个文本分类的过程和工作的。那对于这一块还有很多相关的知识和理论不了解,所以没有形成很好的对比和实践。如果有更好的解决方案,请告诉我一起来完成。谢谢!

推荐阅读更多精彩内容