引入

大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供非常好的拼写检查,比如你输入 speling,谷歌会马上返回 spelling。

下面是用21行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] += 1

return model

NWORDS = train(words(file('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'

除了这段代码外,作为机器学习的一部分,肯定还应该有大量的样本数据,准备了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] += 1

return model

NWORDS = train(words(file('big.txt').read()))

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

现在我们处理完了公式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)

以上就是本文的全部内容,希望对大家学习python程序设计有所帮助。

python代码大全p-21行Python代码实现拼写检查器相关推荐

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

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

  2. python读取文件第n行-Python读取文件后n行的代码示例

    这篇文章主要介绍了Python实现读取文件最后n行的方法,涉及Python针对文件的读取.遍历与运算相关操作技巧,需要的朋友可以参考下# -*- coding:utf8-*- import os im ...

  3. python自动化--如何用10行Python代码调一个闹钟 #电脑调闹钟

    python自动化--如何用10行Python代码写一个闹钟 前言: 文末彩蛋--轻松一刻 更多关于Python的知识请加关注哟~~.若需联系博主请私信或者加博主联系方式:       QQ:1542 ...

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

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

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

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

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

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

  7. python图片识别-用10行Python代码进行图像识别

    随着深度学习算法的兴起和普及,人工智能领域取得了令人瞩目的进步,特别是在计算机视觉领域.21世纪的第二个十年迅速采用卷积神经网络,发明了***进的算法,大量训练数据的可用性以及高性能和高性价比计算的发 ...

  8. 聚类 python 代码_不足 20 行 Python 代码,高效实现 k-means 均值聚类算法

    下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法-1.jpg (143.81 KB, ...

  9. python输入三行数据_3行Python代码就能获取海量数据?

    原标题:3行Python代码就能获取海量数据? 一谈起数据分析,首先想到的就是数据,没有数据,谈何分析. 毕竟好的菜肴,没有好的原材料,是很难做的- 所以本期小F就给大家分享一个获取数据的方法,只需三 ...

最新文章

  1. Deep Learning简明深度学习方法概述
  2. SAP 质检使用非物料基本单位
  3. 安卓手机的加密设备和加密外置SD卡
  4. 开学测试代码——需求征集系统
  5. 用python设计学生管理系统_Python实现GUI学生信息管理系统
  6. idea安装Translation翻译插件
  7. 【第二组】项目冲刺(Alpha版本)第三次每日例会 2017/7/13
  8. LeetCode345. Reverse Vowels of a String
  9. Markdown笔记神器Typora配置Gitee图床
  10. 微信支付 ---- (微信退款,提示return_msg=证书已过期, return_code=FAIL)
  11. Heaps | 优先队列
  12. 此计算机 未识别的网络,未识别的网络无网络访问解决方法(图文)
  13. 亚马逊云科技与德勤中国同行,创造更智慧、美好的数字化未来
  14. 蔡颖-《APS走向实践》书解读之二:需求驱动-预测、掌握、满足需求
  15. wireshark流量分析--巧观察
  16. Rufus,Etcher,黑苹果-最方便的启动盘制作工具
  17. 俄罗斯电商平台ozon的崛起,卖家可以使用测评补单方式打造爆款吗?
  18. js中some和every用法
  19. 阿里 2020暑期实习生 笔试回忆
  20. VBA编程中的 sheet1 与 sheets(1)的区别

热门文章

  1. Python2和Python3共存下使用robotframework
  2. 【安富莱原创开源应用第3期】花式玩转网络摄像头之VNC远程桌面版本,稳定运行2年不死机...
  3. python 多进程使用总结
  4. 欧几里得最大公约数算法
  5. BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元
  6. __call处理调用错误
  7. java rotatetransition_transition过渡,transform变换
  8. 零基础学python全彩版pdf-(特价书)零基础轻松学Python:青少年趣味编程(全彩版)...
  9. python软件是免费的吗-谁说程序员不懂浪漫?用Python每天自动给女朋友免费发短信...
  10. python大数据分析实例-如何用Python分析大数据(以Twitter数据挖掘为例)