用贝叶斯实现拼写检查器

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

 

以上是关于用贝叶斯实现拼写检查器的主要内容,如果未能解决你的问题,请参考以下文章

贝叶斯实现拼写检查器

利用朴素贝叶斯实现拼写纠错器

机器学习贝叶斯网络实现一个简单的拼写检查

朴素贝叶斯算法——拼写检查器

机器学习实战3:基于朴素贝叶斯实现单词拼写修正器(附Python代码)

机器学习:基于朴素贝叶斯实现单词拼写修正器(附Python代码)