最近在学习机器学习这块, 尝试写次关于贝叶斯算法的博客, 希望能帮到新手朋友们 orz
关于理论部分相信网上有更详细的展开了, 这里略过 (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 的函数(输入单词可能是多打了一个字母, 次序错了, 打错了一个字母, 少打了一个字母, 返回这些集合)
- 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 的函数
- # 判断该单词是否为语料库的'真实'单词
- 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)
定义检查函数
- # 主函数拼写器 返回优先级 真实单词>编辑距离 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])
最后调用即可
correct('ope')
输出结果'one'
(题外话, 我怎么感觉这家伙好像没用到贝叶斯算法吧, 就是最后返回某单词在语料库出现次数最多的单词)
来源: https://www.cnblogs.com/guandaoren/p/10658885.html