拼写纠错模型Noisy Channel(上)
关键词:Noisy Channel
一、说明
在文中,我们将介绍检测和纠正拼写错误的问题。修正拼写错误是现代写作的重要组成部分,无论是通过手机短信、发送电子邮件、撰写较长文档,还是在网络上查找信息。现代拼写检查器并不完美(事实上,自动更正出错是网络上一个流行的娱乐来源),但它们几乎存在于任何依赖键盘输入的软件中。
二、如何理解拼写错误
拼写纠错通常从两个角度考虑。非词拼写纠错是检测和纠正导致非词的拼写错误(如将giraffe拼写为graffe)。相比之下,实词拼写纠错是指即使拼写错误意外地形成了一个实际存在的英文单词(实词错误)也要进行检测和纠正。这可能发生在打字错误(插入、删除、转位)意外产生了一个实词(例如,将three拼写为there),或者认知错误中,作者用同音或近同音词的错误拼写替代了正确的拼写(例如,将desert拼写为dessert,或将peace拼写为piece)。非词错误通过查找任何不在词典中的单词来检测。例如,上面的拼写错误graffe不会出现在词典中。词典越大越好;现代系统经常使用从网络中衍生出的巨大词典。为了纠正非词拼写错误,我们首先生成候选词:与错误有相似字母序列的实际单词。对于拼写错误graffe,候选纠正词可能包括giraffe、graf、gaffe、grail或craft。然后,我们使用源词和表面错误之间的距离度量对候选词进行排序。我们希望有一个度量标准,它符合我们的直觉,即giraffe比grail更可能是graffe的来源,因为giraffe在拼写上更接近graffe。第2章中的最小编辑距离算法在这里将发挥作用。但我们还希望优先选择更常用或在错误上下文中更可能出现的纠正词。下一节介绍的噪声信道模型提供了一种形式化这种直觉的方法。实词拼写错误检测是一项更加困难的任务,因为输入文本中的任何单词都可能是错误。尽管如此,仍然可以使用噪声信道为用户输入的每个单词w找到候选词,并对最有可能是用户原始意图的纠正词进行排名。
三、噪声信道模型
在本节中,我们介绍了噪声信道模型,并展示了如何将其应用于检测和纠正拼写错误的任务。噪声信道模型大约在同一时间由AT&T贝尔实验室(Kernighan等人1990年,Church和Gale1991年)和IBM沃森研究中心(Mays等人1991年)的研究人员应用于拼写纠错任务。
图1:在噪声信道模型中,我们设想我们看到的表面形式实际上是通过噪声信道传递的一个原始词的“扭曲”形式。解码器将每个假设通过该信道的模型,并选择与表面噪声词最匹配的词。
噪声信道模型(见图B.1)的直观理解是,将拼写错误的单词视为正确拼写的单词通过一个有噪声的通信信道后发生了“扭曲”。这个信道以替换或其他方式引入了“噪声”,使得识别“真实”单词变得困难。因此,我们的目标是建立一个信道模型。根据这个模型,我们将语言中的每一个单词通过我们构建的噪声信道模型,并观察哪个单词最接近拼写错误的单词。
这个嘈杂信道模型是一种贝叶斯推断。我们看到一个观察值x(一个拼写错误的词),我们的任务是找到生成这个拼写错误词的词w。在词汇表V中的所有可能单词中,我们要找到使P(w|x)最高的词w。我们使用帽子符号ˆ表示“我们对正确单词的估计”
w^=argmax(P(w∣x))w∈V\hat{w} = \underset{w \in V}{ argmax(P(w|x))}w^=w∈Vargmax(P(w∣x)) (B1)
函数argmaxₓ f(x)表示“使得f(x)最大化的x”。因此,方程B.1意味着,在词汇表中的所有单词中,我们希望找到使右侧P(w|x)最大的特定单词。贝叶斯分类的直观理解是使用贝叶斯法则将方程B.1转换为一组其他概率。贝叶斯法则在方程B.2中给出,它为我们提供了一种将任何条件概率P(a|b)分解为三种其他概率的方法:
P(a∣b)=P(b∣a)P(a)P(b)P(a|b) = \frac{ P(b|a)P(a)}{P(b)}P(a∣b)=P(b)P(b∣a)P(a) (B2)
然后我们可以将方程B.2代入方程B.1,得到方程B.3。
w^=argmaxw∈V(P(x∣w)P(w)P(x))\hat{w} = \underset{w \in V}{ argmax}( \frac{ P(x|w)P(w)}{P(x)})w^=w∈Vargmax(P(x)P(x∣w)P(w))
(B3)
我们可以方便地简化公式B.3,去掉分母P(x)。为什么可以这样做?因为我们是从所有单词中选择一个潜在的修正词,对于每个单词,我们都会计算P(x|w)P(w)/P(x)。但P(x)对每个单词来说不会改变;我们总是询问在相同的观察错误x下最可能的单词,这必须具有相同的概率P(x)。因此,我们可以选择使这个更简单的公式最大化:
wˆ=argmaxw∈VP(x∣w)P(w)wˆ = \underset{w∈V}{argmax} \frac{P(x|w)}{P(w)}wˆ=w∈VargmaxP(w)P(x∣w)(B4)
总结来说,噪声信道模型认为我们有一些真实的底层单词w,并且有一个噪声信道将该单词修改为某种可能的拼写错误的表面形式。噪声信道模型产生任何特定观察序列x的概率由P(x|w)建模。隐藏词的先验概率由P(w)建模。我们可以计算在看到某些观察到的拼写错误x的情况下最可能的单词ˆw,通过将先验P(w)和似然P(x|w)相乘并选择使这个乘积最大的单词来实现。
我们通过采用噪声信道方法来纠正非词拼写错误,即对于不在我们的拼写词典中的任何单词,生成一个候选词列表,根据公式B.4对其进行排序,并选择排名最高的那个。我们可以修改公式B.4,使其引用这个候选词列表而不是完整的词汇表V,如下所示:
w^=argmaxw∈CP(x∣w)⏞channelmodelP(w)⏞prior\hat{w} = \underset{w∈C}{argmax}\overbrace{P(x|w)}^{channel model}\overbrace{P(w)}^{prior}w^=w∈CargmaxP(x∣w)channelmodelP(w)prior(B4)
噪声信道算法如图B.2所示。
图B.2 用于拼写纠错的未知单词噪声信道模型。
为了查看计算似然和先验(语言模型)的详细过程,让我们通过一个例子来演示算法的应用,即对拼写错误“acress”进行修正。算法的第一阶段通过寻找与输入单词拼写相似的单词提出候选修正词。对拼写错误数据的分析表明,大多数拼写错误由单个字母的变化组成,因此我们通常假设这些候选词与错误单词的编辑距离为1。为了找到这个候选词列表,我们将使用第2章介绍的最小编辑距离算法,并扩展该算法,除了插入、删除和替换之外,我们还将添加第四种编辑类型,即转位,其中两个字母被交换。带有转位的编辑距离版本称为Damerau-Levenshtein编辑距离。将所有这样的单次变换应用于“acress”,得到图B.3中的候选词列表。
图B.3 候选校正方案用于拼写错误的acress,以及可能导致该错误的转换(根据Kernighan等人(1990))。‘—’表示一个空字符。
一旦我们有一组候选人,要使用公式B.5对每个候选人进行评分,我们需要计算先验概率和信道模型。每个修正的先验概率P(w)是单词w在上下文中的语言模型概率,这可以通过任何语言模型来计算,从单字到三字或四字。在这个例子中,让我们从以下表格开始,假设使用单字语言模型。我们根据当代英语语料库(COCA)中的404,253,213个单词计算了语言模型。
我们如何估计条件概率P(x|w),也称为信道模型或错误模型?一个完美的模型会考虑各种因素:打字员是谁,打字员是左撇子还是右撇子等等。幸运的是,我们只需通过观察局部上下文就可以得到一个相当合理的估计:正确字母的识别、拼写错误以及周围的字母。例如,字母m和n经常互相替换;这在一定程度上是由于它们本身的特性(这两个字母发音相似,并且在键盘上相邻),在一定程度上也是由于上下文(因为它们发音相似并且出现在类似的上下文中)。
一个简单的模型可能会估计,例如,p(acress|across),仅仅使用在某个大型错误语料库中字母e替换字母o的次数。为了以这种方式计算每次编辑的概率,我们需要一个包含错误计数的混淆矩阵。一般来说,混淆矩阵列出了某物被误认为另一物的次数。因此,例如,替换矩阵将是一个26×26(或更一般地|A|×|A|,对于一个字母表A)的方阵,表示一个字母被误用为另一个字母的次数。按照Kernighan等人(1990年)的方法,我们将使用四个混淆矩阵。
del[x, y]: count(xy typed as x)
ins[x, y]: count(x typed as xy)
sub[x, y]: count(x typed as y)
trans[x, y]: count(xy typed as yx)
我们根据前一个字符来调整插入和删除的概率;我们也可以选择根据后一个字符来调整。这些混淆矩阵从哪里来?一种方法是从像下面这样的拼写错误列表中提取:
additional: addional, additonal
environments: enviornments, enviorments, enviroments
preceded: preceeded
维基百科和罗杰·米顿(http://www.dcs.bbk.ac.uk/~ROGER/corpora.html)以及彼得·诺维格(http://norvig.com/ngrams/)提供了可用的列表。诺维格还给出了每种单字符编辑的计数,这些计数可以直接用于创建错误模型的概率。肯尼思等人(1990年)采用了一种替代方法,通过迭代使用这个拼写纠错算法本身来计算矩阵。迭代算法首先用相等的值初始化矩阵;因此,任何字符被删除的可能性是相等的,被替换为任何其他字符的可能性也是相等的,等等。接下来,在一组拼写错误上运行拼写纠错算法。给定一组与预测纠正配对的错字,现在可以重新计算混淆矩阵,再次运行拼写算法,依此类推。这种迭代算法是重要EM算法(德姆普斯特等人,1977年)的一个实例,我们在附录A中讨论了它。
一旦我们得到了混淆矩阵,我们可以按以下方式估计P(x|w)(其中wiw_iwi是正确单词w的第i个字符,xi是错别字x的第i个字符):
使用Kernighan等人(1990年)的数据得出的acress错误模型概率如图B.4所示。
图B.4 用于across的信道模型;概率取自Kernighan等人(1990年)所示的del[], ins[], sub[], 和trans[]混淆矩阵。
图B.5显示了每个潜在修正的最终概率;一元先验与似然(通过公式B.6和混淆矩阵计算)相乘。最后一列显示了乘积,为了便于阅读,乘以10^9。
图B.5 使用前面显示的语言模型和图B.4中的错误模型,计算每个候选修正的排名。最终得分乘以109以提高可读性。
图B.5中的计算表明,我们对噪声信道模型的实现选择了“across”作为最佳修正词,并将“actress”作为第二可能的单词。不幸的是,算法在这里错了;从上下文中可以看出作者的意图:. . . was called a “stellar and versatile acress whose combination of sass and glamour has defined her. . .。周围的词语清楚地表明,作者想要表达的是“actress”,而不是“across”。
因此,使用比单语模型更大的语言模型是很重要的。例如,如果我们使用当代美国英语语料库来计算单词女演员和横跨在它们上下文中使用加一平滑的二元语法概率,我们得到以下概率:
P(actress|versatile) = .000021
P(across|versatile) = .000021
P(whose|actress) = .0010
P(whose|across) = .000006
将这些数相乘,我们得到了在上下文中两个候选语言模型的估计值。
P(“versatileactresswhose”)=.000021∗.0010=210×10−10P(“versatile actress whose”) = .000021 ∗ .0010 = 210×10^{−10}P(“versatileactresswhose”)=.000021∗.0010=210×10−10
P(“versatileacrosswhose”)=.000021∗.000006=1×10−10P(“versatile across whose”) = .000021 ∗ .000006 = 1×10^{−10}P(“versatileacrosswhose”)=.000021∗.000006=1×10−10
将语言模型与图B.5中的错误模型结合后,二元组噪声信道模型现在选择了正确的单词“女演员”。评估拼写纠正算法通常通过从像诺维格和米顿网站上提到的那些错误列表中保留训练集、开发集和测试集来完成。
(未完待续…)