拼写纠正系列
NLP 中文拼写检测实现思路
NLP 中文拼写检测纠正算法整理
NLP 英文拼写算法,如果提升 100W 倍的性能?
NLP 中文拼写检测纠正 Paper
java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊!
一个提升英文单词拼写检测性能 1000 倍的算法?
单词拼写纠正-03-leetcode edit-distance 72.力扣编辑距离
NLP 开源项目
nlp-hanzi-similar 汉字相似度
word-checker 中英文拼写检测
pinyin 汉字转拼音
opencc4j 繁简体转换
sensitive-word 敏感词
前言
大家好,我是老马。
下面学习整理一些其他优秀小伙伴的设计、论文和开源实现。
摘要
本文介绍了我们在NLPTEA2020任务——中文语法错误诊断(CGED)中的系统。CGED旨在诊断四种类型的语法错误:缺失词(M)、冗余词(R)、错误选词(S)和词序错乱(W)。
自动化的CGED系统包含两个部分:错误检测和错误修正。
对于错误检测,我们的系统基于多层双向Transformer编码器模型,并将ResNet集成到编码器中以提高性能。我们还探索了从模型库中逐步集成选择,以提高单一模型的表现。
对于错误修正,我们设计了两个模型,分别推荐S类型和M类型错误的修正。在官方评估中,我们的系统在错误检测的识别级别和位置级别获得了最高的F1分数,在修正级别获得了第二高的F1分数。
1 引言
中文通常被认为是最复杂的语言之一。与英语相比,中文没有单复数变化,也没有动词时态变化。
此外,由于中文没有明确的词边界,通常需要在深入分析之前进行分词处理。
这些问题使得中文学习对新学习者来说具有很大的挑战性。近年来,越来越多来自不同语言和知识背景的人开始对学习中文作为第二语言产生兴趣。
为了帮助这些人识别和纠正中文写作中的语法错误,开发一个自动化的中文语法错误诊断(CGED)工具变得非常必要。
为了促进中文学习中自动语法错误诊断技术的发展,2014年起,自然语言处理教育应用技术(NLP-TEA)将CGED作为共享任务之一,提出了多种方法来解决CGED任务。
在这项工作中,我们介绍了我们在NLPTEA-2020 CGED任务中的系统。
在错误检测方面,我们的系统基于多层双向Transformer编码器模型,并将ResNet集成到编码器中以提升性能。
我们还探索了从模型库中逐步集成选择,以提高单一模型的表现。
在错误修正方面,我们设计了两个模型,分别针对S类型和M类型错误推荐修正。
更具体地,我们使用RoBERTa(Liu et al., 2019)和n-gram语言模型来修正S类型错误,结合预训练的掩码语言模型和统计语言模型生成M类型错误的可能修正结果。
在官方评估中,我们的系统在错误检测的识别级别和位置级别获得了最高的F1分数,在修正级别获得了第二高的F1分数。
本文组织结构如下:第2节简要介绍CGED共享任务,第3节介绍我们的研究方法,第4节展示实验结果,第5节介绍相关工作,最后第6节总结了结论并展望未来工作。
2 中文语法错误诊断
NLPTEA CGED任务的目标是指出中文作为外语学习者写作中的语法错误。
句子中可能包含四种类型的语法错误,包括缺失词(M)、冗余词(R)、选词错误(S)和词序错误(W)。
输入的句子可能包含一种或多种错误。
给定一个句子,系统需要完成以下任务:
(1)判断句子是否正确;
(2)指出句子包含的错误类型;
(3)标明错误的具体位置;
(4)对S类型和M类型错误提供可能的修正。
表1展示了一些典型示例。
3 方法论
3.1 错误检测
我们将错误检测问题视为序列标注问题。具体而言,给定一个句子 ( x ),我们使用BIO编码(Kim 等,2004)生成相应的标签序列 ( y )。然后,我们结合ResNet和Transformer编码器来解决标注问题。
集成ResNet
深度神经网络在每一层学习不同的表示。
例如,Belinkov 等(2017)表明,在机器翻译任务中,网络的低层学习表示单词结构,而高层则更关注单词的意义。
对于强调语法特征的任务(如中文语法错误检测),低层的网络信息被认为非常重要。
在本工作中,我们使用残差学习框架(He 等,2016)将单词嵌入信息与深层信息结合起来。给定序列 ( S = w_0, ..., w_N ) 作为输入,ResBERT的公式如下:
公式(6)表示残差学习框架,其中 ( h_L^i ) 的隐藏输出与输入嵌入一起用于逼近残差函数。然后,我们将 ( h_L^i ) 和 ( R_i ) 的连接结果传递给输出层。
逐步集成选择(Stepwise Ensemble Selection)
我们发现,不同的随机种子和dropout值可能导致每次训练结束时不同的性能。
为了提高性能,我们合并不同模型的结果。我们并不是通过加权平均来合并所有单一模型,而是使用来自模型库的逐步集成选择(Caruana 等,2004)来找到一个子集的模型,该子集在加权平均时能获得最优性能。模型库是通过使用不同的随机种子和dropout值生成的。
基本的集成选择过程如下:
- 从空集开始。
- 向集成中添加模型库中最大化集成性能的模型,以提高中文语法错误检测指标在验证集上的表现。
- 重复步骤2,直到达到固定的迭代次数或所有模型都已使用完。
- 返回在验证集上具有最大性能的嵌套集成结果。
在每一步选择最佳模型时,使用的是跨跨度(span-level)的投票机制,具体如下:
- 每个单一模型标注的错误文本跨度都会为该跨度投一票(例如,如果某个位置的词“是”被某个模型标记为R类型,那么它就获得一票)。需要注意的是,只有在某个单一模型标记为错误类型的文本跨度才被认为是候选的错误文本。
- 如果某个候选错误文本跨度收集到的投票数达到最小阈值(例如30% * 模型子集数量),则该文本被标记为真实错误。
所呈现的简单的前向模型选择过程是有效的,但有时会导致过拟合验证集,从而降低集成在测试集上的表现。为了减少过拟合,我们对选择过程做了三项改进,如Caruana 等(2004)所述:
有替换的选择:如果没有替换地进行模型选择,性能会随着最佳模型的加入而提高,直到达到峰值,然后迅速下降。通过有替换的选择可以大大减少这个问题。有替换的选择允许同一个模型多次加入集成,这样可以通过加权模型来微调集成:被多次加入集成的模型会获得更大的权重。
排序集成初始化:简单的前向模型选择过程从空集开始。前向选择在集成较小的时候容易过拟合。为防止过拟合,我们根据模型的表现对模型库中的模型进行排序,并将最好的 ( N ) 个模型放入集成中。我们设置 ( N = 5 )。
袋装集成选择:随着模型库中模型数量的增加,找到会导致过拟合验证集的模型组合的可能性也增加。袋装方法可以最小化这个问题。我们通过从模型库中随机抽样一部分模型来减少模型的数量,并从该样本中选择模型。如果某个特定组合的 ( M ) 个模型发生过拟合,那么它们出现在随机袋中的概率会小于 ( (1 - p)^M ),其中 ( p ) 是袋中模型的比例。我们使用 ( p = 0.5 ),并进行20次袋装集成选择,以确保最好的模型有多次被选中的机会。最终的集成结果是这20个集成的平均值。
3.2 错误修正
该系统还需要为S型和M型错误推荐修正。
在本工作中,我们设计了两个不同的模型,分别为S型和M型错误推荐修正。下面分别描述这两个模型。
S型修正
对于S型错误的修正,我们主要使用RoBERTa(Liu 等,2019)和n-gram语言模型。
首先,我们对语言模型进行领域适配。我们使用之前比赛的CGED训练集对RoBERTa-wwm进行微调,并将CGED数据与新闻语料结合,训练一个5-gram语言模型。
S型修正包括单字符修正和多字符修正。
对于单字符修正,我们考虑RoBERTa生成的前20个候选结果和L2学习者语料库中最常见的3500个字符作为候选项。
我们根据RoBERTa的预测概率、n-gram语言模型的预测概率、视觉相似性和语音相似性(Hong 等,2019)对候选项进行打分。随后,选择得分最高的字符作为修正结果。
对于多字符修正,我们同样选取RoBERTa在每个位置生成的前20个字符。然后,我们将这些字符组合成词,并保留词汇表中出现的词作为候选项。除了单字符修正时使用的四种特征外,我们还考虑了错误词和候选词之间的Levenshtein距离。
数据统计
错误类型 | R | M | S | W |
---|---|---|---|---|
训练集 | 52,312 | 11,548 | 13,931 | 23,014 |
验证集 | 4,871 | 1,060 | 1,269 | 2,156 |
M型修正
特别地,我们将M型错误的修正视为完形填空任务,并利用预训练的掩码语言模型和统计语言模型的组合来生成可能的修正结果。
给定怀疑为缺失的位置,我们将M型错误的修正过程分为两个步骤:首先提供可能的修正,然后评估并选择最合理的修正。
使用预训练的掩码语言模型时,我们首先通过基于BERT的序列标注模型预测疑似M型错误位置的缺失字符数。
然后,我们在该位置前插入与预测缺失字符数相同数量的[MASK]符号。接着,使用BERT预测每个[MASK]符号最可能的字符,将其作为修正候选项。
使用统计语言模型时,我们准备了一个L2学习者的中文高频词汇表,并将所有可能的中文词汇从该词汇表补充到疑似M型错误位置,生成一系列修正候选项。
为了评估每个候选项的概率,我们使用这些候选项构造修改后的句子,并计算原句和所有修改句子的困惑度(perplexity),困惑度由在L2学习者语料库上预训练的统计语言模型计算。
如果修改句子的困惑度显著低于原句的困惑度(这个阈值由人工设置),我们就将该候选项视为预测的修正结果。
相关工作
研究人员使用了多种不同的方法来研究英语语法错误修正任务,并取得了良好的结果(Ng et al., 2014)。
与英语相比,中文语法错误诊断系统的研究起步较晚,数据集和有效方法较为匮乏。
早期工作:
- Chen 等人(2013)仍然使用 n-gram 作为主要方法,并通过加入 Web 资源来提高检测性能。
- Lin 和 Chu(2015)建立了一个基于 n-gram 的评分系统,从而获得了更好的修正选项。
近年来的进展:
随着 NLPTEA CGED 任务的引入,中文语法错误诊断逐渐成为共享任务,提出了许多方法来解决这一任务(Yu 等人,2014;Lee 等人,2015,2016)。
Zheng 等人(2016)提出了基于字符嵌入和 bigram 嵌入的 BiLSTM-CRF 模型。
Shiue 等人(2017)结合了机器学习和传统的 n-gram 方法,使用 Bi-LSTM 检测错误位置,并加入了额外的语言学信息,如 POS、n-gram。
Li 等人(2017)使用 Bi-LSTM 生成每个字符的概率,并使用两种策略来判断字符是否正确。
Liao 等人(2017)使用 LSTM-CRF 模型来检测输出之间的依赖关系,从而更好地检测错误信息。
Yang 等人(2017)在 LSTM-CRF 模型中加入了更多的语言学信息,如 POS、n-gram、PMI 分数和依赖特征。该系统在 CGED2017 任务中达到了最佳的 F1-scores,分别在识别层次和位置层次上表现优异。
Fu 等人(2018)在 BiLSTM-CRF 模型中加入了更多特征,如 词汇分割、Gaussian ePMI、POS 和 PMI 的结合,并采用了概率集成方法来提高系统性能。该系统在 CGED2018 任务中取得了识别层次和位置层次的最佳 F1-score。
结论与未来工作
本文描述了我们在 NLPTEA-2020 CGED 任务中的系统,该系统结合了 ResNet 和 BERT 用于中文语法错误诊断。
我们还设计了两种不同的集成策略,以最大化模型的能力。
性能亮点:
- 我们的系统在 识别层次 和 位置层次 上取得了最佳的 F1 分数。
- 我们还在 修正 top1 层次 上取得了第二高的 F1 分数,在 检测层次 上取得了第三高的 F1 分数。
未来工作:
- 我们计划通过使用更多的训练数据来构建一个更强大的语法错误诊断系统,并尝试通过使用不同的跨领域语料库来提高系统的能力。
致谢
我们感谢 CGED 2020 任务的组织者们为本任务做出的巨大贡献。
我们也感谢匿名评审员提供的有见地的评论和建议。
本工作得到了 中国国家重点研发计划(项目编号 2018YFB1005100)和 国家自然科学基金(项目编号 61976072, 61632011, 61772153)的资助。
参考资料
https://aclanthology.org/2020.nlptea-1.5.pdf