最近,笔者一直在研究语音识别后的文本纠错,而就在八月26-30日,CCF的自然语言处理和中文计算会议召开了,笔者也从师兄那里拿到了新鲜出炉的会议论文集,其中重点看的自然是其shared task2:grammatical error correction的overview以及优胜团队的论文。本文总结了优胜团队的论文并给出了一些可能的改进方向。
本文涉及四篇文章:
0.官方的overview: Overview of the NLPCC 2018 Shared Task: Grammatical Error Correction
1.比赛第一名:有道团队的论文:Youdao’s Winning Solution to the NLPCC-2018 Task 2 Challenge: A Neural Machine Translation Approach to Chinese Grammatical Error Correction
2.比赛第二名:阿里团队的论文:Chinese Grammatical Error Correction Using Statistical and Neural Models
3.比赛第三名:北京语言大学团队的论文:A Sequence to Sequence Learning for Chinese Grammatical Error Correction
首先来看官方的overview。
0. Overview of the NLPCC 2018 Shared Task: Grammatical Error Correction
官方的overview将整个shared task的目标、数据集、评价标准以及参赛情况进行大致总结。
数据集来自于学习中文的外国人作文,评价标准为F0.5。
训练语料中,每个句子后面跟着0~n(n不定)个纠正过后的句子,若句子后面没有纠正的句子,则说明该句子是正确的。后面的n个句子都是正确结果。
这里我们当然更关注参赛团队情况以及他们使用的方法,参赛总共23支队伍,6支提交了最终结果,最终分数如下:
在论文集中,F0.5 29以上的三支参赛队伍:有道、阿里、北京语言大学信息科学学院分别提交了他们的论文,下面也会分别进行小结。
以下是官方对那6支参赛团队使用方法的总结原文:
Most of the systems treat the GEC problem as a machine translation (MT) task. Rule-based models and language models are also explored.
AliGM proposes two modules for this problem: the correction module and the combination module. In the former module, correction candidates are generated for each input sentence with two statistical models and one neural model. The statistical models include a rule-based model and a statistical machine translation (SMT) -based model. The neural model refers to a neural machine translation (NMT) -based model. In the latter module, they combine these models in a hierarchical manner.
CU-Boulder uses a Bi-LSTM model with attention to make corrections. And they use the character-level minimum edit distance (MED) to select the correction version among multiple candidates. Joint voting of five models is implemented to advance the performance.
YouDao also casts the problem as a machine translation task. It is worth noting that they use a staged approach and design specific modules targeting at particular errors, including spelling, grammatical, etc.
BUPT uses a two-stage procedure method. In the first stage, they adopt neural models for error detection. In the second stage, they use a statistical method following Generating and scoring correction candidates in Chinese grammatical error diagnosis..
PKU uses a character-based MT model to deal with this problem. Besides, they propose a preprocessing module for the correction of spelling errors. First, the error detection is based on the binary features including cooccurrence probability, mutual information and chi-square test. Then confusion sets are introduced to generate candidates at the detected point. The final correction is the candidate with the highest language model probability. To improve the precision score, they set a high threshold. In addition, they check each correction with confidence levels in a post-processing stage.
BLCU proposes a system mainly based on the convolutional sequence-to-sequence model.
可以看到,大多数参赛团队将纠错任务作为翻译任务(从错误句子到正确句子的翻译),以往基于统计以及规则的模型虽然还有使用但不再作为主力,基于双向LSTM的神经网络模型已经成为主流,其中以 Encoder-Decoder + attention 模型最为流行,但他们并没有纯用神经网络进行纠错,而是掺杂了从编辑距离到n-gram等各种方法。此外还有划分阶段,对不同阶段使用不同模型,最终整合各个阶段的输出的策略。下面我们来依次看比赛前三名的论文。
1. Youdao’s Winning Solution to the NLPCC-2018 Task 2 Challenge: A Neural Machine Translation Approach to Chinese Grammatical Error Correction
总结:他们将纠错任务视作翻译任务,错误分为表面错误和语法错误,使用相似字音表+5-gram解决低级错误,使用字级、词级 Transformer 模型解决高级错误,将低级模型和高级模型进行组合,最终再用5-gram语言模型对纠正后句子进行困惑度分析,选择困惑度最低的句子。
输入处理
他们的预处理阶段较为简单,语料方面使用的是全语料策略:每个句子和其正确答案句子各构成一个样本对,即{(错误句子,正确句子0),(错误句子,正确句子1),(错误句子,正确句子2)。。。},若句子本身是正确,则答案句子用其本身,即{(待训练句子,待训练句子)}。
值得一提的是,他们得到了样本对还额外经过了一步筛选:使用自己在大语料中训练出来的5-gram字级语言模型检测错误句子和正确句子的困惑度,若是前者的困惑度低于后者,则把这个样本对删去。
模型分层:
有道将错误大题分成两类,一类是拼写类的表面错误,第二类是较为困难的语法错误。
对于表面错误,有道使用大量文本训练出来的5-gram字级模型作为辅助模型,并且使用 SIGHAN 2013 CSC Datasets 中提供字音、字形相似表。
在有了5-gram模型和字表之后,他们使用的方式颇为暴力:对句子中的每个字,将其在字表中的候选字替换进去并计算得分,所有句子中困惑度最低的即为最终选择。
在纠正完表面错误后,他们开始着手进行语法错误的纠正,这方面他们采用的是 基于 self-attention的 encoder-decoder框架Transformer ,因为在机器翻译领域 sub-word 效果更好,然而字级更能处理拼写和字级语法错误,因此他们分别构造了字级和词级的神经网络模型,试图将他们组合起来以此获取这两种颗粒度各自的优点,实现方面他们使用了基于tensorflow的框架 tensor2tensor,参数设置方面除了把hidden size设为800外,其余为默认设置。
分类处理完之后,自然要进行模型的组合了,首先是低级错误模型单独来,然后是低级错误+高级错误模型,先字后词、先词后字以及只用字、只用词四种高级模型,由此得到了总共5个纠正模型:
值得一提的是,他们并不是只使用一个模型组合,而是将五个模型组合都使用上,最终得到了5个组合的输出,再用5-gram模型对这5个句子进行评分,选择困惑度最低的句子。最终他们的结果如下:
可以看出,他们的思路是将错误分为简单和复杂两类错误,用简单模型(5-gram+暴力替换)解决简单错误,复杂模型(Transformer)解决复杂错误,而后将两个阶段的模型进行组合,把字级5-gram作为评分工具选出最后的句子。
2. Chinese Grammatical Error Correction Using Statistical and Neural Models
总结:多模型平行结构,使用基于规则、基于统计和神经网络三大类模型,先在类别内进行低级组合得到类别候选,再对类别候选进行高级组合。
在输入处理方面,阿里生成了两类数据集,第一类是将待测句子和其纠正句子中编辑距离最小的句子构成样本对,称为NLPCC MinEd,第二类是将待测句子和所有纠正句子各构成样本对,称为NLPCC Expand。在神经网络翻译模型中使用不同的语料类训练模型并组合结果。
阿里使用的模型和有道的不大相同。有道的在单个模型组合里采用的是垂直结构:先纠简单再就复杂,然而阿里采用的是平行结构,不分简单复杂,模型自行把它们都搞定,而后再组合起来。
此外,他们引入了基于规则的模型,在基于统计的模型中使用语言模型+翻译模型并用信道噪声+beam search挑选候选解。
语言模型方面用中文语料进行训练,翻译模型方面用平行语料(错误句子和正确句子的对应)训练,以此得到错误句子和正确句子的条件概率。
神经网络方面也是 Encoder-Decoder (各2层LSTM) + attention 的模型,他们只使用字级模型,但在其它方面做了修改,如LSTM是单向还是双向、是否使用以及是在Encoder还是在Decoder使用预训练的embedding,数据集是只挑错误句子到候选正确句子编辑距离最低的句子对还是使用所有候选正确句子,以此产生了4个模型组合:
组合起来的模型得到了输出结果,若是几个模型的输出结果不同,则称发生了冲突,他们提出了5种冲突解决方案,不同与有道直接使用5-gram进行困惑度排序并挑选一整个句子作为最终结果,阿里的几个解决方案中把修改部分单独拿出来构成修改集,结合最小编辑距离和语言模型评分挑选最终修改结果:
冲突发生时的解决方案(两个模型产生的两个句子):
- 为模型分配优先级,当冲突发生时选择优先级高的模型的结果
- 将冲突句子对原句所做的更改做并集,选择可以最小化编辑距离的修改方式
- 对修改集做交集
- 用语言模型对修改后的句子进行评分,选择分数高的
- 用语言模型评分,并把句子长度作为正则化参数 (分数 / 句子长度)
组合分类:
- 低层组合:组合同一类型模型的候选结果
- 高层组合:组合不同类型模型的候选结果
组合方式:
- 低层组合:模型两两组合,并排列组合使用解决方案,使用验证集分数最高的方案
- 高层组合:
- 将冲突解决方案扩展成对三个模型的
- 加入保护机制,当三种模型的冲突太多时则不对句子做修改
3. A Sequence to Sequence Learning for Chinese Grammatical Error Correction
北京语言文化大学和前两者相比,模型较为简单,他们使用的是基于CNN的seq2seq模型,没有对错误划分类型也没有使用多个模型。因为语法错误更多和邻近词语有关,使用CNN能比LSTM更好捕捉邻近词的关系,而多层CNN也同样可以捕获较远距离的词语交互信息。
输入方面,对于不常见词语以及未登录词,他们同样使用BPE算法将词划分成Subword 单元。Embedding方面,他们使用了基于中文语法修正过后word2vec的wang2vec,并且将位置向量接在embedding以及生成的词语后面,以此给输入和输出层提供位置信息。
总结
以上三篇论文所使用的,基本都是对已有的成熟模型进行的一些小修改,前两支队伍使用多个模型,或横向划分模型类型或纵向划分错误类型,而后将模型组合起来,观察他们的实验结果可以发现,混合模型的分数要比单个模型高出不少(有道的实验结果),组合策略的选择也同样对分数有较大影响(阿里的策略),若是在算力上有所欠缺无法在能接受的时间内训练多个模型并组合,北京语言文化大学的CNN seq2seq+attention模型未尝不是一个好选择。
下面对以上三篇论文以及笔者最近的一些浏览结果进行一些总结,给出可能改进和组合的方向:
- 输入处理:
- 颗粒度选择:字级或词级(词级可用BPE划分subword解决OOV或rare word问题)
- 训练语料对划分:
- 最小编辑距离语料:错误句子只和与其编辑距离最小的正确句子构成训练语料对
- 全语料:错误句子和其每个正确句子分别构成训练语料对
- embedding:
- 模型:
- 基于规则的模型
- 基于统计的模型:
- n-gram 或 rnn 语言模型 + 相似字音表暴力替换
- (n-gram + 翻译模型)得到概率 + (信道噪声 + beam search)挑选候选解
- encoder-decoder( lstm(单向或双向) 或 CNN ) + attention(一般attention或google的self-attention)
- 划分方式:
- 纵向划分:用基于统计、基于规则的简单模型解决简单错误,再把经过简单错误处理后的句子输入处理复杂错误的seq2seq模型
- 横向划分:不同类型的模型内部自行排列组合并选出每个类别的输出代表(低层组合),再对类别的输出进行组合得到最终输出(高层组合)
- 组合方式:
- 整句采用型:
- 对模型分配优先级,选择优先级高的模型的输出结果
- 用语言模型对句子进行评分,选取困惑度最低的句子
- 语言模型评分+句子长度作为正则化
- 构造编辑集:抽取出在原句上修改的部分,几个模型的修改部分分别构造成几个编辑集
- 对编辑集求并集,选取编辑距离最小的修改方式
- 对编辑集求交集
- 冲突避免:几个模型给出的修改意见不同处太多,意见不统一则放弃修改
- 整句采用型:
我的个人博客:Zedom1.top