前几天在微博上看到了谷歌某位写的一篇博客,如何写一个小巧的单词拼写检查器:http://norvig.com/spell-correct.html
由于英语水平的限制,以及不了解python,所以这边文章不敢保证和原文的思想完全一致。
我对原文的一些细节的地方,做了细微的修改(尽量不影响效果)。最大的一处修改为编辑距离,原文计算了编辑距离为2的所有单词,而这儿我只计算了距离为1的单词。(可以对我的代码稍作修改从而达到距离为2的单词:递归调用Enum函数)
不扯了,上干货---
用户输入一个单词w,返回一个正确的单词c(有可能为w),使得这种c(输入w的情况下)尽可能合理。
原理主要是贝叶斯概率公式,可以参见原文,这儿直接给出算法。
1.如果用户输入的w存在我们的语料库中,即可认为w是一个正确的单词(语料库的限制,不100%正确),故直接返回w;
2.如果w不存在语料库中,对w作距离为1的编辑,该编辑过程如下:
---删除。 每次删除w中的一个字符,于是我们得到若干个单词. 如abc, 我们可以得到bc,ac,ab三个新的单词,他们与原单词距离为1
---交换。依次交换每相邻的两个字符,如abc,我们可以得到bac acb。
---增加。每次增加一个新的字符(从a到z)如abc,我们可以得到多个单词,不一一列举:aabc,babc,cabc......aabc,abbc.......