我是爱生活爱学习爱工作的布知,英语初阶机器学习入门的土澳渣硕,在这个系列里以后会给大家分享一些代码少于100行有趣的Python新手向小应用和背后的算法原理,感受到编程带来的小小乐趣。
Python简介:
这里粗暴地引用下廖大的介绍
- Python是一种脚本语言
- Python程序简单易懂,易于入门,易于深入
- Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码
- Python提供了非常完善的基础代码库,Python还有大量的第三方库,大大加快开发进度
- 许多大型网站就是用Python开发的,例如YouTube、Instagram,还有国内的豆瓣。很多大公司,包括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'
可以看出,代码对单词中字母的换位、缺失和重复起到了检查的作用
数学原理
看见下面这条公式,大家是不是很眼熟