实现一个基础的spelling corrector
题目假设:
- 有一个真实英文词汇的大辞典。
- 只实现错误单词到正确单词的更正。
- 只考虑不同于错误单词的单个字符(插入、删除或替换)的更正。
实现原理:
参考Peter Norvig的spelling corrector
给定一个单词,我们的任务是选择和它最相似的拼写正确的单词。(如果这个单词本身拼写就是正确的, 那么最相近的就是它自己)。当然,不可能绝对的找到相近的单词,比如说给定 lates 这个单词,它应该别更正为 late 呢,还是 latest 呢?这些困难指示我们,需要使用概率论,而不是基于规则的判断。我们说,给定一个词 w,在所有正确的拼写词中,我们想要找一个正确的词 c,使得对于 w 的条件概率最大,也就是说:
按照 贝叶斯理论 上面的式子等价于:
因为用户可以输错任何词,因此对于任何 c 来讲,出现 w 的概率 P(w) 都是一样的,从而我们在上式中忽略它,写成:
这个式子有三个部分, 从右到左, 分别是:
P(c),文章中出现一个正确拼写词 c 的概率,也就是说,在英语文章中,c 出现的概率有多大呢? 因为这个概率完全由英语这种语言决定,我们称之为做语言模型。好比说,英语中出现 the 的概率 P('the') 就相对高,而出现 P('zxzxzxzyy') 的概率接近0(假设后者也是一个词的话)。
P(w|c),在用户想键入 c 的情况下敲成 w 的概率。因为这个是代表用户会以多大的概率把 c 敲错成 w,因此这个被称为误 差模型。
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相关推荐
- 如何写一个拼写纠错器 -- how to write a spelling corrector
本文是经典的how to write a spelling corrector的大致翻译. 作者两个朋友向他夸赞google的拼写纠正功能,输入speling, google就会立即问你是不是找spe ...
- How to Write a Spelling Corrector代码注释
Peter Norvig的简易版的Spelling Corrector写得非常精巧,仅仅20多行Python代码就取得了非常不错的效果. 这个Spelling Corrector涉及到人工智能里常用的 ...
- 与君共品代码: Spelling Corrector
用python spell check在网上到处搜索到的都是下面这个代码. 不知道性能如何? 我最后自己做了一个spell check的功能,应该比它这个功能还强一点儿. 我的可以对一段话或者一个网址 ...
- 手把手编写语音矫正(Spelling Corrector) -- 玩具级(python)
手把手编写语音矫正(Spelling Corrector) – 玩具级(python) 这个代码示例是翻译Morvig的,原文地址 import re from collections import ...
- 如何创建一个基础jQuery插件
如何创建一个基础插件 How to Create a Basic Plugin 有时你想使一块功能性的代码在你代码的任何地方有效.比如,也许你想调用jQuery对象的一个方法,对该对象进行一系列的操作 ...
- 一个基础的 HTML 文档有哪些标签?(3)
作者简介 作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者.15-16年曾在网上直播,带领一批程序小白走上程序员之路.欢迎各位小白加我咨询我相关信息,迷茫的你会找到 ...
- UE4-如何做一个简单的TPS角色(一)-创建一个基础角色
打开UE4进入创建项目界面,选择游戏,第三人称项目进入下一步 按照以下配置创建一个项目,命名任意,一定要包含初学者内容!!!关系到后面素材使用 项目创建完成后,先创建一个Level文件夹,在文件夹中创 ...
- 用zrender制作一个基础的绘图板,绘图板可用于组态界面的基础性开发
zrender制作一个基础的绘图板,绘图板可用于组态界面的基础性开发,本实基于vue基础开发,可用于vue项目组态界面的参考. zrender开发文档地址:https://ecomfe.github. ...
- How to Write a Spelling Corrector
How to Write a Spelling Corrector 原文链接:http://norvig.com/spell-correct.html: One week in 2007, two f ...
- Verilog如何编写一个基础的Testbench
本文将讲述如何使用Verilog 编写一个基础的测试脚本(testbench). 在考虑一些关键概念之前,先来看看testbench的架构是什么样的.架构包括建模时间.initial块(initial ...
最新文章
- 自己写的哈希表以及解决哈希冲突
- 面试AI Lab能力测评
- 网络服务-DNS 域名系统服务
- css之命名规范 BEM
- SAP UI5 应用开发教程的学习目录
- Tensorflow 梯度下降实例
- 在SuSE10.1上安装Oracle10g
- python-模块的操作-安装-导入-使用
- Github使用之git回退到某个历史版本
- mssql linux性能,MSSQL 的Top 和 MAX 效率测试
- greenplum定期清理日志脚本-分割线后更新简单方法
- 酷比魔方iwork12 linux,双系统二合一 酷比魔方iwork 12评测
- 红米note9pro刷鸿蒙,红米Note10Pro:正式说你好,红米Note9Pro:彻底说再见!
- python绘图-中文字体
- Java最佳学习途径
- 伦敦的威斯敏斯特大教堂地下室的墓碑林中,一块震撼全世界的一段碑文。
- 全国计算机二级ACCESS在线,全国计算机二级《Access》操作试题及答案
- 绿地五里桥 设计原型_绿地 · 黄浦滨江项目设计
- 曾做erp开发工程师,谈下自己的经验
- 一名优秀的数据分析师,应该具备哪些基本素质?
热门文章
- 关于Java的权限修饰符(public,private,protected,默认friendly)
- MySQL select
- 针对Web系统常用的功能测试方法浅析
- 【学堂在线数据挖掘:理论方法笔记】第八天(4.2)
- 【算法学习】高斯模糊算法
- C#的Bitmap.LockBits 使用说明
- 智能优化算法应用:基于灰狼算法的二维Otsu图像阈值分割-附代码
- 李宏毅机器学习HW1_pm2.5prediction(adagrad/gradient descent/SGD)
- ENVI/IDL实现每个波段信噪比计算
- word中设置论文中英文参考文献对齐方法