手把手教你用RNN做情感分析—初学者指南(附代码)

简介: 情感分析是NLP中最常见的应用之一,作者在博文中把情感分析建模成二分类问题,使用端到端的RNN网络建模,用Keras实现,简洁易懂,是学习RNN文本建模的好文,并附相应的Python代码实现。

A Beginner’s Guide on Sentiment Analysis with RNN

情感分析(Sentiment analysis)可以说是自然语言处理最常见的一个应用了。我不需要再强调对客户服务工具的情感分析变得有多么重要。因此在这里,我们将使用RNN(Recurrent Neural Networks)在 IMDB数据集【】中训练一个电影评论分类器。如果你想要深入学习情感分析,请参考下面论文:
https://arxiv.org/ftp/arxiv/papers/1801/1801.07883.pdf

数据(The data)

我们将使用循环神经网络,特别是LSTM,在Keras中编写情感分析的代码。方便的是,Keras有一个内置的IMDb电影评论数据集,我们可以使用它。

from keras.datasets import imdb

设置词库的大小,加载训练和测试数据。

vocabulary_size = 5000
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words = 
vocabulary_size)
print('Loaded dataset with {} training samples, {} test samples'.
format(len(X_train), len(X_test)))

加载数据集,包含25000个训练样本,25000个测试样本

检查样本及其标签(打印出某个样本)。
结果如图1所示

print('---review---')
print(X_train[6])
print('---label---')
print(y_train[6])

image

图1


值得注意的是评论被存储为一个整数序列。这个序列中的整数是预先分配给单个单词的单词id,标签是一个整数(0表示消极的,1表示积极的)。

我们可以使用imdb.get_word_index()返回的字典将评论映射回原始单词。如图2所示。

word2id = imdb.get_word_index()
id2word = {i: word for word, i in word2id.items()}
print('---review with words---')
print([id2word.get(i, ' ') for i in X_train[6]])
print('---label---')
print(y_train[6])

image

图2

打印出最长评论的长度和最短评论的长度:

print('Maximumreview length: {}'.format(
len(max((X_train+ X_test), key=len))))

最长评论的长度为2697

print('Minimum review length: {}'.format(
len(min((X_test + X_test), key=len))))

最短评论的长度为14

填充序列(Pad sequences)

为了将这些数据输入到RNN中,所有输入序列都必须具有相同的长度。我们将截断较长的评论,并限制评论的最大长度为max_words,并使用0来填充较短的评论。现在,将max_words设置为500。

from keras.preprocessing import sequence
max_words = 500
X_train = sequence.pad_sequences(X_train, maxlen=max_words)
X_test = sequence.pad_sequences(X_test, maxlen=max_words)

设计情感分析的RNN模型

我们开始在下面的代码单元中构建模型架构。我们已经从Keras中导入了一些layer,你可能需要这些layer,但是也可以自由地使用你喜欢的任何其他layers / transformations。

记住,我们的输入是一个最大长度为 max_words的单词序列(技术上说,序列中的整数为单词id),我们的输出是一个二进制情感标签(0或1)。

from keras import Sequential
from keras.layers import Embedding, LSTM, Dense, Dropout
embedding_size=32
model=Sequential()
model.add(Embedding(vocabulary_size, embedding_size, 
input_length=max_words))
model.add(LSTM(100))
model.add(Dense(1, activation='sigmoid'))
print(model.summary())

结果如图3

image

图3

总而言之,我们的模型是一个简单的RNN模型,具有1个embedding层,1个LSTM层和1个dense层。总共需要训练213,301个参数。

训练和评估我们的模型

我们首先需要通过指定在训练时使用的损失函数和优化器以及我们想要测量的任何评估指标来编译我们的模型。指定适当的参数,至少包括一个度量指标“accuracy”。

model.compile(loss='binary_crossentropy',
             optimizer='adam',
             metrics=['accuracy'])

编译完成后,我们就可以开始训练过程。我们必须指定两个重要的训练参数——批处理大小(batch size)和训练周期的数量(number of training epochs),它们与我们的模型体系结构一起决定了总的训练时间。

训练可能需要一段时间!

batch_size = 64
num_epochs = 3
X_valid, y_valid = X_train[:batch_size], y_train[:batch_size]
X_train2, y_train2 = X_train[batch_size:], y_train[batch_size:]
model.fit(X_train2, y_train2, validation_data=(X_valid, y_valid), 
batch_size=batch_size, epochs=num_epochs)

结果如图4

image

图4


一旦我们训练好了模型,就该看看它在未知的测试数据上的表现如何了。

scores[1]将会对应于评价指标 metrics=[‘accuracy’]。

scores =model.evaluate(X_test, y_test, verbose=0)
print('Testaccuracy:', scores[1])

结果:
Test accuracy: 0.86964

总结

我们可以通过多种方式构建模型。我们可以通过尝试不同的架构,层和参数来继续尝试和提高模型的准确性。如果时间训练不长,我们能做得多好?如何防止过度拟合?

原文发布时间为:2018-07-17
本文作者:Susan Li
本文来自云栖社区合作伙伴“专知”,了解相关信息可以关注“专知

相关文章
|
机器学习/深度学习 PyTorch 测试技术
深度学习框架哪家强?MXNet称霸CNN、RNN和情感分析,TensorFlow仅擅长推断特征提取
深度学习框架哪家强?MXNet称霸CNN、RNN和情感分析,TensorFlow仅擅长推断特征提取
331 0
|
5月前
|
机器学习/深度学习
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
|
1月前
|
机器学习/深度学习 数据采集 存储
时间序列预测新突破:深入解析循环神经网络(RNN)在金融数据分析中的应用
【10月更文挑战第7天】时间序列预测是数据科学领域的一个重要课题,特别是在金融行业中。准确的时间序列预测能够帮助投资者做出更明智的决策,比如股票价格预测、汇率变动预测等。近年来,随着深度学习技术的发展,尤其是循环神经网络(Recurrent Neural Networks, RNNs)及其变体如长短期记忆网络(LSTM)和门控循环单元(GRU),在处理时间序列数据方面展现出了巨大的潜力。本文将探讨RNN的基本概念,并通过具体的代码示例展示如何使用这些模型来进行金融数据分析。
216 2
|
5月前
|
机器学习/深度学习 自然语言处理 算法
RNN-循环神经网络
自然语言处理(Nature language Processing, NLP)研究的主要是通过计算机算法来理解自然语言。对于自然语言来说,处理的数据主要就是人类的语言,我们在进行文本数据处理时,需要将文本进行数据值化,然后进行后续的训练工作。
|
5月前
|
机器学习/深度学习 自然语言处理 算法
【从零开始学习深度学习】49.Pytorch_NLP项目实战:文本情感分类---使用循环神经网络RNN
【从零开始学习深度学习】49.Pytorch_NLP项目实战:文本情感分类---使用循环神经网络RNN
|
6月前
|
机器学习/深度学习 自然语言处理 语音技术
深度学习500问——Chapter06: 循环神经网络(RNN)(3)
深度学习500问——Chapter06: 循环神经网络(RNN)(3)
149 3
|
6月前
|
机器学习/深度学习 自然语言处理 PyTorch
使用Python实现循环神经网络(RNN)的博客教程
使用Python实现循环神经网络(RNN)的博客教程
691 1
|
1月前
|
机器学习/深度学习 存储 自然语言处理
深度学习入门:循环神经网络------RNN概述,词嵌入层,循环网络层及案例实践!(万字详解!)
深度学习入门:循环神经网络------RNN概述,词嵌入层,循环网络层及案例实践!(万字详解!)
|
3月前
|
自然语言处理 C# 开发者
Uno Platform多语言开发秘籍大公开:轻松驾驭全球用户,一键切换语言,让你的应用成为跨文化交流的桥梁!
【8月更文挑战第31天】Uno Platform 是一个强大的开源框架,允许使用 C# 和 XAML 构建跨平台的原生移动、Web 和桌面应用程序。本文详细介绍如何通过 Uno Platform 创建多语言应用,包括准备工作、设置多语言资源、XAML 中引用资源、C# 中加载资源以及处理语言更改。通过简单的步骤和示例代码,帮助开发者轻松实现应用的国际化。
41 1
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
TensorFlow 中的循环神经网络超厉害!从理论到实践详解,带你领略 RNN 的强大魅力!
【8月更文挑战第31天】循环神经网络(RNN)在人工智能领域扮演着重要角色,尤其在TensorFlow框架下处理序列数据时展现出强大功能。RNN具有记忆能力,能捕捉序列中的长期依赖关系,适用于自然语言处理、机器翻译和语音识别等多个领域。尽管存在长期依赖和梯度消失等问题,但通过LSTM和GRU等改进结构可以有效解决。在TensorFlow中实现RNN十分简便,为处理复杂序列数据提供了有力支持。
35 0