文本纠错–CRASpell模型

CRASpell: A Contextual Typo Robust Approach to Improve Chinese Spelling Correction 这篇论文是发表于22年ACL,在Chinese spelling correction (CSC)任务上是SOTA。基于bert预训练模型的CSC的模型有两个极限:
(1) 在多错误文本上模型效果不好,通常在拼写错误的文本,拼写错误字符至少出现1次,这会带来噪声,这种噪声文本导致多错字文本的性能下降。
(2) 由于bert掩码任务,这些模型过度校正偏向于高频词的有用表达词。
CRASpell模型每一个训练样本构建一个有噪声的样本,correct 模型基于原始训练数据和噪声样本输出更相似的输出,为了解决过度校正问题,结合了复制机制来使得我们的模型在错误校正和输入字符根据给定上下文都有效时选择输入字符。
文章地址为:文章
代码地址为:code

模型

任务描述

中文拼写纠错的目的是检测和纠正文本中的拼写错误。通常表述为 X={x1,x2,…,xn}\Large\boldsymbol{X} = \{x_{1}, x_{2}, \dots, x_{n}\}X={x1,x2,,xn}是长度为nnn的包含拼写错误的文本,Y={y1,y2,…,yn}\Large\boldsymbol{Y} = \{y_{1}, y_{2}, \dots, y_{n}\}Y={y1,y2,,yn}是长度为nnn的正确文本,模型输入X\Large\boldsymbol{X}X生成正确的文本Y\Large\boldsymbol{Y}Y.

CRASpell 模型


左边是Correction模型,右边是Noise模型,下面详细介绍模型。
(1) Correction Module
给定输入文本X={x1,x2,…,xn}\Large\boldsymbol{X} = \{x_{1}, x_{2}, \dots, x_{n}\}X={x1,x2,,xn}得到embedding 向量E={e1,e2,…,en}\Large\boldsymbol{E} = \{e_{1}, e_{2}, \dots, e_{n}\}E={e1,e2,,en},其中每一个字符xix_{i}xi对应的embedding向量记为eie_{i}ei,将E\Large\boldsymbol{E}E输入到Transformer Encoder中得到hidden state matrix H={h1,h2,…,hn}\Large\boldsymbol{H} = \{h_{1}, h_{2}, \dots, h_{n}\}H={h1,h2,,hn},其中hi∈R768h_{i}\in\Large\boldsymbol{R}^{768}hiR768是字符xix_{i}xi经过Transformer Encoder得到特征。
(2) Generative Distribution
X={x1,x2,…,xn}\Large\boldsymbol{X} = \{x_{1}, x_{2}, \dots, x_{n}\}X={x1,x2,,xn}经过Transformer Encoder得到特征向量H={h1,h2,…,hn}\Large\boldsymbol{H} = \{h_{1}, h_{2}, \dots, h_{n}\}H={h1,h2,,hn},经过一个前向线性层和一个softmax层得到每个一字符token的生成概率,公式如下:

pg=softmax(Wghi+bg)p_{g} = softmax(W_{g}h_{i} + b_{g}) pg=softmax(Wghi+bg)
其中Wg∈Rnv×768W_{g}\in \Large\boldsymbol{R}^{n_{v}\times768}WgRnv×768bg∈R768b_{g}\in \Large\boldsymbol{R}^{768}bgR768nvn_{v}nv是预训练模型词表的大小。

(3) Copy Distribution
xix_{i}xi的copy distribution pc∈{0,1}nvp_{c} \in \{0,1\}^{n_{v}}pc{0,1}nvxix_{i}xi在字典中的idx(xi)idx(x_{i})idx(xi)的one-hot 表示,具体表示如下:

(4) Copy Probability
Copy Probability是模型图中的Copy Block中的输出$\omega \in\Large\boldsymbol{R}$,即transformers encoder 得到的隐藏层特征向量$h_{i}$经过两个前向线性层和一个layer normalization得到$\omega$,具体公式如下:

hc=Wchfln(hi)+bchhc′=fln(fact(hc))ω=Sigmoid(Wchc′)h_{c} = W_{ch}f_{ln}(h_{i}) + b_{ch} \\ h_{c}^{'} = f_{ln}(f_{act}(h_{c})) \\ \omega = Sigmoid(W_{c}h_{c}^{'}) hc=Wchfln(hi)+bchhc=fln(fact(hc))ω=Sigmoid(Wchc)
其中Wch∈R768×dcW_{ch}\in\Large\boldsymbol{R}^{768\times d_{c}}WchR768×dcbch∈Rdcb_{ch} \in \Large\boldsymbol{R}^{d_{c}}bchRdcWc∈Rdc×1W_{c}\in\Large\boldsymbol{R}^{d_{c}\times 1}WcRdc×1flnf_{ln}fln是layer normalization,factf_{act}fact是激活函数,在代码使用的激活函数为glue.详细见代码

Copy Block输出概率ppp结合了生成Generative Distribution pgp_{g}pg和Copy Distribution pcp_{c}pc
p=ω×pc+(1−ω)×pgp = \omega\times p_{c} + (1 - \omega)\times p_{g} p=ω×pc+(1ω)×pg
与之前CSC模型的不同之处在于,CRASpell模型在模型最终生成输出考虑了Copy Probability pcp_{c}pc,使得模型在输入字符有效但不是最适合 BERT 时有更多机会选择输入字符,避免过度矫正。
(5) Noise Modeling Module
Noise Modeling Module通过校正模型为原始上下文和噪声上下文产生相似的分布来解决上下文错字干扰问题。 如上面模型图的右侧,Noise Modeling Module 大致分为下面几个过程:
a. 根据输入样本X\Large\boldsymbol{X}X生成噪声上下文X~\Large\widetilde{\boldsymbol{X}}X


b. 将噪声上下文X~\Large\widetilde{\boldsymbol{X}}X

作为输入得到Transformer Encoder得到隐藏特征向量H~\widetilde{\boldsymbol{H}}H


c. 根据隐藏特征向量H~\widetilde{\boldsymbol{H}}H

生成生成分布pg~\widetilde{p_{g}}pg


d. 生成分布与校正模型生成的分布相似。生成分布与校正模型生成的分布相似这个是通过minimizing the bidirectional Kullback-
Leibler divergence体现,具体公式如下:
LKL=12(DKL(pg∥pg~)+DKL(pg~∥pg))\mathcal{L}_{KL} = \frac{1}{2}(\mathcal{D}_{KL}(p_{g}\Vert\widetilde{p_{g}}) + \mathcal{D}_{KL}(\widetilde{p_{g}}\Vert p_{g})) LKL=21(DKL(pgpg

)+
DKL(pg

pg))

备注:Noise Modeling Module仅在训练过程中出现,模型推理只使用校正网络
Noisy Block
下面介绍数据添加噪声数据。通过替换原始训练样本的字符来生成噪声样本。在替换字符的过程中只替换拼写错误字符上下文附近dtd_{t}dt个词,如果训练样本没有拼写错误,该样本不进行替换生成噪声样本。如下图所示:

dtd_{t}dt选择实验结果

我们根据公开可用的混淆集将每个选择的位置替换为相似的字符。 具体来说,我们选取位置处的词进行替换
(i) 70% 的替换随机选择语音相似字符
(ii) 15% 的替换随机选择字形相似字符
(iii) 15% 的替换从词汇表中的随机选择。
作者提供了相同拼音汉字,字形相似以及拼音相近字这三个文件,按照上述方式从这三个文件中数据进行替换。代码如下:

    def do_mask(self, input_sample, target_indice):masked_sample = input_samplemethod = self.get_mask_method()for pos in target_indice:if method == 'pinyin':new_c = self.same_py_confusion.get_confusion_item_by_ids(input_sample[pos])if new_c is not None:masked_sample[pos] = new_celif method == 'jinyin':new_c = self.simi_py_confusion.get_confusion_item_by_ids(input_sample[pos])if new_c is not None:masked_sample[pos] = new_celif method == 'stroke':new_c = self.sk_confusion.get_confusion_item_by_ids(input_sample[pos]) if new_c is not None:masked_sample[pos] = new_celif method == 'random':new_c = self.all_token_ids[random.randint(0, self.n_all_token_ids)]if new_c is not None:masked_sample[pos] = new_creturn masked_sample

这里替换后是得到的tokenizer后的结果,并不是得到一个汉字字符。

Loss

给定训练样本(X,Y)(\Large\boldsymbol{X}, \Large\boldsymbol{Y})(X,Y)X\Large\boldsymbol{X}X是输入错误样本,Y\Large\boldsymbol{Y}Y是校正正确样本,每一个校正正确样本Yi\Large\boldsymbol{Y_{i}}Yi的loss为
Lci=−log⁡(p(Yi∣X))\mathcal{L}_{c}^{i} = -\log(p(\Large\boldsymbol{Y_{i}}|\Large\boldsymbol{X})) Lci=log(p(YiX))
其中ppp
p=ω×pc+(1−ω)×pgp = \omega\times p_{c} + (1 - \omega)\times p_{g} p=ω×pc+(1ω)×pg
详细见上面介绍。
模型loss为L\mathcal{L}L
Li=(1−αi)Lci+αiLKLi\mathcal{L}^{i} = (1 - \alpha_{i})\mathcal{L}_{c}^{i} + \alpha_{i} \mathcal{L}_{KL}^{i} Li=(1αi)Lci+αiLKLi
其中αi\alpha_{i}αi

其中α\alphaαLc\mathcal{L}_{c}LcLKL\mathcal{L}_{KL}LKL的权衡因子。构建的噪声样本本身不会参与训练过程,而只会作为上下文参与。这个策略旨在确保构造的噪声数据不会改变训练语料中正负样本的比例。

实验结果

CRASpell模型实验结果
论文中使用的是拼写错误预训练模型得到的实验结果

笔者最近加载torch版的chinese-roberta-wwm-ext模型得到的结果如下:
sighan15 test data result
token num: gold_n:694, pred_n:783, right_n:586
token check: p=0.748, r=0.844, f=0.793
token correction-1: p=0.954, r=0.805, f=0.873
token correction-2: p=0.714, r=0.805, f=0.757
precision:0.7484026201754532, recall:0.8443791867735061, f1_score:0.7934992640496943
绝对准确率为0.7372。

文本纠错--CRASpell模型相关推荐

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

    本文首先介绍一下: 1)错别字的类型有哪些 2)错别字纠正的关键技术和关键点 3)简要介绍我们项目中采用的文本纠错框架 4)介绍错别字项目的个人体会 5)几个现成的工具包 ,百度nlp平台最近也推出了 ...

  2. 文本纠错与BERT的最新结合,Soft-Masked BERT

    文本纠错相关资料 1.http://www.doc88.com/p-8038708924257.html 2.http://blog.csdn.net/glanderlice/article/deta ...

  3. lstm 文本纠错_工业界纠错系统

    本篇文章,主要来唠嗑下工业界的纠错系统怎么设计?包括:基于规则的纠错系统(简单的英文纠错.复杂的中文纠错).基于NN的纠错系统.当然,在成熟的工业界纠错系统中,最好是结合规则&&NN方 ...

  4. 万能的BERT连文本纠错也不放过

    一只小狐狸带你解锁炼丹术&NLP秘籍 作者:孙树兵 学校:河北科技大学 方向:QA/NLU/信息抽取 编辑:小轶 背景 文本纠错(Spelling Error Correction)技术常用于 ...

  5. 文本纠错pycorrector

    原文链接:https://blog.csdn.net/javastart/article/details/107428483 这一段时间再研究身份证和面单识别项目,总发现一些识别准确率问题,在想办法提 ...

  6. 中文文本纠错算法实现

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 文本纠错又称为拼写错误或者拼写检查,由于纯文本往往来源于手打或者OCR识别,很可能存在一些错误 ...

  7. 中文文本纠错算法走到多远了?

    纠错是从互联网起始时就在一直解决的问题,但是一直作为一些重要技术的辅助.附属功能而默默无闻,譬如搜索引擎.譬如火热的智能写作等. 素质整理! 中文文本纠错任务,常见错误类型包括: 谐音字词,如 配副眼 ...

  8. nlp 中文文本纠错_百度中文纠错技术

    原标题:百度中文纠错技术 分享嘉宾:付志宏 百度资深研发工程师 编辑整理:李润顺 内容来源:Baidu Brain & DataFun AI Talk<百度中文纠错技术> 出品社区 ...

  9. 中文文本纠错任务简介

    每天给你送来NLP技术干货! 来自:ChallengeHub 最近在梳理中文文本纠错任务,文本根据搜集到的文章整理成的任务简介,在此先感谢大佬们分享的高质量资料. 1 任务简介 中文文本纠错是针对中文 ...

最新文章

  1. 会计科目中英文对照表
  2. python数据结构包括什么_Python中的数据结构详解
  3. EasyUI中Window窗口的简单使用
  4. 云计算的新界面—Kubernetes容器技术
  5. Filter_快速入门
  6. 605. 种花问题 golang 切片越界问题和逻辑操作符的思考
  7. 数据库sql课程设计_SQL和数据库-初学者完整课程
  8. (转)基因芯片数据GO和KEGG功能分析
  9. vscode 使用 ssh 登录
  10. java math max_Java Math类静态double max(double d1,double d2)示例
  11. 计算机视觉专业要学什么课程,[08本]“计算机视觉基础”课程介绍和课件
  12. 数据库管理工具 Navicat使用教程:导航窗格提示和技巧 - 管理连接
  13. 部署hexo后github pages页面未更新或无法打开问题
  14. matlab 矩阵 三维矩阵相乘,将三维矩阵与二维矩阵相乘
  15. SQL: 第二高的薪水
  16. 真·稳如狗:中国团队推出四足机器人,对标波士顿动力
  17. 大脑是如何编码外界各种信息的?
  18. 知识图谱neo4j入门之魔兽世界人物可视化
  19. 键盘按键VK键值列表及宏定义
  20. 关于文件not found 的几个常见排查点的总结

热门文章

  1. win7连上WIFI但上不去网
  2. iOS-获取当前设备的局域网以及链接的WiFi分配的IP地址
  3. Java 电商订单管理设计,基于Java的电商网站的设计与实现
  4. EasyCVR平台接入大华EVS存储服务器,需要注意哪些事项?
  5. C++动态分配内存空间
  6. PPT卡片排版技巧,快来收藏
  7. 网络安全笔记8——虚拟专网技术
  8. 《Java黑皮书基础篇第10版》 第3章【习题】
  9. mongo慢查询排查
  10. 云服务器测速脚本_服务器测速命令