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

    p(h+|D) = p(h) * p(D|h+) / p(D)  表示一个单词输错的概率 = 单词的词频 * 一个输错单词的可能的正确单词的数量

    p(h-|D) = p(h) * p(D|h-) / p(D)

    第一步:读取词库,通过正则找出每个单词,并统计单词的词频

    复制代码
    import  collections, re
    

    #找出所有的单词,并且变成小写
    def word(text): return re.findall('[a-z]+', text.lower())

    #晒出内容的词频
    def train(feature):
    model
    = collections.defaultdict(lambda :1)
    for f in feature:
    model[f]
    += 1
    return model

    NWORDS = train(word(open('big.txt').read()))

    复制代码

    第二步 : 模拟一个错误单词的其他拼写可能性

    复制代码
    alphabet = '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 alphabet] + # alteration
                   [word[0:i]+c+word[i:] for i in range(n+1) for c in alphabet])
    复制代码

    第三步: 判断其他拼写是否在词库中

    #如果word在词库中就返回
    def known(word):
        return set(w for w in word if w in NWORDS)

    第四步: 我们对模拟的其他拼写可能性进行再一次的模拟

    #对第一次变换再进行一次,如果存在的话,就返回
    def known_edits2(word):
        return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)

    第五步: 进行优先选择,优先是正确的,然后是第一次模拟,然后是第二次模拟,最后是返回该值

    def correct(word):
        #从前到后进行判断选择
        candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
        # 结果中选择概率最大的
        return max(candidates, key=lambda w: NWORDS[w])
  • 相关阅读:
    angular ng-bind-html异常Attempting to use an unsafe value in a safe context处理
    JS执行机制详解,定时器时间间隔的真正含义
    es6入门4--promise详解
    es6入门3--箭头函数与形参等属性的拓展
    JS判断滚动条到底部,页面是否有滚动条
    js forEach跳出循环
    es6入门2--对象解构赋值
    前端开发与日常好玩的的小工具,网站与插件分享
    详解 线程池
    详解 volatile关键字 与 CAS算法
  • 原文地址:https://www.cnblogs.com/litieshuai/p/11388641.html
Copyright © 2011-2022 走看看