说明
最近根据需要整理了一下关于中文输入纠错相关的内容,特此记录一下。
1. 中文输入纠错任务定义
1.1. 任务定义
任务定义:中文拼写任务指的是对于自然语言在使用的过程中出现的问题进行自动的识别和纠正。
中文输入纠错任务主要有两个子任务,分别为错误识别和错误修正。错误识别的任务是指出错误出现的句子位置,错误修正就是在识别的基础上自动更正。
1.2. 同英文纠错任务的区别
中文纠错相比于英文纠错来说,主要困难来源于中文的语言特性:中文的词边界以及中文庞大的字符集。
中文的词边界,严格来讲,中文是没有词边界的。由于中文没有词的明确间隔且每个词的长度非常短。因此,在中文输入纠错的过程中,必须考虑上下文的因素,例如一个长短语或者一个句子,不能单纯针对一个词做纠错。一般来讲,拼写错误的出现会导致分词结果的不同。
中文庞大的字符集,根据调查,百分之九十的英文拼写错误和正确的编辑距离为1,编辑距离小于等于2的基本已经包括全部的拼写错误情况。因此,由于英文的字符集只有26个字母,英文拼写错误可以转化为字符级别的错误进行建模。但是中文的常用字符集就达到5000以上。
由于中文的语言特性,两种语言的错误类型也是不同的。英文的修改操作包括插入、删除、替换以及移动(移动指两个字母交换顺序等),而对于中文来说,因为每一个中文汉字都可独立成词,因此插入、删除和移动的错误只是作为语法错误。由于大部分的用户均为母语用户且输入法的存在,语法错误的情况比较少。因此,中文输入纠错主要集中在替换错误上。
2. 中文输入纠错评测
中文输入纠错的评测数据主要包括SIGHAN Bake-off 2013/2014/2015这三个数据集,均是针对繁体字进行的纠错。其中,只有SIGHAN Bake-off 2013是针对母语使用者的,而另外两个是针对非母语使用者。这里主要罗列一下常用的评测指标。在错误识别子任务中,常用的评测指标有:
- FAR(错误识别率):没有笔误却被识别为有笔误的句子数/没有笔误的句子总数
- DA(识别精准率):正确识别是否有笔误的句子数(不管有没有笔误)/句子总数
- DP(识别准确率):识别有笔误的句子中正确的个数/识别有笔误的句子总数
- DR(识别找回率):识别有笔误的句子中正确的个数/有笔误的句子总数
- DF1(识别F1值):2 * DP * DR/ (DP + DR)
- ELA(错误位置精准率):位置识别正确的句子(不管有没有笔误)/句子总数
- ELP(错误位置准确率):正确识别出笔误所在位置的句子/识别有笔误的句子总数
- ELR(错误位置召回率):正确识别出笔误所在位置的句子/有笔误的句子总数
- ELF1(错误位置准确率):2*ELP*ELR / (ELP+ELR)
在错误纠正任务中,常用的评测指标为:
- LA位置精确率:识别出笔误位置的句子/总的句子
- CA修改精确率:修改正确的句子/句子总数
- CP修改准确率:修改正确的句子/修改过的句子
3. 中文输入纠错主要框架
中文输入纠错的文章很多,但是从整体的思路来看,大部分是可以统一在一个框架之下。首先,给中文纠错任务一个形式化的定义:给定一个自然语言句子S,找出其中出错的汉字或词语c,并给出修改意见。中文纠错大致可作为一个两阶段建模:
- 构造纠正候选实体。这一阶段的主要目的就是利用一种或多种策略(某种规则或者模型)构建对于原句的修改候选,每一个候选均是对可能存在错误的一处或多处汉字进行替换后的结果。这一阶段是整个模型召回率的保证,同时也是一个模型的上限。
- 候选实体评分函数。这一阶段的主要目的就是在上一阶段的基础上,利用某种评分函数(编辑距离、LM等)或者分类器(LR、SVM等)结合局部乃至全局的特征进行一个排序的工作,最终排序最高的纠正候选作为修改结果。
大部分的模型基本上可以划分为这两部分,也有部分模型将两部分联合起来建模,在逐个构造候选的同时进行评分和筛选,本质上也可以属于这个框架的。
4. 候选生成的主要方法
4.1. 利用困惑集直接替换
首先介绍困惑集(confuse set)。困惑集是在中文输入纠错当中较为关键的数据之一,用于存储每个汉字可能被混淆的错别词的可能。困惑集的数据格式是key-value格式,key为中文中的常用汉字,value为汉字可能的错误形式。
这里的错误形式主要分为两大类,分别是发音混淆或者是形状混淆。应拼音输入和五笔输入带来的错误。发音混淆是最为主要的一种方式,其比例可达70%左右,发音混淆有四种错误类型,分别为相同读音、相同音节不同音调、相似音节相同音调、相似音节不同音调。形状混淆一般来说简单的根据五笔码的编辑距离计算就可以得到。困惑集的质量很大程度上决定了中文纠错的上限。
直接利用困惑集替换主要有两种策略,全部替换和单字替换。
- 全部替换:假设句子中每一个字都是错误的,利用构造集逐个替换每一个汉字,生成所有可能的组合,利用二元语言模型评估,取概率最大的作为正确答案[1]。这种方式可以遍历大多数的可能,但是缺点在于性能问题和FAR太低。
- 单字替换:假设句子中的每一个单字都是错误的,即对于分词之后每个单个的字利用困惑集进行替换,再进行选择[2]。这种方式在错误发现任务上取得了很好的召回率,但是其他方面的效率不高(把大量正常句子也当成有笔误的了)
4.2. 利用困惑集有选择替换
上述两种方式,对于单字的替换策略过于简单,虽然可以取得比较好的召回率,但是会将大量的正常句子修改且性能太差。为了解决上述的问题,主要有三种方式,一种是利用规则来减少替换的字数,一种是利用词表模板或语言模型过滤正确的表达,第三种是利用模型生成修正候选。
4.2.1. 利用规则的方法
文献[7]首先利用CRF进行文本分词,随后利用一系列规则进行困惑集的替换。
- 如果一个词只包含单个汉字,那么将候选集中的所有可能替换均加入;
- 如果一个词包括多个汉字,且词不在词表当中,尝试对每个汉字进行替换,若替换后词出现在词表,那么作为候选加入;
- 如果一个词包括多个汉字且在词表中,不做任何处理。
4.2.2. 利用词表或语言模型的方法
这种方法主要有两种思路,一种是过滤掉那些正确的部分,减少替换的次数;还有一种是对于一些常见的错误,构建模板或词表,遇到之后直接替换,避免替换的产生。
文献[9]利用新闻语料数据集TWWaC 训练汉字级别的ngram模型(n为2,3,4),选取出现次数超过10词的作为有效序列。随后通过分词找到单词组成的序列,并检查这些序列是否在词典中或者在ngram出现过,如果没有,那么对该序列的单字进行替换。
文献[3]采用了两种替换方式,一种是利用未登录词识别,找到无意义的单音节词素,利用困惑集进行替换;另一种是利用谷歌1T一元数据构造修正词表,利用纠错词对直接进行拼写纠错。该方法实施的原因是谷歌1T一元数据中包含了很多拼写错误,具体步骤为:
- 对1T一元数据中出现频率低的词用困惑集替换其中的汉字,如果新的词频率很高,那么作为纠错词对候选
- 计算每一个纠错词对中两个词在另一个大语料上的出现次数,如果原词/修改词的比值小于0.1,那么将纠错词对写入词典。
文献[6]通过语料统计的方式构造一部分高可信度模板,利用模版过滤一部分正确的序列,只对剩余的部分进行替换工作。主要维护三类数据,模板、长词词表、常用错误词表。具体操作如下:
- 构建一个长度超过两个字(包括两个)的词表,并给出对应的拼音,形成词汇拼音对;
- 对于每一个词汇拼音对,在一份具有拼音标注的语料中统计拼音到词汇的概率,具有高可信度的词汇作为高可信度词汇拼音模板;
- 对于输入的句子,如果检测到模板中的拼音,对比模版中的词汇同原句词汇的差异,重叠部分的汉字(这里汉字就行,即只要有一个汉字重合也算)被标记为正确,之后不再考虑这里有错误的可能;
- 维护一个长词的词典,收集超过4个字的词,例如成语谚语等,如果准确匹配,那么标记为正确;
- 构建一个常见错误的词表,例如“一旦”写成“一但”,如果匹配到,给出正确意见。
在排除之后,再进行连续单字的处理工作,通过替换连续单字序列中的每个单字,如果生成的序列在词表或者在Google Web 1T语料统计得到的ngram超过一定频率,那么作为候选生成。
文献[5]对困惑集做了扩充,并对每一个拼写错误构建倒排索引,拼写错误为索引词,潜在正确结果为检索内容,对于每个潜在正确内容,利用汉字出现的频率进行排名。预测同时,在监测阶段维护一个错词修正表,每次替换之后不在词表的词均加入错词表,最终找到正确结果的词加入正确词表,每次结束之后构建错词修正表。如果下次预测到的时候直接利用错词修正表进行调整。(这篇文章的效果很不错,但是论文比较短,写的很笼统,而且后续也没什么改进研究,一直没有特别读懂)
4.2.3. 利用模型生成的方法
模型生成的好处在于模型生成的过程中基本考虑了每种可能,利用其评分函数可以在生成候选实体的过程中进行预先筛选。
目前效果比较好的方式主要有HMM和基于图理论的方法。利用SMT进行生成的方式效果没有上两种好。
虽然模型比较多,但是我认为其总体思路还是一个信道噪声模型,假设有错的句子为S,纠错的句子为C,那么基本表达式为