文本纠错,是天然语言处理领域检测一段文字是否存在错别字、以及将错别字纠正过来的技术,通常用于文本预处理阶段,同时能显著缓解智能客服等场景下语音识别(ASR)不许确的问题。html
本文将经过如下几个章节简要介绍文本纠错相关知识。python
1. 文本纠错示例与难点
2. 文本纠错经常使用技术
3. 如何将 BERT 应用于文本纠错
4. 文本纠错最优模型:Soft-Masked BERT(2020-ACL)
5. 立立刻手的纠错工具推荐
一.文本纠错示例与难点
生活中常见的文本错误能够分为(1)字形类似引发的错误(2)拼音类似引发的错误 两大类;如:“咳数”->“咳嗽”;“哈蜜”->“哈密”。错别字每每来自于以下的“类似字典”。git




其余错误还包括方言、口语化、重复输入致使的错误,在ASR中较为常见。github
现有的NLP技术已经能解决多数文本拼写错误。剩余的纠错难点主要在于,部分文本拼写错误须要常识背景(world-knowledge)才能识别。例如:算法
Wrong: "我想去埃及金子塔旅游。"
Right: "我想去埃及金字塔旅游。"
将其中的“金子塔”纠正为“金字塔”须要必定的背景知识。网络
同时,一些错误须要模型像人同样具有必定的推理和分析能力才能识破。例如:架构
Wrong: "他的求胜欲很强,为了越狱在挖洞。"
Right: "他的求生欲很强,为了越狱在挖洞。"
“求胜欲”和“求生欲”在天然语言中都是正确的,可是结合上下文语境来分析,显而后者更为合适。函数
最后,文本纠错技术对于误判率有严格的要求,通常要求低于0.5%。若是纠错方法的误判率很高(将正确的词“纠正”成错误的),会对系统和用户体验有不好的负面效果。工具
二.文本纠错经常使用技术
错别字纠正已经有不少年的研究历史。经常使用的方法能够概括为错别字词典、编辑距离、语言模型等。学习
构建错别字词典人工成本较高,适用于错别字有限的部分垂直领域;编辑距离采用相似字符串模糊匹配的方法,经过对照正确样本能够纠正部分常见错别字和语病,可是通用性不足。
因此,现阶段学术界和工业界研究的重点通常都是基于语言模型的纠错技术。2018年以前,语言模型的方法能够分为传统的n-gram LM和DNN LM,能够以字或词为纠错粒度。其中“字粒度”的语义信息相对较弱,所以误判率会高于“词粒度”的纠错;“词粒度”则较依赖于分词模型的准确率。
为了下降误判率,每每在模型的输出层加入CRF层校对,经过学习转移几率和全局最优路径避免不合理的错别字输出。
2018年以后,预训练语言模型开始流行,研究人员很快把BERT类的模型迁移到了文本纠错中,并取得了新的最优效果。
3、将BERT应用于文本纠错


BERT与以往深度学习模型的主要区别在于:预训练阶段使用了“掩码语言模型”MLM和“判断s1是否为s2下一句”NSP两个任务,特征抽取使用12层双向Transformer,更大的训练语料和机器「More Money,More Power」。其中,MLM任务使得模型并不知道输入位置的词汇是否为正确的词汇(10%几率),这就迫使模型更多地依赖于上下文信息去预测词汇,赋予了模型必定的纠错能力。
一种简单的使用方式为,依次将文本s中的每个字c作mask掩码,依赖c的上下文来预测c位置最合适的字(假设词表大小为20000,至关于在句子中的每个位置作了一个“20000分类”)。设置一个容错阈值k=5,若是原先的字c出如今预测结果的top5中,就认为该位置不是错别字,不然是错别字。


固然这种方法过于粗暴,极可能形成高误判率。做为优化,咱们能够采用预训练的方式对BERT进行微调,显著改进纠错效果。纠错的领域最好和微调领域相同(若是须要在新闻类文章中纠错,可使用“人民日报语料”对模型微调)。
4、文本纠错最优模型:Soft-Masked BERT
为了弥补baseline方法的不足,最大限度发挥BERT功效,复旦大学的研究人员在2020 ACL上发表了最新论文:
“Spelling Error Correction with Soft-Masked BERT”。 arxiv.org

论文首次提出了Soft-Masked BERT模型,主要创新点在于:
(1)将文本纠错划分为检测网络(Detection)和纠正网络(Correction)两部分,纠正网络的输入来自于检测网络输出。
(2)以检测网络的输出做为权重,将 masking-embedding以“soft方式”添加到各个字符特征上,即“Soft-Masked”。
论文简要分析
具体来看,模型Input是字粒度的word-embedding,可使用BERT-Embedding层的输出或者word2vec。检测网络由Bi-GRU组成,充分学习输入的上下文信息,输出是每一个位置 i 可能为错别字的几率 p(i),值越大表示该位置出错的可能性越大。


检测网络 与 Soft Masking
Soft Masking 部分,将每一个位置的特征以 的几率乘上 masking 字符的特征
,以
的几率乘上原始的输入特征,最后两部分相加做为每个字符的特征,输入到纠正网络中。原文描述:


纠正网络
纠正网络部分,是一个基于BERT的序列多分类标记模型。检测网络输出的特征做为BERT 12层Transformer模块的输入,最后一层的输出 + Input部分的Embedding特征 (残差链接)做为每一个字符最终的特征表示。


最后,将每一个字特征过一层 Softmax 分类器,从候选词表中输出几率最大的字符认为是每一个位置的正确字符。


整个网络的训练端到端进行,损失函数由检测网络和纠正网络加权构成。


实验结果
做者在“SIGHAN”和“NEWs Title”两份数据集上作了对比实验。其中“SIGHAN”是2013年开源的中文文本纠错数据集,规模在1000条左右。“NEWs Title”是从今日头条新闻标题中自动构建的纠错数据集(根据文章开头展现的类似字形、类似拼音字典),有500万条语料。


Soft-Masked BERT 在两份数据集上几乎都取得了最好结果。同时咱们发现,Finetune对于原始BERT的表现具备巨大的促进做用。
论文代码做者暂未开源,可是论文的模型和思路应该是很是清晰易懂的,实现起来不会太难。这儿先立个flag,有时间本身来实现一下。
5、立立刻手的纠错工具推荐
笔者简单调研发现,文本纠错网上已经有很多的开源工具包供你们使用了。其中最知名的应该是 pycorrector
pycorrector github.com支持kenlm、rnn_crf、seq2seq、BERT等各类模型。结合具体领域的微调和少许规则修正,应该能够知足大部分场景中的文本纠错需求了。


Demo中笔者使用了经人民日报语料微调过的BERT模型,经过pycorrect加载来作基于MLM的文本纠错。识别结果还算能够,甚至“金字塔”这种须要常识的错别字都纠正出来了。
固然pycorrect还支持各类语言模型和DNN模型,留给你们自行把玩 : )
此外,笔者还找到一个京东客服机器人语料作的纠错模型:
基于京东客服机器人语料作的中文纠错模型 github.com
主要解决同音字自动纠错问题,好比:
对京东新人度大打折扣 --> 对京东信任度大打折扣
我想买哥苹果手机 --> 我想买个苹果手机
不过仓库上一次更新在5年前,年代久远估计效果有限。
以上是笔者近期调研文本纠错后的一些思考,恰好上周在实验室组会中作了分享,就顺便写了这篇文章。若是你们发现有好的纠错方法或论文,欢迎留言分享一块儿交流哈