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中的for i in range

n = input() for i in range(0,n):#for(i=0;i
  • xdz78
  • xdz78
  • 2016年03月31日 18:16
  • 5613

贝叶斯定理拼写检查中的应用

.
  • wenyichuan
  • wenyichuan
  • 2017年11月18日 23:03
  • 97

使用POI读写word doc文件

使用POI读写word doc文件 目录 1     读word doc文件 1.1     通过WordExtractor读文件 1.2     通过HWPFDocument读文件 2  ...
  • zhaoquanfei
  • zhaoquanfei
  • 2014年07月16日 14:49
  • 352

文本情感分类(三):到底需不需要分词

深度学习是一种“端到端”的模型,所谓端到端就是能够将原始数据和标签输入,然后让模型自己完成一切过程-包括特征的提取、模型的学习。。而回顾我们做中文情感分类的过程,一般都是“分词——词向量——句向量(L...
  • zhonglongshen
  • zhonglongshen
  • 2017年12月19日 17:30
  • 65

python入门笔记--循环(for...range\enumerate\zip)、列表推导

一、循环结构 >>> range(1,5) #代表从1到5(不包含5) [1, 2, 3, 4] >>> range(1,5,2) #代表从1到5,间隔2(不包含5) [1, 3] >>> range...
  • u011649536
  • u011649536
  • 2015年05月21日 15:34
  • 3246

运用Range 对象处理 Word 文档内容

转自http://www.officexy.com/articles/word/word_vba20061027194952795.htm 在所有 Office 应用程序中,Microsoft Wor...
  • foreverfall
  • foreverfall
  • 2015年05月19日 15:02
  • 1921

C#中操作Word(3)—— 利用Range对象读取和设置Word中的文本

本文主要介绍利用C#读取和写入Word内容的一般方法。 一、创建工程。 1.1 引入控制台Control         我们创建一个名叫WordTest的Windows窗体应用程序作为本次试验的工程...
  • lzhui1987
  • lzhui1987
  • 2016年11月09日 14:13
  • 2668

Python面试题

第一个题: ##分析## 该题纯考if...elsif..else语句的语法与判断过程,按一般顺序结构写即可代码如下: 代码调试: 第二题: 问题描述:一个整数,加上100是完全平方数...
  • Stephen_Curry11
  • Stephen_Curry11
  • 2017年12月27日 19:06
  • 62

java面试题inti=2;i+=i-=i*i的值以及关于i++;++i;i=i+1;i+=1 的效率问题

关于i++;++i;i=i+1;i+=1 的效率问题
  • liaoqianwen123
  • liaoqianwen123
  • 2014年04月19日 21:15
  • 3117

【51Nod】-1050 循环数组最大子段和(LIS,小变化)

1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 N个整数组成的循环...
  • Bear1998
  • Bear1998
  • 2016年08月19日 15:38
  • 363
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python 拼写检查
举报原因:
原因补充:

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