输入法纠错系统的原理理解
问题背景:
随着移动互联网的繁荣发展,人们在手机上可以处理各种事务。由于在屏幕上显示的键盘尺寸较小,我们在输入文字的时候经常点按错误,输入一些不存在的单词或者拼音。例如:用户原本要在键盘上输入拼音“panduan(判断)”,然而由于‘s’与‘a’在键盘上位置接近,误输入“pandusn”。而一款智能的输入法能判断用户误输入,并给出修正建议。
用python实现一个英文输入法纠错系统:
代码截图:
分步理解:
1、
def words(text): return re.findall('[a-z]+', text.lower())
def train(features):
model = collections.defaultdict(lambda: 1)
for f in features:
model[f] += 1
return model
NWORDS = train(words(file('test.txt').read()))
def train(features):
model = collections.defaultdict(lambda: 1)
for f in features:
model[f] += 1
return model
NWORDS = train(words(file('test.txt').read()))
此部分主要是在自己的单词库中训练一个概率模型,即统计一下每个单词出现的次数。
2、
def edits1(word):
n = len(word)
return set([word[0:i]+word[i+1:] for i in range(n)] + # deletion
[word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n-1)] + # transposition
[word[0:i]+c+word[i+1:] for i in range(n) for c in alphabet] + # alteration
[word[0:i]+c+word[i:] for i in range(n+1) for c in alphabet]) # insertion
n = len(word)
return set([word[0:i]+word[i+1:] for i in range(n)] + # deletion
[word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n-1)] + # transposition
[word[0:i]+c+word[i+1:] for i in range(n) for c in alphabet] + # alteration
[word[0:i]+c+word[i:] for i in range(n+1) for c in alphabet]) # insertion
当给定了一个单词A,输入法需要枚举所有可能正确的拼写,即和自己输入的单词A相似的单词。此部分函数是列举出所有与输入单词 A 编辑举例为1的单词。 两个单词之间的编辑距离为1,即通过一次 增添字母、删除字母、交换字母、替换字母可以从一个单词变到另一个单词。
3、
def known_edits2(word):
return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
此部分即计算和单词A编辑距离为2的可能正确的单词。
此代码只考虑和原单词编辑距离为1和2,因为只是一个简单的示例,不需要花费太多的时间成本。
4、
def known(words): return set(w for w in words if w in NWORDS)
def correct(word):
candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
return max(candidates, key=lambda w: NWORDS[w])
def correct(word):
candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
return max(candidates, key=lambda w: NWORDS[w])
此处为一个判断函数,即输入一个单词A,函数会将A与库中的单词、与A编辑举例为1的单词、与A编辑距离为2的单词都枚举出来输出一个概率最大的单词。 当然,存在一个设定好的优先级,如果库中存在一个和A完全相同的单词,便输出,否则输出编辑距离为1的,再输出编辑举例为2的。
另外还需要创建一个单词库,单词库中的单词数目越多,得到的结果自然越准确,为了方便观察结果,故选取了这几个单词
运行结果:
可以看出编辑距离为012都可以返回正确的单词,而我们输入lates的时候,和两个单词latest 、late的编辑距离都是1,而late出现的概率要更大,所以返回结果late。