文献阅读——MDCSpell:一种多任务的汉语拼写校正器框架


概述

本次讨论班分享一篇关于中文拼写纠错(以下简称CSC)的论文,该文章提出了一种新的通用检测器-校正器多任务框架,其中校正器使用BERT来捕获原始句子中每个字符的视觉和语音特征,并使用后期融合策略来融合校正器和检测器的隐藏状态,以最大限度地减少拼写错误对字符的误导影响。在基准测试上的综合实验表明,本文提出的方法在CSC任务中的性能明显优于最新的方法。

1 介绍

中文拼写纠正(CSC)是一项旨在自动检测和纠正中文文本中的拼写错误的基础性工作。这些拼写错误通常是由人类书写、自动语音识别(ASR)或光学字符识别(OCR)系统引起的。CSC是必不可少的,因为它对许多下游任务至关重要,如搜索引擎和论文评分。

近年来,随着BERT预训练模型的出现,许多方法被提出,并在CSC中取得了很大的进展。其中大多数工作使用基于BERT的语言模型和混淆集直接更正输入句子的每个字符。然而,这些方法通过上下文信息难以区分地纠正句子的每个字符,而上下文信息容易被错误拼写的字符误导。如下表1中的大写字母所示,上下文受到错误字符“以”的影响,这使得更正模型错误地将原来的正确字符“关”更改为“所”。为了解决上述问题,其他一些工作提出使用错误检测器来检测错误的位置,这些错误被用作通过masking进行校正的先验知识。然而,这些方法反过来又会削弱拼写错误的字符的视觉或语音特征,这可能是纠正的关键。如下表1中较小的字母所示,尽管模型正确地找到了错误位置,但它未能将错误更改为更正字符“变”,因为它遗漏了拼写错误的字符“遍”的音素特征。因此,如何利用拼写错误的汉字的视觉和语音特征,同时消除它们对语境的误导影响,仍然是CSC任务中的一个悬而未决的问题。

表1 CSC结果的示例

为了解决上述问题,我们提出了一种新的通用多任务检测器-校正器CSC框架(MDCSpell),该框架既可以利用拼写错误字符的视觉和语音特征,又可以消除它们对上下文的误导影响。具体地,纠错和检测任务被同时执行,其中校正器使用BERT直接从原始句子捕捉所有字符的视觉和语音特征,并且检测器使用轻量级transformer来检测拼写错误的字符的位置。采用后期融合策略将校正器的隐藏状态与检测器的隐藏状态进行融合,并通过端到端的联合训练消除拼写错误字符的误导性影响。该框架易于实现,任何基于BERT的CSC模型都可以很容易地在该框架中进行调整。在三个开放基准上的实验结果表明,MDCSpell可以显著优于竞争对手。

2 方法

2.1 问题陈述

中文拼写纠正(CSC)任务可以形式化为以下任务。给定n个汉字\(X=(x_1,x_2,\dots ,x_n)\)的文本序列,目标是输出\(Y=(y_1,y_2,\dots,y_n)\),其中X表示包含一些错误字符的原始文本,Y表示更正后的正确文本。X和Y的长度相同。因此,CSC任务可以看作是一种序列标注任务。通常,一个句子中没有或只有一小部分拼写错误的字符,应该复制所有或大部分字符。

2.2 Motivations

我们的Motivation如图1所示。大多数现有的最先进的CSC方法都将校正视为一项序列标记任务,如图1(a)所示,即使用更正模块来分类对应的token应该转换为哪些字符。这种方法的缺点是,他们对拼写错误的字符的位置缺乏认识,并且仅通过上下文更正每个字符,而上下文很容易被拼写错误的字符误导。

为了解决这个问题,如图1(b)所示的方法,在纠正模块之前增加了检测模块,以mask可能发生错误的位置,并预测被mask位置中的正确字符。虽然该方案在一定程度上减弱了拼写错误的误导影响,但也带来了一个新的问题:由于mask抑制了拼写错误字符的语音和视觉信息,这些信息可能与正确字符高度相似,有助于纠正,因此纠错性能仍然可能是次优的。

因此,上述问题启发我们寻找一种利用错误检测信息的新方案。具体而言,如图1(c)所示,原始句子直接用作更正模块的输入,以保持拼错字符的视觉和语音特征,而更正模块的隐藏状态最近与检测模块的隐藏状态融合。通过端到端的联合训练,将拼写错误字符的误导性影响降至最低。在以下部分中,我们将说明如何基于此方案实现多任务框架。

图1 三种CSC模型方案的比较

2.3 MDCSpell模型结构

如图2所示。MDCSpell由基于transformer的检测网络和基于BERT的校正网络组成。这两个网络使用相同的词嵌入作为输入。在校正网络的末端,来自校正和检测网络的隐藏状态被融合到分类密集层中作为输入,以生成校正结果。这两项任务可以端到端的方式同时进行训练。

更具体地说,我们首先为每个字符生成BERT所需的embedding,具体为word embeddingposition embeddingsegment embedding的总和。然后将输入文本的embedding序列分别输入检测网络和校正网络,得到编码后的向量。检测网络是一种基于多层transformer的结构,它需要适应每个位置的字符是否为拼写错误。因此,检测网络的输出编码向量包含每个位置可能出错的概率信息。纠错网络是一种基于BERT的结构,它需要检测每个位置需要输出哪些字符。接下来,将两个编码向量的信息进行融合,生成最终的编码向量。最后,由词嵌入表的转置初始化参数的致密层将最终的编码向量作为输入并生成预测结果。

2.4 检测网络

检测网络是基于transformer结构的二分类任务,用于确定字符在每个位置的错误概率。对于长度为\(n\)的输入文本,检测网络的输入是字符的embedding序列\(E=(e_1,e_2,\dots,e_n)\),它是word embeddingposition embeddingsegment embedding的总和。然后使用上下文编码器得到检测编码向量。最后,使用投影层将编码向量投影到二维空间,该二维空间分别表示位置字符的正确概率和错误概率。具体来说,为了更好的捕获上下文语义,我们使用多层transformer进行编码,其中每一层使用相同的块结构。每个transformer块的定义如下

\[MultiHead=Concat(head_1, \dots, head_n)W^O \tag{1} \]

\[head_i=Attention(QW^Q_i,KW^K_i,VW^V_i) \tag{2} \]

\[FFN(X) = max(0, XW_1 + b_1)W_2 + b_2 \tag{3} \]

其中,Q、K和V表示当前输入序列,这可能是字符的embedding或前一个transformer块的输出。\(MultiHead\)\(FFN\)分别代表多头自注意力机制和前馈网络,它们是transformer的基本部件。我们将transformer块最后一层的隐藏状态序列表示为\(H^d=(h^d_1, h^d_2, \dots, h^d_n)\)

隐藏状态\(H^d\)既用于预测拼写错误的字符的位置,也用于将位置信息传递给校正网络。具体地说,我们使用致密层作为输出层,并使用Softmax函数来确定是否发生错误。对于原始输入的每个字符,错误检测的概率定义为

\[P^d(g_i=1|X)=\sigma (Wh^d_i+b) \tag{4} \]

其中,\(P^d(g_i=1|X)\)是表示对应于\(h^d_i\)的字符的拼写错误概率的条件概率,σ表示我们使用的Sigmoid函数,\(h^d_i\)表示基于transformer的检测网络的最后一层,W和b是致密层的参数。