大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供非常好的拼写检查,比如你输入 speling,谷歌会马上返回 spelling。
下面是用python代码实现的一个简易但是具备完整功能的拼写检查器:

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] += 1return model
NWORDS = train(words(open('big.txt').read()))
alphabet = 'abcdefghijklmnopqrstuvwxyz'
def edits1(word):splits     = [(word[:i], word[i:]) for i in range(len(word) + 1)]deletes    = [a + b[1:] for a, b in splits if b]transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1]replaces   = [a + c + b[1:] for a, b in splits for c in alphabet if b]inserts    = [a + c + b     for a, b in splits for c in alphabet]return set(deletes + transposes + replaces + inserts)
def known_edits2(word):return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
def known(words): return set(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=NWORDS.get)

可以看出来,代码量很少,correct函数是程序的入口,传进去错误拼写的单词会返回正确。

>>> correct("cpoy")
'copy'
>>> correct("engilsh")
'english'
>>> correct("sruprise")
'surprise'
>>> correct('thiink')
'think'

除了这段代码外,作为机器学习的一部分,肯定还应该有大量的样本数据,准备了big.txt作为我们的样本数据。

背后原理


上面的代码是基于贝叶斯来实现的,事实上谷歌百度实现的拼写检查也是通过贝叶斯实现,不过肯定比这个复杂多了。
首先简单介绍一下背后的原理,如果读者之前了解过了,可以跳过这段。
给一个词,我们试图选取一个最可能的正确的的拼写建议(建议也可能就是输入的单词)。有时也不清楚(比如lates应该被更正为late或者latest),我们用概率决定把哪一个作为建议。我们从跟原始词w相关的所有可能的正确拼写中找到可能性最大的那个拼写建议c:

argmaxc  P(c|w)

通过贝叶斯定理,上式可以转化为

argmaxc P(w|c) P(c) / P(w)

下面介绍一下上式中的含义:

P(c|w)代表在输入单词w 的情况下,你本来想输入单词c的概率。
P(w|c)代表用户想输入单词c却输入w的概率,这个可以我们认为给定的。
P(c)代表在样本数据中单词c出现的概率
P(w)代表在样本数字中单词w出现的概率
可以确定P(w)对于所有可能的单词c概率都是一样的,所以上式可以转换为
argmaxc P(w|c) P(c)
我们所有的代码都是基于这个公式来的,下面分析具体代码实现

代码分析

利用words()函数提取big.txt中的单词

def words(text): return re.findall('[a-z]+', text.lower())

re.findall(‘[a-z]+’是利用python正则表达式模块,提取所有的符合’[a-z]+’条件的,也就是由字母组成的单词。(这里不详细介绍正则表达式了,有兴趣的同学可以看正则表达式简介。text.lower()是将文本转化为小写字母,也就是“the”和“The”一样定义为同一个单词。

利用train()函数计算每个单词出现的次数然后训练出一个合适的模型

def train(features):model = collections.defaultdict(lambda: 1)for f in features:model[f] += 1return modelNWORDS = train(words(open('big.txt').read()))

这样NWORDS[w]代表了单词w在样本中出现的次数。如果有一个单词并没有出现在我们的样本中该怎么办?处理方法是将他们的次数默认设为1,这里通过collections模块和lambda表达式实现。collections.defaultdict()创建了一个默认的字典,lambda:1将这个字典中的每个值都默认设为1。(lambda表达式可以看lambda简介

现在我们处理完了公式argmaxc P(w|c) P(c)中的P(c),接下来处理P(w|c)即想输入单词c却错误地输入单词w的概率,通过 “edit distance“--将一个单词变为另一个单词所需要的编辑次数来衡量,一次edit可能是一次删除,一个交换(两个相邻的字母),一次插入,一次修改。下面的函数返回一个将c进行一次编辑所有可能得到的单词w的集合:

def edits1(word):splits     = [(word[:i], word[i:]) for i in range(len(word) + 1)]deletes    = [a + b[1:] for a, b in splits if b]transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1]replaces   = [a + c + b[1:] for a, b in splits for c in alphabet if b]inserts    = [a + c + b     for a, b in splits for c in alphabet]return set(deletes + transposes + replaces + inserts)

相关论文显示,80-95%的拼写错误跟想要拼写的单词都只有1个编辑距离,如果觉得一次编辑不够,那我们再来一次

def known_edits2(word):return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)

同时还可能有编辑距离为0次的即本身就拼写正确的:

def known(words):return set(w for w in words if w in NWORDS)

我们假设编辑距离1次的概率远大于2次的,0次的远大于1次的。下面通过correct函数先选择编辑距离最小的单词,其对应的P(w|c)就会越大,作为候选单词,再选择P(c)最大的那个单词作为拼写建议

def correct(word):candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]return max(candidates, key=NWORDS.get)

转载于:https://www.cnblogs.com/peihao/p/5269141.html

Python简单的拼写检查相关推荐

  1. python代码大全p-21行Python代码实现拼写检查器

    引入 大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供非常好的拼写检查,比如你输入 speling,谷歌会马上返回 spelling. 下面是用21行python代码实现的一个简易但是具备 ...

  2. 拼写检查 java_一个简单的拼写检查器

    记得以前就看过这篇文章:How to write a spelling corrector,文章将贝叶斯原理运用于拼写检查,二十几行简单的Python的代码就实现了一个拼写检查器. 原作者python ...

  3. 使用贝叶斯实现简单得拼写检查

    贝叶斯实现拼写检查 实现原理 详细步骤 导入语料库并进行处理 编辑距离,P(w|a)的实现 实现代码 实现原理 求解:argmaxc P(a|w)->argmaxc P(w|a)P(a)/P(w ...

  4. Python写一个简洁拼写检查器

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

  5. 介绍 Java 平台的 Jazzy:一种新的拼写检查器 API

    计算机擅长执行快速搜索操作,可以根据给定的搜索词,对大量存储的信息快速进行搜索.但是,拼写检查应用程序所要求的搜索能力,不仅仅是正确的字符串匹配.在这篇文章中,我将介绍搜索算法的一些历史,包括语音匹配 ...

  6. Jazzy--一种新的拼写检查器API(Java平台)

    计算机擅长执行快速搜索操作,可以根据给定的搜索词,对大量存储的信息快速进行搜索.但是,拼写检查应用程序所要求的搜索能力,不仅仅是正确的字符串匹配. 在这篇文章中,我将介绍搜索算法的一些历史,包括语音匹 ...

  7. python拼写错误20几分钟怎么办_Python | 21行轻松搞定拼写检查器

    引入 大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供非常好的拼写检查,比如你输入 speling,谷歌会马上返回 spelling. 下面是用21行python代码实现的一个简易但是具备 ...

  8. 怎样写一个拼写检查器-贝叶斯-python

    怎样写一个拼写检查器 Peter Norvig 翻译: Eric You XU 原版:http://norvig.com/spell-correct.html 翻译:http://blog.youxu ...

  9. 20来行的Python拼写检查器

    近来Google的人工智能围棋机器人AlphaGo击败了欧洲围棋冠军樊麾二段(原中国国少队队员),引起了围棋界的轩然大波.AlphaGo采用的是机器学习加上蒙特卡洛算法的方式.蒙特卡洛算法早有研读,而 ...

最新文章

  1. 网易2017春招笔试真题编程题集合(2)——赶去公司
  2. Android Tab 选项卡的简单实现
  3. 马云养的蚂蚁赚钱如印钞:每小时盈利500万,程序员平均年薪竟没到百万
  4. VTK:几何对象之PlatonicSolids
  5. 华中C语言程序简答题,华中科技大学0911年C语言程序设计试卷.doc
  6. 10.2.1 CSS介绍与引入
  7. 玩转mini2440开发板之【在64位WIN7/WIN10系统中安装USB驱动】
  8. Eight HDU - 1043(八数码+搜索)
  9. 牛客题霸 [二叉树中是否存在节点和为指定值的路径] C++题解/答案
  10. OpenShift 4 之使用持久化存储
  11. 谈谈struts2的工作原理
  12. (转自YYW'S BLOG)IListT 转换成 DataSet
  13. 位图切割器位图裁剪器
  14. Mybatis学习笔记-一级缓存与二级缓存
  15. DDOS hulk,rudy
  16. 关于爱情和婚姻的见解
  17. linux中硬盘安装教程图解,硬盘安装Debian 5教程图解
  18. HTML 表单 (form) 的作用解释
  19. TDIfw在windows 10 1903的测试
  20. 由酷6员工猝死想到的:IT民工 我该拿什么拯救你

热门文章

  1. 对注册表操作的REG函数
  2. Android:adb进程问题
  3. web-attack 1-5视频汇总
  4. 安装与设置Visual SVN
  5. 3d游戏编程大师技巧 源代码_C/C++编程入门基础系列:俄罗斯方块小游戏制作,直接源代码分享...
  6. golang 导入自定义包_二、Go基本命令及定制自定义第三方包
  7. svpwm仿真_【好物推荐】《现代永磁同步电机控制原理及MATLAB仿真》
  8. java图形界面关键字_怎样用Java编写一个图形界面,要求可以利用关键词查询txt中的内容...
  9. 电大计算机网络技术基础,电大--2016年电大 计算机与网络技术基础小抄已排版.doc...
  10. android adjust,【报Bug】安卓 adjust-position设置为false 页面依然被顶起 ios是好的