搭建LSTM(深度学习模型)做文本情感分类的代码

2017 年 9 月 3 日 数据挖掘入门与实战 要学习更多点这→



大数据挖掘DT数据分析  公众号: datadw


传统的文本情感分类思路简单易懂,而且稳定性也比较强,然而存在着两个难以克服的局限性:

一、精度问题,传统思路差强人意,当然一般的应用已经足够了,但是要进一步提高精度,却缺乏比较好的方法;

二、背景知识问题,传统思路需要事先提取好情感词典,而这一步骤,往往需要人工操作才能保证准确率,换句话说,做这个事情的人,不仅仅要是数据挖掘专家,还需要语言学家,这个背景知识依赖性问题会阻碍着自然语言处理的进步。

庆幸的是,深度学习解决了这个问题(至少很大程度上解决了),它允许我们在几乎“零背景”的前提下,为某个领域的实际问题建立模型。本文延续上一篇文章所谈及的文本情感分类为例,简单讲解深度学习模型。其中上一篇文章已经详细讨论过的部分,本文不再详细展开。

深度学习与自然语言处理

近年来,深度学习算法被应用到了自然语言处理领域,获得了比传统模型更优秀的成果。如Bengio等学者基于深度学习的思想构建了神经概率语言模型,并进一步利用各种深层神经网络在大规模英文语料上进行语言模型的训练,得到了较好的语义表征,完成了句法分析和情感分类等常见的自然语言处理任务,为大数据时代的自然语言处理提供了新的思路。

经过笔者的测试,基于深度神经网络的情感分析模型,其准确率往往有95%以上,深度学习算法的魅力和威力可见一斑!

关于深度学习进一步的资料,请参考以下文献:

[1] Yoshua Bengio, Réjean Ducharme Pascal Vincent, Christian Jauvin. A Neural Probabilistic Language Model, 2003
[2] 一种新的语言模型:http://blog.sciencenet.cn/blog-795431-647334.html
[3] Deep Learning(深度学习)学习笔记整理:http://blog.csdn.net/zouxy09/article/details/8775360
[4] Deep Learning:http://deeplearning.net
[5] 漫话中文自动分词和语义识别:http://www.matrix67.com/blog/archives/4212
[6] Deep Learning 在中文分词和词性标注任务中的应用:http://blog.csdn.net/itplus/article/details/13616045

语言的表达


建模环节中最重要的一步是特征提取,在自然语言处理中也不例外。在自然语言处理中,最核心的一个问题是,如何把一个句子用数字的形式有效地表达出来?如果能够完成这一步,句子的分类就不成问题了。显然,一个最初等的思路是:给每个词语赋予唯一的编号1,2,3,4...,然后把句子看成是编号的集合,比如假设1,2,3,4分别代表“我”、“你”、“爱”、“恨”,那么“我爱你”就是[1, 3, 2],“我恨你”就是[1, 4, 2]。这种思路看起来有效,实际上非常有问题,比如一个稳定的模型会认为3跟4是很接近的,因此[1, 3, 2]和[1, 4, 2]应当给出接近的分类结果,但是按照我们的编号,3跟4所代表的词语意思完全相反,分类结果不可能相同。因此,这种编码方式不可能给出好的结果。

读者也许会想到,我将意思相近的词语的编号凑在一堆(给予相近的编号)不就行了?嗯,确实如果,如果有办法把相近的词语编号放在一起,那么确实会大大提高模型的准确率。可是问题来了,如果给出每个词语唯一的编号,并且将相近的词语编号设为相近,实际上是假设了语义的单一性,也就是说,语义仅仅是一维的。然而事实并非如此,语义应该是多维的。

比如我们谈到“家园”,有的人会想到近义词“家庭”,从“家庭”又会想到“亲人”,这些都是有相近意思的词语;另外,从“家园”,有的人会想到“地球”,从“地球”又会想到“火星”。换句话说,“亲人”、“火星”都可以看作是“家园”的二级近似,但是“亲人”跟“火星”本身就没有什么明显的联系了。此外,从语义上来讲,“大学”、“舒适”也可以看做是“家园”的二级近似,显然,如果仅通过一个唯一的编号,是很难把这些词语放到适合的位置的。

Word2Vec:高维来了


从上面的讨论可以知道,很多词语的意思是各个方向发散开的,而不是单纯的一个方向,因此唯一的编号不是特别理想。那么,多个编号如何?换句话说,将词语对应一个多维向量?不错,这正是非常正确的思路。


为什么多维向量可行?首先,多维向量解决了词语的多方向发散问题,仅仅是二维向量就可以360度全方位旋转了,何况是更高维呢(实际应用中一般是几百维)。其次,还有一个比较实际的问题,就是多维向量允许我们用变化较小的数字来表征词语。怎么说?我们知道,就中文而言,词语的数量就多达数十万,如果给每个词语唯一的编号,那么编号就是从1到几十万变化,变化幅度如此之大,模型的稳定性是很难保证的。如果是高维向量,比如说20维,那么仅需要0和1就可以表达