























原理和原文见 Peter Norvig的这篇文章
原文是基于词频,在文后提到可以通过上下文来提高准确率
下面这段代码只考虑了待纠正词在序列末尾的情况,应当还要考虑其在序列中和序列首的情况
import re, collections, sys, randomdef words(text): return re.findall('[a-z]+', text.lower()) def defaultdict_factoryn(n, default):
if n == 1: return lambda: default
return lambda: collections.defaultdict(defaultdict_factoryn(n-1, default))def multidict_set(d, l, v):
curd = d;
i = 0
for ele in l:
i += 1
if i == len(l):
curd[ele] = v
else:
curd = curd[ele]def multidict_add(d, l, v):
curd = d;
i = 0
for ele in l:
i += 1
if i == len(l):
curd[ele] += v
else:
curd = curd[ele]def multidict_get(d, l):
curd = d;
i = 0
for ele in l:
curd = curd[ele]
return curddef train(features, n):
model = collections.defaultdict(defaultdict_factoryn(n, 1))
prevlen = n
prev = collections.deque()
for f in features:
if (len(prev) < prevlen):
prev.append(f)
continue
multidict_add(model, prev, 1)
prev.popleft()
prev.append(f)
return modeldef most_likely(prev):
l = multidict_get(Model, prev)
if not l:
return ""
l = l.items()
if len(l) == 0:
return ""
l = sorted(l, cmp=lambda x, y:y[1] - x[1])
count = min(len(l) - 1, 10)
return l[random.randint(0, count)][0]
stage
= 1NWORDS
= train_1(words(file('big.txt').read()))alphabet
= 'abcdefghijklmnopqrstuvwxyz'def edits1(word):此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。