返回顶部
首页 > 资讯 > 后端开发 > Python >21行Python代码实现拼写检查器
  • 789
分享到

21行Python代码实现拼写检查器

代码Python 2022-06-04 19:06:28 789人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

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

引入

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

--结束END--

本文标题: 21行Python代码实现拼写检查器

本文链接: https://lsjlt.com/news/15434.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 21行Python代码实现拼写检查器
    引入 大家在使用谷歌或者百度搜索时,输入搜索内容时,谷歌总是能提供非常好的拼写检查,比如你输入 speling,谷歌会马上返回 spelling。 下面是用21行python代码实现的一个简易但是具备完整功...
    99+
    2022-06-04
    代码 Python
  • python 代码检查,实现行级代码优化
        有时候运行一个python程序,它需要运行很长时间。你或许想提升该程序的运行效率。那该怎么做那?     首先需要你要找到该程序瓶颈在哪里~   比如,哪个函数的运行花费时间比较长? 哪个函数占用内存比较多,是否需要优化对内存的使用...
    99+
    2023-01-31
    代码 python
  • Python pomegranate库实现基于贝叶斯网络拼写检查器
    目录概要一、准备数据二、构建贝叶斯网络三、训练模型四、测试模型五、总结概要 贝叶斯网络是一种基于概率的图模型,可用于建立变量之间的条件概率关系。在拼写检查器中,贝叶斯网络可以通过建立...
    99+
    2023-05-17
    Python pomegranate库 贝叶斯网络拼写检查器
  • 如何使用Python pomegranate库实现基于贝叶斯网络拼写检查器
    这篇文章主要介绍“如何使用Python pomegranate库实现基于贝叶斯网络拼写检查器”,在日常操作中,相信很多人在如何使用Python pomegranate库实现基于贝叶斯网络拼写检查器问题上存在疑惑,小编查阅...
    99+
    2023-07-06
  • Python的爬虫框架scrapy用21行代码写一个爬虫
    开发说明 开发环境:Pycharm 2017.1(目前最新) 开发框架:Scrapy 1.3.3(目前最新) 目标 爬取线报网站,并把内容保存到items.json里 页面分析 根据上图我们可以发...
    99+
    2022-06-04
    爬虫 框架 代码
  • Python实现21点小游戏的示例代码
    目录游戏玩法代码 - v1测试代码 - v2测试游戏玩法 游戏玩法: 该游戏由 2 到 6 个人玩,使用除大小王之外的 52 张牌, 游戏者的目标是使手中的牌的点数之和不超过 21 ...
    99+
    2024-04-02
  • Python实现 MK检验示例代码
    MK检验:时间序列进行检测,并找出突变点,本文参考网上的matlab程序改写为python代码如下: import numpy as np import pandas as pd...
    99+
    2024-04-02
  • 一行 Python 代码实现并行
    Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏"重"。而且往往隔靴搔痒,没有深入探讨日常工作中最有用的内容。...
    99+
    2023-05-14
    Python
  • 怎么用Python代码写一个语言检测器
    怎么用Python代码写一个语言检测器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。你有没有曾经好奇过Chrome浏览器是如何知道一个网页的语言,并对外国文字的网页提供翻译服务...
    99+
    2023-06-17
  • Python 代码实现模糊查询
    最近在做一个django项目,里面有一个字典数据非常大,虽然已经做了分页处理。但是用户想要找到指定的数据,还得一页页翻,非常繁琐。字典的结构如下:file_list = [     ...
    99+
    2023-01-31
    模糊 代码 Python
  • Python只用40行代码编写的计算器实例
    本文实例讲述了Python只用40行代码编写的计算器。分享给大家供大家参考,具体如下: 效果图: 代码: from tkinter import * reset=True def buttonCall...
    99+
    2022-06-04
    计算器 实例 代码
  • Python opencv进行圆形识别(圆检测)实例代码
    目录前言1 读入图像2 图像预处理3 圆形识别4 显示检测结果5 完整代码和示例图像总结前言 圆形识别(圆检测)是图像识别中很常见的一种处理方式,最核心的是cv2.HoughCirc...
    99+
    2023-05-20
    opencv识别圆形 opencv 圆形检测 opencv形状识别
  • 3行代码实现 Python 并行处理,速
    来源 | towardsdatascience.com 编译 | 数说君 出品 | 数说工作室 原标题:Here’s how you can get a 2–6x speed-up on your data pre-processing...
    99+
    2023-01-31
    代码 Python
  • python中如何实现代码换行
    这篇“python中如何实现代码换行”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“python中如何实现代码换行”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下面让...
    99+
    2023-06-06
  • python Django实现增删改查实战代码
    1.先创建个app子级 python .\manage.py startapp app01 然后创建数据模型 app01下的modules.py文件 from django.db ...
    99+
    2024-04-02
  • Python实际案例演示:一行 Python代码实现并行
    Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏"重"。而且往往隔靴搔痒,没有深入探讨日常...
    99+
    2023-06-01
  • Python可视化目标检测框的实现代码
    目录1 引言2 举个栗子3 实现3.1 函数讲解3.2 读入图像3.3 标签美化3.4 角点美化3.5 综合效果4 透明效果实现5 扩展应用6 总结7 参考1 引言 随着计算机视觉算...
    99+
    2024-04-02
  • Python如何换行】:使用换行符来实现多行代码的编写和阅读
    在Python中,有时候我们需要编写较长的代码行,为了提高可读性和美观性,我们可以使用换行符来将代码分成多行。下面我将详细介绍如何在Python中实现换行,并提供相应的源代码示例。 在Python中,...
    99+
    2023-10-20
    python 开发语言 Python
  • python实现烟花的实例代码怎么编写
    本篇文章给大家分享的是有关python实现烟花的实例代码怎么编写,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现代码如下:# -*- coding:&nb...
    99+
    2023-06-22
  • 11行Python代码实现解密摩斯密码
    目录1、引言2、代码示例2.1摩尔斯电码科普2.2 加密2.3 解密3、总结1、引言 小屌丝:鱼哥,快来求助求助! 小鱼:嗯? 啥事,让你这么慌慌张张的? 小屌丝:刚刚我女神给我发古...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作