Chinese Grammatical Error Diagnosis
1. 论文概述
-
题目:Chinese Grammatical Error Diagnosis with Graph Convolution Network and Multi-task Learning
-
年份:2020年
-
领域:NLP-文本语法诊断
-
摘要:
该论文是CGED 2020任务实现的一种中文语法错误诊断方法。本文将将错误诊断分为2个子任务:
-
子任务1:错误检测---采用2个基于bert的方法
a) 加入语法依赖树(syntactic dependency trees)来强化模型性能:BERT+GCN+CRF
b) 在多任务目标学习框架之下,将序列标注(sequence labeling)和seq2seq模型结合:BERT+CRF+Muti-Task
-
子任务2:错误纠正
利用MLM(masked language model)、seq2seq模型和拼写检测模型,基于子任务1检测到的错误,生成正确的语句
-
-
要点:
-
使用GCN-base方法来提高baseline模型的语法依赖理解能力,并且引入seq2seq模型提升原始序列标注任务的性能
-
结合三种方法,包括MLM、seq2seq和 chinese spell check,基于检测到的错误来纠正错误的句子
-
取得的效果:在CGED 2020排名中,在纠错层面的召回率为最高,在identification level 和position level 两个层面的错误检测上,其F1值达到了第二名。
-
2. 任务描述
中文语法错误诊断是针对一个中文语句,检测其中存在的语法错误,并纠正。现在定义4种语法错误类型:
-
R (Redundant Word Error):冗余单词错误,也就是“多字(词)”
-
M (Missing Word Error):缺失单词错误,也就是“少字(词)”
-
W (Word Ordering Error):单词语序错乱,也就是“不通顺”
-
S (Word Selection Wrrors):单词使用错误,也就是“错字(词)”
如图所示,是一个训练数据的样例,里面给出了原始语句,纠正后的语句,以及原始语句错误的位置和类型。图中标记出2处错误:
1. 位置为11-12,也就是“要”字的位置,其错误类型为S,也就是错字,应该改为“能”
2. 位置为13,也就是“允”的位置,其错误类型为M,也就是少字,应该加一个字“被”
性能评估分为4个方面,评估其精确度、招呼率和F1值:
-
检测层面 (detection level) :二分类,此句是否有语法错误 (0/1)
-
标识层面 (identification level):检测出语法错误类型,(R,M,W and S)
-
位置层面 (identification level):检测出语句中每个位置的错误类型(序列标注)
-
纠错层面 (correction level):对于M和S类型错误,系统需给出至少3种纠错候选
3. 系统描述
3.1 BERT + CRF
文本采用StructBERT+CRF架构来完成错误检测子任务,原因是Struct-BERT在预训练时,加入了词结构和句结构目标,可接受带有乱序词的句子,契合本文的目标。
需要注意的是,Struct-BERT的模型结构如下图所示
a) Word Structural Objective
输入的句子首先先按照BERT一样mask15%。然后,从未被mask的序列中随机选择部分子序列(使用超参数K来确定子序列的长度),将子序列中的词序打乱,让模型重建原来的词序,希望的结果是把sequence 恢复成正确顺序的likelihood最大:
-
Larger K,模型必须要学会reconstruct 更多的干扰数据,任务比较难,但是噪声多
-
Smaller K,模型必须要学会reconstruct 较少的干扰数据,可能这个任务就比较简单
b) Sentence Structural Objective
一个句子pair (S1,S2),判断 S2是S1的下一个句子、上一个句子、毫无关联的句子(三分类问题):
-
1/3的概率:采样S的下一句组成句对
-
1/3的概率:采样S的上一句组成句对
-
1/3的概率:随机采样另一个文档的句子组成句对
在预训练bert时,执行者4个任务(1个Word Structural Objective,3个Sentence Structural Objective),这样预训练的模型本身具备一定的纠错能力。
有了Struct-BERT后,在输出层加上一个CRF层,即可达到序列标注检错的目标。
3.2 BERT + GCN + CRF
在解析语句特征时,有2种信息信息非常重要:
-
Part-of-speech-tagging(词性标注,也称为词性、词类或句法类别)
-
语句的语法依赖结构,特别是R(冗余)和M(少字)这2种错误在语法树上的表示非常迥异,如图所示:
为了能够使模型更好地提取到这种依赖结构,本文引入了GCN(Graph Convolution Network)来解决此问题。模型结构设计如下:
-
Word Dependency:如图中树形部分,是词的依赖结构树,将输入的语句分词,并获取每个词之间的依赖关系。由于BERT模型在中文上的处理时基于字粒度的,所以这里从词到字添加额外的edge。
-
多层GCN:
-
接收从BERT中获取的字粒度信息
-
接收词的依赖结构树的邻接矩阵
-
每层的卷积操作可表示如下
-
在此网络中,词采用相同的输入表示来表征字之间的依赖结构
-
-
Accumulated Output(累加输出):在经过了GCN之后,将GCN的l层表示H_l和bert的的隐藏层H_0进行concatenate(拼接)操作,并进行线性变换得到向量V,将其输入到CRF层
-
CRF层:用于序列标记预测,预测每个字符,从而组成正确语句序列
损失函数可表示为:
最后再使用Viterbi算法来得到最终的输出序列。
3.3 BERT + CRF + Muti-Task
在模型训练过程中,本文不仅使用序列标记,还要纠正语句中的错误。正确的语句非常重要,对于在hidden states的表达上,可提供更好的表达。除此之外,使用正确的语句可使得模型可以更好的理解句子的原始意义。因此,本文用seq2seq任务,将训练过程当做多任务。其模型的结构如图所示:
上图,序列标注模型是整个结构中的encoder,以此结合transformer的decoder来预测出真实的句子序列。序列标注和seq2seq这2个模型的loss通过一个超参数w进行加权求和,如下:
在推理阶段,使用序列标注模块来预测正确的值即可。
3.4 集成机制
为了能够充分利用多个错误检测模型预测的优势,本文采用一种2-stage voting集合机制:
-
第一阶段:用多模型的预测来区分正确语句和有语法错误的语句。具体来说,当θ_det模型检测到错误的数目小于检测正确的数目时,则认为该语句是正确的。也就是“少数服从多数”
-
第二阶段:edit-level 投票机制被用于针对有错误语法语句的预测。
在本文实验中,采用了网格搜索来选取θ_det 和 θ_edit,依据是多模型在验证数据集上的性能。
3.5 纠错
对于S(错字)和M(少字)这2种错误,本文引入2种方式来生成纠错集。
-
第一种方式:用MASK标记插入语句中,并使用BERT来生成纠错集,采用AR(自回归)的方式,逐字预测出MASK处的字符。在实验中,插入1-4个MASK覆盖大部分情况,并采用beam-search算法来降低搜索的复杂度。
-
第二种方式:通过seq2seq模型训练,映射错误语句到正确语句,从而生成纠正候选集。根据检测结果,持续生成下一个字符,直到在beam-search算法搜索中出现正确的字符,然后替换掉错误的错误的区域。
3.6 中文拼写检查
Chinese Spelling Check (CSC) :用于检测出语句中的拼写错误。
本文结合两种检测器:
a) 基于规则的检测器:对于非词,也就是字的拼写层面的错误,具有良好的效果
b) 基于BERT的检测模型(由CSC数据训练):让CSC任务视为序列标注,对于词粒度的错误具备良好的检测效果
将纠正结果分割并与输入句子对齐,从而获得在词粒度上的编辑结果。
由于CSC模型在验证集上有良好的精确度,因此,我们可以将拼写错误视为S(错字/词)型错误,而后直接将CSC的结果合并到检测和纠正结果中,作为我们最后的结果输出。
4. 实验过程
4.1 数据和实验配置
-
数据:CGED 2015,2016,2017,2018的数据
-
训练数据:CGED 2015 , 2016 , 2017
-
测试数据:CGED 2018
-
-
标记方式:BIOES
(B-begin,I-inside,O-outside,E-end,S-single)
-
词法依赖树:LTP(Language Technology Plantform)获取
-
超参数选取:依据验证集上的性能
-
BERT+GCN+CRF Model:
-
隐藏层向量:256
-
层数:2
-
dropout:0.2
-
Batch Size:32
-
learning rate:1e-5
-
-
BERT+Muti-Task model
-
batch size: 32
-
learning rate: 3e-5
-
w: 0.9
-
-
Transformer Decoder的参数尽可能从BERT中初始化
4.2 验证结果
将BERT+CRF(base) 和 StructBERT+CRF(large)作为baseline模型。不同方式的结果如下表所示。在召回率方面,StructBERT+CRF(large)对base具有压倒性的优势,无论是在detection、indentification还是position
GCN和muti-task方法相较于baseline,在indentification和position层面均取得了较好的效果。因此,我们选择StructBERT+GCN+CRF和StructBERT+CRF+multi-task来进行集成。
-
为了获取各种单一模型来进行集成,我们使用不同的超参数和随机种子,训练了如下数目的模型:
-
StructBERT+GCN+CRF模型:38个
-
StructBERT+CRF+multi-task模型:65个
正如上表中所示,采用集成机制的模型,相较于单一模型,具有明显的提升。
-
这里还评估了GCN网络对于R和M型错误的检测效果,如下表所示:
4.3 测试结果
最终的输出结果,本文采用三种策略:
-
单模型带纠错
-
集成模型带纠错
-
集成模型带纠错和CSC
如下表所示,本文的系统方法取得了F1值第二名(indentification和position),在correction层面,召回率达到了top3。对于检测和纠正存在差距的原因是一个错误的句子往往有多种方式来修改,而且修改的粒度很难控制。
训练集中大多数包含语法错误的语句以及集成机制都是基于验证集上的F1值来进行调整的。这些因素会在检测层面降低精确度。
5. 总结
本文提出2种方法:BERT+GCN+CRF模型和BERT+CRF+Muti-Task,来改善baseline模型的检测错误的效果。同时,也设计了3种方法,包括MLM、seq2seq和spelling check来纠正这些错误。