想100%了解消费者?用Netflix评论识别人类情感
本文介绍了情感分析这个主题以及如何应用一个深度学习模型。该模型可在Netflix评论中识别和分类人类的情感。
企业最重要的目的之一就是与客户群保持联系。这些公司必须清楚地了解客户对新老产品或服务、最近的举措以及客户服务产品的看法。
情感分析是完成这项必要任务的一种方法。
情感分析属于自然语言处理(NLP)领域,它构建了试图识别和分类表达式属性的模型,例如:
· 极性:如果发言者表达了积极或消极的意见。
· 主题:正在谈论的事情。
· 意见持有人:表达意见的个人或实体。
在每天生成2.5个五万亿字节数据的世界中,情绪分析已成为理解数据的关键工具。这使得公司能够获得关键的见解并将所有类型的流程自动化。
情感分析可以自动地将非结构化信息转换为关于产品、服务、品牌,或任何人们可以表达意见的话题的公众意见的结构化数据。这些数据对于营销分析,公共关系,产品评论,网络发起人评分,产品反馈和客户服务等商业应用非常有用。
在下文中,我们将展示如何将Netflix评论分类为正面或负面的深度学习模型。该模型把所有的评论作为输入(逐字逐句),并提供百分比评级,以检查评论是否传达了积极或消极的情感。
我们使用的数据集含大约5000个负面和5000个正面评论。 以下是来自数据集的5个样本评论,在文章的最后将根据深度学习模型进行分类:
“The film is a hoot and is just as good if not better than much of what s on saturday morning tv, especially the pseudo educational stuff we all can’t stand.。” “The things this movie tries to get the audience to buy just won’t fly with most intelligent viewers.” “Although life or something like it is very much in the mold of feel good movies, the cast and director stephen herek’s polished direction pour delightfully piquant wine from aged bottles.” “This is the case of a pregnant premise being wasted by a script that takes few chances and manages to insult the intelligence of everyone in the audience.” “One of the finest most humane and important holocaust movies ever made.”
(深度学习模型+所有必要数据:https://github.com/artem-oppermann/Sentiment-Analysis-of-Netflix-Reviews)
让我们从理论知识开始吧!
1. 递归神经网络
递归神经网络(RNN)是在许多NLP任务中表现出很大前景的流行模型。
RNN使用文本等顺序信息。在“传统”前馈神经网络中,我们假设所有输入彼此独立。但对于许多任务而言,这样并不好。例如,一个句子具有明确的语法结构和顺序,其中每个单词取决于前一个单词。如果你希望你的神经网络清楚这个含义(或我们例子中的情感),网络必须知道哪些单词以哪种顺序出现。
RNN之所以被称为循环,因为它们对序列的每个元素都执行相同的任务,输出依赖于先前的计算。考虑RNN的另一种方式是它们具有“记忆”,它能捕获到目前为止已经计算的信息。这是典型的RNN的结构:
图1.递归神经网络架构
x(t-1),x(t),x(t+!)是彼此依赖的顺序输入(例如句子中的单词)。Y(t-1),y(t),y(t+1)是输出。RNN的独特之处在于,输入x(t)神经元的当前隐藏状态h(t)的计算取决于先前输入x(t-1)的前一个隐藏状态h(t-1)。 Wxh和Whh是权重矩阵,其分别将输入x(t)与隐藏层h(t)和h(t)与h(t-1)连接。
通过这种方式,我们引入了一个神经网络的递归,它可以被看做为先前输入的记忆。从理论上讲,这种“vanilla”RNN可以在任意长的序列中使用信息,但在实践中,它们仅限于回顾几个步骤。
这就是LSTM派上用场的地方。
1. 1 LSTMs
长短期内存网络——通常被称为“LSTM”——是一种特殊的RNN,能够学习长期依赖性。LSTM与RNN并没有完全不同的架构,但它们各自也包含了额外的组件。
LSTM的关键是单元状态C(t),即贯穿图顶部的水平线。除了仅使用隐藏状态h(t)之外,单元状态是存储存储器的另一种方式。然而,C(t)使得LSTM可以使用vanilla RNN相反的更长序列。
此外,LSTM能够在单元里移除或添加信息状态,由称为门的结构来进行调节。门是一种可选择通过信息的方式。 LSTM具有三个这样的门,用于保护和控制单元状态。
· 忘记门:在获得前一个输入x(t-1)的隐藏状态h(t-1)之后,忘记门帮助我们决定必须删除h(t-1)状态中的什么内容,从而只保留相关的内容。
· 输入门:在输入门中,我们决定将当前输入x(t)中的新信息添加到我们当前的单元状态C(t)中。
· 输出门:顾名思义,输出门决定从当前单元状态C(t)输出到下一个C(t+1)的输出。对于语言模型的例子来说,由于它只是看到一个主题,它可能想要输出与动词相关的信息,以防接下来会发生什么。例如,它可以输出主语是单数还是复数,这样我们就知道接下来如果是单数动词,那么动词应该变成什么形式。
每个状态的背后都是独立的神经网络。可以想象,这使LSTM变得非常复杂。
2. 预处理
在我们将这些评论用作于递归神经网络的输入之前,需要对数据进行一些预处理。我们的主要目的是缩小观察空间。
2.1 统一单词的拼写
想想诸如“Something”和“something”之类的词。对我们来说,这些词语具有相同的含义,它们之间唯一的区别是第一个词是大写的,因为它可能是句子中的第一个词。
但是对于神经网络来说,由于它们的拼写不同,这些单词(至少在开始时)会有不同的含义。只有在训练期间,神经网络才能够学会或不学会识别这些词的含义是否相同。我们的目的是防止这种误解。
因此,预处理的第一步是将所有单词设为小写单词。
2.2 删除特殊字符
诸如。,!? '等的特殊字符不会影响评论的情感,因此可以删除。
最终结果
请看以下未经处理的评论示例:
“Although life or something like it is very much in the mold of feel good movies, the cast and director stephen herek’s polished direction pour delightfully piquant wine from aged bottles.”
在我们执行上述预处理步骤之后,评论示例如下所示:
“although life or something like it is very much in the mold of feel good movies the cast and director stephen hereks polished direction pour delightfully piquant wine from aged bottles”
预处理应用于数据集中的每个评论。
2.3 Word-To-Index
另一个主要步骤是创建一个所谓的Word-To-Index映射,它为数据集中的每个单词分配一个唯一的整数值。我在该项目中使用的包含所有正面和负面评论的数据集由18339个独特单词组成。因此,word-to-index引映射具有相同数量的条目。这个数字也称为词汇量大小。
我们获得的word-to-index映射中的第一个和最后一个条目如下所示:
为数据集中的单词分配唯一整数的这一步骤至关重要,因为我们无法将字符串数据输入到神经网络。相反,单词到索引允许我们使用整数来表示整个句子和评论。请看以下评论:
“这部电影试图让观众购买的东西,在大多数聪明的观众中是行不通的。”
使用word-to-index映射,可以用整数数组来表示评论,其中每个整数根据映射表示一个单词:
[0, 5094, 147, 81, 1269, 5, 532, 0, 1303, 5, 1835, 652, 236, 1101, 125, 188, 712, 855]
3. Word嵌入
当然,神经网络不能将字符串或单个整数值作为输入。因此,我们必须使用Word嵌入。
Word嵌入是文本的分布式表示,这可能是深度学习方法在挑战NLP问题上令人印象深刻的关键突破之一。Word嵌入实际上是一类技术,其中单个单词由实值向量表示,通常具有数十或数百个维度。每个字被映射到一个特定向量,并且向量值由神经网络学习。
这与稀疏字表示所需的数千或数百万维度形成对比,例如单热编码。例如,我们可以将“虽然”和“生命”这些词语嵌入为10维向量:
虽然 = [0.8 1.0 4.2 7.5 3.6] 生命 = [8.3 5.7 7.8 4.6 2.5 ]
表示数据集中表示一个单词的向量都是从一个被称为嵌入矩阵的大矩阵中获得的。此矩阵的行数表示单词嵌入的维度,列数表示数据集中的词汇量大小或唯一单词的数量。因此,该矩阵的每列表示数据集中唯一单词的嵌入向量。
我们如何知道哪一列代表哪个词?这是我们要使用word-to-index映射的地方。假设你想得到单词“虽然”的嵌入向量,根据word-to-index的映射,这个单词由数字2511表示。在下一步中,需要创建一个热编码的向量,大小为18339(数据集中的单词数),其中除了第2511条目的值为1,其它每个条目都为0。
通过在嵌入矩阵和单热编码矢量之间进行点积,我们得到矩阵的第2511列,即单词“虽然”的嵌入向量。
这样就可以将整个字符串段落或Netflix评论提供给LSTM。我们只需在word-to-index映射中查找每个单词的整数值,创建适当的单热编码向量并使用矩阵执行点积。然后将评论逐字(矢量与矢量)馈送到LSTM网络中。
4. 获得评论的情感
到目前为止,你已经了解了如何预处理数据以及如何在LSTM网络中提供评论。现在,让我们讨论如何最终获得给定评论的情感。
对于每个时间步长t,LSTM网络接收输入矢量x(t),其导致输出矢量y(t)。重复该过程直到x(n),n为评论中的单词数。假设n = 20个单词。直到x(n)LSTM网络产生y(n)输出向量。这20个向量中的每一个都代表了某些东西,但并不是是我们正在寻找的情感。相反,矢量y是评论的特征编码表示(基于神经网络),它在确定情感方面是非常重要的。
Y(8)表示神经网络在评论的前8个单词中识别的特征。另一方面,y(20)表示整个评论的特征。虽然在实践中仅使用最后一个输出向量y(20)就足够了,但我发现如果我们使用所有向量y(0)-y(20)来确定情感,它将会使结果变得更准确。这可以通过计算所有向量的平均值来实现。我们称这个平均值向量为y_mean。
最后,可以通过y_mean中编码评论的特征表示将评论分类为正面或负面的类别。为了做到这一点,需要添加一个最终的分类层,它只不过是y_mean和另一个权重矩阵W之间的点积。
刚才描述的情感分析过程是在GitHub中的深度学习模型中操作实现的。在开发模型之后,你可以对尚未看到的评论进行情感分析:
测试样品: 评论: “the film is a hoot and is just as good if not better than much of whats on saturday morning tv especially the pseudo educational stuff we all cant stand” pos. sentiment: 0.96 %neg. sentiment: 0.04 % 评论: “the things this movie tries to get the audience to buy just wont fly with most intelligent viewers” pos. sentiment: 0.11 %neg. sentiment: 0.89 % 评论: “although life or something like it is very much in the mold of feel good movies the cast and director stephen hereks polished direction pour delightfully piquant wine from aged bottles” pos. sentiment: 0.97 %neg. sentiment: 0.03 % 评论: “this is the case of a pregnant premise being wasted by a script that takes few chances and manages to insult the intelligence of everyone in the audience” pos. sentiment: 0.02 %neg. sentiment: 0.98 %