深度学习实战(三):利用RNN与LSTM网络实战——LSTM进行情感分析

版权声明:本文为博主原创文章,未经博主允许不得转载


一、RNN / LSTM结构介绍

RNN 与 LSTM在这里插入图片描述
RNN结构图在这里插入图片描述
LSTM结构图
这里提出使用的是LSTM,也叫做长短时记忆网络,该网络其实是RNN的衍生,主要是为针对RNN的缺点设计出来的,一个神经单元有遗忘门、输入门、输出门,该网络除了结构有所改变,其训练方法和其它NN一样,也是主要采用反向传播、梯度的方法。下面贴出其单个神经单元的结构图:
在这里插入图片描述
该结构继承了RNN的记忆功能,也改善了RNN不能够排除掉很久以前的信息,在文本处理中,可能现阶段的文本与很久之前的文本没有一丁点关系了,但是RNN依然保留了很久之前的信息,不能排除。但LSTM由于有遗忘门,便可以“慢慢遗忘”之前无关的信息

二、LSTM情感分类分析

2.1 项目介绍

【项目目标】

  • LSTM & Word2Vec结合

【何为文本情感分析?】

  • 即:用户输入了一句话,我们需要靠机器来知道这句话的情感,本文会以开心和不开心为例,来进行情感分析,有点像二分类,但并不是。

2.2 深度学习在自然语言处理中的应用

自然语言处理是教会机器如何去处理或者读懂人类语言的系统,主要应用领域:

  (1)对话系统 : 聊天机器人(小冰)

  (2)情感分析 : 对一段文本进行情感识别(我们一会要做的)

  (3)图文映射 : CNN和RNN的融合

  (3)机器翻译 : 将一种语言翻译成另一种语言,现在谷歌做的太牛了

  (3)语音识别 : 能不能应用到游戏上

2.3 词向量模型

计算机可只认识数字!
在这里插入图片描述
我们可以将一句话中的每一个词都转换成一个向量
在这里插入图片描述
你可以将输入数据看成是一个 16*D 的一个矩阵。

词向量是具有空间意义的并不是简单的映射!例如,我们希望单词 “love” 和 “adore” 这两个词在向量空间中是有一定的相关性的,因为他们有类似的定义,他们都在类似的上下文中使用。 单词的向量表示也被称之为词嵌入。
在这里插入图片描述

2.4 Word2Vec

为了去得到这些词嵌入,我们使用一个非常厉害的模型 “Word2Vec”:简单的说,这个模型根据上下文的语境来推断出每个词的词向量。如果这两个词在上下文的语境中,可以被互相替换,那么这两个词的距离就非常近。在自然语言中,上下文的语境对分析词语的意义是非常重要的。比如,之前我们提到的 “adore” 和 “love” 这两个词,我们观察如下上下文的语境。
在这里插入图片描述
从句子中我们可以看到,这两个词通常在句子中是表现积极的,而且一般比名词或者名词组合要好。这也说明了,这两个词可以被互相替换,他们的意思是非常相近的。对于句子的语法结构分析,上下文语境也是非常重要的。所以,这个模型的作用就是从一大堆句子(以 Wikipedia 为例)中为每个独一无二的单词进行建模,并且输出一个唯一的向量。Word2Vec 模型的输出被称为一个嵌入矩阵。在这里插入图片描述
这个嵌入矩阵包含训练集中每个词的一个向量。传统来讲,这个嵌入矩阵中的词向量数据会很大。Word2Vec 模型根据数据集中的每个句子进行训练,并且以一个固定窗口在句子上进行滑动,根据句子的上下文来预测固定窗口中间那个词的向量。然后根据一个损失函数和优化方法,来对这个模型进行训练。

2.5 Recurrent Neural Networks (RNNs)

现在,我们已经得到了神经网络的输入数据 —— 词向量,接下来让我们看看需要构建的神经网络。NLP 数据的一个独特之处是它是时间序列数据。每个单词的出现都依赖于它的前一个单词和后一个单词。由于这种依赖的存在,我们使用循环神经网络来处理这种时间序列数据。

循环神经网络的结构和你之前看到的那些前馈神经网络的结构可能有一些不一样。前馈神经网络由三部分组成,输入层,隐藏层和输出层。
在这里插入图片描述
前馈神经网络和 RNN 之间的主要区别就是 RNN 考虑了时间的信息。在 RNN 中,句子中的每个单词都被考虑上了时间步骤。实际上,时间步长的数量将等于最大序列长度。在这里插入图片描述
与每个时间步骤相关联的中间状态也被作为一个新的组件,称为隐藏状态向量 h(t) 。从抽象的角度来看,这个向量是用来封装和汇总前面时间步骤中所看到的所有信息。就像 x(t) 表示一个向量,它封装了一个特定单词的所有信息。

隐藏状态是当前单词向量和前一步的隐藏状态向量的函数。并且这两项之和需要通过激活函数来进行激活。在这里插入图片描述在这里插入图片描述

2.6 Long Short Term Memory Units (LSTMs)

长短期记忆网络单元,是另一个 RNN 中的模块。从抽象的角度看,LSTM 保存了文本中长期的依赖信息。正如我们前面所看到的,H 在传统的RNN网络中是非常简单的,这种简单结构不能有效的将历史信息链接在一起。举个例子,在问答领域中,假设我们得到如下一段文本,那么 LSTM 就可以很好的将历史信息进行记录学习。在这里插入图片描述
在这里,我们看到中间的句子对被问的问题没有影响。然而,第一句和第三句之间有很强的联系。对于一个典型的RNN网络,隐藏状态向量对于第二句的存储信息量可能比第一句的信息量会大很多但是LSTM,基本上就会判断哪些信息是有用的,哪些是没用的,并且把有用的信息在 LSTM 中进行保存。


我们从技术的角度来谈谈 LSTM 单元,该单元根据输入数据 x(t) ,隐藏层输出 h(t) 。在这些单元中,h(t) 的表达形式比经典的 RNN 网络会复杂很多这些复杂组件分为四个部分:输入门,输出门,遗忘门和一个记忆控制器在这里插入图片描述
每个门都将 x(t) 和 h(t-1) 作为输入(没有在图中显示出来), 并且利用这些输入来计算一些中间状态每个中间状态都会被送入不同的管道,并且这些信息最终会汇集到 h(t) 。为简单起见,我们不会去关心每一个门的具体推导。 这些门可以被认为是不同的模块,各有不同的功能。输入门决定在每个输入上施加多少强调,遗忘门决定我们将丢弃什么信息,输出门根据中间状态来决定最终的 h(t)

三、案例流程

(1)制作词向量,可以使用gensim这个库,也可以直接用现成的

(2)词和ID的映射,常规套路了

(3)构建RNN网络架构

(4)训练我们的模型

(5)验证模型

四、代码实现

注意:此代码是基于Jupyter Notebook运行的

4.1 情感数据集处理

wordsList.npy
    数据类型:numpy array ——> list ——> 编码:‘UTF-8’

wordVectors
    数据类型:numpy.array
    拿着wordsList里的词访问wordVectors嵌入矩阵来得到相应的向量

4.1.1 导入数据 / 加载词向量模型

首先 ,我们需要去创建词向量。为了简单起见,我们使用训练好的模型来创建。

作为该领域的一个最大玩家,Google 已经帮助我们在大规模数据集上训练出来了 Word2Vec 模型,包括 1000 亿个不同的词!在这个模型中,谷歌能创建 300 万个词向量,每个向量维度为 300。

在理想情况下,我们将使用这些向量来构建模型,但是因为这个单词向量矩阵相当大(3.6G),我们用另外一个现成的小一些的,该矩阵由 GloVe 进行训练得到。矩阵将包含 400000 个词向量,每个向量的维数为 50。

我们将导入两个不同的数据结构:一个是包含 400000 个单词的 Python 列表,一个是包含所有单词向量值的 400000*50 维的嵌入矩阵

import numpy as np
wordsList = np.load('./training_data/wordsList.npy')

# Originally loaded as numpy array
wordsList = wordsList.tolist()

# Encode words as UTF-8
wordsList = [word.decode('UTF-8') for word in wordsList]

wordVectors = np.load('./training_data/wordVectors.npy')

【例子讲解】得到词向量

wordsList :词库

wordVectors :嵌入矩阵

我们也可以在词库中搜索单词,比如“baseball”,然后可以通过访问嵌入矩阵来得到相应的向量,如下:

baseballIndex = wordsList.index('baseball')
wordVectors[baseballIndex]  

在这里插入图片描述

现在我们有了向量,我们的第一步就是输入一个句子,然后构造它的向量表示

假设我们现在的输入句子是:“I thought the movie was incredible and inspiring.”

为了得到词向量,我们可以使用 Tensorflow 的嵌入函数:这个函数有2个参数,一个是嵌入矩阵(在我们的情况下是词向量矩阵),另一个是每个词对应的索引

【例子讲解】得到词向量

import tensorflow as tf
maxSeqLegth = 10  # Maximum length of sentence
numDimensions = 300 # Dimensions for each word vector

firstSentence = np.zeros((maxSeqLegth), dtype='int32')
firstSentence[0] = wordsList.index('i')
firstSentence[1] = wordsList.index('thought')
firstSentence[2] = wordsList.index(
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

InitialHeart2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值