FASPell中文纠错模型论文阅读

一、简单介绍

中文纠错主要存在的问题可以这样划分:

  1. 谐音字词,如 配副眼睛-配副眼镜
  2. 混淆音字词,如 流浪织女-牛郎织女
  3. 字词顺序颠倒,如 伍迪艾伦-艾伦伍迪,我不会让失望她-我不会让她失望
  4. 字词补全,如 爱有天意-假如爱有天意
  5. 形似字错误,如 高梁-高粱
  6. 中文拼音全拼,如 xingfu-幸福
  7. 中文拼音缩写,如 sz-深圳
  8. 语法错误,如 想象难以-难以想象

从现有的技术角度,按照时间以及技术的更新时间可以这样划分:

  1. ngram模型
  2. 最短编辑距离
  3. 依存树分析
  4. RNNLM
  5. ...
  6. Bert模型的横空出世———2018年

前面的几种方式,在网上可以找到一大堆说明,这里我就不赘述了。重点是最后一种Bert模型。

2018年以来的NLP避不开的一个模型就是Bert模型。全称是Bidirectional Encoder Representation from Transformers,它在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越人类,并且还在11种不同NLP测试中创出最佳成绩,包括将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进率5.6%)等。BERT为NLP带来里程碑式的改变。

那么Bert模型主要解决什么问题?

首先我们看看NLP中有哪些问题,阅读理解,语句情感分析,完形填空,判断两句话的相似程度,语法分析,包括我们这里提到的文本纠错。显然,如果使用监督学习来完成这些任务,需要海量数据。作者认为存在通用的语言模型,先用语料文章无监督的预训练通用模型,然后再根据具体应用,用 supervised 训练数据,精加工(fine tuning)模型,使之适用于具体应用。为了区别于针对语言生成的 Language Model,作者给通用的语言模型,取了一个名字,叫语言表征模型 Language Representation Model。

本文提到的这个模型是爱奇艺在2019年提出的汉字纠错模型。主要解决的是文字相似字形和读音相似文字的纠错,论文中提到优点是只需要少量的训练数据(1万条左右)用于有监督的训练,训练数据之所有只需要这么一点是因为强大的bert预训练模型。第二个优点是,这里模型采用的自动编码器DAE加上解码器decoder结构,其中的解码器涉及有助于减少模型对混淆集的使用,这是因为在解码器中充分利用了中文相似性特征。

image.png

过去的中文纠错采用的策略是,首先每个汉字都预先准备一个混淆集,混淆集中存放的是容易和这个汉字混淆的其他汉字。然后用一个过滤器来选择对于一条指定语句的最佳的汉字。这样的方式存在的问题是,第一 纠错样本是缺乏的,即使采用人工生成的纠错样本,正确了也会在4万条语句之后停止上升。其次,混淆集在利用汉字的相似性上是不充分和不灵活的,有时候某个正确汉字可能不在当前使用的错别字的混淆集中。

本文中采用的DAE+decoder模型,其中的DAE输入为原始语句,输出为语句中每个汉字的候选集合排序结构,decoder通过综合考虑文字的其他特征进行最优汉字的筛选,最终得到识别后的语句结果。其中的DAE采用了bert模型,对每个汉字输出指定的topk候选集,decoder选择一个人工精心设计的过滤器,用来综合汉字本身的特征进行候选集的过滤。

本文作者提到这个模型的优点是速度快、适应能力强(可用于简体中文和繁体中文,之前的模型大多针对繁体中文),简单(结构简单,DAE+decoder),能力强悍。这里需要额外指出,针对ocr数据,可以达到错误检出78.5%,错误纠正73.4%.当然使用的是爱奇艺自己的数据。我们使用自己的数据基本就是开源的错误数据以及生成的假样本,正确率需要打个折扣。

二、模型介绍

下面分别介绍DAE和decoder模型的结构。

1. masked language model

DAE模型听起来比较神神叨叨,但是本质上这个名词的作用就是一个生成每个汉字候选集的一个模型。论文中采用的masked language model.这种模型的代表就是bert,于是这里处于简单考虑就使用了bert作为DAE。


image.png

举一个论文中的例子,输入是带错别字的语句“国际电台苦名丰持人”,设置bert模型对每个文字输出top4的候选集,就可以得到下面的候选集合,每个候选集文字下的数字就是置信度,是bert模型对该汉字可能性的预估。这个指标在Decoder中也会被使用。


image.png

Encoder训练

在bert的原始训练过程中,错误的文字会被mask,其中80%会用[MASK]这个符号替换,10%会随机选择一个词汇符号替换,10%不进行替换。这么做的作用是,对于被[MASK]符号替换的汉字,模型会根据上下文学习缺失部分怎么填写,对于被随机替换的汉字,模型会学习到如何检测一个汉字是否是错误的并且纠正它,对于不被替换的汉字,模型学习这个汉字是否是错误的(论文上是这么说的,但是我感觉不也是检测错误并且纠正吗?和上面一个功能差不多)。

但是随机替换一个汉字的方式明显和纠错这个实际任务有点出入,因为我们实际的错别字往往是拼写错误或者是拼音输入错误,也就是说,错别字要么是长得和正确字相似要么是读音和正确字相似。那么在生成训练样本的时候,实际使用的生成策略是:

  1. 对于正确的语句,按照bert的原始生成策略来
  2. 对于有错误的语句,等比例生成如下的样本: 对于错误文字不做mask操作(也就是用自身mask),但是label为正确的文字;对于正确的文字也使用自身进行mask,label也是自身。

其中第二个操作我还比较迷醉,作者说这是为了避免overfit,但是这个不就是对含有错误的样本不做任何mask的含义吗?

上面提到的训练都是对bert进行finetune,finetuning在很多自然语言处理的下游任务中被证明是有效的。

2. Decoder

decoder通过综合考虑文字的其他特征进行最优汉字的筛选。 这里的其他特征包括文字形状相似度、文字读音相似性和上面Encoder提供的每个文字的置信度。


image.png

首先介绍一下文字的相似性。 在OCR中,文字的错误往往是相似汉字的错误,在拼音打字的时产生的错误往往是读音相近的错误。

形状相似的文字应该怎么衡量相似度?

在Kanji Database Project中使用IDS序列来表示字符的形状。

下面是一个例子,每个汉字都可以按照上下、左右进行拆分,将这种拆分使用二叉树绘制出来就是下面这样的。③是最详尽的一种拆分。将拆分的二叉树进行前序遍历就可以得到一个汉字的IDS序列表示。通过计算两个汉字的IDS序列的编辑距离就可以得到两个汉字的字形相似度。需要注意的是,我们希望相似度实在0-1之间的,因此需要进行归一化处理,这里直接除两个字中较长序列的长度即可。其次我们希望复杂汉字对之间的相似度要略高于简单汉字对之间的相似度。

这里之所以计算的是序列的编辑距离而不是二叉树的编辑距离,因为二叉树的编辑距离计算时间复杂度较高,而且从实验效果上看,两者没有明显的区别。


汉字拆分

读音相似的文字怎么衡量相似度?

中文存在很多方言,所以这里的相似度就是众多方言(语种)的读音的编辑距离的平均值。和上面一样,也需要进行归一化处理将值域放在[0-1]之间。


截图 (1).png

有了相似文字的相似度衡量指标之后,结合bert给出的语句中每个汉字的候选集置信度,就可以介绍下面的内容了。bert模型会给每个汉字产生候选集,候选集的数量是我们自己指定的,假设为4,那么每个汉字的候选集就有四个汉字,每个汉字都带有一个置信度,表示bert模型认为是该汉字的概率。先假设候选集数量为1,那么此时bert模型只会对语句中的每个汉字产生一个候选结果。候选文字和原始文字一致,我们不会替换,候选文字和原始文字不一致,我们希望绘制置信度-相似性曲线来得到该结果是否正确的曲线来分类。

如图①所示,通过观察可以发现,如果是正确汉字,那么这个正确汉字的置信度会比较高,而且相似度指标也会比较高。也就是比较靠近绘制图的右上角。

如果原始文字正确但是候选集汉字错误,那么会比较偏向于左下角。此时可以绘制一条曲线过滤掉错误检测F-d的文字,如图②所示。

如果原始文字错误,但是候选的汉字也是错误的,那么比较偏向于中间部分,我们仍然可以画一条取消过滤掉大部分这样的错误,如图③所示。

如果我们不使用动态曲线,而是强制性的设计阈值,比如0.8×confidence+0.2*similarity<0.8来过滤结果,那么得到的就是图④。可以看出图④会导致结果的准确率偏低。


CSD曲线绘制

在只有一个候选集的情况下,我们可以根据上面方式寻找一条合理的曲线过滤候选集,一般选择图③的 曲线进行过滤,那么当候选集的数量有多个的时候,也可以采用类似的方式。将排在同位的候选集汉字构成一个集合,绘制上述的曲线。比如候选集为4时,需要绘制四条曲线。

下面是一个简单的例子,候选集为4,也就是语句中的每个汉字会产生4个候选字。”国际电台知名主持人“这几个候选字排在第一名,因此在训练时,对rank=1的候选字们绘制上述的图表得到曲线curve1进行过滤;同理对训练集中排在rank=2的候选集文字也进行曲线绘制,得到过滤曲线curve2,...,这样就分别得到了四条曲线。

在实际使用的时候,首先对rank=1的候选集文字使用curve1进行过滤,这里需要进行过滤的只有两个候选字,分别为"知“和"主”,而实际只有”主”字得以过滤通过。对Rank=2的候选集进行过滤,只有“著“字通过过滤。因此最终得到的就是正确纠正之后的文字。


一个例子

三、实验效果:

image.png

在实验中,首先对bert模型进行finetuning,然后对decoder中使用的Confidence-Similarity-Decoder(CSD)进行观察和曲线绘制。作者提到对于OCR的错误,如果对bert模型进行finetuning可能会导致效果变得更差,所以只是对CSD进行训练。

对CSD环节中的候选集数量进行实验发现候选集的添加总是有助于召回率的。考虑到时间效率,选择候选集数量为4比较合适。

对round数量进行实验发现round设置为3的时候达到巅峰,较大的回合数有助于提升精确率,因为在这一轮中没有矫正的汉字可以再下一轮中被矫正。(所以需要看一下代码,了解一下这个round是干啥用的)

和其他现有纠错模型比较,fasPell模型效果很好。

作者也对模型的框架进行开源,我们需要做的是根据自己的需要finetuning bert模型,绘制CSD的曲线。

你可能感兴趣的:(FASPell中文纠错模型论文阅读)