【机器学习】朴素贝叶斯实现垃圾邮件过滤

article/2025/10/4 5:32:37

朴素贝叶斯法概述

         朴素贝叶斯法是基于贝叶斯定理与特征条件独立性假设的分类方法。对于给定的训练集,首先基于特征条件独立假设学习输入输出的联合概率分布(朴素贝叶斯法这种通过学习得到模型的机制,显然属于生成模型);然后基于此模型,对给定的输入 x,利用贝叶斯定理求出后验概率最大的输出 y。

 贝叶斯公式

我们要做的是计算在已知词向量w=(w1,w2,...,wn)w=(w1,w2,...,wn)的条件下求包含该词向量邮件是否为垃圾邮件的概率,即求(s为垃圾邮件):

         

 根据贝叶斯公式和全概率公式有:

 根据朴素贝叶斯的条件独立假设,并设先验概率 P(s)=P(s′)=0.5,上式可化为:

 接下来会用式2来计算概率 P(s|w)

准备邮件样本

总共收集了正常邮件样本normal8000封,垃圾邮件样本spam8000封,然后取1至200的normal,7801至8000的spam,总共400封邮件作为测试集test,其余作为训练集。

 

实现步骤

(1)对训练集用结巴分词,并用停用表进行简单过滤,然后使用正则表达式过滤掉邮件中的非中文字符;
(2)分别保存正常邮件与垃圾邮件中出现的词有多少邮件出现该词,得到两个词典。例如词”疯狂”在8000封正常邮件中出现了20次,在8000封垃圾邮件中出现了200次;
(3)对测试集中的每一封邮件做同样的处理,并计算得到P(s|w)P(s|w)最高的15个词,在计算过程中,若该词只出现在垃圾邮件的词典中,则令 P(w|s′)=0.01P(w|s′)=0.01,反之亦然;若都未出现,则令 P(s|w)=0.4P(s|w)=0.4。
(4)对得到的每封邮件中重要的15个词利用式2计算概率,若概率 >>阈值α(设为0.9),则判为垃圾邮件,否则判为正常邮件。

实现代码

先写一个方法类spamEmailBayes,用于对邮件样本进行分词,统计词频,计算贝叶斯概率,计算预测结果正确率。

        分词处理

import jieba;
import os;
class spamEmailBayes:#获得停用词表def getStopWords(self):stopList=[]for line in open("../data/中文停用词表.txt"):stopList.append(line[:len(line)-1])return stopList;#获得词典def get_word_list(self,content,wordsList,stopList):#分词结果放入res_listres_list = list(jieba.cut(content))for i in res_list:if i not in stopList and i.strip()!='' and i!=None:if i not in wordsList:wordsList.append(i)#若列表中的词已在词典中,则加1,否则添加进去def addToDict(self,wordsList,wordsDict):for item in wordsList:if item in wordsDict.keys():wordsDict[item]+=1else:wordsDict.setdefault(item,1)def get_File_List(self,filePath):filenames=os.listdir(filePath)return filenames

        获取对邮件分类影响最大的15个词

    #通过计算每个文件中p(s|w)来得到对分类影响最大的15个词def getTestWords(self,testDict,spamDict,normDict,normFilelen,spamFilelen):wordProbList={}for word,num  in testDict.items():if word in spamDict.keys() and word in normDict.keys():#该文件中包含词个数pw_s=spamDict[word]/spamFilelenpw_n=normDict[word]/normFilelenps_w=pw_s/(pw_s+pw_n) wordProbList.setdefault(word,ps_w)if word in spamDict.keys() and word not in normDict.keys():pw_s=spamDict[word]/spamFilelenpw_n=0.01ps_w=pw_s/(pw_s+pw_n) wordProbList.setdefault(word,ps_w)if word not in spamDict.keys() and word in normDict.keys():pw_s=0.01pw_n=normDict[word]/normFilelenps_w=pw_s/(pw_s+pw_n) wordProbList.setdefault(word,ps_w)if word not in spamDict.keys() and word not in normDict.keys():#若该词不在脏词词典中,概率设为0.4wordProbList.setdefault(word,0.4)sorted(wordProbList.items(),key=lambda d:d[1],reverse=True)[0:15]return (wordProbList)

        计算贝叶斯概率

    #计算贝叶斯概率def calBayes(self,wordList,spamdict,normdict):ps_w=1ps_n=1for word,prob in wordList.items() :print(word+"/"+str(prob))ps_w*=(prob)ps_n*=(1-prob)p=ps_w/(ps_w+ps_n)
#         print(str(ps_w)+""+str(ps_n))return p    

        计算预测结果正确率

    #计算预测结果正确率def calAccuracy(self,testResult):rightCount=0errorCount=0for name ,catagory in testResult.items():if (int(name)<1000 and catagory==0) or(int(name)>1000 and catagory==1):rightCount+=1else:errorCount+=1return rightCount/(rightCount+errorCount)

 接下来调用方法类spamEmailBayes中的方法具体实现邮件的分类

from spam.spamEmail import spamEmailBayes
import re
#spam类对象
spam=spamEmailBayes()
#保存词频的词典
spamDict={}
normDict={}
testDict={}
#保存每封邮件中出现的词
wordsList=[]
wordsDict={}
#保存预测结果,key为文件名,值为预测类别
testResult={}
#分别获得正常邮件、垃圾邮件及测试文件名称列表
normFileList=spam.get_File_List(r"..\data\normal")
spamFileList=spam.get_File_List(r"..\data\spam")
testFileList=spam.get_File_List(r"..\data\test")
#获取训练集中正常邮件与垃圾邮件的数量
normFilelen=len(normFileList)
spamFilelen=len(spamFileList)
#获得停用词表,用于对停用词过滤
stopList=spam.getStopWords()
#获得正常邮件中的词频
for fileName in normFileList:wordsList.clear()for line in open("../data/normal/"+fileName):#过滤掉非中文字符rule=re.compile(r"[^\u4e00-\u9fa5]")line=rule.sub("",line)#将每封邮件出现的词保存在wordsList中spam.get_word_list(line,wordsList,stopList)#统计每个词在所有邮件中出现的次数spam.addToDict(wordsList, wordsDict)
normDict=wordsDict.copy()  #获得垃圾邮件中的词频
wordsDict.clear()
for fileName in spamFileList:wordsList.clear()for line in open("../data/spam/"+fileName):rule=re.compile(r"[^\u4e00-\u9fa5]")line=rule.sub("",line)spam.get_word_list(line,wordsList,stopList)spam.addToDict(wordsList, wordsDict)
spamDict=wordsDict.copy()# 测试邮件
for fileName in testFileList:testDict.clear( )wordsDict.clear()wordsList.clear()for line in open("../data/test/"+fileName):rule=re.compile(r"[^\u4e00-\u9fa5]")line=rule.sub("",line)spam.get_word_list(line,wordsList,stopList)spam.addToDict(wordsList, wordsDict)testDict=wordsDict.copy()#通过计算每个文件中p(s|w)来得到对分类影响最大的15个词wordProbList=spam.getTestWords(testDict, spamDict,normDict,normFilelen,spamFilelen)#对每封邮件得到的15个词计算贝叶斯概率  p=spam.calBayes(wordProbList, spamDict, normDict)if(p>0.9):testResult.setdefault(fileName,1)else:testResult.setdefault(fileName,0)#计算分类准确率(测试集中文件名为1至200的为正常邮件,7801至8000的为垃圾邮件)
testAccuracy=spam.calAccuracy(testResult)
for i,ic in testResult.items():print(i+"/"+str(ic))
print("正确率为:")
print(testAccuracy)

 代码运行结果

        影响每封邮件分类关键词的贝叶斯概率(概率大于0.9判为垃圾邮件,否则判为正常邮件)

  

        根据贝叶斯概率对测试集邮件判别情况(1为垃圾邮件,0为正常邮件)

 

        邮件分类判别的正确率

 

        可以看到,在400封邮件(正常邮件与垃圾邮件各一半)的测试集中测试结果为分类准确率95.15%,朴素贝叶斯分类器的分类结果还是相当好的。 

 总结

朴素贝叶斯的优点和缺点

优点

  1. 对待预测样本进行预测,过程简单速度快(想想邮件分类的问题,预测就是分词后进行概率乘积,在log域直接做加法更快)。
  2. 对于多分类问题也同样很有效,复杂度也不会有大程度上升。
  3. 在分布独立这个假设成立的情况下,贝叶斯分类器效果奇好,会略胜于逻辑回归,同时我们需要的样本量也更少一点
  4. 对于类别类的输入特征变量,效果非常好。对于数值型变量特征,我们是默认它符合正态分布的。

缺点

  1. 对于测试集中的一个类别变量特征,如果在训练集里没见过,直接算的话概率就是0了,预测功能就失效了。当然,我们前面的文章提过我们有一种技术叫做『平滑』操作,可以缓解这个问题,最常见的平滑技术是拉普拉斯估测。
  2. 那个…咳咳,朴素贝叶斯算出的概率结果,比较大小还凑合,实际物理含义…恩,别太当真。
  3. 朴素贝叶斯有分布独立的假设前提,而现实生活中这些predictor很难是完全独立的


http://chatgpt.dhexx.cn/article/oqMaS2WB.shtml

相关文章

python:基于朴素贝叶斯算法的垃圾邮件过滤分类

目录 一、朴素贝叶斯算法 1.概述 2.推导过程 二、实现垃圾邮件过滤分类 1.垃圾邮件问题背景 2.朴素贝叶斯算法实现垃圾邮件分类的步骤 3.python实现 参考学习网址&#xff1a;https://blog.csdn.net/weixin_59450364/article/details/124343350 一、朴素贝叶斯算法 1.…

机器学习:朴素贝叶斯的应用之垃圾邮件过滤

机器学习&#xff1a;朴素贝叶斯的应用之垃圾邮件过滤 文章目录 机器学习&#xff1a;朴素贝叶斯的应用之垃圾邮件过滤1.相关概念1.条件概率&#xff1a;2.贝叶斯公式&#xff1a;3.拉普拉斯平滑&#xff1a; 2.朴素贝叶斯分类器1.根据已知数据计算先验概率以及条件概率2.根据M…

【机器学习】贝叶斯算法详解 + 公式推导 + 垃圾邮件过滤实战 + Python代码实现

文章目录 一、贝叶斯简介二、贝叶斯公式推导三、拼写纠正案例四、垃圾邮件过滤案例4.1 问题描述4.2 朴素贝叶斯引入 五、基于朴素贝叶斯的垃圾邮件过滤实战5.1 导入相关库5.2 邮件数据读取5.3 构建语料表&#xff08;字典&#xff09;5.4 构建训练集的特征向量5.5 朴素贝叶斯算…

实现垃圾邮件过滤(Python3实现)

实验代码&#xff1a; import os import re import string import mathDATA_DIR enron target_names [ham, spam]def get_data(DATA_DIR):subfolders [enron%d % i for i in range(1, 7)]data []target []for subfolder in subfolders:# spamspam_files os.listdir(os.pa…

机器学习之朴素贝叶斯实现垃圾邮件过滤

一.朴素贝叶斯概述 朴素贝叶斯法是基于贝叶斯定理与特征条件独立性假设的分类方法。对于给定的训练集&#xff0c;首先基于特征条件独立假设学习输入输出的联合概率分布&#xff08;朴素贝叶斯法这种通过学习得到模型的机制&#xff0c;显然属于生成模型&#xff09;&#xff…

基于逻辑回归方法完成垃圾邮件过滤任务

一、基于逻辑回归方法完成垃圾邮件过滤任务 1、✌ 任务描述 我们日常学习以及工作中会收到非常多的邮件&#xff0c;除了与学习工作相关的邮件&#xff0c;还会收到许多垃圾邮件&#xff0c;包括广告邮件、欺诈邮件等等。本任务通过邮件中包含的文本内容来判断该邮件是正常邮…

【机器学习实战】朴素贝叶斯应用之垃圾邮件过滤

1.什么是朴素贝叶斯2.贝叶斯公式3.朴素贝叶斯常用的三个模型4.朴素贝叶斯实现垃圾邮件过滤的步骤5.垃圾邮件过滤实验&#xff1a;&#xff08;一&#xff09;、准备收集好的数据集&#xff0c;并下载到本地文件夹&#xff08;二&#xff09;、朴素贝叶斯分类器训练函数&#xf…

贝叶斯垃圾邮件过滤

贝叶斯垃圾邮件过滤 译自From Wikipedia, the free encyclopedia 贝叶斯垃圾邮件过滤是一种筛选电子邮件的统计技术。在它的基本形式中&#xff0c;它使用天真贝叶斯分类器在词特征包上识别垃圾电子邮件&#xff0c;这是一种在文本分类中常用的方法。 天真贝叶斯分类器通过使用…

【布隆过滤器】如何防止缓存穿透、海量邮箱的垃圾邮件过滤等问题?

目录 一、布隆过滤器是什么&#xff1f; 二、布隆过滤器的模拟实现 2.1、模拟实现 2.2、布隆过滤器的优点和缺点 优点&#xff1a; 缺点&#xff1a; 2.3、布隆过滤器的删除功能 2.4、布隆过滤器的使用场景 一、布隆过滤器是什么&#xff1f; 它是一种概率型数据结构&am…

垃圾邮件过滤挑战

垃圾邮件过滤挑战 随着网络应用的逐渐发展&#xff0c;电子邮件成为人们日常工作生活中不可分割的一部分。与此同时&#xff0c;垃圾邮件的问题困扰着许多电子邮件的使用者&#xff0c;它们不仅为电子邮件的使用者带来阅读负担&#xff0c;更占用了有限的邮箱空间。为此本研究…

基于C#的机器学习--垃圾邮件过滤

在这一章&#xff0c;我们将建立一个垃圾邮件过滤分类模型。我们将使用一个包含垃圾邮件和非垃圾邮件的原始电子邮件数据集&#xff0c;并使用它来训练我们的ML模型。我们将开始遵循上一章讨论的开发ML模型的步骤。这将帮助我们理解工作流程。 在本章中&#xff0c;我们将讨论以…

基于内容的垃圾邮件过滤

1 引言 电子邮件&#xff08;E-mail&#xff09;以其方便、快捷、低成本的独特魅力成为人们日常生活中不可缺少的通信手段之一。但电子邮件给人们带来极大便利的同时&#xff0c;也日益显示出其负面影响&#xff0c;那就是我们每天收到的邮件中有很大一部分是那种“不请自来”…

朴素贝叶斯——垃圾邮件过滤

文章目录 利用朴素贝叶斯进行文档分类1、获取数据集2、切分文本3、构建词表和分类4、构建分类器5、测试算法 利用朴素贝叶斯进行垃圾邮件过滤1、导入数据集2、垃圾邮件预测 总结 利用朴素贝叶斯进行文档分类 1、获取数据集 下载数据集&#xff0c;获取到一些邮件文档。其中ha…

贝叶斯算法:垃圾邮件过滤

准备 100封邮件&#xff0c;50封垃圾邮件和50封正常邮件参考 : 贝叶斯算法原理 程序过程解释 垃圾邮件分类的数学基础是贝叶斯推断(bayesian inference)。整个程序过程主要有以下几个部分构成&#xff1a; step 1 : 提取邮件并处理 1、使用 TDirectory.GetFiles(xPat…

毕业设计-基于深度学习的垃圾邮件过滤系统的设计与实现

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

机器学习:朴素贝叶斯算法与垃圾邮件过滤

简介 贝叶斯算法是由英国数学家托马斯贝叶斯提出的&#xff0c;这个算法的提出是为了解决“逆向概率”的问题。首先我们先来解释下正向概率与逆向概率的含义&#xff1a; 正向概率&#xff1a;假设一个箱子里有5个黄色球和5个白色球&#xff0c;随机从箱子里拿出一个球&#…

朴素贝叶斯算法--垃圾邮件过滤

文章目录 一、朴素贝叶斯概述1、贝叶斯决策理论2、条件概率3、朴素贝叶斯4、朴素贝叶斯一般过程 二、朴素贝叶斯算法--垃圾邮件1、准备数据&#xff1a;从文本中构建词向量2、训练算法&#xff1a;从词向量计算概率3、测试算法&#xff1a;根据现实情况修改分类器5、垃圾邮件分…

机器学习-朴素贝叶斯过滤垃圾邮件

一、朴素贝叶斯实现垃圾邮件分类的原理 什么是朴素贝叶斯算法&#xff1a;用贝叶斯定理来预测一个未知类别的样本属于各个类别的可能性,选择可能性最大的一个类别作为该样本的最终类别。 用这个算法处理垃圾邮件就可以理解为&#xff1a;用贝叶斯定理来预测一封由若干个单词组成…

机器学习项目(一)——垃圾邮件的过滤技术

一、垃圾邮件过滤技术项目需求与设计方案 二、数据的内容分析 &#xff08;1、是否为垃圾邮件的标签&#xff0c;spam——是垃圾邮件&#xff1b;ham——不是垃圾邮件&#xff09; &#xff08;2、邮件的内容分析——主要包含&#xff1a;发件人、收件人、发件时间以及邮件的内…