用贝叶斯实现拼写检查器
1、贝叶斯公式
p(A|D)=p(A)*p(D|A)/p(D);
可以应用于垃圾邮件的过滤和拼写检查
例如:对于拼写检查,写出一个单词D,判断该单词为正确单词A的概率。为上述条件概率的描述。
其中p(A)为先验概率,可以根据现有的数据库中的单词,来获得A单词的概率p(A)。由于正确的单词不仅仅有A,还有可能有A1,A2....
最终比较p(A1|D),p(A2|D),p(A3|D)...由于分母比较时相同,可以只比较分子p(A)*p(D|A)
p(A|D)正比于p(A)*p(D|A)
分别计算p(A1)*p(D|A1),p(A2)*p(D2|A)。其中p(D|A),例如在写A=good,错写为D=gooe是的概率。是根据增删减距离获得。
若 p(A1)*p(D|A1)=p(A2)*p(D2|A),则根据实际生活中先验概率的选择p(A1),p(A2)大小选择。
2、re和正则表达式的关系
1)re模块提供了对正则表达式的支持。
正则表达式式可匹配文本片段的模式
2)正则表达式
目的:通过匹配可以在文本查找,将特定的模式进行替换,将文本分割成片段。
正则表达式的表示形式:
a、最简单的正则表达式为普通字符串 ‘python’
b、通配符.-- 通过特殊字符串进行创建,可以将其表示为任意一个字符
‘.ython’ 可以匹配 ‘uthon’,....
c、当字符串本身含有特殊字符,利用两个\\进行转义。‘python.org’可以用‘python\\.org’表示
d、字符集[a-zA-Z0-9]只能将其作为一个字符使用
‘[pj]thon’与python 或jthon匹配但是不与‘pjthon'使用。
注意
例1 text='good morning! Today we will go to the park,please be quiet!'
re.findall('[a-z]+',text.lower()) 文中的子串为均为a-z表示的单词返回列表
['good','morning','Today','we', 'will', 'go','to','the', 'park','please', 'be', 'quiet']
例2
‘[python]’只能匹配‘p’,'y'....
['python']只能匹配‘python’
print(known(['will']))
输出{‘will’}
3、re模块中使用的函数
re常用的重要函数
findall(pattern,string) 返回一个列表。其中包含字符串中所有与模式匹配的子串
sub(pat,rel,string[,count=0]) 将字符串中与模式pat匹配的子串都替换为repl
split(pattern,string[,maxsplit=0]) 根据模式来分割字符串
match(pattern,string[,flags]) 在字符串开头匹配模式
search(pattern,string[,flags]) 在字符串中查找模式
compile(pattern[ ,flags]) 用字符串表示的正则表达式转换为模式对象
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()))
alphabelt='abcdefghijklmnopqrstuvwxyz'
#编辑距离
def edits1(word):
n=len(word)
return set([word[0:i]+word[i+1:] for i in range(n)]+ #deletion
[word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n-1)]+ #transposition
[word[0:i]+c+word[i+1:]for i in range(n) for c in alphabelt]+ #alteration
[word[0:i]+c+word[i:] for i in range(n+1)for c in alphabelt]) #insertion
def edits2(word):
return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
#定义有优先顺序
def known(words):return set(w for w in words if w in NWORDS)
def correct(word):
candidates=known([word])or known(edits1(word)or edits2(word)or[word])
return max(candidates,key=lambda w:NWORDS[w])
print(correct('goode'))
good