01 朴素贝叶斯分类实战

前面介绍了贝叶斯的基本理论,朴素贝叶斯分类器,拉普拉斯修正,文章的链接如下:
机器学习:说说贝叶斯分类
朴素贝叶斯分类器:例子解释
朴素贝叶斯分类:拉普拉斯修正
在这3篇推送中用例子详细阐述了贝叶斯公式和朴素贝叶斯如何做分类,以及如何修正一些属性某些取值概率。

下面,借助朴素贝叶斯分类器的基本思想,编写一个单词拼写纠正器,它大致实现的功能如下:
如果用户输入的单词存在,则直接提示在字典中发现,并返回
如果单词不在词典中,纠正器会猜测用户的可能输入,然后做出最多两步的距离调整,并返回纠正后,用户最可能想输入的前三个单词
如果经过最多的两步调整后,还是未找到,则提示想输入的单词在字典中不存在。

02 纠正器实现原理

1 如用户输入了 hella,纠正后发现的3个最有可能的输入如下:
‘want to input: hello’, ‘hell’, ‘fella’
2 如用户输入了appropreate,纠正器纠正后:
‘want to input: appropriate’
3 如用户输入了owesomes,纠正器纠正后:
‘want to input: awesome’
4 如用户输入了grduallyare,纠正器纠正后:
grduallyare not found in dictionary!

以上是纠正器能实现的纠正实例,那么该如何实现这么一个单词拼写错误检查和纠正的工具呢。

如果用户实际输入的单词为 w(word的简写), 然后拼写纠正器猜测用户实际想输入的单词为 c1, c2 , c3 , ……. 因此,我们可以猜测用户输入了 P(c1 | w) ,P(c2 | w),P(c3 | w)等等这些多种猜测。如果发现P(c1 | w) 的概率最大,那么用户很有可能想输入的那个单词为 c1 。这个概率可以统一表示为:
P(c | w)
如何求解这个概率的最大值?

将以上概率做如下转化来求解:用户想输入的很可能在语料库的这个 c 时,有可能被错误的输入为了 w1,w2,w3 ,…… 则这个概率可以统一表示为:
P(w | c)
用户错误地输入成 w1,w2,w3,……,它们之间是相互独立的,因此可以根据朴素贝叶斯分类器的理论,进一步将后验概率 P(c | w) 的求解转化为求解如下的目标函数:
max ( P(c) * P(w | c) / P(w) )
上式中 P(c)为先验概率,下载一个比较丰富的单词拼写都正确的英文单词库后,统计下每个单词出现的频次,就是单词 c 的出现的概率;
P(w) 是与问题分类无关的量,因为用户有可能输入任意一个单词;
P(w | c) 是一个类条件概率:用户想输入c(c在语料库中是有对应的,在此处需要注意:我们取的语料库不能100%保证一定存在任意一个正确的单词,所以在统计的过程中,假定单词至少出现1次),但是被错误地输入为了 wi 的概率。

P(w | c) 的求解方法通常会有很多种,比如用户想输入hello,但是实际输入了 hella,它们之间的区别仅仅是最后一个字符输入错误,这个出现的概率还是挺大的吧;但是,再看看下面这个例子。

如果用户想输入awesome, 但是实际输入成了owesomes,输错了1个字符,多添加了 1个字符,这种情况发生的概率就比上面那种小一些吧。

因此,在本文中设计的纠正器没有直接去量化 P(w | c) 这个概率,而是采取了从定性上进行分析,通常经过一步调整出现的概率大于经过两步调整出现的概率。所以,当纠正器遇到一个待纠正的词语时,它会纠正一步,如果发现了,就直接返回了;否则才会进行两步调整,这种调整的优先级的原理是根据 P(w | c) 。

这样先验概率 P(c) 和类条件概率 P(w | c) 的求解方法就弄明白了,当一步纠正就能在语料库找到对应后,就不会进行两步纠正,但是一步纠正会返回多个,此时再根据P(c)找出这些中的出现频次最多的,这样最终的结果便是猜测到的用户最有可能想输入的单词。

03 纠正器Python代码

构建先验概率P(c),语料库下载了老友记的1-10部+呼啸山庄全部组成的单词库。

import re, collections
def tolower(text):return re.findall('[a-z]+',text.lower())def prior(cwords):model = collections.defaultdict(lambda:1)for f in cwords:model[f]+=1return modelipath = './bigword.txt'
uipath = ipath.encode("utf8")
htxt = open(uipath,'r',errors ='ignore')
cwords = tolower(htxt.read())
#get P(c)
nwords = train(cwords)
nwords
类条件概率
alpha = 'abcdefghijklmnopqrstuvwxyz'
#一步调整
def version1(word):n = len(word)add_a_char = [word[0:i] + c + word[i:] for i in range(n+1) for c in alpha]delete_a_char = [word[0:i] + word[i+1:] for i in range(n)]revise_a_char = [word[0:i] + c + word[i+1:] for i in range(n) for c in alpha]swap_adjacent_two_chars = [word[0:i] + word[i+1]+ word[i]+ word[i+2:] for i in range(n-1)] return set( add_a_char + delete_a_char +revise_a_char +  swap_adjacent_two_chars)
#两步调整
def version2(word):return set(e2 for e1 in edits1(word) for e2 in edits1(e1))朴素贝叶斯分类器def identify(words):return set(w for w in words if w in nwords)def getMax(wanteds):threewanteds=[]maxword = max(wanteds,key=lambda w : nwords[w])threewanteds.append('want to input: '+ maxword)wanteds.remove(maxword)if len(wanteds)>0:maxword = max(wanteds,key=lambda w : nwords[w])threewanteds.append(maxword)wanteds.remove(maxword)if len(wanteds)>0:maxword = max(wanteds,key=lambda w : nwords[w])threewanteds.append(maxword)   return threewanteds
def bayesClassifier(word):#如果字典中有输入的单词,直接返回if identify([word]):return 'found: '+ word#一步调整wanteds = identify(version1(word)) if len(wanteds)>0:return getMax(wanteds)#两步调整wanteds = identify(version2(word))if len(wanteds)>0:return getMax(wanteds)#不再修正,直接提示这个单词不在当前的词典中else:    return [word + ' not found in dictionary!' ]

欢迎关注 算法channel

机器学习:单词拼写纠正器python实现相关推荐

  1. 机器学习入门--带着贝叶斯公式一步步实现单词拼写纠正器,这一篇就够了

    开篇先看几张张熟悉的图: 很多朋友可能都熟悉这种界面,那今天我们就揭开其中奥秘 一.贝叶斯公式是什么 回忆里想起小时候,不对, 应该是高中的时候咱都学过一些概率知识 ,什么排列.组合,古典概型...等 ...

  2. 朴素贝叶斯实战应用---单词拼写检查器(结合html直观展示)

    博文写于2020-05-10,于2020-07-07再次编辑 1.一个小小的引子: 写这篇博文的时候,日子有点特殊,啥日子大家应该都知道.用一篇某高二学生母亲节的英语作文,先祝天下所有母亲身体健康,母 ...

  3. PHPStorm单词拼写纠正提示设置

    使用PHPStorm经常能看到一些单词下面打了波浪线,而这个波浪线是拼写纠正提示~ 如果你使用Symfony.Yii等等框架会发现项目里面有很多这种拼写纠正提示,看起来眼花缭乱的. 如果你想解决这个问 ...

  4. python拼写_用 Python 27 行实现拼写纠正

    用 Python 27 行实现拼写纠正 徐宥翻译过一次,但是后来 Norvig 又更新了代码. 首先,这不是一个工业级的拼写纠正器,是 Peter Norvig(Director of Researc ...

  5. 【小实验讲解】贝叶斯拼写检查器

    贝叶斯拼写检查器 python代码 拼写检查器的代码+注释 python代码 big.txt只是一个语料库大家网上可以找得到. 拼写检查器的代码+注释 # ##求解: argmaxc P(c|w) & ...

  6. 20来行的Python拼写检查器

    近来Google的人工智能围棋机器人AlphaGo击败了欧洲围棋冠军樊麾二段(原中国国少队队员),引起了围棋界的轩然大波.AlphaGo采用的是机器学习加上蒙特卡洛算法的方式.蒙特卡洛算法早有研读,而 ...

  7. python代码大全p-21行Python代码实现拼写检查器

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

  8. python拼写错误20几分钟怎么办_Python | 21行轻松搞定拼写检查器

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

  9. 怎样写一个拼写检查器-贝叶斯-python

    怎样写一个拼写检查器 Peter Norvig 翻译: Eric You XU 原版:http://norvig.com/spell-correct.html 翻译:http://blog.youxu ...

最新文章

  1. 腾讯云无法绑定公网IP问题解释与解决方案。
  2. C++中嵌套类的使用
  3. python使用matplotlib, seaborn画图时候的数据加载
  4. spring依赖注入底层原理与源码分析
  5. apache实现URL地址隐藏跳转
  6. 百度计算广告学沙龙学习笔记 - 内容匹配广告
  7. 差分约束 4416 FFF 团卧底的后宫
  8. linux redis安装报错,Linux安装Redis实现过程及报错解决方案
  9. java 反射获取对象_java 反射-反射对象的获取
  10. Linux Ubuntu从零开始部署web环境及项目 -----部署项目 (三)
  11. eclipse ARM/AARCH64版本下载
  12. 【Hoxton.SR1版本】Spring Cloud Eureka服务注册中心单节点搭建
  13. 别折腾安全软件了 你的手机也许还不配被黑客破解
  14. 大物期末复习(知识点公式总结+错题分析)
  15. linux注册浏览器协议,在Linux系统上安装Beaker浏览器的方法
  16. 初学JAVA项目(三、槑图秀秀)
  17. sin(ωt),一文和正弦函数、频域、周期的头疼说白白
  18. 靠谱的企业并购流程|塔米狗
  19. maximo-API下载连接
  20. 程序员自我修养笔记:第九章

热门文章

  1. DSO Framer _ WinForm 使用
  2. 详解StringTokenizer函数
  3. FPGA(一)Vivado与ModelSim
  4. 深度学习代码学习笔记(一)——阶跃函数与激活函数的python代码实现
  5. Cisco Packet Tracer 6.0下载安装及汉化包使用方法
  6. Lucene学习——IKAnalyzer中文分词(二)
  7. 十、什么是临界资源及如何访问临界资源
  8. Ubuntu 安装 libvirt
  9. android 静态工厂方法,Android 源码中的静态工厂方法
  10. 【bzoj 4833】[Lydsy1704月赛]最小公倍佩尔数