zoukankan      html  css  js  c++  java
  • 用贝叶斯实现拼写检查器

    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

     

  • 相关阅读:
    gitlab10+版本删除项目工程
    Ubuntu16.04上通过anaconda3离线安装Tensorflow2.0详细教程
    android中根据smartRefeshLayout自定义上下拉刷新效果
    android高德地图根据经纬度添加标注(Marker)
    android设置状态栏颜色
    android复制内容到剪贴板
    android拨打电话的两种方式
    java集合转String数组
    解决jenkins部署TomcatManagerException问题
    SpringCloud 微服务消费者之间相互调用的方式
  • 原文地址:https://www.cnblogs.com/6530265oule/p/9245439.html
Copyright © 2011-2022 走看看