机器学习中的贝叶斯算法,实现拼写检查器

贝叶斯要解决的问题:

正向概率:假设袋子里有N个白球,M个黑球,你伸手进去摸一把,摸出黑球的概率是多大
逆向概率:如果我们事先并不知道袋子里面黑白球的比例,而是闭着眼睛摸出一个(或好几个)球,观察这些取出来的球的颜色后,那么我们可以就此对袋子里面的黑白球的比例作出怎样的推测

贝叶斯实现拼写检查器

求解:argmaxc P(c|w) -> argmaxc P(w|c)P© / P(w)
P©,文章中出现一个正确拼写词c的概率,也就是说,在英语文章中,c出现的概率有多大
P(w|c),在用户想键入c的情况下敲成w的概率,因为这个是代表用户会以多大概率把c敲错成w
argmaxc,用来枚举所有可能的c并且选取概率最大的

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()))
			#输出每个词出现的频率,要是遇到我们从来没有见过的新词怎么办,假如说一个词完全正确,但是语料库中没有包含这个词,所以先验概率为0,0乘任何数都为	0,从而这个词也不会出现在训练集中,于是,我们就要返回出现这个词的概率值为0,这个情况很不妙,因为概率为0代表了这个时间绝对不可能发生,而在我们的概率模型中,我们期望用一个很小的概率来代表这种情况。 lambda : 1


	alphabet = 'abcdefghijklmnopqrstuvwxyz'  
	
	# 编辑距离
	# 两个词之间的编辑距离定义为使用了几次插入,删除,交换,替换
	def edits1(word):
	    n = len(word)
	    return set(
	        [word[0:i] + word[i+1:] for i in range(n)] + 
	        [word[0:i] + word[i+1] + word[i] + word[i+2:] for i in range(n-1)] + 
	        [word[0:i] + c + word[i+1:] for i in range(n) for c in alphabet] + 
	        [word[0:i] + c + word[i:] for i in range(n+1) for c in alphabet]
	    )
	# 返回所有与单词w编辑距离为1的集合    


	def known_edits2(word):
	    return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
	# 返回所有与单词w编辑距离为2的集合,在这些编辑距离小于2的词中间,只把那些正确的词作为候选词,如果不是的话,选项太多
	
	# 总而言之,编辑距离为0的正确单词优先度最高  

	def known(words):
	    returnset(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])
	# 如果known(set)非空,candidate就会选取这个集合,而不计算后面的

	# 测试一下
	correct('appl')

可以看到输出为apply

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值