机器学习——贝叶斯算法

一、什么是贝叶斯算法

机器学习——贝叶斯算法_第1张图片

二、实战代码单词拼写检查器

机器学习——贝叶斯算法_第2张图片
  • re 库是关于正则表达式的一个库。这里面包含了多种字符串匹配的方法。
    re.findall(pattern, string[,flags] ) 查找字符串中所有(非重复)出现的正则表达式模式,并返回一个匹配列表。

import re

#读取内容
text = open("../big.txt").read()

#首先把文章中所有的单词取出来,转化成小写,并去除单词中的特殊符号。
text = re.findall("[a-z]+",text.lower())

# 统计每个单词出现的次数
dic_words = {}
for t in text:
    dic_words[t] = dic_words.get(t, 0) + 1

#返回所有与单词 word 编辑距离为 1 的集合
alphabet = 'abcdefghijklmnopqrstuvwxyz'
def edits1(word):
    n = len(word)
    return set([word[0:i]+word[i+1:] for i in range(n)] +                     # 少一个字母的情况
               [word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n-1)] + # 字母调换的情况
               [word[0:i]+c+word[i+1:] for i in range(n) for c in alphabet] + # 修改字母情况
               [word[0:i]+c+word[i:] for i in range(n+1) for c in alphabet])  # 插入字母的情况

#为了提高正确率,在这里虑编辑距离为 2 的单词
def edits2(word):
    return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in dic_words)

#最后选择输出单词的方法为:编辑距离为1的正确单词比编辑距离为2的优先级高, 而编辑距离为0的正确单词优先级比编辑距离为1的高,优先级高的先输出。
def know(word):
    return set(w for w in word if w in dic_words)

# 先计算编辑距离,再根据编辑距离找到最匹配的单词
def correct(word):
    # 获取候选单词
    # 如果know(set)非空, candidates 就会选取这个集合, 而不继续计算后面的
    candidates = know([word]) or know(edits1(word)) or know(edits2(word)) or [word]
    # 字典中不存在相近的词
    if word == candidates:
        return word
    # 返回频率最高的词
    max_num = 0
    for c in candidates:
        if dic_words[c] >= max_num:
            max_num = dic_words[c]
            candidate = c
    return candidate

result = input(f"输入错误单词")
print("拼写检查器纠错后单词为:",correct(result))
# 输入错误单词tha
# 拼写检查器纠错后单词为: the

你可能感兴趣的:(算法)