论文部分内容阅读
摘要:针对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进行长度的截断,结果如下: pad_sequences([[1,2,3,4,5,6,7,8],[6,7,8,9]], maxlen=10)
array([[1, 2, 3, 4, 5,6], [0,0, 6, 7, 8, 9]], dtype=int32)
2.5 定义词嵌入矩阵
下面创建一个词嵌入矩阵,用来作为上述文本集合词典(按照使用的频率高低排序后取序号在前10000的词)的词嵌入矩阵,矩阵维度是(10000, 300)。
矩阵的每一行i代表词典中第i个词的词向量。本文中建立词嵌入矩阵是预训练词向量的一个子集。语料中很可能有的词不在预训练词向量中,这样的词在这个词向量矩阵中对应的向量元素都设为零。在本例中,10000个词有95.65%在预训练词向量中。
词嵌入矩阵的创建本文调用tf.keras.layers.Embedding对其进行向量化处理,处理的结果是将输入序列中的整数索引转换成一个稠密的向量,输入是一个2D张量,形状为(batch_size, sequence_length),输出是3D张量,形状为(batch_size, sequence_length, output_dim)。嵌入层的输入数据sequence向量的整数元素对应词的编码,前面看到这个获取序列编码的步骤使用了Keras的Tokenizer API来实现,如果不使用预训练词向量模型,嵌入层是用随机权重进行初始化,在训练中将学习到训练集中的所有词的权重,也就是词向量。但使用预训练的词嵌入的自己训练,在数据集较小的情况下,难以学习到足够好的embedding层,因此本文采用官方提供的GlOve来生成词向量矩阵。要采用官方提供的GlOve进行词嵌入向量矩阵的生成,可以通过对tf.keras.layers.Embedding两个输入参数weights=[embedding_matrix]和trainable=False进行设置,第一参数设置该层的嵌入矩阵为上面我们定义好的词嵌入矩阵,即不使用随机初始化的权重,后者设置为本层参数不可训练,即不会随着后面模型的训练而更改。
3 建立神经网络模型进行对比验证
上面提到,词向量矩阵可以自己进行训练,也可以不训练而调用官方提供的训练结果直接使用。为了对比这两种方式的差异,本文首先进行自己训练词向量,进行模型训练得出采用这种词向量方式的训练结果,然后使用官方提供的词向量数据,再重新进行模型训练。以下是两种方式的训练结果,如图1所示。
上图中,左边的图是自己训练的词向量矩阵,右边的图是采用官方提供的GlOve,从训练的accuracy来看,左边的达到85%左右的准确率,而右边的达到95%以上的准确率,结果表明,预训练模型的加载可以大幅提高模型训练的效率,模型的验证准确度也提升的比较快。
4 总结
本文先介绍情感分析、卷积神经网络和词嵌入技术的相关概念,提出一种基于预训练模型的词嵌入技术的方案,并从数据预处理方面详细介绍该模型的建立和处理过程,然后通过自训练和采用官方提供的词嵌入矩阵进行实验并进行对比分析,结果表明,在语料数据不足的情况下,采用官方提供预训练模型的加载比自定义的效果更好,不但可以大幅提高模型训练的效率,而且模型的验证准确度也提升的比较快。
参考文献
[1] 王宇石等.一种基于卷积神经网络的违禁品探测系统及部署方法[J],科技创新与应用,2020(7).
[2] 来学伟.TensorFlow读取数据在简单图像识别中的应用[J],现代信息科技,2019(6).
[3] 王晓华. TensorFlow 2.0卷积神经网络实战 [M]. 清华大学出版社出版社,2020
[4] 閆涛. 深度学习算法实践 [M]. 电子工业出版社出版社,2020.
作者简介:翟高粤, 男(1975.11) 广西钦州 ,汉 ,硕士,副教授,研究方向:软件理论,人工智能。
关键词:词嵌入;深度学习;卷积神经网络;情感分类
中图分类号: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进行长度的截断,结果如下: pad_sequences([[1,2,3,4,5,6,7,8],[6,7,8,9]], maxlen=10)
array([[1, 2, 3, 4, 5,6], [0,0, 6, 7, 8, 9]], dtype=int32)
2.5 定义词嵌入矩阵
下面创建一个词嵌入矩阵,用来作为上述文本集合词典(按照使用的频率高低排序后取序号在前10000的词)的词嵌入矩阵,矩阵维度是(10000, 300)。
矩阵的每一行i代表词典中第i个词的词向量。本文中建立词嵌入矩阵是预训练词向量的一个子集。语料中很可能有的词不在预训练词向量中,这样的词在这个词向量矩阵中对应的向量元素都设为零。在本例中,10000个词有95.65%在预训练词向量中。
词嵌入矩阵的创建本文调用tf.keras.layers.Embedding对其进行向量化处理,处理的结果是将输入序列中的整数索引转换成一个稠密的向量,输入是一个2D张量,形状为(batch_size, sequence_length),输出是3D张量,形状为(batch_size, sequence_length, output_dim)。嵌入层的输入数据sequence向量的整数元素对应词的编码,前面看到这个获取序列编码的步骤使用了Keras的Tokenizer API来实现,如果不使用预训练词向量模型,嵌入层是用随机权重进行初始化,在训练中将学习到训练集中的所有词的权重,也就是词向量。但使用预训练的词嵌入的自己训练,在数据集较小的情况下,难以学习到足够好的embedding层,因此本文采用官方提供的GlOve来生成词向量矩阵。要采用官方提供的GlOve进行词嵌入向量矩阵的生成,可以通过对tf.keras.layers.Embedding两个输入参数weights=[embedding_matrix]和trainable=False进行设置,第一参数设置该层的嵌入矩阵为上面我们定义好的词嵌入矩阵,即不使用随机初始化的权重,后者设置为本层参数不可训练,即不会随着后面模型的训练而更改。
3 建立神经网络模型进行对比验证
上面提到,词向量矩阵可以自己进行训练,也可以不训练而调用官方提供的训练结果直接使用。为了对比这两种方式的差异,本文首先进行自己训练词向量,进行模型训练得出采用这种词向量方式的训练结果,然后使用官方提供的词向量数据,再重新进行模型训练。以下是两种方式的训练结果,如图1所示。
上图中,左边的图是自己训练的词向量矩阵,右边的图是采用官方提供的GlOve,从训练的accuracy来看,左边的达到85%左右的准确率,而右边的达到95%以上的准确率,结果表明,预训练模型的加载可以大幅提高模型训练的效率,模型的验证准确度也提升的比较快。
4 总结
本文先介绍情感分析、卷积神经网络和词嵌入技术的相关概念,提出一种基于预训练模型的词嵌入技术的方案,并从数据预处理方面详细介绍该模型的建立和处理过程,然后通过自训练和采用官方提供的词嵌入矩阵进行实验并进行对比分析,结果表明,在语料数据不足的情况下,采用官方提供预训练模型的加载比自定义的效果更好,不但可以大幅提高模型训练的效率,而且模型的验证准确度也提升的比较快。
参考文献
[1] 王宇石等.一种基于卷积神经网络的违禁品探测系统及部署方法[J],科技创新与应用,2020(7).
[2] 来学伟.TensorFlow读取数据在简单图像识别中的应用[J],现代信息科技,2019(6).
[3] 王晓华. TensorFlow 2.0卷积神经网络实战 [M]. 清华大学出版社出版社,2020
[4] 閆涛. 深度学习算法实践 [M]. 电子工业出版社出版社,2020.
作者简介:翟高粤, 男(1975.11) 广西钦州 ,汉 ,硕士,副教授,研究方向:软件理论,人工智能。