查看通俗易懂的贝叶斯垃圾邮件分类原理 请点击此处
下载邮件数据 请点击此处

import os
import re
import string
import math
import numpy as np# 过滤数字
def replace_num(txt_str):txt_str = txt_str.replace(r'0', '')txt_str = txt_str.replace(r'1', '')txt_str = txt_str.replace(r'2', '')txt_str = txt_str.replace(r'3', '')txt_str = txt_str.replace(r'4', '')txt_str = txt_str.replace(r'5', '')txt_str = txt_str.replace(r'6', '')txt_str = txt_str.replace(r'7', '')txt_str = txt_str.replace(r'8', '')txt_str = txt_str.replace(r'9', '')return txt_strdef get_filtered_str(category):email_list = []translator = re.compile('[%s]' % re.escape(string.punctuation))for curDir, dirs, files in os.walk(f'./email/{category}'):for file in files:file_name = os.path.join(curDir, file)with open(file_name, 'r', encoding='utf-8') as f:txt_str = f.read()# 全部小写txt_str = txt_str.lower()# 过滤掉所有符号txt_str = translator.sub(' ', txt_str)# 过滤掉全部数字txt_str = replace_num(txt_str)# 把全体的邮件文本 根据换行符把string划分成列表txt_str_list = txt_str.splitlines()# 把获取的全体单词句子列表转成字符串txt_str = ''.join(txt_str_list)# print(txt_str)email_list.append(txt_str)return email_listdef get_dict_spam_dict_w(spam_email_list):''':param email_list: 每个邮件过滤后形成字符串,存入email_list:param all_email_words: 列表。把所有的邮件内容,分词。一个邮件的词 是它的一个列表元素:return:'''all_email_words = []# 用set集合去重word_set = set()for email_str in spam_email_list:# 把每个邮件的文本 变成单词email_words = email_str.split(' ')# 把每个邮件去重后的列表 存入列表all_email_words.append(email_words)for word in email_words:if(word!=''):word_set.add(word)# 计算每个垃圾词出现的次数word_dict = {}for word in word_set:# 创建字典元素 并让它的值为1word_dict[word] = 0# print(f'word={word}')# 遍历每个邮件,看文本里面是否有该单词,匹配方法不能用正则.邮件里面也必须是分词去重后的!!! 否则 比如出现re是特征, 那么remind 也会被匹配成refor email_words in all_email_words:for email_word in email_words:# print(f'spam_email={email_word}')# 把从set中取出的word 和 每个email分词后的word对比看是否相等if(word==email_word):word_dict[word] += 1# 找到一个就行了break# 计算垃圾词的概率# spam_len = len(os.listdir(f'./email/spam'))# print(f'spam_len={spam_len}')# for word in word_dict:#     word_dict[word]  = word_dict[word] / spam_lenreturn word_dictdef get_dict_ham_dict_w(spam_email_list,ham_email_list):''':param email_list: 每个邮件过滤后形成字符串,存入email_list:param all_email_words: 列表。把所有的邮件内容,分词。一个邮件的词 是它的一个列表元素:return:'''all_ham_email_words = []# 用set集合去重 得到垃圾邮件的特征wword_set = set()#获取垃圾邮件特征for email_str in spam_email_list:# 把每个邮件的文本 变成单词email_words = email_str.split(' ')for word in email_words:if (word != ''):word_set.add(word)for ham_email_str in ham_email_list:# 把每个邮件的文本 变成单词ham_email_words = ham_email_str.split(' ')# print(f'ham_email_words={ham_email_words}')# 把每个邮件分割成单词的 的列表 存入列表all_ham_email_words.append(ham_email_words)# print(f'all_ham_email_words={all_ham_email_words}')# 计算每个垃圾词出现的次数word_dict = {}for word in word_set:# 创建字典元素 并让它的值为1word_dict[word] = 0# print(f'word={word}')# 遍历每个邮件,看文本里面是否有该单词,匹配方法不能用正则.邮件里面也必须是分词去重后的!!! 否则 比如出现re是特征, 那么remind 也会被匹配成refor email_words in all_ham_email_words:# print(f'ham_email_words={email_words}')for email_word in email_words:# 把从set中取出的word 和 每个email分词后的word对比看是否相等# print(f'email_word={email_word}')if(word==email_word):word_dict[word] += 1# 找到一个就行了breakreturn word_dict# 获取测试邮件中出现的 垃圾邮件特征
def get_X_c1(spam_w_dict,file_name):# 获取测试邮件# file_name = './email/spam/25.txt'# 过滤文本translator = re.compile('[%s]' % re.escape(string.punctuation))with open(file_name, 'r', encoding='utf-8') as f:txt_str = f.read()# 全部小写txt_str = txt_str.lower()# 过滤掉所有符号txt_str = translator.sub(' ', txt_str)# 过滤掉全部数字txt_str = replace_num(txt_str)# 把全体的邮件文本 根据换行符把string划分成列表txt_str_list = txt_str.splitlines()# 把获取的全体单词句子列表转成字符串txt_str = ''.join(txt_str_list)# 把句子分成词email_words = txt_str.split(' ')# 去重x_set = set()for word in email_words:if word!='':x_set.add(word)# print(f'\ntest_x_set={x_set}')spam_len = len(os.listdir(f'./email/spam'))# 判断测试邮件的词有哪些是垃圾邮件的特征spam_X_num = []for xi in x_set:for wi in spam_w_dict:if xi == wi:spam_X_num.append(spam_w_dict[wi])# print(f'\nspam_X_num={spam_X_num}')w_appear_sum_num = 1for num in spam_X_num:w_appear_sum_num += num# print(f'\nham_w_appear_sum_num={w_appear_sum_num}')# 求概率w_c1_p = w_appear_sum_num / (spam_len + 2)return w_c1_p# 获取测试邮件中出现的 垃圾邮件特征
def get_X_c2(ham_w_dict,file_name):# 过滤文本translator = re.compile('[%s]' % re.escape(string.punctuation))with open(file_name, 'r', encoding='utf-8') as f:txt_str = f.read()# 全部小写txt_str = txt_str.lower()# 过滤掉所有符号txt_str = translator.sub(' ', txt_str)# 过滤掉全部数字txt_str = replace_num(txt_str)# 把全体的邮件文本 根据换行符把string划分成列表txt_str_list = txt_str.splitlines()# 把获取的全体单词句子列表转成字符串txt_str = ''.join(txt_str_list)# 把句子分成词email_words = txt_str.split(' ')# 去重x_set = set()for word in email_words:if word!='':x_set.add(word)# print(f'\ntest_x_set={x_set}')# 判断测试邮件的词有哪些是垃圾邮件的特征ham_X_num = []for xi in x_set:for wi in ham_w_dict:if xi == wi:ham_X_num.append(ham_w_dict[wi])# print(f'\nham_X_num={ham_X_num}')# 先求分子 所有词出现的总和ham_len = len(os.listdir(f'./email/ham'))w_appear_sum_num = 1for num in ham_X_num:w_appear_sum_num += num# print(f'\nspam_w_appear_sum_num={w_appear_sum_num}')# 求概率w_c2_p = w_appear_sum_num / (ham_len+2)return w_c2_pdef email_test(spam_w_dict,ham_w_dict):for curDir, dirs, files in os.walk(f'./email/test'):for file in files:file_name = os.path.join(curDir, file)print('---------------------------------------------------------------')print(f'测试邮件: {file}')# 获取条件概率 p(X|c1)p_X_c1 = get_X_c1(spam_w_dict,file_name)# 获取条件概率 p(X|c2)p_X_c2 = get_X_c2(ham_w_dict,file_name)# print(f'\nX_c1={p_X_c1}')# print(f'\nX_c2={p_X_c2}')# #注意:Log之后全部变为负数A = np.log(p_X_c1) + np.log(1 / 2)B = np.log(p_X_c2) + np.log(1 / 2)# 除法会出现问题,-1 / 负分母  结果 < -2/同一个分母print(f'p1={A},p2={B}')# 因为分母一致,所以只比较 分子即可if A > B:print('p1>p2,所以是垃圾邮件.')if A <= B:print('p1<p2,所以是正常邮件.')if __name__=='__main__':spam_email_list = get_filtered_str('spam')ham_email_list = get_filtered_str('ham')spam_w_dict = get_dict_spam_dict_w(spam_email_list)ham_w_dict = get_dict_ham_dict_w(spam_email_list,ham_email_list)# print(f'\n从垃圾邮件中提取的特征及每个特征出现的邮件数:')# print(f'spam_w_dict={spam_w_dict}')# print(f'\n普通邮件中垃圾邮件特征出现的邮件数为:')# print(f'ham_w_dict={ham_w_dict}')email_test(spam_w_dict, ham_w_dict)

python实现朴素贝叶斯垃圾邮件分类相关推荐

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

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

  2. 朴素贝叶斯-垃圾邮件分类实现

    1. 前言 <朴素贝叶斯算法(Naive Bayes)>,介绍了朴素贝叶斯原理.本文介绍的是朴素贝叶斯的基础实现,用来垃圾邮件分类. 2. 朴素贝叶斯基础实现 朴素贝叶斯 (naive B ...

  3. 朴素贝叶斯-垃圾邮件(中文的)处理

    #coding=utf-8 from sklearn.naive_bayes import MultinomialNB,GaussianNB import numpy as np import jie ...

  4. 贝叶斯垃圾邮件分类问题中联合概率的推导

    主旨 讨论贝叶斯垃圾邮件分类问题中联合概率的计算问题.通过借鉴现有的资料,整理出一种数学上等价,同时基于本科概率论课程较容易理解的计算公式. 背景知识 2002年Paul Graham提出了一种利用贝 ...

  5. 机器学习(六)--------python实现朴素贝叶斯对email分类

    贝叶斯分类 4.1 贝叶斯定理 计算条件概率 4.2 朴素贝叶斯分类 朴素:特征条件独立 贝叶斯:基于贝叶斯定理 该方法受限于当特征属性有条件独立或基本独立. 4.3 贝叶斯网络 贝叶斯网络也成为信念 ...

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

    文章目录 利用朴素贝叶斯进行文档分类 1.获取数据集 2.切分文本 3.构建词表和分类 4.构建分类器 5.测试算法 利用朴素贝叶斯进行垃圾邮件过滤 1.导入数据集 2.垃圾邮件预测 总结 利用朴素贝 ...

  7. 机器学习-朴素贝叶斯-垃圾邮件

    一:朴素贝叶斯算法概述 1:朴素贝叶斯(Naïve Bayes, NB)算法,是一种基于贝叶斯定理与特征条件独立假设的分类方法.朴素:特征条件独立:贝叶斯:基于贝叶斯定理.属于监督学习的生成模型,实现 ...

  8. 文本处理之贝叶斯垃圾邮件分类

    本文所讲解的是如何通过Python将文本读取,并且将每一个文本生成对应的词向量并返回. 文章的背景是将50封邮件(包含25封正常邮件,25封垃圾邮件)通过贝叶斯算法对其进行分类. 主要分为如下几个部分 ...

  9. 机器学习实战4(1):朴素贝叶斯:垃圾邮件的识别

    一.朴素贝叶斯基础知识 预备数学知识: A. 无约束条件的优化 1.求极值问题 人工智能中最核心的数学环节是求出一个目标函数(object function)的最小值/最大值.求出一个函数最小是/最大 ...

最新文章

  1. java独立承担,Java使用独立文件服务器
  2. jzoj6290-倾斜的线【计算几何,贪心】
  3. 博客网站源代码_详解SEO布词以及网站排名优化技巧
  4. Windows 10 开启有线无线802.1x脚本
  5. C# winform实现窗体最小化时显示到(桌面右下角)系统托盘
  6. mysql 实现row_number_MySQL实现ROW_NUMBER()
  7. 突破网络执法官封锁的方法及其原理
  8. 彻底解决--“未能加载文件或程序集“xxx.dll”或它的某一个依赖项”
  9. 台式电脑投影切屏快捷键_电脑投影切屏快捷键
  10. yaml 格式错误 did not find expected key
  11. setw()函数使用
  12. 【存储】超融合(HCI)和云是什么以及区别
  13. 微软行星云计算Planetary Computer——previsa南美洲亚马逊雨林森林损坏系统AI智能评估
  14. 计算机对无人机的影响,无人机中的人工智能和自主性你了解多少
  15. Ubuntu和windows系统下安装odoo16 社区版和企业版附带安装视频
  16. idea打不开eclipse项目的问题
  17. 笔记本电脑总是莫名其妙自动睡眠,记录一次排查过程
  18. 关于联想昭阳k20-80触摸屏关闭
  19. html让视频变形不留黑边,视频去黑边画面不变形|视频无损去黑边 去掉视频黑边且画面比例正常人物不变形...
  20. 嫦娥五号返回器携带月壤成功着陆地球!一文读懂你关心的六大问题

热门文章

  1. 超链接打不开是什么原因html,超链接打不开是什么原因
  2. elecworks 图框管理器
  3. JAVA 基因牛的繁殖
  4. Python 爬虫工具——notebook
  5. 商场/购物中心会员营销活动方案
  6. android聊天界面与功能,【android】聊天界面的制作-简易版实现
  7. 2014年中国移动游戏行业研究报告
  8. 高压功率放大器ATA4051VS高压功率放大器HSA4051
  9. 多服务器虚拟化 map_兆芯双路刀片加固服务器简介
  10. 适合程序员表白的情话【保你脱单】