关于Faspell的使用经验分享

faspell是2019年由爱奇艺发表的错别字检测纠错sota算法。因为工作原因,涉及到一些错别字的检测纠错技术,因此对相关内容做了点研究。

从技术的原理来说,错别字显然是一个经验型的技术,输入的一句话怎么排?每个字出现的概率概率高低?都是依靠训练样本给出足够的场景数据得出的。从这方面来讲,LSTM+CRF的经典组合必然是首先考虑的。但是又考虑到bert的MLM任务是如此的符合错别字检测纠错场景,因此也关注到基于bert的ctc(Chinese text correction)算法。

最终选择bert体系算法的原因主要有两者:

  1. bert的预训练模型模型太强了,这个就不用多说了,个人如果有装备训练一个同数据量的LSTM,我觉得还不如考虑去买套房。

  2. bert不论从算法本身来说,还是预训练时的任务,都更符合我需要的场景。

另外,现在有很多第三方的开源纠错库,其实如果是垂直领域的文本材料纠错,我还是非常建议选用可以fine-tune的算法。

言归正传,接下来详细介绍下faspell的部分。官方给出的faspell我阅读后并没有感受到非常具体的信息,但是觉得爱奇艺给出的这样一个纠错思路是比较试用大部分垂直场景的,我后续也针对我的工作对此做了一些代码上的优化和改动,代码可以参考:https://github.com/whgaara/tensorflow-faspell

我简化了整个项目的入口部分,并且只选用了拼音作为我的纠错方向,因为我的测试场景是基于输入的,所以放弃了笔画的比较,从faspell_wh.py顺着看下去基本就能看明白原理了。

faspell整体上说是分成的两部分,一个是encoder部分,一个是decoder部分,decoder也就是论文种提到的CSD,其原理其实不复杂,encoder部分基本就是bert,先利用bert对输入的句子中每个字进行预测,预测出每个位置topn的潜在文字。接下来,decoder部分从笔画相似性和拼音相似性两个维度综合对topn中的文字进行rank,从而给出模型inference出的正确结果。

通过上述的的内容,大家不难看出,faspell的重点部分其实还是前面的bert预测部分,当然你要是感兴趣,换成xlnet、gpt都是可以的。作者默认的预训练模型是google官方提供的110M那款的汉字预训练模型:https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip

这个模型可以解决日常常用语的大部分错别字纠错的情况,但是,如果说你要在垂直领域内尤其是具备多种专有表述方式的场景,一定要fine-tune。这里fine-tune时有一个非常重要的点,也是faspell作者在训练时指出的,就是fine-tune时bert训练数据需要人工的对其每个字均进行mask,而不是任由bert那随机产生的15%几率来mask,作者目的在于强化模型对该垂直领域具备更加强的拟合度,产生这些训练数据的代码在bertmodified目录下,先由createdata.py生成数据集,再由create_tf_record.py来创建用于训练的tfrecord文件。本人准备了一套约10000条的原始fine-tune数据集,对每个字进行mask后,生成了约100000条数据集,最终对1000条随机生成的近似音错别字语句进行测试,垂直领域下,可以做到召回率94%,正确率90%。

当然如果你实在懒得弄,我觉得只要你数据量不小,直接基于你的垂直领域数据集个fine-tune也可以,也不是一定要把每个字都mask起来,毕竟bert自身的15%mask概率也不算低了。

当然,上述的成绩仅仅依靠上面的bert fine-tune技巧是肯定不行的,接下来讲讲CSD的部分。这块内容实际上的功能就是一种相似性的计算,一句话中的某个字,bert给出了5个预测结果,那么这6个预测结果如果第一个预测结果与本字相同,那么则认为本字不是错别字。但是如果第一个预测结果与本字不同,则要在拼音和笔画两个方向上找出最相似的那么字作为最后预测出的改正字。在原文中,作者在这部分提出一个训练的概念,这个训练并不是指神经网络的那种训练,而是根据训练集找到两个权重,分别是笔画的相似性权重和拼音的相似性权重,每个预测字使用:笔画权重*笔画相似度+拼音权重*拼音相似度,来得出每个预测字的整体置信度。

而本人所在场景,都是年轻人使用且通过手机输入的场景,五笔的可能性实在是太低,所以我对上述过程进行了简单的针对性优化。首先,bert给出5个预测结果,首先判断这5个预测结果中有没有任意一个字与原字是相同的,只要存在一个预测结果相同,那么这个字则判断不是错别字。若5个预测结果均与原字步相同,那么则分别计算拼音相似度,拼音相似度最高的认为是预测出的修正结果。

那么笔画和拼音的相似度怎么比呢,说到这里就不的不给大家安利一下我整理的数据集了,至于具体代码,可以参考下git里的,总之从faspell_wh顺着看就知道了,上一下数据集链接:

笔画:https://github.com/whgaara/tensorflow-faspell/blob/master/data/ids.txt

拼音:https://github.com/whgaara/tensorflow-faspell/blob/master/data/char_meta.txt

最后再强调下,我给出的git代码里没有我fine-tune后的模型,因为是公司的财产,是不能上传的,但是这套错别字的纠正思路原则上讲是比较清晰的,虽不复杂但是效果不错。

你可能感兴趣的:(关于Faspell的使用经验分享)