自然语言处理2-2: 拼写纠错

一.编辑距离

关于编辑距离,在我的博客https://www.cnblogs.com/loubin/p/13672786.html中已经详细的介绍了。简短的说就是把一个单词修改成另一个单词需要的修改次数。当然,每一次只能增加一个字符,删除一个字符,或者更换一个字符。例如,apple和apply的编辑距离是1,只需要将e改成y即可。dog和pig的编辑距离是2,因为要把‘do’改成‘pi’。

二.拼写纠错初级版

其实就是去词典中找与输入的单词编辑距离最小的单词,例如,如果我输入apple,就去词典中对每个单词计算与apple的编辑距离,然后选择编辑距离最小的那个单词。但是,这样的话时间复杂度是O(v),这里v是词典中的单词个数,一般都是非常大的,例如几百万,所以时间复杂度可以说是非常大了。

三.拼写纠错高级版

对于输入的单词,  首先列出与其编辑距离为1的所有单词,然后基于这些单词再修改一次,生成与输入单词编辑距离为2的单词(当然,也可能修改回原样,这样编辑距离是0,也有可能修改后编辑距离还是1,但是两次修改之后,编辑距离一定是0,1,2)。然后再从这些单词中选择出最有可能的那个单词。那么具体怎么选择的呢?

假设输入的单词是s,我们要找到正确的单词$hat{c} $,那么,也就是解决如下的数学问题:

$$hat{c} = underset{c}{argmax} P(c|s )$$

利用贝叶斯公式,可以转化为如下形式

$$hat{c} = underset{c}{argmax} P(frac{c}{s} ) = underset{c}{argmax}frac{P(s|c)P(c)}{P(s)}  $$

由于P(s)是一个固定的值,所以我们只需要求单词c,使得P(s|c)P(c)最小即可。

P(c)好求,只需要统计单词c出现次数即可。而对于P(s|c),可以通过查阅历史的输入数据来获得。

例如,对于单词apple,100个人中,有5个人输入成apply,2个人输入成applr,那么如果s是apply的话,则P(s|c)=1/20,同样,如果s是spplr,那么P(s|c)=1/50

原文地址:https://www.cnblogs.com/loubin/p/13692813.html