翟高粤
摘要:针对one-hot词嵌入技术无法表述相关词之间的语意和关系的问题,提出一种基于预训练模型的词嵌入(GloVe)和CNN神经网络相结合的情感分类方法。首先,读取要分类的语料并加载中文预训练词向量模型;然后使用TensorFlow进行数据预处理,生成训练集和测试集;最后定义两种词嵌入矩阵并构建CNN模型进行对比。实验结果表明,使用预训练模型的词嵌入方法比自定义训练的方式能进行更好的情感分类
关键词:词嵌入;深度学习;卷积神经网络;情感分类
中图分类号:TP183:文献标识码:A
0 引言
情感分析是从自然语言中识别人的态度的一种人工智能方法,现在有很多人通过社交网络服务、博客、在线评论和社区网站上面发表他们的观点或看法。由于很多用户在网络上表达自己的情感,因此研究人员可以通过分析现实世界中的情感来了解社会舆论。
1 相关概念
1.1 卷积神经网络(CNN)
CNN模型在计算机视觉处理中获得了很大的成功。它由输入层、卷积层、池化层和完全连接层组成。输入层主要输入原始像素值的图像,包括RGB通道。在卷积层中,通过滑动窗口(过滤器)来捕获像素的局部特征。在池化层中,局部小平移具有不变性的特点,并通过子抽样的方法减小了参数维数。在全连接层中,把高维度图像进行平展后进行分类。
1.2 词嵌入技术(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相似度,可以计算出两个单词之间的语义相似性。
1.3 情感分类
情绪分类的目的是识别给定句子(或文档)的情绪极性(积极或消极)。传统分类方法大致可以分为基于词典的分类方法和基于深度学习的分类方法。基于词典的方法通过人工的方法来提取语言特征。例如,通过在词典中标注每个单词的情感极性就被当作语言特征。另一方面,深度学习方法具有自动地从原始数据中学习表示的能力。基于深度学习的方法自动从原始文本输入中提取特征,并使用它们对情绪极性进行分类。因此,基于深度学习的方法在情绪分类任务中越来越受到研究人员的欢迎。
2 数据预处理(定义词嵌入矩阵)
2.1 数据集介绍
本文使用的是IMDB电影评论数据集,该数据集是用于情感分析的国际标准数据集之一。数据集收集了大约50000条的评论,其中训练集25000条,测试集25000条。对于预训练词嵌入,本文使用的是GloVe。
2.2 读取语料
打开语料文件,把原始语料划分为训练数据和测试数据,把文本信息读取到texts列表中,标签信息读取到labels中,其中文本信息需要使用预处理词嵌入技术进行处理,标签信息本文使用one-hot进行表示。
2.3 加载预训练词向量模型
本文采用的词向量是一个稠密向量,可以理解为将文本的语义抽象信息嵌入到了一个具体的多维空间中,词之间语义关系可以用向量空间中的范数计算来表示。
下载GlOve,进行解压之后的中文预训练词向量模型的文件格式是文本文件,首行只有两个空格隔开的数字:词的个数和词向量的维度,从第二行开始格式为:词 数字1 数字2 …… 数字300,形式如下:
364180 300 [首行]
china 0.003146 0.582671 0.049029 -0.312803 0.522986 0.026432 -0.097115 0.194231 -0.362708
以上364180表示的是词的个数,300表示的词的维度,即一个词用300维的数字进行表示,”中国”使用了300维的向量进行表示。
2.4 使用tf.keras对语料进行处理
tf.keras是tensorflow中集成的keras处理模块,通过tf.keras可以直接调用keras中的各种功能。本文将使用tf.keras中的Tokenizer对语料文本进行处理,每个向量等于每个文本的长度,这个长度在处理的时候由变量MAX_SEQUENCE_LEN(最大句子长度)做了限制,其数值并不表示计数,而是对应于字典tokenizer.word_index中的单词索引值,这个字典是在调用Tokenizer時产生。
长度超过MAX_SEQUENCE_LEN的文本序列会被截断,长度小于这个值的文本序列则需要补零来达到这个长度,可以使用tf.keras中的pad_sequence()就是用零来填充向量序列。例如:对[1,2,3,4,5,6,7,8],[6,7,8,9],用maxlen=6进行长度的截断,结果如下: