Win_Man的专栏

心有猛虎,细嗅蔷薇

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,可以用这么简短的程序就完成一个功能。这个还有很多可以优化的地方,文章中也都提到了。日后有时间可以好好优化一下。
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Win_Man/article/details/46776347
文章标签: 正则表达式 python
个人分类: Python
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

python 拼写检查

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭