利用朴素贝叶斯实现拼写检查器

import re
import collections



class SpellCheck():
    """
    P(c|w) = P(w|c)P(c) / P(w)
    P(c):文章出现正确拼写词c的概率,程序中直接用词频表示
    P(w|c):用户把词c错敲成w的概率
    """
    alphabet = list('abcdefghijklmnopqrstuvwxyz')

    # 读取数据
    def get_data(self):
        fp = open("big.txt", 'r', encoding='utf-8')
        return fp.read()

    # 只拿文本中的单词
    def get_words(self):
        text = self.get_data().lower()
        return re.findall('[a-z]+', text)

    # 词频统计,返回的是词语和出现的次数
    def train(self):
        result = collections.defaultdict(lambda: 1)
        for word in self.get_words():
            result[word] += 1
        return result

    def edit_first(self, word):
        """
        只编辑一次就把一个单词变为另一个单词
        :return: 所有与单词word编辑距离为1的集合
        """
        length = len(word)
        return set([word[0:i] + word[i + 1:] for i in range(length)] +  # 从头至尾,依次将word中删除一个字母,构成一个新单词
                   [word[0:i] + word[i + 1] + word[i] + word[i + 2:] for i in range(length - 1)] +  # 从头至尾,依次将word中相邻的两个字母调换顺序,构成一个新单词
                   [word[0:i] + c + word[i + 1:] for i in range(length) for c in self.alphabet] +  # 从头至尾,依次将word中的一个字母进行修改
                   [word[0:i] + c + word[i:] for i in range(length + 1) for c in self.alphabet])  # 从头到尾,依次在word中插入一个字母

    def edit_second(self, word):
        """
        :return: 编辑两次的集合
        """
        words = self.train()#得到存放着所有单词词频的字典
        return set(e2 for e1 in self.edit_first(word) for e2 in self.edit_first(e1) if e2 in words)

    def already_words(self, word):
        """
        :return: 返回已知的和错误单词相近的正确单词集合,允许进行两次编辑
        """
        words = self.train()
        return set(w for w in word if w in words)

    def check(self, word):
        words = self.train()
        #输入的单词是否在字典中     一次编辑的单词是否在字典中    二次编辑的单词是否在字典中
        neighborhood = self.already_words([word]) \
                       or self.already_words(self.edit_first(word)) \
                       or self.already_words(self.edit_second(word)) \
                       or [word]

        # 取概率最大的正确单词,即词频最多的

        return max(neighborhood, key=lambda w: words[w])


if __name__ == '__main__':
    s = SpellCheck()
    print("当前输入的值为:musac","预测值为:",s.check('musac'))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值