基于RNN的情感分类应用设计
2022-05-30翟高粤
翟高粤
摘 要:情感分类应用是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。本文先介绍情感分析的本质和任务,然后引入RNN循环神经网络并进行相关理论和知识介绍;最后对整个项目结构关键部分进行模块分析和功能说明。
关键词:机器学习;循环神经网络;情感分类;自然语言处理
自然语言处理NLP的一项重要处理就是情感分析Sentiment Analysis,它在社交内容的分析以及电商评论反馈分析中,都占有很高的分析价值。文本情感分析任务本质是自然语言序列的特征提取和基于特征的分类问题。相比于生成类NLP任务,文本情感分析任务的核心是自然语言特征的提取。
情感分析是从自然语言中识别人的态度的一种人工智能方法,现在有很多人通过社交网络服务、博客、在线评论和社區网站上面发表他们的观点或看法。由于很多用户在网络上表达自己的情感,因此研究人员可以通过分析现实世界中的情感来了解社会舆论。为了使模型能够明确地学习中文文本的情感知识,本文提出了一种基于RNN的情感信息的分类网络模型。实验证明,该分类模型能较好的对中小规模的数据集进行较好的分类。
本章探讨深度学习中基于RNN的循环神经网络在情感分析中的应用。深度学习适合做文字处理和语义理解,是因为深度学习结构灵活,其底层利用词嵌入技术可以避免文字长短不均带来的处理困难。使用深度学习抽象特征,可以避免大量人工提取特征的工作。深度学习可以模拟词与词之间的联系,有局部特征抽象化和记忆功能。正是这几个优势,使得深度学习在情感分析,乃至文本分析理解中发挥着举足轻重的作用。
一、相关理论
(一)RNN循环神经网络
循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network)。对循环神经网络的研究始于二十世纪80-90年代,并在二十一世纪初发展为深度学习(deep learning)算法之一,其中循环神经网络(Recurrent Neural Network, RNN)是常见基本的循环神经网络。
循环神经网络具有记忆性、参数共享的特点,因此在对序列的非线性特征进行学习时具有一定优势。循环神经网络在自然语言处理(Natural Language Processing, NLP),例如语音识别、语言建模、机器翻译等领域有应用,也被用于各类时间序列预报。引入了卷积神经网络(Convolutional Neural Network,CNN)构筑的循环神经网络可以处理包含序列输入的计算机视觉问题。
(二)词嵌入技术(Word-Embedding)
为了数字化输入的单词,我们可以使用k个编码向量(由若干个0和一个1组成)中的1(one-hot)来表示一个单词,这种方法非常简单,但无法表达单词之间的关系。为了能表达单词之间的关系,我们通常使用词嵌入方法,这是一种降维技术。词嵌入方法就是把每个单词矢量化表示。它由密集且维数较低的k维向量表示。研究表明,语义相近的词向量在向量空间中距离很近,反之语义差距大的词向量在向量空间距离较远。目前,许多关于自然语言处理(NLP)的研究都使用预训练词向量。
使用预训练的词嵌入,在数据集较小的情况下,难以学习到足够好的embedding层,选择一些权威的官方词嵌入数据库(比如GloVe)能够有效解决数据集的问题。GloVe的全称叫Global Vectors for Word Representation,它是一个基于全局词频统计(count-based & overall statistics)的词表征(word representation)工具,它可以把一个单词表达成一个由实数组成的向量,这些向量捕捉到了单词之间一些语义特性,比如相似性(similarity)、类比性(analogy)等。我们通过对向量的运算,比如欧几里得距离或者cosine相似度,可以计算出两个单词之间的语义相似性。
(三)情感分类
文本情感分析:又称意见挖掘、倾向性分析等。简单而言,是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。互联网(如博客和论坛以及社会服务网络如大众点评)上产生了大量的用户参与的、对于诸如人物、事件、产品等有价值的评论信息。这些评论信息表达了人们的各种情感色彩和情感倾向性,如喜、怒、哀、乐和批评、赞扬等。基于此,潜在的用户就可以通过浏览这些主观色彩的评论来了解大众舆论对于某一事件或产品的看法。
情绪分类的目的是识别给定句子(或文档)的情绪极性(积极或消极)。传统分类方法大致可以分为基于词典的分类方法和基于深度学习的分类方法。基于词典的方法通过人工的方法来提取语言特征。例如,通过在词典中标注每个单词的情感极性就被当作语言特征。另一方面,深度学习方法具有自动地从原始数据中学习表示的能力。基于深度学习的方法自动从原始文本输入中提取特征,并使用它们对情绪极性进行分类。因此,基于深度学习的方法在情绪分类任务中越来越受到研究人员的欢迎。
二、RNN情感分类问题实战
(一)网络结构
下面本文利用基础的RNN来解决情感分类的问题,网络结构如图1所示。
RNN 网络共两层,循环提取序列信号的语义特征,利用第 2 层 RNN 层的最后时间戳的状态向量 hS(2)作为句子的全局语义特征表示,送入全连接层构成的分类网络3,得到样本x为积极情感的概率P(x为积极情感|x) ∈ [0,1]。本文使用经典的 IMDB 影评数据集来完成情感分类任务。
(二)数据集分析
IMDB影评数据集包含了50000条用户评价,评价的标签分为消极和积极,其中 IMDB评级<5 的用户评价标注为0,即消极;IMDB评价>=7 的用户评价标注为1,即积极。25000条影评用于训练集,25,000条用于测试集。通过Keras提供的数据集datasets工具即可加载IMDB数据集,部分关键代码如下:
batchsz = 128 # 批量大小
total_words = 10000 # 词汇表大小 N_vocab
max_review_len = 80 # 句子最大长度 s,大于的句子部分将截断,小于的将填充
embedding_len = 100 # 词向量特征长度 n
# 加载 IMDB 数据集,此处的数据采用数字编码,一个数字代表一个单词
(x_train, y_train), (x_test, y_test) =
keras.datasets.imdb.load_data(num_words=total_words)
# 打印输入的形状,标签的形状
print(x_train.shape, len(x_train[0]), y_train.shape)
print(x_test.shape, len(x_test[0]), y_test.shape)
可以看到,x_train 和 x_test 是长度为 25,000 的一维数组,数组的每个元素是不定长 List,保存了数字编码的每个句子,例如训练集的第一个句子共有 218 个单词,测试集的第一个句子共有 68 个单词,每个句子都包含了句子起始标志 ID。
(三)编码方案及处理
通过访问编码表获得每个单词的编码,具体代码如下:
# 数字编码表
word_index = keras.datasets.imdb.get_word_index()
# 打印出编码表的单词和对应的数字
for k,v in word_index.items():
print(k,v)
由于编码表的键为单词,值为 ID,这里翻转编码表,并添加标志位的编码 ID,代码如下:
# 前面 4 个 ID 是特殊位
word_index = {k:(v+3) for k,v in word_index.items()}
word_index["
word_index["
word_index["
word_index["
# 翻转编码表
reverse_word_index = dict([(value, key) for (key, value) in
word_index.items()])
对于一个数字编码的句子,通过如下函数转换为字符串数据:
def decode_review(text):
return ' '.join([reverse_word_index.get(i, '?') for i in text]
(四)模型设计
创建自定义的模型类MyRNN,继承自Model基类,需要新建Embedding层,两个 RNN 层,分类网络层,关键代码如下:
class MyRNN(keras.Model):
# Cell 方式构建多层网络
def __init__(self, units):
super(MyRNN, self).__init__()
# [b, 64],构建 Cell 初始化状态向量,重复使用
self.state0 = [tf.zeros([batchsz, units])]
self.state1 = [tf.zeros([batchsz, units])]
# 词向量编码 [b, 80] => [b, 80, 100]
self.embedding = layers.Embedding(total_words, embedding_len,
input_length=max_review_len)
# 构建 2 个 Cell,使用 dropout 技术防止过拟合
self.rnn_cell0 = layers.SimpleRNNCell(units, dropout=0.5)
self.rnn_cell1 = layers.SimpleRNNCell(units, dropout=0.5)
# 构建分类网络,用于将 CELL 的输出特征进行分类,2 分类
# [b, 80, 100] => [b, 64] => [b, 1]
self.outlayer = layers.Dense(1)
三、結论
情感分析无处不在,它是一种基于自然语言处理的分类技术。其主要解决的问题是给定一段话,判断这段话是正面的还是负面的。当需要大规模的情感分析时,肉眼的处理能力就变得十分有限了。情感分析的本质就是根据已知的文字和情感符号,推测文字是正面的还是负面的。处理好了情感分析,可以大大提升人们对于事物的理解效率,也可以利用情感分析的结论为其他人或事物服务,比如不少基金公司利用人们对于某家公司、某个行业、某件事情的看法态度来预测未来股票的涨跌。
本文先介绍RNN循环神经网络及情感分类的相关概念和理论,然后通过一个真实案例介绍基于RNN循环神经网络进行情感分类的关键技术和关键代码,通过运行测试达到90%以上分类正确率,说明本文采用的情感分类的思想和方法是有效的,具有一定参考价值。
参考文献:
[1] 闫涛. 深度学习算法实践 [M]. 电子工业出版社出版社,2020.
[2] 李建明等.基于深度学习的工业自动化包装缺陷检测方法[J],包装工程,2021(4).
[3] 王晓华. TensorFlow 2.0卷积神经网络实战 [M]. 清华大学出版社出版社,2020.