Soft-Masked BERT:文本纠错与BERT的最新结合

news/2025/2/1 16:47:15/

文章目录

  • 一.文本纠错示例与难点
  • 二.文本纠错常用技术
  • 三、将BERT应用于文本纠错
  • 四、文本纠错最优模型:Soft-Masked BERT
  • 论文简要分析
    • 检测网络 与 Soft Masking
  • 纠正网络
    • 实验结果
  • 五、立马上手的纠错工具推荐
  • Reference

转载来源:https://zhuanlan.zhihu.com/p/144995580
alt
文本纠错,是自然语言处理领域检测一段文字是否存在错别字、以及将错别字纠正过来的技术,一般用于文本预处理阶段,同时能显著缓解智能客服等场景下语音识别(ASR)不准确的问题。

本文将通过以下几个章节简要介绍文本纠错相关知识。

  1. 文本纠错示例与难点
  2. 文本纠错常用技术
  3. 如何将 BERT 应用于文本纠错
  4. 文本纠错最优模型:Soft-Masked BERT(2020-ACL)
  5. 立马上手的纠错工具推荐

一.文本纠错示例与难点

生活中常见的文本错误可以分为(1)字形相似引起的错误(2)拼音相似引起的错误 两大类;如:“咳数”->“咳嗽”;“哈蜜”->“哈密”。错别字往往来自于如下的“相似字典”。

相似发音中文字典
alt

相似字形中文字典
alt
其他错误还包括方言、口语化、重复输入导致的错误,在ASR中较为常见。

现有的NLP技术已经能解决多数文本拼写错误。剩余的纠错难点主要在于,部分文本拼写错误需要**常识背景(world-knowledge)**才能识别。例如:

Wrong: "我想去埃及金子塔旅游。"
Right: "我想去埃及金字塔旅游。"

将其中的“金子塔”纠正为“金字塔”需要一定的背景知识。

同时,一些错误需要模型像人一样具备一定的推理和分析能力才能识破。例如:

Wrong: "他的求胜欲很强,为了越狱在挖洞。"
Right: "他的求生欲很强,为了越狱在挖洞。"

“求胜欲”和“求生欲”在自然语言中都是正确的,但是结合上下文语境来分析,显然后者更为合适。

最后,文本纠错技术对于误判率有严格的要求,一般要求低于0.5%。如果纠错方法的误判率很高(将正确的词“纠正”成错误的),会对系统和用户体验有很差的负面效果。

二.文本纠错常用技术

错别字纠正已经有很多年的研究历史。常用的方法可以归纳为错别字词典、编辑距离、语言模型等。

构建错别字词典人工成本较高,适用于错别字有限的部分垂直领域;编辑距离采用类似字符串模糊匹配的方法,通过对照正确样本可以纠正部分常见错别字和语病,但是通用性不足。

所以,现阶段学术界和工业界研究的重点一般都是基于语言模型的纠错技术。2018年之前,语言模型的方法可以分为传统的n-gram LM和DNN LM,可以以字或词为纠错粒度。其中“字粒度”的语义信息相对较弱,因此误判率会高于“词粒度”的纠错;“词粒度”则较依赖于分词模型的准确率。

为了降低误判率,往往在模型的输出层加入CRF层校对,通过学习转移概率和全局最优路径避免不合理的错别字输出。

2018年之后,预训练语言模型开始流行,研究人员很快把BERT类的模型迁移到了文本纠错中,并取得了新的最优效果。

三、将BERT应用于文本纠错

alt
BERT与以往深度学习模型的主要区别在于:预训练阶段使用了“掩码语言模型”MLM和“判断s1是否为s2下一句”NSP两个任务,特征抽取使用12层双向Transformer,更大的训练语料和机器「More Money,More Power」。其中,MLM任务使得模型并不知道输入位置的词汇是否为正确的词汇(10%概率),这就迫使模型更多地依赖于上下文信息去预测词汇,赋予了模型一定的纠错能力。

一种简单的使用方式为,依次将文本s中的每一个字c做mask掩码,依赖c的上下文来预测c位置最合适的字(假设词表大小为20000,相当于在句子中的每一个位置做了一个“20000分类”)。设置一个容错阈值k=5,如果原先的字c出现在预测结果的top5中,就认为该位置不是错别字,否则是错别字。
alt
当然这种方法过于粗暴,很可能造成高误判率。作为优化,我们可以采用预训练的方式对BERT进行微调,显著改进纠错效果。纠错的领域最好和微调领域相同(如果需要在新闻类文章中纠错,可以使用“人民日报语料”对模型微调)。

四、文本纠错最优模型:Soft-Masked BERT

为了弥补baseline方法的不足,最大限度发挥BERT功效,复旦大学的研究人员在2020 ACL上发表了最新论文:

“Spelling Error Correction with Soft-Masked BERT”

alt
论文首次提出了Soft-Masked BERT模型,主要创新点在于:

(1)将文本纠错划分为检测网络(Detection)和纠正网络(Correction)两部分,纠正网络的输入来自于检测网络输出。

(2)以检测网络的输出作为权重,将 masking-embedding以“soft方式”添加到各个字符特征上,即“Soft-Masked”。

论文简要分析

具体来看,模型Input是字粒度的word-embedding,可以使用BERT-Embedding层的输出或者word2vec。检测网络由Bi-GRU组成,充分学习输入的上下文信息,输出是每个位置 i 可能为错别字的概率 p(i),值越大表示该位置出错的可能性越大。
alt

检测网络 与 Soft Masking

Soft Masking 部分,将每个位置的特征以 p i pi pi 的概率乘上 masking 字符的特征 e m a r k emark emark ,以 1 − p i 1-pi 1pi的概率乘上原始的输入特征,最后两部分相加作为每一个字符的特征,输入到纠正网络中。原文描述:
alt

纠正网络

纠正网络部分,是一个基于BERT的序列多分类标记模型。检测网络输出的特征作为BERT 12层Transformer模块的输入,最后一层的输出 + Input部分的Embedding特征 e i ei ei (残差连接)作为每个字符最终的特征表示。
alt
最后,将每个字特征过一层 Softmax 分类器,从候选词表中输出概率最大的字符认为是每个位置的正确字符。
alt
整个网络的训练端到端进行,损失函数由检测网络和纠正网络加权构成。
alt

实验结果

作者在“SIGHAN”和“NEWs Title”两份数据集上做了对比实验。其中“SIGHAN”是2013年开源的中文文本纠错数据集,规模在1000条左右。“NEWs Title”是从今日头条新闻标题中自动构建的纠错数据集(根据文章开头展示的相似字形、相似拼音字典),有500万条语料。
alt
Soft-Masked BERT 在两份数据集上几乎都取得了最好结果。同时我们发现,Finetune对于原始BERT的表现具有巨大的促进作用。

论文代码作者暂未开源,但是论文的模型和思路应该是非常清晰易懂的,实现起来不会太难。这儿先立个flag,有时间自己来实现一下。

五、立马上手的纠错工具推荐

笔者简单调研发现,文本纠错网上已经有不少的开源工具包供大家使用了。其中最知名的应该是 pycorrector
支持kenlm、rnn_crf、seq2seq、BERT等各种模型。结合具体领域的微调和少量规则修正,应该可以满足大部分场景中的文本纠错需求了。
alt
Demo中笔者使用了经人民日报语料微调过的BERT模型,通过pycorrect加载来做基于MLM的文本纠错。识别结果还算可以,甚至“金字塔”这种需要常识的错别字都纠正出来了。

当然pycorrect还支持各种语言模型和DNN模型,留给大家自行把玩 : )
此外,笔者还找到一个京东客服机器人语料做的纠错模型
主要解决同音字自动纠错问题,比如:

对京东新人度大打折扣 --> 对京东信任度大打折扣
我想买哥苹果手机 --> 我想买个苹果手机

不过仓库上一次更新在5年前,年代久远估计效果有限。

Reference

1.中文文本纠错算法–错别字纠正的二三事

2.Spelling Error Correction with Soft-Masked BERT

3.pycorrector

4.京东客服-文本纠错

5.SIGHAN 2013 Bake-off: Chinese Spelling Check Task


http://www.ppmy.cn/news/237151.html

相关文章

JAVA 实现《推箱子》游戏

前言 《推箱子》推箱子是一个古老的游戏,目的是在训练你的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理…

百家争鸣:Android开源框架排行榜

一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由、网络层、UI层、通信层或其他单一功能的框架 混合开发框架:提供开发hybrid app、h5与webview结合能力、web app能力的框架 企业级开源项目:可以独立运行的app,有…

最新Android框架排行榜。

最新Android框架排行榜。 Android框架排行榜 1.Retrofit  一句话介绍:Retrofit是一款类型安全的网络框架,基于HTTP协议,服务于Android和java语言 上榜理由:Retrofit以21.8k的stars量雄踞github中android子标题榜首,第…

C++实现推箱子游戏

C实现推箱子游戏 设计地图 使用二维数组搭建地图, 其中0为虚空、1为墙壁、2为玩家、3为箱子、4为目标点。 int map[HEIGHT][WIDTH] {{1, 1, 1, 1, 1, 1, 1, 1},{1, 0, 0, 4, 0, 0, 0, 1},{1, 0, 0, 0, 0, 0, 0, 1},{1, 0, 0, 3, 0, 3, 4, 1},{1, 4, 0, 3, 2, 0…

【珍藏版】震撼发布2017年Android百大框架排行榜

一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由、网络层、UI层、通信层或其他单一功能的框架 混合开发框架:提供开发hybrid app、h5与webview结合能力、web app能力的框架 企业级开源项目:可以独立运行的app,有…

Java实现推箱子小游戏

Java实现推箱子小游戏(ideamySQL) 就是我们学校实训有个推箱子的小游戏,一开始只是完成任务,然后……【想法越来越多,我的第一个小游戏就诞生了,虽然可能就我一个人玩了,但是很高兴能和你分享制…

整理了百大框架排行榜

快速索引 框架名称  上榜关键字1.Retrofit  网络2.okhttp网络3.Butter Knife代码模板4.MPAndroidChart图表5.glide图片6.leakcanary内存7.Android-Universal-Image-Loader图片8.EventBus 事件消息9.zxing条码扫描10.picasso图片11.lottie-android动画12.fresco图片13.RxAnd…

五子棋游戏代码(完整版)

编程实现控制台版并支持两人对战的五子棋游戏。 (1)绘制棋盘 - 写一个成员方法实现 (2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。 (3)每当一方下棋后判断是否获胜 - 写一个成员方法…