简单的贝叶斯拼写检查器

                                                             最近在学习机器学习这块,尝试写次关于贝叶斯算法的博客,但愿能帮到新手朋友们 orzhtml

关于理论部分相信网上有更详细的展开了,这里略过(0.0)直接上代码算法

首先引入包(对语料库去除特殊字符)机器学习

#引入 re collections 包
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'

定义编辑距离为1的函数(输入单词多是多打了一个字母,次序错了,打错了一个字母,少打了一个字母,返回这些集合)spa

def edits1(word): n=len(word) return set( [word[0:i]+word[i+1:] for i in range(n)]+  #原单词多打了一个字母 range(n)返回删除一个字母的列表 (ord wrd wod wor)
    [word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n-1)]+  #原单词交换一次位置的可能列表 (owrd wrod wodr)
    [word[0:i]+c+word[i+1:] for i in range(n) for c in alphabet]+  #原单词某字母需被修改可能列表 (~ord w~rd wo~d wor~)
    [word[0:i]+c+word[i:] for i in range(n+1) for c in alphabet]  #原单词需插入一个字母的可能 
    )

定义编辑距离为2的函数code

#判断该单词是否为语料库的'真实'单词
def known(words):return set(w for w in words if w in NWORDS) #编辑距离为2的可能列表中的真实单词
def known_edits2(word): return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)

定义检查函数htm

#主函数拼写器 返回优先级 真实单词>编辑距离1>编辑距离2>不存在的原单词
def correct(word): candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word] return max(candidates, key=lambda w: NWORDS[w])

最后调用便可blog

correct('ope')

输出结果 ‘one’博客

(题外话,我怎么感受这家伙好像没用到贝叶斯算法吧,就是最后返回某单词在语料库出现次数最多的单词)

 

原文出处:https://www.cnblogs.com/guandaoren/p/10658885.html

相关文章
相关标签/搜索