提出一种基于语料库的规则自动抽取方法,在此基础上提出了有限回退算法对英语文章进行语法错误检查及纠正.该方法在2013年CoNLL语法自动检查及纠正评测数据上总体F1为31.96%,超过第1名的31.20%,在冠词错误的纠正方面F1为33.45%,超过2013年最好成绩33.40%,在名词错误的纠正方面F1为45.31%,超过2013年最好成绩44.35%.
Grammatical error correction(GEC) is the task of detecting and correcting grammatical errors in text written by non-native English writers. A limited back-off algorithm and corpus approach was proposed to handle the grammatical error problem in English text, useful and effective for GEC task. The GEC system yields F1 score of 31.96% on the publicly available CoNLL-2013 shared task data, outperforming the first one with 31.20%.
英语是世界上最多国家使用的官方语言,也是世界上使用最广泛的第二语言.对于英语为第二语言的学习者来说,语法错误是写作中最常见也是最难解决的问题之一.语法自动检查及纠正(GEC,grammatical error correction)就是利用计算机自动对英语文章进行语法错误检查并纠正.笔者提出了一种基于语料库的规则自动抽取方法,基于语料库从标注好的训练集中获取大量的错误的语法规则,在此基础上提出了基于有限回退(LB,limited back-off)算法的GEC方法,针对不同错误类型的特点,进行相应语法错误检查及纠正.
1 相关工作GEC最早开始于20世纪80年代,Writer’s Workbench主要是通过规则来进行语法错误的识别及纠正,随后出现了基于句法分析的Epistle系统,1993年微软的word使用了基于拓展短语结构语法(APSG,augmented phrase structure grammar)的分析方法对输入文本进行语法检查.上述方法大都是依赖规则库来进行语法检查[1].
随着各种规模的语料库的出现,将语料库和统计方法相结合成为有效语法检查的方法.相关的评测任务HOO在2011和2012年连续举办了2年,2013,2014年CoNLL主办了GEC[2-5].
研究者将GEC问题分解为多个子问题,针对每个问题建立模型,即针对每种错误类型建立纠正模型. CoNLL-2013评测任务很多优秀的系统都基于这种方法[6].然而,这种方法中的模型性能依赖于先验知识且为每个模型设计不同的特征需要大量的人工操作.所以,笔者采用基于语料库的方法对英文文章语法错误检查及纠正.首先,利用有限训练集,通过规则自动抽取方法获取错误的语法规则.然后,基于规则和大规模语料库在有限回退算法下进行纠正.该方法对先验知识有较少的依赖且不需要设计大量的人工特征,大大减少了人工操作的量,并且可以实时增加语料规模.
2 基于语料库和回退算法的GEC方法提出了一种基于语料库的规则自动抽取方法及基于有限回退算法的语法错误检查及纠正方法,系统架构如图 1所示.
文本预处理主要包括断句、词性标注、句法分析、依存分析.
采用基于规则的方法进行断句,同时采用基于最大熵的词性标注算法.使用基于概率上下文无关文法(PCFG,probabilistic context free grammer)的生成式句法分析模型以及基于神经网络(NN,neural-network)的依存分析器.
2.2 语料库构建 2.2.1 收集语料为保证语料质量,语料来源为纽约时报.对抓取的正文内容进行断句处理及清洗工作,及对标点符号做特殊的处理.
2.2.2 建立搜索服务所提出的有限回退算法依赖语料库需要对语料库进行n-grams检索.为了提高检索效率,对语料中的句子建立倒排索引.
2.3 基于语料库和回退算法的GEC方法CoNLL-2013评测任务中,主要关注英语文章中的冠词及定冠词错误、名词单复数错误、介词错误、主谓不一致和动词错误这5种错误.笔者提出了规则自动抽取方法进行错误规则的抽取,然后利用有限回退算法结合规则进行纠正的方法.
符号说明:w表示句子,wi表示句子w中的第i个单词,k表示移动窗口的大小.
2.3.1 规则自动抽取方法抽取算法描述如下,以冠词为例:
1) 从训练集中取出含有标注为冠词错误类型的句子,进行词性标注,句法分析和依存分析;
2) 定位错误单词的位置,并从句法分析和依存分析中分别获取含有错误单词的NP短语,det(限定词修饰)依存关系,并恢复成单词和词性标注结果的混合的NP短语;
3) 获取“单词_词性”的模式,例如“the_dt _jj life”, “the_dt _jj _nn”, “_dt _jj life”等,统计在语料库中频次,如果频次低于某个阈值T,则该模式是错误的,将这个模式和对应的修改方式放入规则库.
移动窗口
在识别句子w语法错误的过程中,给定位置为i的单词wi后,可以通过窗口的大小为k的移动窗口MWi, k(w)获得wi前后相关的短语[7],以此来判断语法是否正确,如式(1)所示.
$ M{W_{i,k}}\left( w \right) = \left\{ {{w_{i - j}},\; \cdots ,{w_{i - j + \left( {k - 1} \right)}},j = 0,k - 1} \right\} $ | (1) |
窗口的大小k的选择和j的最大取值对GEC的检查有一定的影响,在实际情况下,会根据某个具体的错误类型进行k和j的微调.
知识库
对于语法错误检查及纠正的过程而言,为了排除语言使用时的固定搭配,以及获取被纠正单词的候选集等,笔者构建了相应的知识库.知识库主要包括从训练集中抽取的对应的修改方式,及从网络上获取的有关资料.
2.3.2 有限回退算法纠正过程使用如下回退算法,比值越高说明替换后出现的频度越大,应该被纠正;比值越低说明原单词在语料库中的频度更大,不应该被纠正;如果比值在一定范围,则进行回退,缩短n-grams的长度,继续进行查询比较,直到n-grams长度为1.待纠正单词所在的n-grams可用式(2)来描述.
$ {S_{i,k}}\left( w \right) = {\Sigma _{{\rm{ngram}} \in M{W_k}\left( w \right){\rm{count}}\left( {{\rm{ngram}}} \right)}} $ | (2) |
其中:Si, k(w)代表包含单词wi且由k个单词组成的n-grams在语料库中频度和. k从大到小取值回退,来保证尽可能的准确.由于不同的窗口大小取出的值可能存在较大的差异,为了提高算法的准确率,采用有限回退算法.
即在回退的过程中不仅要满足比值的条件,同时对于当前统计值Si, k(w)也要进行判断,对于不同的k值,统计值高于阈值才进行回退,以提高算法的准确率.
具体的纠正函数的算法描述如下.
function Replace(i, k, w′)
M={m1, m2, m3, m4, m5}
$ r = \frac{{{S_{i,k}}\left( {w'} \right)}}{{{S_{i,k}}\left( w \right)}} $ |
if r>λ and Si, k(w) < Mk
return True
else if k > 2 and r > ∈:
return Replace (i, k, w′)
else
return False
2.3.3 循环检查策略由于句子中可能含有多个错误,且不同的错误之间可能具有一定的依赖性.例如,“In supermarket monitor is needed because we have to track thieves.”,只有判断出“monitor”应该纠正为“monitors”,才能将“is”纠正成“are”.
为了尽可能找出所有的错误,笔者采用循环检查的策略.即在完成一遍检测之后,继续重复原来的步骤,直到多次纠正结果一致.
2.3.4 拼写检查模块如果句子中存在错误的单词拼写,对后续的语法检查会产生很大的影响.笔者针对单词的拼写检查使用规则和统计相结合的方法.对于非词错误的单词wi,给出编辑距离小于2的所有候选集合,用G(wi)表示,然后通过在语料库中查询出现频度最大的候选词作为纠正的单词.为了更准确地找到候选项,笔者使用了候选单词的3种组合[8],如式(4)所示.
$ G\left( {{w_i}} \right) = \left\{ {{w_j},j = 0, \cdots ,k - 1} \right\} $ | (3) |
$ \begin{array}{c} S\left( w \right) = \mathop {\max }\limits_{j = \left\{ {0, \cdots ,k - 1} \right\}} {\rm{sum}}\left[ {\left\{ {{\rm{count}}\left( {{w_{i - 1}}{w_j}} \right)} \right.} \right. + \\ \left. {\left. {{\rm{count}}\left( {{w_j}{w_{i + 1}}} \right) + {\rm{count}}\left( {{w_{i - 1}}{w_j}{w_{i + 1}}} \right)} \right\}} \right] \end{array} $ | (4) |
其中:i为被给定单词的位置,wi为被给定的单词,G(wi)为wi的候选集的集合. S(w)为所有候选项中二元组以及三元组在语料库中总和最大的候选单词.
2.3.5 冠词检查模块冠词检查模块主要针对于定冠词the,以及冠词a、an是否正确使用的情况.
首先,采用句法分析获取所有的内部不包含嵌套NP的最小NP.然后,在知识库中查询是否有触发的规则,如果有,则根据规则进行纠正.最后,利用有限回退算法进行二次检查和纠正.
2.3.6 名词检查模块名词检查模块主要针对于名词单复数使用错误的情况.由于名词单复数形式存在一致的情况,首先建立关于名词单复数的列表,如表 2所示.
表 2中对于存在复数且正确转换的标记为1,对于单复数一致的单词标记为2,对于存在复数但是错误转换的标记为3.
名词检查模块具体的检查过程描述如下:
1) 首先根据词性标注的结果,找出所有标记为NNS,NN的单词;
2) 对于标注为NNS的单词,查询单复数知识库,如果标记为2,则直接将该单词修改为原形.如果标记为3,则先找到该单词的原形,再利用原形找到该单词的正确复数形式,即此时后面标记为1的记录,并跳转到第3)步.如果标记为1,直接跳转到第3)步;
3) 利用有限回退算法,根据在此处名词单数和复数在语料库中出现的频率以及比值,判断是否应该完成纠正.
2.3.7 动词检查模块动词检查模块主要针对于动词的使用情况,包括动词的使用形式以及主谓一致.由于动词的形式复杂多样,笔者建立一个动词的转化表,如表 3所示.
动词检查模块具体的检查过程描述如下:
1) 首先根据词性标注结果找出标注为VB,VBD,VBG,VBN,VBP,VBZ的单词;
2) 依次在知识库里找到该单词的所有可能变化;
3) 最后利用有限回退算法,进行错误检查及纠正.
2.3.8 介词检查模块介词检查模块主要针对介词使用错误.由于介词种类有限,笔者利用训练集构建了一个介词替换的列表,如表 4所示.
由于介词使用的灵活性,笔者增加了介词短语常用搭配列表,如果句中出现了常用介词短语,则不进行纠正,否则利用有限回退算法进行检查及纠正.
3 实验 3.1 实验设置利用StanfordNLP对语料进行断句、词性标注、句法分析和依存分析.利用开源软件enhant生成非词错误的候选集,利用mysql搭建提供候选集的知识库,并利用elasticsearch搭建提供n-grams查询的搜索引擎.
3.2 实验数据实验所用数据来源于CoNLL-2013的GEC评测任务,训练数据和测试数据统计结果如表 5所示.
从表 5可以看出,训练集和测试集中的错误类型占比并不统一,例如对于动词而言,在测试集中占了更高的比例.
3.3 评测方法系统的性能根据CoNLL-2013评测标准,采用F1[4],定义如式(5)所示.
$ {F_1} = \frac{{\left( {{\beta ^2} + 1} \right)PR}}{{{\beta ^2}\left( {P + R} \right)}},\left( {\beta = 1} \right) $ | (5) |
其中:P与R分别表示准确率和召回率,其定义如下.
$ P = \frac{{{N_{{\rm{correct}}}}}}{{{N_{{\rm{predicted}}}}}} $ | (6) |
$ R = \frac{{{N_{{\rm{correct}}}}}}{{{N_{{\rm{target}}}}}} $ | (7) |
为了验证笔者方法的有效性,与CoNLL-2013评测单项第1名进行了对比.
如表 6所示,回退模型改进为有限回退模型后,准确率有了大幅度的提升,并且提高了F值.使用规则结合有限回退算法后,最终F值高于CoNLL-2013评测的单项第1名.
如表 7,8,9所示,在将回退算法为有限回退算法,F值都有一定程度的提升.其中,名词错误的F值高于CoNLL-2013评测单项第1名.
如表 10所示,经过循环检查,使得最终的准确率和召回率都有提升,最终综合F值高于CoNLL-2013评测第1名.
笔者提出了一种基于语料库的规则自动抽取方法进行规则自动获取,在此基础上提出了有限回退算法来对英语文章进行语法错误检查及纠正.该方法在2013年CoNLL语法自动检查及纠正评测数据上总体F1为31.96%,超过第1名的31.20%,在冠词错误的纠正方面F1为33.45%,超过2013年最好成绩33.40%,在名词错误的纠正方面F1为45.31%,超过2013年最好成绩44.35%,实验结果表明,该方法对GEC任务是有效的.
但仍然有一些问题需要解决:1)介词缺失的情况,例如“After several years researching and studying”,应该修改为“After several years of researching and studying”;2)将一个单词修改为多个单词的错误,例如“personal information releasing without knowing”应该修改为“personal information being released without knowing”等.
[1] | 刘磊.面向自动语法检查的依存规则研究[D].北京:北京外国语大学, 2014. http://cdmd.cnki.com.cn/article/cdmd-10030-1014254976.htm |
[2] | Robert D, Adam K. Helping our own:the HOO 2011 pilot shared task[C]//Proceedings of the Generation Challenges Session at the 13th European Workshop on Natural Language Generation, Association for Computational Linguistics, 2011. |
[3] | Robert D, Ilya A, George N. HOO 2012:a report on the preposition and determiner error correction shared task[C]//Proceedings of the Seventh Workshop on Building Educational Applications Using NLP, Association for Computational Linguistics, 2012. http://dl.acm.org/citation.cfm?id=2390390 |
[4] | Ng H T, Wu Siewmei, Wu Yuanbin, et al. The CoNLL-2013 shared task on grammatical error correction[C]//Proceedings of the Seventeenth Conference on Computational Natural Language Learning. Association for Computational Linguistics, 2013. |
[5] | Ng H T, Wu Siewmei, Briscoe T, et al. The CoNLL-2014 shared task on grammatical error correction[C]//Proceedings of the Eighteenth Conference on Computational Natural Language Learning, 2014. |
[6] | Mariano F, Zheng Yuan, Øistein E, et al. Grammatical error correction using hybrid systems and type filtering[C]//Proceedings of the Eighteenth Conference on Computational Natural Language Learning:Shared Task. Association for Computational Linguistics, 2014. |
[7] | Kao Tinghui, Chang Yuwei, Chiu Hsunwen, et al. CoNLL-2013 shared task:grammatical error correction NTHU system description[C]//Proceedings of the Seventeenth Conference on Computational Natural Language Learning:Shared Task, 2013. |
[8] | Pratip S, Bidyut B C. A simple real-word error detection and correction using local word bigram and trigram[C]//ROCLING, 2013. |