使用Apache MXNet进行情感分析

编者注:在这里可以下载本教程用到的所有Jupyter Notebook文件。 
更多人工智能内容请关注O'Reilly和Intel人工智能2018北京大会。

情感分析是数据科学界里一个常见的任务。一个企业可能想监控它的产品在Twitter或是Facebook上被提及的次数,从而能主动察觉(和解决)客户满意度的问题。但是人类的语言是丰富和复杂的,对一些东西有异常多的方式表达正面和负面情绪。反过来,对每种感情也有非常多的表述的方式。在众多的情感分析的机器学习技术里,深度学习已经被证明是能极好地理解这些复杂的内容了。

在本教程里,我们将会使用Apache MXNet构建一个神经网络来对情感进行分类。最终,我们会构建一个分类器,使用电影评论作为输入,试图去识别出对于它所评论的电影是有正面还是负面观点。我们会从一个简单的密集连接模型开始,然后会构建一个和Yoon Kim的这篇论文里类似的卷积网络架构的模型。我们还会使用t-sne这一展示高维数据的技术来可视化输出结果。在最后,我们将会使用迁移学习技术。我们会使用预先建立好的词向量模型glove到我们的神经网络里来分类句子。虽然有非常多的深度学习的框架,例如TensorFlow、Kera、Torch和Caffe,但我们会使用Apache MXNet。因为MXNet的灵活性和跨多GPU的扩展性,它正变得流行起来。

我强烈建议你下载这些Notebook文件。其中有我写好和运行通过的代码。去尝试它们!调整一些超参数,对神经网络架构或是数据准备过程试验不同的方法,看看你能否在准确度上超过我。

Notebook文件里面的内容要求你对卷积运算、神经网络、激活单元、梯度下降和Numpy库有基本的理解。

在学习完本文的内容后,你将能够:

1.理解情感分析的复杂性。

2.理解词向量和它的应用。

3.为训练神经网络准备数据集。

4.为使用不同的模型进行情感分类来实现神经网络架构的定制。

5.使用t-sne来可视化输出的结果。

6.凭借已有的词向量(如glove)来用有限的数据(小数据集或是短句子)进行训练。

情感分析

情感分析是一个复杂的任务。理解一个句子是表达的正面还是负面观点是非常困难的。例如这个句子,“这个电影够无脑、无厘头的,还相当得土,但是我喜欢。”尽管这个句子里包含了好几个负面的词语(无脑、无厘头和土),但这个句子却表达的是正面的观点(“但是我喜欢”)。另外一个不能仅凭单个词语来简单理解的句子是:“这部电影并不关心任何的聪明、智慧和任何类型的智能。”虽然句子里包含了不少的正面词汇(聪明、智慧和智能),但它是一个负面的评论。

一些句子是带有嘲讽性的,或者它们的意思取决于上下文。比如“《飓风营救3》让《飓风营救2》成为一部佳作”。我们能理解这句话其实是贬义,因为我们知道它的上下文(《飓风营救2》并不是一部好片子)。

由于上下文的关系,情感分析是一项非常困难的任务。它的准确性很多时候依赖于要处理的数据。一个情感分析器可能在一套数据上表现得很好,但在另外一套上就表现很糟。机器学习的开发人员应该意识到这一点,并检查他们的模型是否能捕获到数据的变化从而避免尴尬的失败。

编码数据集

越远离表格化数据,数据的处理就越复杂。相比于文字,即使是把图像编码成数字这样的工作都是一个相对简单直接的过程。每个像素只能在RGB色彩空间的0-255之内取值,这些值被存储在一个二维的数组里。对一张图片重设尺寸并不会影响其内容,因此我们可以相对容易地(基于图像处理专家的工作之上)把图像标准化输出为可比较的数组。

但是,把自然语言(词汇)编码成数字就不那么容易了。一种语言可以有海量的词汇,用这些词汇形成的句子就能有各种变化。有时,重设句子的尺寸就会完全改变它们的意思。

让我们看一个样例来帮助理解编码自然语言的过程。看看这组词{我、爱、蛋糕、不喜欢、披萨}({I、love、cake、hate、pizza})。它们构成了我们整个的词汇表。下面两个句子就是用这个词汇表里面的词汇构成的:“我爱蛋糕”(I love cake),“我不喜欢披萨”(I hate pizza)。

我们如何能把这些句子编码成数字?一种方法是使用one-hot编码法把这个词汇表表示成一个如下所示的编码矩阵。

在这个表示方法里,如果词汇表里有N个词,我们就需要一个N×N的矩阵。这个矩阵被叫做词汇表矩阵。这个词汇表矩阵就是查找词汇的表。

现在,让我们试着编码句子。“我不喜欢披萨”将会成为下面这个矩阵。

如果一个词出现在句子里,相应的词汇的行就被从词汇表矩阵里复制过来。这就和在MXNet(或是其他的深度学习框架)的神经网络里的向量层所做的操作是一样的。这一“向量层”就仅仅是进行查找操作,请不要和“词向量”搞混了。关于词向量,我们很快就会介绍的。

有比one-hot编码词汇表更好的方法吗?有更好的表征词的方式吗?词向量就能解决这个问题。与离散化词汇不同,词向量对词汇提供了一个连续值的表征。一个词向量矩阵可以像下面这个样子。

与使用N×N矩阵的词汇表示法不同,我们这里使用一个N×3的矩阵来表征词汇。这里的3就是向量的长度。因此,每个词被表示成了一个3维的向量,而不是N维向量。

词向量不仅能降低词汇表矩阵的尺寸,还能够编码词和词之间的语义关系。例如,“披萨”和“蛋糕”在词汇表里有相似的向量表示,因为它们二者都是食物。“喜爱”和“不喜欢”在第二维上有相同的值,因为它们都表达了感受;但在第一维度上却截然不同(分别是0.9和0.1),因为它们表示的是相反的情感。

这些向量是哪里来的?这些词向量可以是由你的深度神经网络在自动进行情感分类过重中学习到的。特定词的词向量可以被理解成你的深度神经网络需要去学习的权重。这些向量技术也可以被用于图片和其他类型的数据;它们通常被认为是自编码器网络。通常,自编码器试图去用一个更低维的空间来表征输入内容,同时保证最小的信息损失。关于自编码器的详细解释可以在这里找到。

句子的卷积

当用向量层把句子编码成矩阵后,我们就可以对编码矩阵进行一维卷积。这和对两维的图像进行两维卷积很类似。卷积滤波器的尺寸取决于我们想要使用的n-gram。

在边缘的卷积运算会假定输入的边缘是零。这一卷积运算将会帮你基于n-gram从句子里学习。

下面,我们用一个真实的电影评论数据集来看看如何使用MXNet来进行情感分类。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值