本文提出了一种基于循环神经网络的语义完整性分析方法, 通过判断句子是否语义完整, 将长文本切分成多个语义完整句. 首先, 对文本进行分词, 映射为相应的词向量并进行标注, 然后将词向量和标注信息通过循环窗口和欠采样方法处理后, 作为循环神经网络的输入, 经过训练最后得到模型. 实验结果表明, 该方法可以达到91.61%的准确率, 为主观题自动评分工作提供了基础, 同时对语义分析、问答系统和机器翻译等研究有一定的帮助.
This study proposes a semantic integrity analysis method based on recurrent neural network. By judging whether the sentence is semantically complete, the long text is divided into multiple semantic complete sentences. First, dividing the sentences into words, mapped to the corresponding word vector and labeled. Then the word vector and the annotation information are processed by the loop window and the undersampling method, and used as the input of the recurrent neural network. Finally we get the model by training. The result of experiment indicates that this method can achieve an accuracy of 91.61%. This method is the basis of automatic assessment of the subjective questions, and also helps the research of semantic analysis, question and answer system and machine translation.
近年来随着科技信息的发展, 自然语言处理逐渐成为计算机科学和人工智能交叉领域中的一个研究热点[
目前对于语义完整性还没有公认的统一定义. 根据实际工作的需要, 我们认为一条语句如果能够完整的表达出意思, 不再需要借助其他的语句, 且不产生歧义, 就称它是语义完整的. 语义完整性分析, 判别语义完整性, 有助于提高问答系统, 机器翻译以及主观题自动评分等应用系统的准确性.
近年来深度神经网络发展迅速, 被广泛应用于语音识别、计算机视觉和自然语言处理等邻域中. 目前, 将深度学习技术应用于解决自然语言处理(NLP)任务是一个研究热点. 其中循环神经网络(Recurrent Neural Network, RNN)的特点是可以将某个时刻隐藏层的输出作为输入用于计算下一时刻隐藏层的输出, 所以适合来解决一些时间序列的问题. 而且不同于以往模型使用的固定序列长度, 它能够处理任意长度的序列.
文献[
本文试图将循环神经网络应用于中文句子语义完整性分析, 将句子语义完整性分析转换为典型的序列标注问题来处理.
本文提出的模型采用基于双层的Bi-LSTM循环神经网络, 结构如
基于循环神经网络的语义完整性分析方法架构
汉语词汇是语言中能够独立运用的最小语言单元, 是语言中的原子结构, 所以对中文进行分词是自然语言处理的基础. 分词的准确率将会直接影响后续词性标注, 句法分析, 词向量等相关工作的质量. 本文采用结巴分词的精确模式进行分词处理.
为了让计算机理解人类的自然语言, 把词表示为计算机适合处理的方式, 这样词向量的概念就应运而生了. 通常, 词向量有两种表示方式: one-hot representation和distribution representation.
One-hot representation是一种离散表示, 它把每个词表示为一个长向量, 向量中只有一个维度的值为1, 其余维度为0, 这个维度就代表了当前的词. 例如: “物质”表示为[0, 0, 0, 1, 0, 0, 0, 0, 0, ···, 0, 0, 0],这种表示方式简单容易实现, 但缺点就是编码太过于稀疏, 将会导致维度非常高, 同时每个词本身的信息量太小, 无法展示词与词之间的关系.
Distribution representation是将词转化成一种分布式表示, 是一种既能表示词本身又可以考虑语义距离的词向量表示方法. 它是一种低维实数向量, 例如: “物质”表示为[0.792, −0.177, −0.107, ···, 0.109, −0.542]. 这种分布式表示的优点在于它不但解决了维数灾难问题, 并且挖掘了词与词之间的关联属性,每一维度都有特定的含义, 包含了更多的信息, 从而提高了向量语义上的准确度. 因此, 近几年流行的语言模型Word2Vec就是采用这种方法表示词向量的.
近几年循环神经网络(Recurrent Neural Network, RNN)广泛应用于自然语言处理, 它引入了基于时间(状态)的循环机制, RNN神经单元在某一时刻的输出依赖于当前的输入和以往时刻的信息, 同时这一时刻隐藏层的输出也可以作为下一个神经单元的输入, 这样就能够保持数据的依赖关系, 有效利用信息.
经过大量实验证明, 当相关信息和当前预测位置之间的间隔变得非常大时, 普通循环神经网络就很难学习长期依赖, 原因在于梯度消失和梯度爆炸问题, 所以长短时间记忆(Long Short-Term Memory, LSTM)网络这种特定类型的循环神经网络就是专门设计出来解决这个问题的. LSTM在以往的循环神经元结构基础上进行了改进, 它有四个不同的神经网络层进行信息的交互. LSTM单个神经元的网络结构如
LSTM神经元细胞
LSTM通过“门”的结构来控制细胞状态, 门可以实现让信息选择性的通过, 它主要是包括一个非线性激活函数Sigmoid和一个点乘运算Pointwise操作来实现. 这样的门有三个, 分别是输入门、遗忘门和输出门, LSTM通过这三个门来实现信息的存储和更新. 其中Sigmoid函数输出的是一个0到1之间的实数, 表示让对应信息通过的权重, 0表示“不让任何信息通过”, 1表示“让所有信息通过”. 它通过公式(1)~(6)进行计算,其中
Bi-LSTM与LSTM本质上是一致, 只不过Bi-LSTM是在标准LSTM上加了一个反向的LSTM, 这样某一时刻的输出就能由它前面和后面的若干输入共同决定, 充分利用句子的上下文信息, 相比标准LSTM信息更加全面.
本文采用改进的双层Bi-LSTM来进行训练[
(1) 输入层
首先对经过清洗后的数据集进行分词, 然后采用四元标注集T={S, B, M, E}进行标注. 定义B表示为一个语义完整句的开头词, M表示为一个语义完整句的中间词, E表示为一个语义完整句的结尾词, S表示为特定符号(, :、等)前面和后面最靠近的一个词. 例如: “物质世界的运动是绝对的, 而物质在运动过程中又有某种相对的静止”. 这个语义完整句对应的词序列和正确的标签为“物质/B 世界/M 的/M 运动/M 是/M 绝对/M 的/S 而/S 物质/M 在/M 运动/M 过程/M 中/M 又/M 有/M 某种/M 相对/M 的/M 静止/E”.
经过上述规则标注的标签数量会出现严重的类别不平衡问题[
各个标签采样前后数目统计
随机欠采样后的词序列因为上下文特征改变, 可能会出现欠拟合的现象, 为了既对词序列进行采样, 又不丢失一个词应有的上下文信息, 本文提出滑动窗口的方法, 在随机欠采样前对序列数据进行处理. 对于一个有
(2) 双层Bi-LSTM
为了方便说明, 这里假设滑动窗口的大小为5的双层Bi-LSTM其内部结构如
双层Bi-LSTM结构图
在输入层我们已经把输入的词序列转换为维度为64的词向量,
(3) 输出层
深层神经网络中, 过拟合会使模型泛化性能变差, 为了防止过拟合, 模型中增加了Dropout层[
Dropout层的输出向量维度与Bi-LSTM的输出维度相同, 为了将向量维度转换为与标签类别数一致, 所以增加了一个全连接层, 并采用elu激活函数, 将Dropout层的输出转换为指定维度的向量. 最后对提取的特征采用Softmax激活函数得到输出的概率. Softmax的函数定义如下:
其中,
本文实际解决的是一个多分类问题, 采用的损失函数为交叉熵损失函数[
其中,
模型的预测过程即对于任意的输入序列, 深度神经网络输出的是每个时刻标注的条件概率(参见Softmax输出格式). 预测过程中, 模型需要根据该输出值, 进一步输出对应的标签. 本文为了检验模型的准确性, 直接选取概率最大的标签作为预测结果.
实验环境如
实验环境配置
项目 | 环境值 |
服务器 | 戴尔PowerEdge T640 |
处理器 | Intel(R) Xeon(R) Bronze 3106 CPU @ 1.70 GHz |
内存 | 128 GB |
显卡 | 4*GeForce RTX 2080 Ti |
操作系统 | Ubuntu 16.04 |
开发环境 | Python3.6、TensorFlow、Keras |
本文采用的数据集是宾州中文树库(CTB)8.0语料库, 总字数大概130万字, 采用自动标注和人工标注相结合的方法, 先将数据集中的几种标点(.?!;)视为语义完整的标志, 然后通过人工检查进一步提高标注的准确性. 最后随机的将数据集切分为90%的训练集和10%的测试集.
词向量数据来源为百度百科+维基百科+新闻+小说一共120 g数据, 词向量维度为64维. 本文在获取词向量过程中, 对于未登录词统一用特殊向量代替.
本文属于多分类问题, 我们采用准确率(
本文提出的模型影响实验结果的主要参数有神经元数目, 激活函数类型以及模型优化器的选择, 为了找到每个参数的较优解, 本文采用控制变量法, 分别作如下实验.
(1) 神经元数目
这里说的神经元数目, 准确来说是循环神经网络的前馈网络层中隐藏神经元的个数, 一般情况下, 隐藏神经元的数目越多, 模型就越复杂, 训练时间越长. 下面分别将隐藏神经元大小设定为64、128、256、512, 实验结果如
(2) 激活函数的选择
激活函数的作用是给模型添加非线性因素, 增加模型对数据的适应性, 使得分类更加准确. 神经网络常用的激活函数有sigmoid、tanh、elu、relu等, 本文选取这四种激活函数分别进行实验, 实验结果如
神经元数目对比实验结果
激活函数实验对比结果
激活函数 | ||||
0.7839 | 0.7623 | 0.7729 | 0.8205 | |
0.8539 | 0.8483 | 0.8511 | 0.8716 | |
0.7683 | 0.7228 | 0.7449 | 0.8039 |
(3) 模型优化器设定
模型优化器就是设置深度学习的优化算法, 主要目的是优化参数的更新策略. 不恰当的优化算法会导致模型收敛到局部最优解. 本文选择较常用的adam优化算法[
模型优化器对比实验结果
优化算法 | ||||
adadelta | ||||
adam | 0.7692 | 0.7053 | 0.7359 | 0.8047 |
adam+decay | 0.8220 | 0.8071 | 0.8145 | 0.8382 |
AMSGrad | 0.8816 | 0.8793 | 0.8804 | 0.8899 |
(4) 输入欠采样方案比较
对于分类不平衡问题, 本文采取改进的随机欠采样方法对输入数据进行处理. 实验结果如
优化算法对比实验结果
实验组 | ||||
1 | 0.8750 | 0.8782 | 0.8766 | 0.8808 |
2 | 0.8994 | 0.8917 | 0.8955 | 0.9010 |
3 | ||||
4 | 0.9116 | 0.9052 | 0.9084 | 0.9084 |
经过上述参数对比试验, 本文主要参数设定如下: Bi-LSTM神经元数目为256, Dropout层设定比率为0.5, 词序列的滑动窗口大小为9, 训练神经网络的批次(batch)大小设定为64, 训练循环次数(epoch)设定为20, 每次循环结束将训练数据集进行shuffle处理. 采用AdaDelta优化算法, 全连接层激活函数为elu. 为了说明本模型的有效性, 使用相同的数据集, 分别采用RNN、LSTM、双层LSTM、双层Bi-LSTM进行对比实验, 实验结果如
模型对比实验结果
模型 | ||||
RNN | 0.6837 | 0.6328 | 0.6573 | 0.7425 |
LSTM | 0.7417 | 0.7165 | 0.7289 | 0.7909 |
双层LSTM | 0.8255 | 0.8075 | 0.8164 | 0.8369 |
双层Bi-LSTM |
从结果可以看出, 本文提出的双层Bi-LSTM模型的准确率可以达到91.61%, 优于其他模型. 一方面, 本文采用的循环窗口和随机欠采样方法可以在欠采样过程中很好的保留上下文特征. 另一方面, Bi-LSTM能够更好的学习上下文特征, 且双层Bi-LSTM模型获取特征更准确, 因此可以达到较好的效果.
本文采用基于双层Bi-LSTM的循环神经网络模型, 对长文本实现自动标注, 从而实现语义完整性分析. 从实验结果和项目使用来看, 本方法可以较好的解决标注语义完整性的问题. 后续将模型用到生产环境的过程中, 可以结合标签之间的依赖关系, 对模型输出结果, 按照一定的词性规则进一步提升预测结果.
林奕欧, 雷航, 李晓瑜, 等. 自然语言处理中的深度学习: 方法及应用. 电子科技大学学报, 2017, 46(6): 913-919.
Tang DY, Qin B, Liu T. Document modeling with gated recurrent neural network for sentiment classification. Proceedings of 2015 Conference on Empirical Methods in Natural Language Processing. Lisbon, Portuguesa. 2015. 1422-1432.
何炎祥, 孙松涛, 牛菲菲, 等. 用于微博情感分析的一种情感语义增强的深度学习模型. 计算机学报, 2017, 40(4): 773-790.
刁琦, 古丽米拉•克孜尔别克, 钟丽峰, 等. 基于循环神经网络序列标注的中文分词研究. 计算机技术与发展, 2017, 27(10): 65-68.
李艳翠, 冯文贺, 周国栋, 等. 基于逗号的汉语子句识别研究. 北京大学学报(自然科学版), 2013, 49(1): 7-14.
王博立, 史晓东, 苏劲松. 一种基于循环神经网络的古文断句方法. 北京大学学报(自然科学版), 2017, 53(2): 255-261.
赵楠, 张小芳, 张利军. 不平衡数据分类研究综述. 计算机科学, 2018, 45(6A): 22-27, 57.
Srivastava N, Hinton G, Krizhevsky A, et al. Dropout: A simple way to prevent neural networks from overfitting. The Journal of Machine Learning Research, 2014, 15(1): 1929-1958.