【第22期】观点:IT 行业加班,到底有没有价值?

python 拼写检查

原创 2015年07月06日 16:44:11

无意中刷微博看到这篇文章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,可以用这么简短的程序就完成一个功能。这个还有很多可以优化的地方,文章中也都提到了。日后有时间可以好好优化一下。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

怎样写一个拼写检查器 (python)

原文在这里 作者:Peter Norvig 翻译: Eric You XU 怎样写一个拼写检查器  上个星期, 我的两个朋友 Dean 和 Bill 分别告诉我说他们对 Goo...

“部落格观察”和《Python检查你的站点的人气》

<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html&quo...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

Python写一个简洁拼写检查器

网上看到的一篇神文,利用的是朴素贝叶斯模型实现了一个简单的拼写检查器。 英文原文链接见这里,中文翻译如下 =============================================...

[Python]检查你的站点的人气[1008Updated]

<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html&quo...

用快速使用Python写一个拼写检查器

拼写检查器是个非常常用的工具,现在几乎所有涉及到搜索的网站都已经实现了这个功能。那拼写检查器是不是很复杂呢?不是的,只要你明白一点贝叶斯公式的原理,你就能写出一个拼写检查器来。
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)