当用户输入错误时,系统如何识别并进行纠错?
拼写错误有两种,第一种是拼写错误,例如上面的theirs,当用户输入的词不存在于词库中时,系统就能知道其输入错误;第二种是语法错误,例如I am go home,应该使用going。
当发现用户输入错误之后,可以使用经典的编辑距离寻找可能的输入单词。编辑操作有插入、替换、删除。编辑距离比较小的词是可能的待输入词。
词库词量很大,最笨的方法是循环整个词典,计算每个词与输入词的编辑距离,这样的时间复杂度非常高,时间复杂度与词库的大小相关;
为了提高效率,可以使用更高效的方法;最笨的方法是遍历词库的每个词,寻找与输入词编辑距离最小的词。,时间复杂度为
O
(
V
)
∗
e
d
i
t
O(V)*edit
O(V)∗edit,V为词库大小,edit为每个词对应的编辑距离。
另外一个方法是基于输入词生成编辑距离为1,2的字符串,比如对于单词appl,通过插入、删除、替换可以生成例如apple、app等单词。生成编辑距离为1的单词之后,基于生成的词再执行一遍插入、删除、替换就可以得到编辑距离为2的单词。
当得到编辑距离为1或者2的单词之后,怎么选择最合适的字符串呢?我们从数学角度进行定义:
给定字符串s,找到与其编辑距离为1或者2的所有字符串,返回概率
P
(
c
∣
s
)
P(c|s)
P(c∣s)最大的字符串。也就是需要求使得
P
(
c
∣
s
)
P(c|s)
P(c∣s)最大的字符串c。
我们的目的是: c ^ = a r g m a x c ∈ c a n d i d a t e s P ( c ∣ s ) \hat{c}=argmax_{c\in candidates}P(c|s) c^=argmaxc∈candidatesP(c∣s)通过贝叶斯定理可以将上面公式转换为: c ^ = a r g m a x c ∈ c a n d i d a t e s P ( s ∣ c ) P ( c ) / P ( s ) \hat{c}=argmax_{c\in candidates}P(s|c)P(c)/P(s) c^=argmaxc∈candidatesP(s∣c)P(c)/P(s)因为字符串s给定,因此 P ( s ) P(s) P(s)是常数项,因此可以忽略 P ( s ) P(s) P(s),上述公式可以改写为: c ^ = a r g m a x c ∈ c a n d i d a t e s P ( s ∣ c ) P ( c ) \hat{c}=argmax_{c\in candidates}P(s|c)P(c) c^=argmaxc∈candidatesP(s∣c)P(c)公式中的 P ( s ∣ c ) P(s|c) P(s∣c)是指用户想要的单词是c,但是错输入为s,这样的概率可以从后台大数据中收集得到。也就是说用户想输入的单词为apple,但是用户错输入为appl的概率是多少,这样就可以得到 P ( a p p l ∣ a p p l e ) P(appl|apple) P(appl∣apple)。
P ( c ) P(c) P(c)可以从用户数据中获得,比如c在所有输入语料中出现的次数。基于 P ( s ∣ c ) P(s|c) P(s∣c)和 P ( c ) P(c) P(c)就可以返回概率 P ( c ∣ s ) P(c|s) P(c∣s)最大的词c。