用贝叶斯实现拼写检查器

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

 

 

posted @ 2018-06-29 21:06  zjkl_欧了  阅读(665)  评论(0编辑  收藏  举报