0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用21行python代码实现的一个简易但是具备完整功能的拼写检查器

马哥Linux运维 来源:未知 作者:李倩 2018-09-10 17:24 次阅读

引入

大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供非常好的拼写检查,比如你输入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。(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)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4788

    浏览量

    68625
  • 贝叶斯
    +关注

    关注

    0

    文章

    77

    浏览量

    12567
  • python
    +关注

    关注

    56

    文章

    4797

    浏览量

    84694

原文标题:python实现拼写检查器21行轻松搞定

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    分享50条经典的Python一行代码

    今天浩道跟大家分享python学习过程中非常经典的50条一行代码,让大家体验它简洁而功能强大的特点。同时给大家分享号主收集到的所有关于python
    发表于 08-16 15:00 1046次阅读

    python编写高效搜索代码工具

    python编写高效搜索代码工具大多码农在linux环境下使用grep+关键词的命令搜索自己想要的
    发表于 01-16 15:24

    数据分析为什么Python?只需4代码就可以画地图

    Python 4代码即可以画出地图,8
    的头像 发表于 05-28 16:16 4971次阅读
    数据分析为什么<b class='flag-5'>用</b><b class='flag-5'>Python</b>?只需4<b class='flag-5'>代码</b>就可以画地图

    如何实现计算机视觉的目标检测10Python代码帮你实现

    只需10Python代码,我们就能实现计算机视觉中目标检测。 没错,这寥寥10
    的头像 发表于 02-03 11:35 3056次阅读

    如何使用50Python代码实现AI的动作平衡

    本文将为大家展示如何通过 Numpy 库和 50 Python 代码,使用标准的 OpenAI Gym平台创建智能体 (agent),就教会机器处理推车杆问题 (cart pole problem) ,保持平衡。
    的头像 发表于 06-16 10:40 3131次阅读

    盘点10一行强大的、有趣的Python代码

    Python门非常简洁而优美的编程语言,在其他编程语言中需要繁琐的代码逻辑才能完成的事情,往往在Python一行就可以解决。
    的头像 发表于 10-08 14:33 8776次阅读

    使用Python读文件的源代码免费下载

    本文档的主要内容详细介绍的是使用Python读文件的源代码免费下载。
    发表于 10-22 17:57 12次下载
    使用<b class='flag-5'>Python</b>按<b class='flag-5'>行</b>读文件的源<b class='flag-5'>代码</b>免费下载

    Python代码的性能分析的命令合集

    。注意,在本教程中,我建议使用 Anaconda。1.分析一行代码检查一行 python 代码
    发表于 11-25 10:43 10次下载

    python设计简单推荐系统的资料和完整代码

    本文档的主要内容详细介绍的是python设计简单推荐系统的资料和完整代码免费下载。
    发表于 03-30 09:32 14次下载

    浅析FPGA开发-Sublime编辑

    Sublime Text 是文本编辑(收费软件,可以无限期试用,但是会有激活提示弹窗),同时也是
    的头像 发表于 11-09 09:14 2133次阅读
    浅析FPGA开发-Sublime编辑<b class='flag-5'>器</b>

    3代码实现单片机Uart功能

    文章目录前言实现功能二、接线图三、完整代码前言shineblink core 开发板(简称Core)的库函数支持GPIO读写
    发表于 12-28 19:27 1次下载
    3<b class='flag-5'>行</b><b class='flag-5'>代码</b><b class='flag-5'>实现</b>单片机Uart<b class='flag-5'>功能</b>

    3代码一个WebServer

    电子发烧友网站提供《3代码一个WebServer.zip》资料免费下载
    发表于 10-28 16:52 0次下载
    <b class='flag-5'>用</b>3<b class='flag-5'>行</b><b class='flag-5'>代码</b>做<b class='flag-5'>一个</b>WebServer

    20非常有用的Python单行代码

    有用的 Python 单行代码片段,只需一行代码即可解决特定编码问题!
    的头像 发表于 03-14 17:45 908次阅读

    一行代码Python程序转换为GUI应用程序

    Gooey项目支持一行代码将(几乎)任何Python 2或3控制台程序转换为GUI应用程序。 1.快速开始 开始之前,你要确保Python
    的头像 发表于 10-17 11:41 979次阅读
    <b class='flag-5'>一行</b><b class='flag-5'>代码</b>将<b class='flag-5'>Python</b>程序转换为GUI应用程序

    一行代码Python程序转换为图形界面应用

    Gooey项目支持一行代码将(几乎)任何Python 2或3控制台程序转换为GUI应用程序。 1.快速开始 开始之前,你要确保Python
    的头像 发表于 10-30 15:39 467次阅读
    <b class='flag-5'>一行</b><b class='flag-5'>代码</b>将<b class='flag-5'>Python</b>程序转换为图形界面应用