本文基于朴素贝叶斯构建一个分类垃圾邮件的模型,研究对象是英文的垃圾邮件。

邮件内容保存在txt文件中,其中分为训练样本train和测试样本test。
在训练样本中正常邮件命名为:pos;垃圾邮件命名为:neg。
同时,可以将待分类的测试样本放入测试文件test中的对于pos,或者neg下,用来进行测试,如果是垃圾邮件则类别为0,反之类别为1。

在朴素贝叶斯法进行垃圾邮件的分类的思想中:有一个方法与一个假设:
  贝叶斯定理:求解p(c|x)的问题变成了求解p(x|c)的问题
  特征条件独立假设 :X的n个特征在某类确定的条件下都是条件独立的。
具体可以看:[监督学习] 朴素贝叶斯法.
在GitHub上的数据: 数据及代码.

1 邮件分类算法步骤

1 建立词汇表,(用来收集训练集中所有邮件的词汇。)
2 每封邮件词汇向量,(通过所有词汇来确定每封邮件中词汇出现的数量。)
3 计算先验概率p(b)
4 计算每个词汇的条件概率
5 用例测试

完整程序:

# -*- coding: utf-8 -*-
# @Time    : 2020/4/16 21:09
# @Author  : Zudy'''
1. 基于朴素贝叶斯的垃圾邮件分类
'''from sklearn import datasets
from time import time
import numpy
import re
import os
import randomdef load_data(folder_path):print("Loading dataset ...")loadTime = time()datalist = datasets.load_files(folder_path)#datalist是一个Bunch类,其中重要的数据项有#data:原始数据#filenames:每个文件的名称#target:类别标签(子目录的文件从0开始标记了索引)#target_names:类别标签(子目录的具体名称)#输出总文档数和类别数print("summary: {0} documents in {1} categories.".format(len(datalist.data),len(datalist.target_names)))#加载数据所用的时间print("Load data in {0}seconds".format(time() - loadTime))#去停用词操作#datalist.data = [word for word in datalist.data if(word not in stopwords.words('english'))]return datalist# 返回集合列表
def word_create(ori_data):print("\nVectorzing dataset ...")word_dic = set([]) #建立一个集合列表#词向量的时间vectorTime = time()#词典的构造for doc in ori_data.data:#doc是byte,这里将byte转化为stringdoc = str(doc, encoding = "utf-8")#使用正则表达式将特殊符号去除doc = re.sub("[\s+\.\!\/_,$%^*(+\"\'-]+|[+——!,。?、~@#¥%……&*()<>]+", " ", doc)#使用默认的空格方式将email分隔开,然后转化为小写字母,与原集合取并集word_dic = word_dic|set(doc.lower().split())#向量化的时间和词典中词的数量print("Vectorzing time:{0}\nThe number of word_dictionary:{1}".format(vectorTime,len(word_dic)))return list(word_dic)def doc_represent(wordDic,ori_data):#创建一个文档数(行)*词向量(列)长度的二维数组doc_re = numpy.zeros((len(ori_data.data),len(wordDic)),dtype= numpy.int)#计数器count = 0#用来记录词向量表示时间representTime = time()for doc in ori_data.data:#同word_create函数,进行同样的操作doc = str(doc, encoding = "utf-8")doc = re.sub("[\s+\.\!\/_,$%^*(+\"\'-]+|[+——!,。?、~@#¥%……&*()<>]+", " ", doc)for word in doc.lower().split():if word in wordDic:#将对应词向量位置置1doc_re[count][wordDic.index(word)] = 1count = count+1print("Represent doc time:{0}\nThe number of doc:{1}".format(representTime-time(),len(doc_re)))#返回表示文档的二维数组return doc_redef pre_probabilty(ori_data):s_pre_pro = []#正常邮件的先验概率P_normal = (normal + 1.0)/(len(ori_data.data) + 2.0)s_pre_pro.append(P_normal)#垃圾邮件的先验概率P_spam = (spam + 1.0)/(len(ori_data.data) + 2.0)s_pre_pro.append(P_spam)#返回先验概率的列表return s_pre_pro#计算每个词在正常邮件垃圾邮件中的数目
def wordNum_email(email_repre,wordDic):#用二维向量存储num_word = numpy.zeros((2,len(wordDic)),dtype= numpy.int)for i in range(len(wordDic)):#在正常邮件的数目for j in range(normal):num_word[0][i] += email_repre[j][i]#在垃圾邮件中的数目for j in range(normal, spam+normal):num_word[1][i] += email_repre[j][i]return num_word#条件概率
def con_probabilty(email_repre,wordDic):#得到每个词汇在正常邮件、垃圾邮件中的数目word_num = wordNum_email(email_repre,wordDic)word_pro = numpy.zeros((2,len(wordDic)),dtype = numpy.double)for i in range(len(wordDic)):word_pro[0][i] = round((word_num[0][i]+1)/(normal + 2),8)word_pro[1][i] = round((word_num[1][i]+1)/(spam + 2 ),8)return word_pro#得到每个类别中的文档数
def class_num(path,class_name):count = 0path=path+"/"+class_namefor root, dirs, files in os.walk(path):  # 遍历统计for each in files:count += 1return count#测试
def test_spam(test_repre,pre_pro,con_pro):email_pro = numpy.zeros((len(test_repre),2),dtype = numpy.double)email_judge = []normal_num = 0spam_num = 0for i in range(len(test_repre)):email_pro[i][0] = round(pre_pro[0],8)email_pro[i][1] = round(pre_pro[1],8)for j in range(len(test_repre[0])):if test_repre[i][j] != 0:email_pro[i][0] *= con_pro[0][j]email_pro[i][1] *= con_pro[1][j]if email_pro[i][0] > email_pro[i][1] :email_judge.append(0)elif email_pro[i][0] < email_pro[i][1] :email_judge.append(1)else :if random.random() > 0.5:email_judge.append(1)else:email_judge.append(0)for i in range(normal_test):if email_judge[i] == 0:normal_num +=1for i in range(normal_test,len(test_repre)):if email_judge[i] == 1:spam_num +=1print("email_judge=")print(email_judge)print("normal_num="+str(normal_num)+"\nspam_num="+str(spam_num))return (normal_num + spam_num)/len(test_repre)if __name__ == "__main__":# 训练集和测试集的路径train_path = "D:/Python/Python_learning/Book_code/LH_mechine_learning/bayes/spamDataset/email/train1"test_path = "D:/Python/Python_learning/Book_code/LH_mechine_learning/bayes/spamDataset/email/test1"train_list = load_data(train_path)test_list = load_data(test_path)normal = class_num(train_path,"pos")  # 正常邮件的数目spam = class_num(train_path,"neg")  # 垃圾邮件的数目WordDictionary = word_create(train_list)   # 建立词汇表docRepre = doc_represent(WordDictionary,train_list)  # 将训练数据进行向量表示prePro = pre_probabilty(train_list)conPro = con_probabilty(docRepre,WordDictionary)print("\npreProbablity:",prePro)   # 计算先验概率print("conProbablity:",conPro)   # 计算条件概率testRepre = doc_represent(WordDictionary,test_list)  # 测试数据的向量表示normal_test = class_num(test_path, "pos")  # 正常邮件的数目spam_test = class_num(test_path, "neg")  # 垃圾邮件的数目test_accuracy = test_spam(testRepre,prePro,conPro)  # 测试数据的准确率print ("test accuracy")print(test_accuracy)

2 测试结果

Loading dataset ...
summary: 43 documents in 2 categories.
Load data in 0.008994102478027344seconds
Loading dataset ...
summary: 36 documents in 2 categories.
Load data in 0.007995843887329102secondsVectorzing dataset ...
Vectorzing time:1587043343.3496442
The number of word_dictionary:2426
Represent doc time:-0.5976784229278564
The number of doc:43preProbablity: [0.5777777777777777, 0.4222222222222222]
conProbablity: [[0.59259259 0.07407407 0.03703704 ... 0.11111111 0.07407407 0.03703704][0.7        0.05       0.15       ... 0.05       0.05       0.1       ]]
Represent doc time:-0.5137045383453369
The number of doc:36
email_judge=
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1]
normal_num=16
spam_num=13
test accuracy
0.8055555555555556

参考文献:
链接: 基于朴素贝叶斯的垃圾邮件分类.

朴素贝叶斯法 - 垃圾邮件分类相关推荐

  1. 机器学习--使用朴素贝叶斯进行垃圾邮件分类

    一.学习背景 垃圾邮件的问题一直困扰着人们,传统的垃圾邮件分类的方法主要有"关键词法"和"校验码法"等,然而这两种方法效果并不理想.其中,如果使用的是" ...

  2. [CS229学习笔记] 5.判别学习算法与生成学习算法,高斯判别分析,朴素贝叶斯,垃圾邮件分类,拉普拉斯平滑

    本文对应的是吴恩达老师的CS229机器学习的第五课.这节课介绍了判别学习算法和生成学习算法,并给出了生成学习算法的一个实例:利用朴素贝叶斯进行垃圾邮件分类. 判别学习(Discriminative L ...

  3. Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说

    Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报  分类: 机器学习(19)  听说朴 ...

  4. AI基础:朴素贝叶斯与垃圾邮件分类

    来,继续回顾基础算法 文章目录 背景&贝叶斯原理 贝叶斯分类器 朴素贝叶斯分类器 西瓜数据集下的朴素贝叶斯示例 朴素贝叶斯分类的优缺点 朴素贝叶斯关键问题 朴素贝叶斯企业中的应用案例 基于朴素 ...

  5. 朴素贝叶斯(垃圾邮件分类)

    一.基于贝叶斯决策理论的分类方法 朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同.比 ...

  6. 基于朴素贝叶斯的垃圾邮件分类-着重理解拉普拉斯变换

    1. 引言 在正式学习朴素贝叶斯之前,需要明确的是机器学习所要实现的是基于有限的训练样本集尽可能准确地估计出后验概率P(c|x),即根据特征得到所属类别的概率,首先引入两个概念. 判别式模型(disc ...

  7. Python微调文本顺序对抗朴素贝叶斯算法垃圾邮件分类机制

    封面图片:<Python可以这样学>,ISBN:9787302456469,董付国,清华大学出版社 图书详情(京东): ================= 关于朴素贝叶斯算法中文垃圾邮件分 ...

  8. 第六次实验:使用朴素贝叶斯对垃圾邮件分类(CUST)

    1.实验目的和要求 会用Python创建朴素贝叶斯模型 使用朴素贝叶斯模型对垃圾邮件分类 会把文本文件变成向量 会用评价朴素贝叶斯模型的分类效果 2.实验环境 pycharm2021.3.1.Win1 ...

  9. 朴素贝叶斯与垃圾邮件分类

    垃圾邮件识别问题,也即对给定样本(包含垃圾邮件,非垃圾邮件)判断是否为垃圾邮件,根据贝叶斯定理: ⎧⎩⎨⎪⎪⎪⎪⎪⎪p(y=1|x)=p(y=1,x)p(x)p(y=0|x)=p(y=0,x)p(x) ...

最新文章

  1. 因子分析数据_Excel数据分析案例:用Excel做因子分析
  2. SpringBoot中用itext实现PDF导出时实现循环添加元素
  3. 配置普通用户可以运行saltstack的模块
  4. 基于Socket的java网络编程
  5. 数据库OceanBase创始人阳振坤:通关TPC-C到底有多难?
  6. 正态分布表怎么查表_《深入浅出统计学》-读书笔记-再谈正态分布的应用
  7. 第八届蓝桥杯第二题等差素数列
  8. scala文件通过本地命令运行
  9. BMFONT 字体制作
  10. gps天线拆解图片_威旺M20如何拆解中控导航及找出gps天线
  11. 数据杂谈:大数据之ETL(数据抽取,转换何加载)
  12. 4.10验证码(抠图)和超级鹰的使用
  13. 华为设备配置OSPF的NSSA区域
  14. 微信公众号新手运营指南——四种类别如何选择
  15. 一种基于Android、iOS平台的移动端车牌识别方法,能够在复杂背景下迅速识别多种车牌
  16. 如何用JS刷新当前页面
  17. 【读书笔记】《微习惯:瘦身篇》
  18. 新媒体运营,微博运营活动技巧分享
  19. 容联云通讯纽交所上市,创始人孙昌勋:是荣耀,更是责任
  20. 淘宝新手设计快速提升一(思想片)

热门文章

  1. picturebox显示服务器图片大小,WinForm中实现picturebox自适应图片大小的方法
  2. BUAA(2021春)实验:树的构造与遍历——根据提示循序渐进(可惜提示有问题Ծ‸Ծ)
  3. 微型计算机逻辑元件有哪些,目前普遍使用的微型计算机所采用的逻辑元件有哪些...
  4. MWC 2018火热开幕,AI取代手机成主角,华为超越苹果称霸!
  5. 讲真,这可能是博客图床最佳解决方案
  6. 上海亚商投顾:沪指逼近2900点 两市超4500股飘绿
  7. 可执行文件结构:PE文件结构讲解
  8. 微型计算机的外辅储存器,微型计算机的外辅储存器是指
  9. 重新运行一次阿里云服务器.从零开始搭建.?log-换-服务器
  10. 可拖拽排序的GridView(高仿今日头条编辑频道效果)