码迷,mamicode.com
首页 > 其他好文 > 详细

用贝叶斯实现拼写检查器

时间:2018-06-29 21:44:55      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:距离   range   生活   概率   turn   efault   alpha   port   lam   

贝叶斯公式

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

 

用贝叶斯实现拼写检查器

标签:距离   range   生活   概率   turn   efault   alpha   port   lam   

原文地址:https://www.cnblogs.com/6530265oule/p/9245439.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!