题目假设:

  1. 有一个真实英文词汇的大辞典。
  2. 只实现错误单词到正确单词的更正。
  3. 只考虑不同于错误单词的单个字符(插入、删除或替换)的更正。

实现原理:

参考Peter Norvig的spelling corrector

给定一个单词,我们的任务是选择和它最相似的拼写正确的单词。(如果这个单词本身拼写就是正确的, 那么最相近的就是它自己)。当然,不可能绝对的找到相近的单词,比如说给定 lates 这个单词,它应该别更正为 late 呢,还是 latest 呢?这些困难指示我们,需要使用概率论,而不是基于规则的判断。我们说,给定一个词 w,在所有正确的拼写词中,我们想要找一个正确的词 c,使得对于 w 的条件概率最大,也就是说:

按照 贝叶斯理论 上面的式子等价于:

因为用户可以输错任何词,因此对于任何 c 来讲,出现 w 的概率 P(w) 都是一样的,从而我们在上式中忽略它,写成:

这个式子有三个部分, 从右到左, 分别是:

  1. P(c),文章中出现一个正确拼写词 c 的概率,也就是说,在英语文章中,c 出现的概率有多大呢? 因为这个概率完全由英语这种语言决定,我们称之为做语言模型。好比说,英语中出现 the 的概率 P('the') 就相对高,而出现 P('zxzxzxzyy') 的概率接近0(假设后者也是一个词的话)。

  2. P(w|c),在用户想键入 c 的情况下敲成 w 的概率。因为这个是代表用户会以多大的概率把 c 敲错成 w,因此这个被称为误 差模型。

  3. argmaxc,用来枚举所有可能的 c 并且选取概率最大的,因为我们有理由相信,一个(正确的)单词出现的频率高,用户又容易把它敲成另一个错误的单词,那么,那个敲错的单词应该被更正为这个正确的。

实现步骤:

1.为了方便计算P(c),选取一个具有一定规模的英文语料库(这里选取的是Peter Norvig使用的具有几百万个单词的文本文件big.txt),利用正则表达式生成单词列表,计算其中出现的每个单词的词频存入字典d中(平滑处理默认词频为1,包括未出现词)。

# 返回单词的列表
def words(text):return re.findall('[a-z]+', text.lower())# 统计每个单词出现的次数,用于计算每个单词出现的频率,平滑处理默认词频为1
def train(words):model = collections.defaultdict(lambda: 1)for word in words:model[word] += 1return model# 读取整个文本,并且把文本中的单词进行统计
with open('./big.txt') as f:words_tf = train(words(f.read()))

2.生成所有与输入单词x相差1个字符(即编辑距离为1)的单词y_(不一定是正确单词)的集合,具体步骤为将每个单词都分割为两两一组a和b,方便编辑距离的计算,则删除为每次从字符串b中删除一个字符;替换为每次替换b中的一个字母;插入为向每个单词分割的组插入一个字母。然后从字典d中筛选出正确单词y的集合。

# 小写字母列表
alphabet = 'abcdefghijklmnopqrstuvwxyz'# 计算每个与给定单词编辑距离为1的单词,并组成一个集合
def edits(word):# 将每个单词都分割为两两一组,方便后边的编辑距离的计算splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]# 删除的编辑距离:每次从b字符串中删除一个字符deletion = [a + b[1:] for a, b in splits if b]# 替换的编辑距离:每次替换b中的一个字母substitution = [a + c + b[1:] for a, b in splits for c in alphabet if b]# 插入的编辑距离:向每个单词分割的组插入一个字母insertion = [a + c + b for a, b in splits for c in alphabet]return set(deletion + substitution + insertion)# 计算单词列表words中,在文件中的单词的列表
def known(words):return set(w for w in words if w in words_tf)

3.若输入单词x在字典d中,则返回该单词本身;若不在字典d中,生成与输入单词相差1个字符的所有单词,若存在正确单词y,则返回在字典d中具有最大词频的y;若不存在正确单词y,仍然返回输入单词x本身。

# 计算候选单词中词频最大的单词
def correct(word):candidates = known([word]) or known(edits(word)) or [word]return max(candidates, key=words_tf.get)

实现结果:

测试我在输入spelling corrector时最常写错的词:

print(correct('speling'))
print(correct('cerrect'))

输出结果为:

spelling
correct

实现一个基础的spelling corrector相关推荐

  1. 如何写一个拼写纠错器 -- how to write a spelling corrector

    本文是经典的how to write a spelling corrector的大致翻译. 作者两个朋友向他夸赞google的拼写纠正功能,输入speling, google就会立即问你是不是找spe ...

  2. How to Write a Spelling Corrector代码注释

    Peter Norvig的简易版的Spelling Corrector写得非常精巧,仅仅20多行Python代码就取得了非常不错的效果. 这个Spelling Corrector涉及到人工智能里常用的 ...

  3. 与君共品代码: Spelling Corrector

    用python spell check在网上到处搜索到的都是下面这个代码. 不知道性能如何? 我最后自己做了一个spell check的功能,应该比它这个功能还强一点儿. 我的可以对一段话或者一个网址 ...

  4. 手把手编写语音矫正(Spelling Corrector) -- 玩具级(python)

    手把手编写语音矫正(Spelling Corrector) – 玩具级(python) 这个代码示例是翻译Morvig的,原文地址 import re from collections import ...

  5. 如何创建一个基础jQuery插件

    如何创建一个基础插件 How to Create a Basic Plugin 有时你想使一块功能性的代码在你代码的任何地方有效.比如,也许你想调用jQuery对象的一个方法,对该对象进行一系列的操作 ...

  6. 一个基础的 HTML 文档有哪些标签?(3)

    作者简介 作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者.15-16年曾在网上直播,带领一批程序小白走上程序员之路.欢迎各位小白加我咨询我相关信息,迷茫的你会找到 ...

  7. UE4-如何做一个简单的TPS角色(一)-创建一个基础角色

    打开UE4进入创建项目界面,选择游戏,第三人称项目进入下一步 按照以下配置创建一个项目,命名任意,一定要包含初学者内容!!!关系到后面素材使用 项目创建完成后,先创建一个Level文件夹,在文件夹中创 ...

  8. 用zrender制作一个基础的绘图板,绘图板可用于组态界面的基础性开发

    zrender制作一个基础的绘图板,绘图板可用于组态界面的基础性开发,本实基于vue基础开发,可用于vue项目组态界面的参考. zrender开发文档地址:https://ecomfe.github. ...

  9. How to Write a Spelling Corrector

    How to Write a Spelling Corrector 原文链接:http://norvig.com/spell-correct.html: One week in 2007, two f ...

  10. Verilog如何编写一个基础的Testbench

    本文将讲述如何使用Verilog 编写一个基础的测试脚本(testbench). 在考虑一些关键概念之前,先来看看testbench的架构是什么样的.架构包括建模时间.initial块(initial ...

最新文章

  1. 自己写的哈希表以及解决哈希冲突
  2. 面试AI Lab能力测评
  3. 网络服务-DNS 域名系统服务
  4. css之命名规范 BEM
  5. SAP UI5 应用开发教程的学习目录
  6. Tensorflow 梯度下降实例
  7. 在SuSE10.1上安装Oracle10g
  8. python-模块的操作-安装-导入-使用
  9. Github使用之git回退到某个历史版本
  10. mssql linux性能,MSSQL 的Top 和 MAX 效率测试
  11. greenplum定期清理日志脚本-分割线后更新简单方法
  12. 酷比魔方iwork12 linux,双系统二合一 酷比魔方iwork 12评测
  13. 红米note9pro刷鸿蒙,红米Note10Pro:正式说你好,红米Note9Pro:彻底说再见!
  14. python绘图-中文字体
  15. Java最佳学习途径
  16. 伦敦的威斯敏斯特大教堂地下室的墓碑林中,一块震撼全世界的一段碑文。
  17. 全国计算机二级ACCESS在线,全国计算机二级《Access》操作试题及答案
  18. 绿地五里桥 设计原型_绿地 · 黄浦滨江项目设计
  19. 曾做erp开发工程师,谈下自己的经验
  20. 一名优秀的数据分析师,应该具备哪些基本素质?

热门文章

  1. 关于Java的权限修饰符(public,private,protected,默认friendly)
  2. MySQL select
  3. 针对Web系统常用的功能测试方法浅析
  4. 【学堂在线数据挖掘:理论方法笔记】第八天(4.2)
  5. 【算法学习】高斯模糊算法
  6. C#的Bitmap.LockBits 使用说明
  7. 智能优化算法应用:基于灰狼算法的二维Otsu图像阈值分割-附代码
  8. 李宏毅机器学习HW1_pm2.5prediction(adagrad/gradient descent/SGD)
  9. ENVI/IDL实现每个波段信噪比计算
  10. word中设置论文中英文参考文献对齐方法