python 拼写检查

无意中刷微博看到这篇文章http://python.jobbole.com/81675/作者用很简短的语句写了一个拼写检查的python程序。看完之后发现原来拼写检查的原理是这样的,之前感觉应该是很高深的东西。但是由于对python中lambda表达式的不怎么理解于是,我就又凭着自己的理解简单的写了一遍。没有原文中作者的优化部分,只是简单的实现了功能。而且是只有文章中提到的编译距离1以内的情况。

def words(text):
	Text=text.lower()
	pat=re.compile(r'[a-z]+')
	return	pat.findall(Text)
def Probability_model(words):
	res=collections.defaultdict(int)
	for item in words:
		res[item]+=1
	return res
f=open(r'haha.txt','r')
text=f.read()
model=Probability_model(words(text))
这是用来建立单词拼写的概率模型的部分,需要首先那一些文本对概率模型进行训练,所谓的训练其实就是统计一下单词出现的次数。collections.defaultdict(int)是对字典进行一个默认值的确定,参数中的int说明这个是一个计数的字典,遇到未出现的键值就赋值0。

alphabet='abcdefghijklmnopqrstuvwxyz'
def edits(word):
	n=len(word)
	res=[]
	#删除一个字符
	for i in range(n):
		res+=[word[0:i]+word[i+1:]]
	#插入一个字符
	for i in range(n):
		for a in alphabet:
			res+=[word[0:i]+a+word[i:]]
	#替换一个字符
	for i in range(n):
		for a in alphabet:
			res+=[word[0:i]+a+word[i+1:]]
	#将相邻两个字符交换
	for i in range(n-1):
		res+=[word[0:i]+word[i+1]+word[i]+word[i+2:]]
	#only one
	return set(res)
这是产生编译距离为1的所有可能的情况,最后用set去除重复出现的单词。


完整代码:

#coding:utf-8
import re,collections
alphabet='abcdefghijklmnopqrstuvwxyz'
def edits(word):
	n=len(word)
	res=[]
	#删除一个字符
	for i in range(n):
		res+=[word[0:i]+word[i+1:]]
	#插入一个字符
	for i in range(n):
		for a in alphabet:
			res+=[word[0:i]+a+word[i:]]
	#改变一个字符
	for i in range(n):
		for a in alphabet:
			res+=[word[0:i]+a+word[i+1:]]
	#交换相邻字符
	for i in range(n-1):
		res+=[word[0:i]+word[i+1]+word[i]+word[i+2:]]
	#only one
	return set(res)
def words(text):
	Text=text.lower()
	pat=re.compile(r'[a-z]+')
	return	pat.findall(Text)
def Probability_model(words):
	res=collections.defaultdict(int)
	for item in words:
		res[item]+=1
	return res
f=open(r'haha.txt','r')
text=f.read()
model=Probability_model(words(text))
def correct(word):
	words=edits(word)
	if model[word]:
		return  word;
	res=''
	for w in words:
		if model['w']>model[res]:
			res=w
	return w
越来越喜欢python,可以用这么简短的程序就完成一个功能。这个还有很多可以优化的地方,文章中也都提到了。日后有时间可以好好优化一下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值