p(h+|D) = p(h) * p(D|h+) / p(D) 表示一个单词输错的概率 = 单词的词频 * 一个输错单词的可能的正确单词的数量
p(h-|D) = p(h) * p(D|h-) / p(D)
第一步:读取词库,通过正则找出每个单词,并统计单词的词频
import collections, re #找出所有的单词,并且变成小写 def word(text): return re.findall('[a-z]+', text.lower()) #晒出内容的词频 def train(feature): model = collections.defaultdict(lambda :1) for f in feature: model[f] += 1 return model NWORDS = train(word(open('big.txt').read()))
第二步 : 模拟一个错误单词的其他拼写可能性
alphabet = 'abcdefghijklmnopqrstuvwxyz' # 编辑出其他拼写的可能性 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])
第三步: 判断其他拼写是否在词库中
#如果word在词库中就返回 def known(word): return set(w for w in word if w in NWORDS)
第四步: 我们对模拟的其他拼写可能性进行再一次的模拟
#对第一次变换再进行一次,如果存在的话,就返回 def known_edits2(word): return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 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])