文本纠错文献
整理文本纠错相关文献
文本主要包含有三种类型的错误:1.替换;2.插入或删除
3.局部重排,如下图所示
目前的主流思路是利用经过预训练后的语言模型,结合具体的纠错模型实现对文本的纠错
中文常见数据集:
数据集 | 训练集 | 验证集 | 测试集 |
---|---|---|---|
HybirdSet | 274039 | 3162 | 3162 |
SIGHAN15 | 2339 | / | 1100 |
SIGHAN13 | 350 | / | 974 |
SIGHAN14 | 6526 | / | 526 |
英文数据集:
数据集 | 训练集 | 验证集 | 测试集 |
---|---|---|---|
CoNLL-2014 | |||
BEA-2019 | |||
GMEG |
在评测时经常使用的评测指标是\(F_{0.5}\) 其是指准确率比召回率重要一倍
1.《Confusionset-guided Pointer Networks for Chinese Spelling Check》
Dingmin Wang, Yi Tay, Li Zhong ACL 2019
作者提出了一种基于混淆数据集的指针网络来进行中文纠错
在中文语句中错误的是少数的字词,因此作者认为可以将正确的直接复制过来,而错误的字词则是从混淆数据集中选择
具体做法
文章采用Encoder-Decoder模型

在编码器端,对于输入\(X=\{c_1^s,c_2^s,\dots,c_n^s\}\)将其通过Bi-LSTM网络,得到编码后的结果\(h_i^s\)
在解码器端,首先通过单向LSTM生成当前时间步隐藏编码\(h_j^t\),再利用\(h_j^t\)和\(h_i^s\)计算注意力得到\(h_j^{t'}\),将得到的\(h_j^{t'}\)和\(h_j^t\)经过简单的线性变换得到上下文向量\(C_j\) \[ h_j^t=LSTM(h_{j-1}^t,e_{j-1}^t) \\ u_i=v^Ttanh(W_1h_j^t+W_2h_i^s) \\ \alpha_i=softmax(u_i) \\ h_j^{t'}=\sum_{i=0}^n\alpha_i h_i^s \\ C_j=tanh(W(h_j^t;h_j^{t'})) \] 在这以前作者用的都是普通的Encoder-Decoder模型,作者的创新点在于接下来的步骤
作者根据得到的上下文向量\(C_j\)计算了两个分布,一个是词汇表分布,一个是用于复制机制
首先是词汇表分布:\(P_{vocab}=softmax(W_{vocab}C_j)\)
接下来是基于输入的分布:\(L_j=softmax(W_i[W_gC_j;Loc_j])\)
其中\(Loc_j\)代表的是位置分布,在每个时间步只有第 j 项为1,其它均为0
作者是这样考虑的,在inference阶段首先根据基于输入的分布\(L_j\)来判断当前词汇是否在输入的范围内,如果不在的话则调用混淆表和词汇分布表计算出应该的值 \[ \widehat{c}_j^t=\begin{cases} argmax(L_j), \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if \ \ \ \ argmax(L_j)!=n+1 \\argmax(P_{vocab}\odot M[j]), \ \ \ \ otherwise \end{cases} \] 为了实现该效果,作者在训练期间定义了正确的基于输入的分布\(L_j^{loc}\) \[ L_j^{loc}=\begin{cases} max(z), \ \ \ \ \ \ \ if\ \ \exists \ \ z \ \ \ \ s.t. \ c_j^t=X[z] \\ n+1, \ \ \ \ \ \ \ \ \ \ otherwise \end{cases} \] 这里面的\(c_j^t\)是指正确的输出序列,即判断标准输出在输入上正确的索引,对于输出不在输入范围内的情况(即错误的字词),用n+1表示
最后loss被定义为:\(Loss_l=\sum_{i}^m-logL_j[L_j^{loc}]\)
结论
作者在SIGHAN 2013,14,15三个数据集上做了测试

相比其它模型都取得了不错的成绩
但是作者指出该模型只能应对输入输出等长的情况,对于语法错误则无法修正
2.《Tail-to-Tail Non-Autoregressive Sequence Prediction for Chinese Grammatical Error Correction》
Piji Li Shuming Shi 2021 ACL
作者上来指出目前的语法纠错(Grammatical Error Correction GEC)模型都只能处理等长的输入输出序列,对于需要删除,增加的操作无法很好的支持
作者总结了三种GEC更正类型:1.替换;2.插入或删除 3.局部重排

作者给出了三个示意图来展示token信息在 bottom tail 和 up tail 之间的流动 (这里的tail 可以被视为尾部)
作者为了克服之前说到的问题,提出了 Tail-to-Tail 的非自回归模型(TtT)并在计算loss时使用焦点损失补偿(Focal loss penalty strategy)来缓解类不平衡问题
1.具体实现

输入为\(X=(x_1,x_2,\dots,x_T)\)其中\(x_i\)为字符,\(T\)为序列长度,模型的目标是输出一个新的句子\(Y=(y_1,y_2,\dots,y_{T'})\)其中\(T'\)和\(T\)不一定相等,在输入后接Transformer层,用于双向语义建模,在其后接CRF层计算token之间的依赖关系来进行非自回归序列生成
1.1 可变长输入
作者提出了\(T'\)和\(T\)长度不一定一致,则此时存在三种情况,假设输入为\(X=(x_1,x_2,x_3,<eos>)\)
1.\(T' = T\)
此时无需任何额外处理
2. \(T' < T\)
此时输出假设为\(Y=(y_1,y_2,<eos>)\)则需要在其后补$
3. \(T' > T\)
此时输出假设为\(Y=(y_1,y_2,y_3,y_4,y_5,<eos>)\),则需要在输入后补\(<mask>\)标签直到\(T' = T\) 即输入变为\(X=(x_1,x_2,x_3,<eos>,<mask>,<mask>)\)
通过如此操作即实现了输入和输出尾对齐
1.2 双向语义建模
这一部分使用的是Transformer层,同时利用了预训练模型
1.3 非自回归序列预测
这里面包含两部分,一部分是直接预测即\(P_{dp}(y_t)=softmax(h_t^TW_s+b_s)\),将经过编码器的结果经过线性变换直接输出
另一部分则是利用CRF层对token之间的依赖关系建模 \[ P_{crf}(Y|X)=\frac{1}{Z(X)}exp(\sum_{t=1}^{T'}s(y_t) + \sum_{t=2}^{T'}t(y_{t-1},y_t)) \] 这其中\(Z(X)\)是归一化因子,\(s(y_t)\)是在第t时间步\(y_t\)的得分,可以用直接预测得到的分数\(s_t = h_t^TW_s+b_s\)
\(t(y_{t-1},y_t)\)是转移分数,即从\(y_{t-1}\)到\(y_t\)的概率,一般会使用转移矩阵来表示,即\(t(y_{t-1},y_t)=M_{y_{t-1},y_t}\)然而一般的语言任务中词汇表都会很大,此时\(M\)会非常大,为解决该问题,作者将\(M\)分解为两个小的矩阵\(E_1,E_2\) \[ M =E_1E_2^T \]
1.4 焦点惩罚训练 Training with Focal Penalty
在GEC任务中由于大部分句子中的大部分单词都是正确的不需要修改,这就会导致在一般的loss计算下,loss值会快速下降,然而真正错误的部分还没有被修正
为了修正该问题,作者引入了一个trick,将损失函数改为 \[ \mathcal{L}_{dp}^{'} = -\sum_{t=1}^{T'}(1-P_{dp}(y_t|X))^\gamma logP_{dp}(y_t|X) \\ \mathcal{L}_{crf}^{'} = -(1-P_{crf}(Y|X))^\gamma logP_{crf}(Y|X) \\ \mathcal{L}^{'} =\mathcal{L}_{dp}^{'} + \mathcal{L}_{crf}^{'} \]
结论
作者为了验证自己的模型可以有效处理可变长度纠错,自己在HybirdSet数据集的基础上构建了变长数据集TtTSet,并在此数据集和SIGHAN15上做了不同模型的对比试验

同时作者给出了在不加crf或者不加直接预测的对比试验,以证明模型结合两种任务是正确的

最后作者认为未来可以引入更多的词法分析知识,如分词和命名实体识别,以进一步提高性能
3.《LM-Critic:Language Models for Unsupervised Grammatical Error Correction》
Michihiro Yasunaga Jure Leskovec Percy Liang
这是一篇无监督训练的文章,作者受到 Break-It-Fix-It 框架的启发,想要将其引入到纠错领域,在 Break-It-Fix-It 中会有一个批评家(如编译器),但对于GEC任务来说这个批评家并不存在。因此作者利用预训练模型来定义一个 LM-Critic
Break-It-Fix-It 本来是用于对代码进行修复,其可以从未标记数据中获取真实配对数据
作者指出直观上一个好的语言模型(LM)可以使用概率的高低去区分符合语法和不符合语法的句子。但在实际中无法使用直接指定一个阈值来判断句子是否符合语法,这是因为一个不符合语法的句子中可能会存在很多合法词汇而被给予较高的概率。因此作者想的是比较句子在局部邻域的概率,如果一个句子在局部邻域中概率最高,则认为句子是合法的

在这里作者的 LM-Critic 只用来评价一个句子是合乎语法还是不符合语法的
作者在这里提出了一个局部最优概念,其是根据两个直觉得到的
- 对于一个合乎语法的句子和其不合乎语法的句子相比存在 \(p(x_{bad}<p(x_{good}))\)
- 对于每个句子而言其有一个最符合语法的准确句子,在该句子周围分布着各种不合乎语法的版本这一系列集合称为\(B(x)\)
由此作者得到了判断句子是否合乎语法的方法,即判断句子是否是局部最优的
实现
接下来作者描述了如何实现 LM-Critic
由于真实的邻域\(B(x)\)是无法得到的,因此作者设计了一种扰动函数来构建\(B(x)\)的近似\(\hat{B}(x)\)
这里作者给出了三种扰动函数
- 编辑距离为1:随机插入小写字母,删除一个字符,替换字符,交换两个相邻字符
- 编辑距离为1 + 单词:随机插入,删除,替换一个单词
- 编辑距离为1 + 单词纠正:第二种扰动存在修改原句子含义的情况,在这里去掉该情况
作者为了验证之前的直觉还做了实验

对于那些坏句子概率比好句子高的情况,其中大部分是由于标点符号引起的

作者实验发现对于上面说的三种扰动方法来说,第一种扰动空间小导致对好的句子做出错误预测,第二种扰动空间较大会对坏的句子做出错误预测,第三种则比较平衡

经过实验后作者决定使用第三种扰动,采样设为100,并利用GPT2作为 LM-Critic
之后作者利用 LM-Critic 和 fixer 来交替实现 GEC

结论
作者在有监督和无监督下均作了实验:
无监督:

有监督:

4.《Improving Grammatical Error Correction with Data Augmentation by Editing Latent Representation》
Zhaohong Wan Xiaojun Wan Wenguang Wang ICCL
作者主要研究了数据增强在GEC上的实现,这里作者是通过修改句子潜在表示,来生成各种错误类型的句子

实现方法
其训练编码器,解码器和错误类型分类器,对句子的潜在表示中添加扰动向量来训练样本
首先训练编码器\(\phi_E()\)对输入序列进行编码生成潜在表示\(h_x\),随后由错误分类器对其进行分类得到错误类型\(z'\) \[ h_x = \phi_E(x) \\ z'=C(h_x) \] 经过训练得到编码器后,采用自编码的方式训练译码器\(\phi_D\),其目标是最小化输入\(x\)和输出\(\widetilde{x}\)之间的负对数似然 \[ \widetilde{x}=\phi_D(h_x) \\ J(h_x)=-\sum_{t=1}^{L}logP(x_t|\widetilde{x}_{<t},h_x) \] 在将上面的模型训练后就可以得到用来生成新数据的模型,其主要是在中间的潜在表示\(h_x\)上加扰动\(r\),再利用解码器生成额外的训练样本
首先指定想要生成的错误类型,之后计算扰动\(\hat{r}\),其应该满足使得\(L(h_X+r,z,z')\)最小同时为了防止篡改太多元语义,这里可以限制\(r\)的二范数即 \[ \hat{r}=\underset{r,||r||\leq\epsilon}{argmin}\{L(h_x+r,z,z')\} \] 但是这个计算很难精确得到,为此我们可以使用线性化的技术来计算 \(\hat{r}\): \[ \hat{r}=-\epsilon g/||g||_2 \\ g =\bigtriangledown_{h_x}L(h_x,z,z') \] 最后利用译码器对 \(h_x+\hat{r}\) 进行译码得到错误句子 \(x'\)
结论

5.《PLOME: Pre-training with Misspelled Knowledge for Chinese Spelling Correction》
Shulin Liu, Tao Yang, Tianchi Yue, Feng Zhang, Di Wang
作者想在预训练阶段就引入错误示例,以此来训练一个语言模型
这里作者引入的错误示例不仅有形声字还有象形字

在之前已经有人将预训练好的语言模型应用到 CSC 任务上,但由于 CSC 任务和语言模型训练之间相互独立,因此带来的提升并不高,因此作者提出一种专用于 CSC 任务的预训练模型
预训练阶段
训练的时候作者使用混淆数据集中的文字随机替代原句子中的文字,与 BERT 中的 MASK 标记类似

作者提出的生成混淆的方法为:60%被替换为读音相似,15%替换为视觉相似,15%保持不动,10%替换为其它字
最终的预训练结构如图

最终字符的 Embedding 是由字符、位置、拼音、笔画得到的,其中前两者由查找表得到,后两者由 GRU 网络得到

在输出部分,模型会输出两个预测,一个是字符预测一个是拼音预测
微调阶段
在微调阶段训练的目标和预训练阶段一致,但是在训练的时候会对每个字进行预测,而不是像预训练的时候只对 MASK 进行预测
推理阶段: \[ p_j(y_i=j|X)=p_c(y_i=j|X)*p_p(g_i=j^p|X) \\ p_j(y_i|X)=[p_p(g_i|X)\cdot I^T]\odot p_c(y_i|X) \\ \widehat{y}_i=argmax\ \ p_j(y_i|X) \] 这其中 \(I\in R^{n_c \times n_p }\) ,如果第 \(i\) 个字符读音为 \(j\) 则 \(I_{i,j}\) 为1
即实现预测结果结合预测读音和预测字符
结果

6.《SpellGCN: Incorporating Phonological and Visual Similarities into Language Models for Chinese Spelling Check》
Xingyi Cheng、Weidi Xu、Kunlong Chen、Shaohua Jiang、Feng Wang、Taifeng Wang、Wei Chu、Yuan Qi
作者将 GCN 结合预训练模型用于到 CSC 任务上
看不太懂 (有时间了再了解一下GCN)
7.《Integrated Semantic and Phonetic Post-correction for Chinese Speech Recognition》
Yi-Chang Chen
作者将 MLM 语言模型应用到 ASR 后
作者想法非常简单,先用简单的分类器来识别错误的字,之后再将识别为错误的字标记 MASK,随后利用 MLM 模型对其进行重新预测和纠正
作者尝试了三种不同的 MASK 策略,mask-all-and-replace-all, mask-one-and-replace-one, mask-all-and-replace-one.

同时作者引入了 音素距离 ,来辅助纠正

作者利用如下公式来衡量拼音距离,并计算最终得分 \[ S(c,c')=S_P(p_c^I,p_{c'}^I)+S_P(p_c^F,p_{c'}^F)+S_T(p_c^T,p_{c'}^T) \\ \psi(P_{candidate},S(c_{error},c_{candidate}))=P_{candidate}\times exp(-\alpha \times S(c_{error},c_{candidate})) \] 其中 \(I,F,T\) 分别表示 辅音,元音,音调。辅音和元音之间的距离用欧氏距离来衡量
\(\alpha\) 经过作者实验控制在500左右比较好
8.《ASR Error Correction with Augmented Transformer for Entity Retrieval》
Haoyu Wang, Shuyan Dong, Yue Liu, James Logan, Ashish Kumar Agrawal, Yang Liu
作者关注的是特定领域的 ASR 对特定的领域的词汇进行纠正
作者提出的方法是基于 vanilla Transformer 同时引入了音素特征

