只有21行的拼写检查器

本文介绍了Python实现的21行拼写检查器,它利用贝叶斯公式和编辑距离,展示了Python简洁优雅的特性。文章详细解析了代码背后的数学原理、语言模型和误差模型,并分享了性能评估结果,达到了约70%的正确率。
摘要由CSDN通过智能技术生成

我是爱生活爱学习爱工作的布知,英语初阶机器学习入门的土澳渣硕,在这个系列里以后会给大家分享一些代码少于100行有趣的Python新手向小应用和背后的算法原理,感受到编程带来的小小乐趣。

Python简介:

这里粗暴地引用下廖大的介绍

  • Python是一种脚本语言
  • Python程序简单易懂,易于入门,易于深入
  • Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码
  • Python提供了非常完善的基础代码库,Python还有大量的第三方库,大大加快开发进度
  • 许多大型网站就是用Python开发的,例如YouTubeInstagram,还有国内的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美国航空航天局)都大量地使用Python。
  • Python适合开发的类型
    • 网络应用,包括网站、后台服务等;
    • 许多日常需要的小工具,包括系统管理员需要的脚本任务等;
    • 把其他语言开发的程序再包装起来,方便使用。

资源推荐

本系列里不会对基础语法进行非常详尽地介绍,因为已经有足够多优秀的资源了,这里推荐两个

网上还有很多优秀的博客资源,童鞋们可以自行搜索学习

21行的拼写检查器

好了,下面介绍下我们今天的主角,Norvig大神写的拼写检查器,挑选这个例子放在第一讲是因为它充分展示了
- Python代码的简洁优雅:21行代码实现完整功能
- 数学算法的隽永之美:贝叶斯公式(要好好学数学啊,童鞋们,真的很重要)

是机器学习的一个小应用

import re
from collections import Counter

def words(text): return re.findall(r'\w+', text.lower())

WORDS = Counter(words(open('big.txt').read()))

def P(word, N=sum(WORDS.values())): 
    "Probability of `word`."
    return WORDS[word] / N

def correction(word): 
    "Most probable spelling correction for word."
    return max(candidates(word), key=P)

def candidates(word): 
    "Generate possible spelling corrections for word."
    return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])

def known(words): 
    "The subset of `words` that appear in the dictionary of WORDS."
    return set(w for w in words if w in WORDS)

def edits1(word):
    "All edits that are one edit away from `word`."
    letters    = 'abcdefghijklmnopqrstuvwxyz'
    splits     = [(word[:i], word[i:])    for i in range(len(word) + 1)]
    deletes    = [L + R[1:]               for L, R in splits if R]
    transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R)>1]
    replaces   = [L + c + R[1:]           for L, R in splits if R for c in letters]
    inserts    = [L + c + R               for L, R in splits for c in letters]
    return set(deletes + transposes + replaces + inserts)

def edits2(word): 
    "All edits that are two edits away from `word`."
    return (e2 for e1 in edits1(word) for e2 in edits1(e1))

上面就是完整的代码,下面我们再看下它的运行情况

>>> correction("englihs")
'english'
>>> correction("englsh")
'english'
>>> correction("engliish")
'english'

可以看出,代码对单词中字母的换位、缺失和重复起到了检查的作用

数学原理

看见下面这条公式,大家是不是很眼熟

P(A|B)=P(B|A
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值