朴素贝叶斯案例2:拼写纠错(python实现)

来源:互联网 发布:织梦cms源码分析 编辑:程序博客网 时间:2024/06/05 01:34

拼写纠错案例思想:

    当用户输入了一个不在字典中的单词,我们需要去猜测:“这个家伙到底真正想输入的单词是什么呢?”用形式化的语言来叙述,就是我们需要求得:

    P(我们猜测他想输入的单词 | 他实际输入的单词)

    比如用户输入thew,那么猜测他到底想输入the,还是thaw,还是其他的单词?到底哪一个单词的可能性比较大?这时候我们就可以用贝叶斯去求出每个词语的可能性。

    不妨把我们的猜测记为h1、h2、...hn,他们都属于一个有限且离散的猜测空间H(单词总共就只有那么多,H代表hypothesis),将用户实际输入的单词记为D(D代表data,即观测数据),于是问题转为:  

     P(我们的猜测1 | 他实际输入的单词)可以表示为P(h1|D),依次对于猜测2,则表示为P(h2|D),我们需要计算这些概率值,取最大的。

    把所有的猜测先统一记为P(H|D),运用一次贝叶斯公式,我们得到:P(H|D) = P(H) * P(D|H) / P(D)

    因为不论对哪一个具体猜测h1、h2、...hn,其中的P(D)都是一样的,所以在计算或比较P(h1 | D) 和 P(h2 | D) 的时候我们可以忽略P(D)这个常数。把公式简化为:

    P(H | D) ∝ P(H) * P(D | H),其中∝代表正比例于。

    这个式子的抽象含义是:对于给定观测数据,猜测是好是坏,取决于“这个猜测本身独立的可能性大小(先验概率,Prior )”和“这个猜测生成我们观测到的数据的可能性大小”(似然,Likelihood )的乘积。

    具体到上面的 thew 例子上,就是用户实际是想输入 the 的可能性大小取决于 the 本身在词汇表中被使用的可能性(频繁程度)大小(先验概率)和 想打 the 却打成 thew 的可能性大小(似然)的乘积。

   解决问题的方法变为,对于各种猜测,计算下P(H) * P(D | H) 这个值,然后取值为最大的那个猜测即可。


问题解决思路公式如下:

  • argmaxc P(H|D)-->>argmaxc P(D|H)P(H)。

  • P(H),先验概率,在英语文章中,正确单词H出现的概率。

  • P(D|H),用户有多大的概率在想输入H的时候输出了D。

  • argmaxc,用来枚举所有可能的H,并且选取最大的概率。


程序如下:

1、统计词频,计算先验概率P(H)

1)处理训练文本,转化成小写,去掉不含数字、特殊符号。

2)统计每个词的词频

    给不在语料库中的单词设置一个小概率(频数统一设置成1,避免先验概率为0的情况出现)

程序案例:

3)求所有单词与输入次D的编辑距离

    编辑距离:使用几步插入、替换、删除、交换的操作可以把一个词变为另外一个词,这几个步骤就叫作编辑距离,比如有the变为thy的编辑距离为1。

先计算编辑距离为1的所有单词

比如单词the,运算结果为:

计算并返回与单词的编辑距离为2的列表

4)返回最优的单词

执行结果:

程序案例链接:https://pan.baidu.com/s/1kV8CswJ 密码:0i7o

数据案例链接:https://pan.baidu.com/s/1hsu5t4o 密码:lgni

案例来源:51cto,机器学习课程