用贝叶斯实现拼写检查器
Posted 6530265oule
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用贝叶斯实现拼写检查器相关的知识,希望对你有一定的参考价值。
贝叶斯公式
p(A|D)=p(A)*p(D|A)/p(D);
可以应用于垃圾邮件的过滤和拼写检查
例如:对于拼写检查,写出一个单词D,判断该单词为正确单词A的概率。为上述条件概率的描述。
其中p(A)为先验概率,可以根据现有的数据库中的单词,来获得A单词的概率p(A)。由于正确的单词不仅仅有A,还有可能有A1,A2....
最终比较p(A1|D),p(A2|D),p(A3|D)...由于分母比较时相同,可以只比较分子p(A)*p(D|A)
p(A|D)正比于p(A)*p(D|A)
分别计算p(A1)*p(D|A1),p(A2)*p(D2|A)。其中p(D|A),例如在写A=good,错写为D=gooe是的概率。是根据增删减距离获得。
若 p(A1)*p(D|A1)=p(A2)*p(D2|A),则根据实际生活中先验概率的选择p(A1),p(A2)大小选择。
import re,collections 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(open(‘big.txt‘).read())) alphabelt=‘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 alphabelt]+ #alteration [word[0:i]+c+word[i:] for i in range(n+1)for c in alphabelt]) #insertion def known_edits2(word): return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS) 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])
print(correct(‘goode‘))
good
以上是关于用贝叶斯实现拼写检查器的主要内容,如果未能解决你的问题,请参考以下文章