机器学习小实战(三) 贝叶斯实现拼写检查器

一、贝叶斯(Bayes)简介

     贝叶斯老爷爷是一位有名的老人家!贝叶斯算法和概率有关,贝叶斯公式其实高中学过的,就是忘了而已。

P(A|B)=P(B|A)P(A)/P(B)

二、贝叶斯实现拼写检查器

1. 原理

argmaxc P(A|B)=argmaxc P(B|A) P(A) /P(B)

P(A|B):待求的;用户本想本想输入B的前提下,错输成A的概率

P(A):文章中出现正确单词A的概率

P(B|A):用户本想本想输入A的前提下,错输成B的概率

P(B):文章中出现正确单词B的概率

argmaxc:用来枚举所有可能的A,并选取概率最大的那个

拼写检查器就是,输入一个单词,先判断这个单词是否存在于语料库中(是否正确),如果不在(可能语料库中没有,或者拼写错误),则需要根据编辑距离进行检查修正。

2. 编辑距离

编辑距离为1,意味着单词1只需增/删/改/交换相邻字母 1次,就可以变成单词2,以此类推。

import re,collections #正则表达式re库

def words(text):   # 将给定语料库中所有单词转为小写,去除单词中的特殊符号
    return re.findall('[a-z]+',text.lower())

def train(features): # 统计每个单词的出现次数,并为每个单词设置一个默认值-1
    model=collections.defaultdict(lambda:1) #匿名函数,为每个单词的出现频率设置最低值1
    for f in features:
        model[f]+=1
    return model

NWORDS=train(words(open('big.txt').read())) # 计算big文件中各个词的出现次数

alphabet='abcdefghijklmnopqrstuvwxyz'

def edits1(word): #返回所有与word编辑距离为1的集合
    n=len(word)
    return set([word[0:i]+word[i+1:] for i in range(n)]+  #delete
               [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]) #insertion

def edists2(word): #编辑距离为2 的单词
    return set(e2 for e1 in edits1(word) for e2 in edits1(e1))

def known(words):  #将那些正确的词作为候选词
    return set(w for w in words if w in NWORDS) 

def correct(word): #检查器函数,先判断是不是正确的拼写形式,如果不是则选出编辑距离为1的单词……
    candidates=known([word])or known(edits1(word)) or known(edists2(word)) or [word]
    return max(candidates,key=lambda w:NWORDS[w])

print(correct('mach'))

输出:much

3. 其他

python中,set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。本例中set的用法本菜鸟有点没看懂,要是有哪位大神看懂了可否帮忙解惑!3ks!!

你可能感兴趣的:(Machine,Learning)