Python-贝叶斯实战垃圾邮件过滤(大量数据)
时间:2022-05-05
本文章向大家介绍Python-贝叶斯实战垃圾邮件过滤(大量数据),主要内容包括环境、数据、流程图、Code:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
- Github: https://github.com/yingzk/MyML
- 博 客: https://www.yingjoy.cn/
环境
Python 3.6.2
jieba 0.39
数据
8000封邮件数据
- 正常邮件: 7063封
- 垃圾邮件: 7775封
- 测试邮件:392封(其中文件名低于1000的均为正常邮件)
流程图
此处将结果输出到result.txt文件中
各词概率保存到wordsProb.txt中
Code:
def getProbWord(self, testDict, normalDict, spamDict, numNormal, numSpam):
"""
计算对分类结果影响最大的15个词
:param testDict: 测试数据字典
:param normalDict: 正常邮件字典
:param spamDict: 垃圾邮件字典
:param numNormal: 正常邮件的数量
:param numSpam: 垃圾邮件的数量
:return wordProbList: 对分类结果影响最大的15个词
"""
wordProbList = {}
for word, num in testDict.items():
# 当词不在垃圾邮件词表中,在正常邮件词表中,计算概率
if word in spamDict.keys() and word in normalDict.keys():
# 求类先验概率
# 正常邮件
pw_n = normalDict[word] / numNormal
# 垃圾邮件
pw_s = spamDict[word] / numSpam
ps_w = pw_s / (pw_s + pw_n)
wordProbList[word] = ps_w
# 当词在垃圾邮件词表中,不在正常邮件词表中,计算概率
if word in spamDict.keys() and word not in normalDict.keys():
pw_s = spamDict[word] / numSpam
pw_n = 0.01
ps_w = pw_s / (pw_s + pw_n)
wordProbList[word] = ps_w
# 当词在垃圾邮件词表中,而且在正常邮件词表中,计算概率
if word not in spamDict.keys() and word in normalDict.keys():
pw_s = 0.01
pw_n = normalDict[word] / numNormal
ps_w = pw_s / (pw_s + pw_n)
wordProbList[word] = ps_w
# 当词不在垃圾邮件词表中,也不在正常邮件词表中,计算概率
if word not in spamDict.keys() and word not in normalDict.keys():
wordProbList[word] = 0.5 # 0.4
sorted(wordProbList.items(), key=lambda d: d[1], reverse=True)[0:15]
return wordProbList
def calBayes(self, wordList, spamDict, normalDict):
"""
计算贝叶斯概率
:param wordList: 词表
:param spamDict: 垃圾邮件词语字典
:param normalDict: 正常邮件词语字典
:return: 概率
"""
ps_w = 1
ps_n = 1
with open('wordsProb.txt', 'a', encoding='utf-8') as f:
for word, prob in wordList.items():
f.write(word + ":" + str(prob) + "n")
ps_w *= prob
ps_n *= 1 - prob
p = ps_w / (ps_w + ps_n)
return p
def calAccuracy(self, testResult):
"""
计算精度
:return:
"""
rightCount = 0
errorCount = 0
for name, catagory in testResult.items():
if (int(name) < 1000 and catagory == 0) or (int(name) > 1000 and catagory == 1):
rightCount += 1
else:
errorCount += 1
return rightCount / (rightCount + errorCount)
Github: https://github.com/yingzk/MyML/
- kafka权威指南 第二章第6节 Kafka集群配置与调优
- hdu----(1677)Nested Dolls(DP/LIS(二维))
- hdu----(1950)Bridging signals(最长递增子序列 (LIS) )
- hdu------(1757)A Simple Math Problem(简单矩阵快速幂)
- python实现Tab自动补全功能
- hdu-----(2807)The Shortest Path(矩阵+Floyd)
- hdu----(4686)Arc of Dream(矩阵快速幂)
- HDU----(4549)M斐波那契数列(小费马引理+快速矩阵幂)
- Centos系统修改时区
- zookeeper思考与总结1:在其它组件的作用及hdfs对比
- HDU----(4291)A Short problem(快速矩阵幂)
- Linux下删除指定文件之外的其他文件
- HDU----(2157)How many ways??(快速矩阵幂)
- 试试Linux下的ip命令
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法