当前位置:   article > 正文

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

朴素贝叶斯拼写检查
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'))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/370945
推荐阅读
相关标签
  

闽ICP备14008679号