赞
踩
自然语言处理是当代机器学习一块很重要的分支,而情绪分析也是NLP中的重要研究部分。本文为基于简单的“情绪数据集”,通过词向量模型,LSTM等方法训练神经网络模型,对句子进行情绪上的分类与识别。最终识别准确率可达到90.95%。
关键词:NLP, 文本情感分析,情绪分析,词向量模型,LSTM,神经网络,深度学习。
自然语言处理(NLP)是一种专业分析人类语言的人工智能。它接收自然语言,
转译自然语言,最后分析自然语言并输出结果。文本情感分析(Sentiment Analysis)是指利用自然语言处理和文本挖掘技术,对带有情感色彩的主观性文本进行分析、处理和抽取的过程。
深度学习技术发展到今天,在自然语言处理领域有很多的应用。而由于人类语言的多样性、多意性,使得NLP的难度成倍增加。例如由相同的三个字形成的组合“不怕辣”、“辣不怕”、“怕不辣”、“怕辣不”表达了不同的含义。因此,对于自然语言的处理仍具有挑战性与发展空间。本文旨在分析自然语言语句(英语为例),来对其表达的情绪进行归类于分析。
人类想要读懂一句话往往非常容易,然而对于机器来讲却是一个需要不断学习的漫长而复杂的过程。想要让机器读懂一句话,我们必须将自然语言转化成计算机可识别的数字。文本向量化表示就是用数值向量来表示文本的语义。我们人类在读一段文本后立刻就能明白它要表达的内容,如何让机器也能拥有这样的能力呢?
在得到了神经网络的输入数据——词向量后,我们需要确定将要构建的神经网络。NLP数据的一个独特之处是它是时间序列数据。每个单词的出现都依赖于它的前一个单词和后一个单词。由于这种依赖的存在,我们使用循环神经网络来处理这种时间序列数据。
循环神经网络的结构和你之前看到的那些前馈神经网络的结构可能有一些不一样。前馈神经网络由三部分组成,输入层、隐藏层和输出层。
前馈神经网络和RNN之前的主要区别就是RNN考虑了时间的信息。在RNN中,句子中的每个单词都被考虑上了时间步骤。实际上,时间步长的数量将等于最大序列长度。
与每个时间步骤相关联的中间状态也被作为一个新的组件,称为隐藏状态向量h(t)。从抽象的角度来看,这个向量是用来封装和汇总前面时间步骤中所看到的所有信息。就像x(t)表示一个向量,它封装了一个特定单词的所有信息。
隐藏状态是当前单词向量和前一步的隐藏状态向量的函数。并且这两项之和需要通过激活函数来进行激活。
然而,RNN存在一个致命的缺点——即梯度消失的问题,很难处理长序列的数据。为了解决此问题,我们又引入了本文所用到的方法:LSTM。
为了解决RNN存在问题,后续人们对RNN做了改进,得到了RNN的特例LSTM,它可以避免常规RNN的梯度消失,因此在工业界得到了广泛的应用。LSTM模型是RNN的变体,它能够学习长期依赖,允许信息长期存在。
举个例子来讲:比如人们读文章的时候,人们会根据已经阅读过的内容来对后面的内容进行理解,不会把之前的东西都丢掉从头进行思考,对内容的理解是贯穿的。
传统的神经网络即RNN做不到这一点,LSTM是具有循环的网络,解决了信息无法长期存在的问题,在工业界普遍使用有良好的效果。
RNN与LSTM之间的联系:
RNN具有如下的结构,每个序列索引位置t都有一个隐藏状态h(t):
如果略去每层都有的o(t),L(t),y(t),则RNN的模型可以简化成如下图的形式:
可以看出h(t)由x(t)和h(t−1)得到。得到h(t)后一方面用于当前层的模型损失计算,另一方面用于计算下一层的h(t+1)。
为了避免RNN的梯度消失,LSTM将tanh激活函数转为更为复杂的结构。LSTM的结构如下图:
粉红色圆圈表示点向运算,如向量加法、点乘,而黄色框是学习神经网络层。 线的合并表示连接,而线的交叉表示其内容正在复制,副本将转到不同的位置。
LSTM的工作原理:
对于一个典型的RNN网络,隐藏状态向量对于第二句的存储信息量可能比第一句的信息量会大很多。但是LSTM,基本上就会判断哪些信息是有用的,哪些是没用的,并且把有用的信息在LSTM中进行保存。
LSTM的单元根据输入数据x(t),隐藏层输出h(t)。在这些单元中,h(t)的表达形式比经典的RNN网络会复杂很多。这些复杂组件分为四个部分:输入门、输出门、遗忘门和一个记忆控制器。
每个门都将x(t)和h(t-1)作为输入,并且利用这些输入来计算一些中间状态。每个中间状态都会被送入不同的管道,并且这些信息最终会汇集到h(t)。这些门可以被认为是不同的模块,各有不同的功能。Ct是控制参数,控制什么样的值保留,什么样的值舍弃,输入门决定在每个输入上施加多少强调,遗忘门决定我们将丢弃什么信息,输出门根据中间状态来决定最终的h(t)。
简要来说,LSTM 单元能够学习到识别重要输入(输入门作用),存储进长时状态,并保存必要的时间(遗忘门功能),并学会提取当前输出所需要的记忆。这也解释了 LSTM 单元能够在提取长时序列,长文本,录音等数据中的长期模式的惊人成功的原因。
本次的数据集来自Kaggel上专门为情感分析提供的数据集。地址 https://www.kaggle.com/praveengovi/emotions-dataset-for-nlp
该数据集包含了三个文档
通过这三个文档我们将建立机器学习模型。以下是train.txt的部分数据:
Eg: i didnt fell humiliated;sadness,这条数据中包含了:1. 句子的具体内容: i didnt fell humiliated; 2. 事先人为分类号的情绪标签: sadness。
导入并展示:
# 导入数据集
train = pd.read_csv('E:/大三下/机器学习/NLP情感分析/train.txt', sep=';', header=None)
# 重命名Dataframe列名
train.columns=['Sentence', 'Sentiment']
# 统计数据集中情感种类以及出现次数
train['Sentiment'].value_counts()
joy 5362
sadness 4666
anger 2159
fear 1937
love 1304
surprise 572
Name: Sentiment, dtype: int64
train
Sentence | Sentiment | |
---|---|---|
0 | i didnt feel humiliated | sadness |
1 | i can go from feeling so hopeless to so damned... | sadness |
2 | im grabbing a minute to post i feel greedy wrong | anger |
3 | i am ever feeling nostalgic about the fireplac... | love |
4 | i am feeling grouchy | anger |
... | ... | ... |
15995 | i just had a very brief time in the beanbag an... | sadness |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。