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

return 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] += 1

return model

NWORDS = 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)

python如何拼读英语单词怎么写_Python简单的拼写检查相关推荐

  1. python如何拼读英语单词怎么写_怎么用英标快速拼读英语单词,这些技巧你知道吗...

    怎么用英标快速拼读英语单词?我们都知道学习英语离不开英语单词,单词是我们学习英语的基础,一个人只有积累足够多的英语单词,才能更好的去学英语.首先就要从读英标开始,那么大家知道如何用英标快速拼读单词吗? ...

  2. python如何拼读英语单词怎么写_浅谈如何拼读英语新单词

    浅谈如何拼读英语新单词 语音教学是英语教学的一个重要组成部分. 如果学生能够掌握好语音, 既能 增强学习英语的信心, 又能提高学习英语的积极性, 我认为如果学生能够学好英 语语音, 比较准确地听懂英语 ...

  3. python如何拼读英语单词-q开头的英语单词

    你是怎样记忆单词呢?你的记忆方法有效吗?每天记忆的单词有多少呢?你有对比过其他的方式吗?你知道最常用的英语单词有哪些呢?给你一组100个单词,看你还能记得多少?你又可以在多少时间内记住多少单词呢?如果 ...

  4. python需要背的英语单词怎么写_学Python必须背的42个常见单词,看看你都会吗?...

    这42个单词是学习Python必须背会的单词,也是代码中常见的单词.希望你能都背下来!! 1. adult  [ˈædʌlt]  成年人 2. authentication [ɔːˌθentɪˈkeɪ ...

  5. 学python应该掌握的英语单词怎么写_想学Python但是有好多英语单词不认识,Python的常见英语单词都在这儿...

    想学python但是有好多英文单词不认识怎么办? 以下是python代码编写和提示信息中的常用和常见的英文单词. 不需要背,看得多了用到的多了就熟悉了. 另外,我为大家准备了2020最新的学习资料,路 ...

  6. python必背的英语单词怎么写_学习Python必须知道的单英文词,你都会了吗你都背了吗?...

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本文来自腾讯云 作者:python学习教程 今天给大家分享一些学习Python必须 ...

  7. Emscripten 单词_分享15个英语单词记忆方法,简单实用,赶紧收藏吧!

    分享15个英语单词记忆方法,简单实用,赶紧收藏吧! 单词是学习英语的基石,英语程度的好坏,单词是最重要的衡量标准.单词的构成方式其实很简单,就是26个字母的排列组合. 那有什么方法能够让我们更好地把单 ...

  8. Python简单的拼写检查

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

  9. 给 asp.net core 写一个简单的健康检查

    给 asp.net core 写一个简单的健康检查 Intro 健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供 ...

  10. python编程英语单词怎么写_用Python写一个背英文单词程序

    小朋友学习英文时背单词总是很困扰的一个问题,Ashing老师用Python开发了这个简易的背英文单词程序,帮助小朋友练习单词.功能虽简单却都很实用,只需帮他们用excel建立好单词表. 目前建立的功能 ...

最新文章

  1. java web 的标准目录结构(zz)
  2. 【GAN优化】从动力学视角看GAN是一种什么感觉?
  3. 行内元素,块级元素,各自特点及其相互转化
  4. HTML DOM之节点操作方法(1)
  5. 踩坑记录--mybatisplus模糊查询中文时 有数据但 like查不到
  6. java for foreach 效率_Java中LinkedList的fori和foreach效率比较
  7. [Java] [Lock] [Synchronized VS ReentrantLock]
  8. 机器学习/人工智能 知识图谱
  9. python父亲节礼物送什么_父亲节送什么礼物给父亲呢?
  10. Linux:JDK配置
  11. linux MySQL5.7 rpm安装
  12. AMR音频文件格式分析
  13. 信号失真度测量装置(A 题)--2021 年全国大学生电子设计竞赛试题
  14. 白嫖画师原作训练Stable Diffusion引正主不满:未经同意,说用就用?
  15. JavaScript高级编程设计(第三版)——第二章:在html中使用javaScript
  16. 将HQL语句转为sql语句
  17. 我竟然在CSDN玩游戏??,教你利用github page在CSDN主页放置小游戏
  18. [JVM]了断局: 堆外内存无法 [ -XX:MaxDirectMemorySize ] 限制
  19. SMOTE算法代码是什么
  20. Docker portainer-ce 汉化版安装(基于centos)

热门文章

  1. Android腾讯云通信集成记录(快速实现聊天功能)
  2. 外汇EA是什么?外汇EA有什么用呢?能赚钱吗?
  3. Ubuntu 更改默认浏览器
  4. Unity Shader学习-单张纹理
  5. 洛谷 - P3403 跳楼机(同余最短路)
  6. windows7经典开机音乐_那些经典的单机游戏背景音乐,带你找寻童年记忆
  7. 解决 Gitee上不显示贡献度
  8. 深度xp系统插入光盘显示上一张光盘资料解决方法
  9. JQuery 如何使用插件如何安装插件(详细讲解)
  10. 全新自适应地址发布页HTML源码【手机端】【pc端】