基于贝叶斯算法的拼写纠错案例


import  re,collections
import  sys
#把语料库的单词全部抽取出来,转写成小写,并去掉单词中间的特殊符号
def words(text):
    return re.findall('[a-z]+',text.lower())

"""
    如果遇到一个语料库中没有的单词怎么办?
    假如说一个单词拼写正确,但是语料库中没有包含这个词,从而这个词也永远不会出现现在的训练集中。if 于是我们要返回出现这个词的概率是0
代表这个事件绝对不可能发生而在我们的概率模型中我们期望用一个很小的概率来代表这种情况。lambda:1

"""
def train(features):
    model = collections.defaultdict(lambda :1)
    for f in features:
        model[f]+=1
    return model

NWORDS = train(words(open('M:/python练习/data/Python/big.txt').read()))

alphabet = 'abcdefghijklmnopqrstuvwxyz'

"""
    编辑距离:两个词之间的编辑距离定义为使用了几次插入(在词中插入一个单字母),交换(交换相邻两个字母),
替换(把一个字母换成另一个)的操作从一个词变到另一个词
"""
#返回所以与单词w编辑距离为1的集合
def editsl(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]        # insertion
                )

# 返回所有与单词w编辑距离为2的单词集合
#在这些编辑距离小于2的中间,只把那些正确的词作为候选词
def know_edits2(word):
    return set(e2 for e1 in editsl(word) for e2 in editsl(e1) if e2 in NWORDS)

def known(words):
    return set(w for w in words if w in NWORDS)

def correct(words):
    candidates = known([words]) or known(editsl(words)) or know_edits2(words) or [words]
    return max(candidates,key=lambda w:NWORDS[w])



def main():
    while True:
        str = input("input word:")
        if str=='break':
            return
        c = correct(str)
        print(c)

if __name__ == '__main__':
    main()

初 步 学 习 , 记 录 便 于 理 解 , 如 有 错 望 指 正 , 谢 谢 \color{red}{初步学习,记录便于理解,如有错望指正,谢谢} 便

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值