一、贝叶斯(Bayes)简介
贝叶斯老爷爷是一位有名的老人家!贝叶斯算法和概率有关,贝叶斯公式其实高中学过的,就是忘了而已。
二、贝叶斯实现拼写检查器
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!!