python:基于朴素贝叶斯算法的垃圾邮件过滤分类
目录
一、朴素贝叶斯算法
1.概述
2.推导过程
二、实现垃圾邮件过滤分类
1.垃圾邮件问题背景
2.朴素贝叶斯算法实现垃圾邮件分类的步骤
3.python实现
参考学习网址:https://blog.csdn.net/weixin_59450364/article/details/124343350
一、朴素贝叶斯算法
1.概述
朴素贝叶斯法(Naive Bayes model)是基于贝叶斯定理与特征条件独立假设的分类方法 。朴素贝叶斯算法(Naive Bayesian algorithm) 是应用最为广泛的分类算法之一。
最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM)。和决策树模型相比,朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响。朴素贝叶斯方法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。
2.推导过程
二、实现垃圾邮件过滤分类
1.垃圾邮件问题背景
垃圾邮件曾经是一个令广大网友非常头痛的问题,长期困扰着邮件运营商和用户。据官方统计,用户收到的电子邮件中80%以上是垃圾邮件。影响我们的正常网络生活而且还占取有限的可用资源;占用大量网络带宽,浪费存储空间,影响网络传输和运算速度;妖言惑众,骗人钱财,传播色情、反动等内容的垃圾邮件,已对现实社会造成严重危害。
传统的垃圾邮件过滤方法,主要有"关键词法"和"校验码法"等。关键词法的过滤依据是特定的词语,(如垃圾邮件的关键词:“发票”,“贷款”,“利率”,“中奖”,“办证”,“抽奖”,“号码”,“钱”,“款”,“幸运”……等等。)但这种方法效果很不理想,而且容易规避。一是正常邮件中也可能有这些关键词,非常容易误判。二是将关键词进行变形,如“代!开-发/票”,“中奖”如果被拆成“中 ~~~ 奖”可能会识别不了。后来,直到提出了使用“贝叶斯”的方法才使得垃圾邮件的分类达到一个较好的效果,而且随着邮件数目越来越多,贝叶斯分类的效果会更加好。如果将关键词的各种变形都找出来过滤,那是无穷无尽的,而且更容易误判正常邮件。
校验码法则是计算邮件文本的校验码,再与已知的垃圾邮件进行对比。它们的识别效果都不理想,而且很容易规避。直到2002年,Paul Graham提出使用“贝叶斯方法”过滤垃圾邮件,经过几年的工程化应用,才算解决了这个问题。而这种方法的效果,好的不可思议。此外,这种过滤方法还具有自我学习能力,会根据新收到的邮件,不断调整。收到的垃圾邮件越多,它的准确率就越高。采用的分类方法是通过多个词来判断是否为垃圾邮件,但这个概率难以估计,通过贝叶斯公式,可以转化为求垃圾邮件中这些词出现的概率。
2.朴素贝叶斯算法实现垃圾邮件分类的步骤
(1)提供样本数据(邮件样本):收集相关文本文件,在此我在网上搜集了一些 Enron Email Dataset 数据集
(2)数据读入:第一步将准备的数据文件读入
(3)准备数据(预处理):清除标点符符号、将字符串标记为单词、计算某个单词出现的次数等
(4)数据处理:建立一个集合存储所有出现的单词、统计spam和ham邮件的个数、计算先验概率(即在所有的样本邮件中垃圾邮件和正常邮件的占比)、构建一个字典存储单封邮件中的单词以及其个数
(5)测试:遍历所有的测试集、计算P(内容|垃圾邮件)和P(内容|正常邮件),所有的单词都要进行拉普拉斯平滑、把计算到的P(内容|垃圾邮件)和P(内容|正常邮件)加起来、把先验加上去(P(垃圾邮件)和P(正常邮件))、最后进行预测,如果spam_score > ham_score则标志为1,即垃圾邮件
3.python实现
首先准备邮件样本:
每个enron文件夹下有两个文件夹ham和spam。ham文件夹下的txt文件为正常邮件;spam文件下的txt文件为垃圾邮件。
代码:
# -*- coding: utf-8 -*-
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.path.join(DATA_DIR, subfolder, 'spam'))for spam_file in spam_files:with open(os.path.join(DATA_DIR, subfolder, 'spam', spam_file), encoding="latin-1") as f:data.append(f.read())target.append(1)# hamham_files = os.listdir(os.path.join(DATA_DIR, subfolder, 'ham'))for ham_file in ham_files:with open(os.path.join(DATA_DIR, subfolder, 'ham', ham_file), encoding="latin-1") as f:data.append(f.read())target.append(0)return data, targetX, y = get_data(DATA_DIR)class SpamDetector_1(object):"""Implementation of Naive Bayes for binary classification"""# 清除空格def clean(self, s):translator = str.maketrans("", "", string.punctuation)return s.translate(translator)# 分开每个单词def tokenize(self, text):text = self.clean(text).lower()return re.split("\W+", text)# 计算某个单词出现的次数def get_word_counts(self, words):word_counts = {}for word in words:word_counts[word] = word_counts.get(word, 0.0) + 1.0return word_countsclass SpamDetector_2(SpamDetector_1):# X:data,Y:target标签(垃圾邮件或正常邮件)def fit(self, X, Y):self.num_messages = {}self.log_class_priors = {}self.word_counts = {}# 建立一个集合存储所有出现的单词self.vocab = set()# 统计spam和ham邮件的个数self.num_messages['spam'] = sum(1 for label in Y if label == 1)self.num_messages['ham'] = sum(1 for label in Y if label == 0)# 计算先验概率,即所有的邮件中,垃圾邮件和正常邮件所占的比例self.log_class_priors['spam'] = math.log(self.num_messages['spam'] / (self.num_messages['spam'] + self.num_messages['ham']))self.log_class_priors['ham'] = math.log(self.num_messages['ham'] / (self.num_messages['spam'] + self.num_messages['ham']))self.word_counts['spam'] = {}self.word_counts['ham'] = {}for x, y in zip(X, Y):c = 'spam' if y == 1 else 'ham'# 构建一部字典存储单封邮件中的单词以及其个数counts = self.get_word_counts(self.tokenize(x))for word, count in counts.items():if word not in self.vocab:self.vocab.add(word) # 确保self.vocab中含有所有邮件中的单词# 下面语句是为了计算垃圾邮件和非垃圾邮件的词频,即给定词在垃圾邮件和非垃圾邮件中出现的次数。# c是0或1,垃圾邮件的标签if word not in self.word_counts[c]:self.word_counts[c][word] = 0.0self.word_counts[c][word] += countMNB = SpamDetector_2()
MNB.fit(X[100:], y[100:])class SpamDetector(SpamDetector_2):def predict(self, X):result = []flag_1 = 0# 遍历所有的测试集for x in X:counts = self.get_word_counts(self.tokenize(x)) # 生成可以记录单词以及该单词出现的次数的字典spam_score = 0ham_score = 0flag_2 = 0for word, _ in counts.items():if word not in self.vocab:continue# 下面计算P(内容|垃圾邮件)和P(内容|正常邮件),所有的单词都要进行拉普拉斯平滑else:# 该单词存在于正常邮件的训练集和垃圾邮件的训练集当中if word in self.word_counts['spam'].keys() and word in self.word_counts['ham'].keys():log_w_given_spam = math.log((self.word_counts['spam'][word] + 1) / (sum(self.word_counts['spam'].values()) + len(self.vocab)))log_w_given_ham = math.log((self.word_counts['ham'][word] + 1) / (sum(self.word_counts['ham'].values()) + len(self.vocab)))# 该单词存在于垃圾邮件的训练集当中,但不存在于正常邮件的训练集当中if word in self.word_counts['spam'].keys() and word not in self.word_counts['ham'].keys():log_w_given_spam = math.log((self.word_counts['spam'][word] + 1) / (sum(self.word_counts['spam'].values()) + len(self.vocab)))log_w_given_ham = math.log(1 / (sum(self.word_counts['ham'].values()) + len(self.vocab)))# 该单词存在于正常邮件的训练集当中,但不存在于垃圾邮件的训练集当中if word not in self.word_counts['spam'].keys() and word in self.word_counts['ham'].keys():log_w_given_spam = math.log(1 / (sum(self.word_counts['spam'].values()) + len(self.vocab)))log_w_given_ham = math.log((self.word_counts['ham'][word] + 1) / (sum(self.word_counts['ham'].values()) + len(self.vocab)))# 把计算到的P(内容|垃圾邮件)和P(内容|正常邮件)加起来spam_score += log_w_given_spamham_score += log_w_given_hamflag_2 += 1# 最后,还要把先验加上去,即P(垃圾邮件)和P(正常邮件)spam_score += self.log_class_priors['spam']ham_score += self.log_class_priors['ham']# 最后进行预测,如果spam_score > ham_score则标志为1,即垃圾邮件if spam_score > ham_score:result.append(1)else:result.append(0)flag_1 += 1return resultMNB = SpamDetector()
MNB.fit(X[100:], y[100:])
pred = MNB.predict(X[:100])
true = y[:100]accuracy = 0
for i in range(100):if pred[i] == true[i]:accuracy += 1
print(accuracy) # 0.98
运行截图:
python:基于朴素贝叶斯算法的垃圾邮件过滤分类相关推荐
- 朴素贝叶斯算法实现垃圾邮件过滤
朴素贝叶斯算法实现垃圾邮件过滤 1.1 题目的主要研究内容 (1)贝叶斯垃圾邮件过滤技术是一种电子邮件过滤的统计学技术,它使用贝叶斯分类来进行垃圾邮件的判别. (2)贝叶斯分类的运作是借着使用标记(一 ...
- 朴素贝叶斯算法实现垃圾邮件过滤(Python3实现)
目录 1.朴素贝叶斯实现垃圾邮件分类的步骤 2.邮件数据 3.代码实现 4.朴素贝叶斯的优点和缺点 1.朴素贝叶斯实现垃圾邮件分类的步骤 (1)收集数据:提供文本文件. (2)准备数据:将文本文件解析 ...
- 机器学习:朴素贝叶斯算法与垃圾邮件过滤
简介 贝叶斯算法是由英国数学家托马斯·贝叶斯提出的,这个算法的提出是为了解决"逆向概率"的问题.首先我们先来解释下正向概率与逆向概率的含义: 正向概率:假设一个箱子里有5个黄色球和 ...
- 《机器学习实战》基于朴素贝叶斯算法实现垃圾邮件分类
import random import sys import numpy as np import pandas as pd from pandas import Series, DataFrame ...
- 【人工智能】机器学习及与智能数据处理Python使用朴素贝叶斯算法对垃圾短信数据集进行分类
朴素贝叶斯算法 输入:样本集合D={(x_1,y_1),(x_2,y_2) (x_m,y_m); 待预测样本x; 样本标记的所有可能取值{c_1,c_2,c_3 c_k}; 样本输入变量X的每个属性变 ...
- 利用朴素贝叶斯算法识别垃圾邮件
转载自:http://blog.csdn.net/wowcplusplus/article/details/25190809 朴素贝叶斯算法是被工业界广泛应用的机器学习算法,它有较强的数学理论基础,在 ...
- 机器学习——朴素贝叶斯算法(垃圾邮件分类)
朴素贝叶斯算法介绍以及垃圾邮件分类实现 1.一些数学知识 2.贝叶斯公式 3.朴素贝叶斯算法 (1)介绍 (2)核心思想 (3)朴素贝叶斯算法 (4)拉普拉斯修正 (5)防溢出策略 (6)一般过程 ( ...
- 朴素贝叶斯算法实现对邮件的分类
通过朴素贝叶斯算法来分类垃圾邮件的PYTHON实现(超易懂) 文章目录 通过朴素贝叶斯算法来分类垃圾邮件的PYTHON实现(超易懂) 前言 一.朴素贝叶斯算法分类垃圾邮件原理 二.python实现 1 ...
- 【机器学习实战】朴素贝叶斯应用之垃圾邮件过滤
1.什么是朴素贝叶斯 2.贝叶斯公式 3.朴素贝叶斯常用的三个模型 4.朴素贝叶斯实现垃圾邮件过滤的步骤 5.垃圾邮件过滤实验: (一).准备收集好的数据集,并下载到本地文件夹 (二).朴素贝叶斯分类 ...
最新文章
- AI产品经理必修——揭开算法的面纱(余弦定理)
- angular动态选择HTML模板,在angular2中动态加载HTML模板
- CC254x--OSAL
- Phonegap在ios7上系统状态栏的问题解决
- 互联网日报 | 小米跻身千亿美金俱乐部;企业微信活跃用户数达1.3亿;蔚来即将发布旗下首款轿车...
- 【zipkin】链路追踪
- 数据库-MySQL-Java数据库连接-JDBC
- 如何制作一款HTML5 RPG游戏引擎——第五篇,人物人物特效
- GitHub 版本控制 项目托管 02 搭建GitHub运行环境
- SQL Server跨库访问
- D1-H哪吒 设置hdmi分辨率
- 电压驻波比,回波损耗,传输损耗,电压反射系数,功率传输,功率反射换算表
- Unity Kinect添加自定义姿势识别
- uva 10041 - Vito's Family
- EduCoder-Web程序设计基础-html5-表格基本结构-第4关:表格中单元格样式的设置
- 拼多多店铺怎么上榜单?
- Openlayers 中code错误编码对应的问题
- Python之Flask框架(一)
- Win10改用microsoft账户登录发生了错误怎么解决?
- 【C语言】如何很好的实现复数类型
热门文章
- wireshark过滤网段和域名
- 1、统计文本中性别为“男”的用户数。2、统计每个省(或直辖市)用户数。
- 科技界“挠头”:困扰科技界可持续发展的难题
- 线程池之 ScheduledThreadPoolExecutor中scheduleAtFixedRate执行定时任务
- Linux下安装Redis教程
- prepare的用法 php,PHP中的操作mysqli的预处理prepare
- 老公总是拒绝沟通怎么办?
- selenium 反爬虫之跳过淘宝滑块验证(2020/8)
- idea中 当你的代码已经提交并且成功push到服务器上去了 但是文件名还是显示蓝色 再次提交还是会自动选中哪些蓝色文件 idea的terminal没有办法输入命令
- 设计模式之装饰者模式Decorator