基于贝叶斯定理的单词提示器实现
摘要
贝叶斯这个简单的公式可以解决我们现实生活中很多的问题,个人闲暇之余写了一个单词提示器来体现贝叶斯的巨大魔力。
1. 贝叶斯定理:
或者
P
(
A
∣
B
)
=
P
(
B
∣
A
)
∗
P
(
A
)
/
P
(
B
)
\ P(A|B) = P(B|A)*P(A)/P(B)
P(A∣B)=P(B∣A)∗P(A)/P(B)
关于贝叶斯的通俗解释,贝叶斯个人的理解,举个例子说明下:
假设:
九点前起床的概率为50%
九点前起床我吃早点的概率是80%
九点后起床吃早点的概率是30%
我今天去吃了早点为事件A
我今天九点前起了为事件B
P(A|B) = 80%
那我吃了早点,我九点前起的概率为P(B|A) = P(A|B)*P(B)/P(A)=80% * 50% / 1 = 0.4
上述例子是个人根据生活联想的,如果有误请指正。
2. 贝叶斯公式的实际意义
这个简单的公式在我们现实生活中却有着巨大的魔力。
人们根据不确定性信息作出推理和决策需要对各种结论的概率作出估计,这类推理称为概率推理。概率推理既是概率学和逻辑学的研究对象,也是心理学的研究对象,但研究的角度是不同的。概率学和逻辑学研究的是客观概率推算的公式或规则;而心理学研究人们主观概率估计的认知加工过程规律。贝叶斯推理的问题是条件概率推理问题,这一领域的探讨对揭示人们对概率信息的认知加工过程与规律、指导人们进行有效的学习和判断决策都具有十分重要的理论意义和实践意义。1
看完个人用python写了一个单词提示器
思路如下:
3. 原理
当用户输入一个单词 token p(token) = 的概率就是该词,在所有文档中出现的概率
eg: 用户想要输入单词hello hello在所有文档中出现了a次,所有文档中总共有b个单词。
此处不做任何stemming,duplicate removing操作。(减枝,去重)
假设用户想输入一个单词是d,但是实际写成了单词r。
实际写成了r p® = 1 p(d)
p(r|d) = p(d|r)/p(d) * p®
p(d|r) = p(r|d)/p® * p(d)
p® 是先决条件1,想要的结果就转变成了 p(r|d) * p(d)
在实际中 p(r|d) * p(d) 用d该词出现的可能性表示
4. 程序设计思路
模型 所有词-词频字典|词集合
输入词 -(错误词)-> 可能出现词 ->(模型取词频)目标词
# 原理
# 当用户输入一个单词 token p(token) = 的概率就是该词
# 在所有文档中出现的概率
# eg: 用户想要输入单词hello hello在所有文档中出现了a次,所有文档中总共有b个单词。
# 此处不做任何stemming,duplicate removing操作。(减枝,去重)
#
# 假设用户想输入一个单词是d,但是实际写成了单词r。
# 实际写成了r p(r) = 1 p(d)
# p(r|d) = p(d|r)/p(d) * p(r)
#
# p(d|r) = p(r|d)/p(r) * p(d)
# p(r) 是先决条件1,想要的结果就转变成了 p(r|d) * p(d)
#
# 在实际中 p(r|d) * p(d) 用d该词出现的可能性表示
#
# 程序设计思路
# ---------------------------------------------------
# 模型 所有词-词频字典|词集合
# ---------------------------------------------------
# 输入词 -(错误词)-> 可能出现词 ->(模型取词频)目标词
# ---------------------------------------------------
#
import collections
with open('documents.txt') as docs:
src = docs.read().lower().split(' ')
model = collections.Counter(src)
token_set = model.keys()
input_token = input("input a token!")
# 输入的词的错误类型,假设错误只会是一个字符
#
# 增 如hello 写成了helllo, 对于机器推测原来可能是 elllo, hlllo, hello, helll
#
# 删 如hello 写成了hell, 对于机器依次补'a-z'的字符
#
# 错 如hello 写成了helle, 对于机器依次替换'a-z'
def destination_set(token=""):
result = []
r = "abcdefghijklmnopqrstuvwxyz"
# 增
for i in range(0, len(token)):
replace = token[0:i] + token[i+1:len(token)]
result.append(replace)
# 删
# 错
for i in range(0, len(token)):
token_list = list(token)
for j in range(0, len(r)):
replace = token[0:i]+r[j:j+1]+token[i:len(token)]
result.append(replace)
token_list[i] = r[j]
result.append("".join(token_list))
return result
# 可能出现的结果集
re = destination_set(input_token)
intersection = set(re).intersection(set(token_set))
# 词频模型取分数,分数高的排前
return_value = {}
for key in list(intersection):
return_value[key] = model.get(key)
return_value = sorted(return_value.items(), key=lambda item: item[1], reverse=True)
print(return_value)
5. 实验效果
input a token!
helo
[(‘hello’, 1), (‘help’, 1)]
input a token!
jave
[(‘java’, 31), (‘have’, 6), (‘save’, 2)]
6. 验证结果:
通过单词提示器可以很好的去找出用户可能想要输入的内容。其思想核心就是
用户输入错误的单词是事件A
用户想要输入的词是事件B
那P(B|A) 是用户想要输入词(B)但已经输入错误词(A)
根据贝叶斯 P(A|B)*P(B)/P(A),用户输入错误是先决条件1,之和用户想要输入词B事件相关,此处简单转换成想要输入的词的词频,就可以实现一个简单的单词提示器。
7. 总结
贝叶斯在我们实际生活中发挥着巨大的作用,可以根据贝叶斯来完成我们很多需要处理的事情,上述单词提示器在一定程度上解决了我们计算机在词汇试别上就发挥了巨大作用。
上述代码中基本没有难点,代码中用的模型数据’documents.txt’只需要在代码所在目录放一个该文件,多放几篇英文文章就可以就可以完成该实验。
为了实验的准确性,可能还需要大量的文本,和更细节的算法实现来进行处理。
-
托马斯·贝叶斯 .智库[引用日期2013-03-07] ↩︎
本文地址:https://blog.csdn.net/weixin_44671737/article/details/109627879