1、数据集

垃圾邮件识别使用的数据集为Enron-Spam数据集,该数据集是目前在电子邮件相关研究中使用最多的公开数据集,其邮件数据是安然公司(Enron Corporation, 原是世界上最大的综合性天然气和电力公司之一,在北美地区是头号天然气和电力批发销售商)150位高级管理人员的往来邮件。这些邮件在安然公司接受美国联邦能源监管委员会调查时被其公布到网上。

机器学习领域使用Enron-Spam数据集来研究文档分类、词性标注、垃圾邮件识别等,由于Enron-Spam数据集都是真实环境下的真实邮件,非常具有实际意义。

Enron-Spam数据集合如图所示使用不同文件夹区分正常邮件和垃圾邮件。

Enron-Spam数据集对应的网址为:http://www2.aueb.gr/users/ion/data/enron-spam/

2、特征提取

文本特征提取有两个非常重要的模型:

词集模型:单词构成的集合,集合中每个元素都只有一个,也即词集中的每个单词都只有一个

词袋模型:如果一个单词在文档中出现不止一次,并统计其出现的次数(频数)

使用朴素贝叶斯算法,特征提取采用词袋模型。

导入相关的函数库:

>>> from sklearn.feature_extraction.text import CountVectorizer

实例化分词对象:

>>> vectorizer = CountVectorizer(min_df=1)
>>> vectorizer
CountVectorizer(analyzer='word', binary=False, decode_error='strict',dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',lowercase=True, max_df=1.0, max_features=None, min_df=1,ngram_range=(1, 1), preprocessor=None, stop_words=None,strip_accents=None, token_pattern='(?u)\\b\\w\\w+\\b',tokenizer=None, vocabulary=None)

将文本进行词袋处理:

>>> corpus=[
...     'This is the first document.',
...     'This is the second second document.',
...     'And the thrid one.',
...     'Is this the first document?',
... ]
>>> X = vectorizer.fit_transform(corpus)
>>> X
<4x9 sparse matrix of type '<class 'numpy.int64'>'with 19 stored elements in Compressed Sparse Row format>

获取对应的特征名称:

>>> vectorizer.get_feature_names() == (
...     ['and', 'document', 'first', 'is', 'one', 'second',
...       'the', 'third', 'this'])
False

获取词袋数据,至此,我们已经完成词袋化:

>>> X.toarray()
array([[0, 1, 1, 1, 0, 0, 1, 1, 0],[0, 1, 0, 1, 0, 2, 1, 1, 0],[1, 0, 0, 0, 1, 0, 1, 0, 1],[0, 1, 1, 1, 0, 0, 1, 1, 0]], dtype=int64)

3、朴素贝叶斯算法

流程图:

代码:

# -*- coding: utf-8 -*-
from sklearn.feature_extraction.text import CountVectorizer
from tflearn.layers.normalization import local_response_normalization
import os
import numpy as np
import tensorflow as tf
import tflearnmax_features=5000
max_document_length=100
#将整个邮件当成一个字符串处理,其中回车和换行需要过滤掉
def load_one_file(filename):x=""with open(filename,'r',encoding='utf-8',errors='ignore') as f:for line in f:line=line.strip('\n')line=line.strip('\r')x+=linereturn x
#遍历指定文件夹下所有文件,加载数据
def load_files_from_dir(rootdir):x=[]list = os.listdir(rootdir)for i in range(0, len(list)):path = os.path.join(rootdir, list[i])if os.path.isfile(path):v=load_one_file(path)x.append(v)return x
#加载所在的文件夹,正常邮件在ham中,垃圾邮件在spam中。
def load_all_files():ham=[]spam=[]for i in range(1,2):#path="../data/mail/enron%d/ham/" % i#path="C:/Users/Administrator/Downloads/enron%d/ham/" % ipath = "C:/Users/Administrator/PycharmProjects/tensortflow快速入门/tensorflow_study\MNIST_data_bak/enron%d/ham/" % iprint("Load %s" % path)ham+=load_files_from_dir(path)#path="../data/mail/enron%d/spam/" % i#path = "C:/Users/Administrator/Downloads/enron%d/spam/" % ipath = "C:/Users/Administrator/PycharmProjects/tensortflow快速入门/tensorflow_study\MNIST_data_bak/enron%d/spam/" % iprint("Load %s" % path)spam+=load_files_from_dir(path)return ham,spam
#使用词袋模型,向量化邮件样本,ham标记为0,spam标记为1
def get_features_by_wordbag():ham, spam=load_all_files()x=ham+spamy=[0]*len(ham)+[1]*len(spam)vectorizer = CountVectorizer(decode_error='ignore',strip_accents='ascii',max_features=max_features,stop_words='english',max_df=1.0,min_df=1 )print(vectorizer)x=vectorizer.fit_transform(x)x=x.toarray()return x,y
#构建贝叶斯模型
def do_nb_wordbag(x_train, x_test, y_train, y_test):print("NB and wordbag")gnb = GaussianNB()gnb.fit(x_train,y_train)y_pred=gnb.predict(x_test)print(metrics.accuracy_score(y_test, y_pred))print(metrics.confusion_matrix(y_test, y_pred))if __name__ == "__main__":print("Hello spam-mail")print("get_features_by_wordbag")x,y=get_features_by_wordbag()x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.4, random_state = 0)  #测试集比例为40%do_nb_wordbag(x_train, x_test, y_train, y_test)

完整输出结果:

Hello spam-mail
get_features_by_wordbag
Load C:/Users/Administrator/PycharmProjects/tensortflow快速入门/tensorflow_study\MNIST_data_bak/enron1/ham/
Load C:/Users/Administrator/PycharmProjects/tensortflow快速入门/tensorflow_study\MNIST_data_bak/enron1/spam/
CountVectorizer(analyzer='word', binary=False, decode_error='ignore',dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',lowercase=True, max_df=1.0, max_features=5000, min_df=1,ngram_range=(1, 1), preprocessor=None, stop_words='english',strip_accents='ascii', token_pattern='(?u)\\b\\w\\w+\\b',tokenizer=None, vocabulary=None)
NB and wordbag
0.9545674238762687
[[1405   58][  36  570]]

在词袋最大特征数为5000的情况下,整个系统的准确度为95.46%,评价结果准确度如下表所示:

类型名称 相关 不相关
检索到 1405 58
未检索到 36 570

垃圾邮件识别-朴素贝叶斯算法相关推荐

  1. 人工智能知识全面讲解:垃圾邮件克星——朴素贝叶斯算法

    6.1 什么是朴素贝叶斯 6.1.1 一个流量预测的场景 某广告平台接到小明和小李两家服装店的需求,准备在A.B两个线上渠道 投放广告.因为小明和小李两家店都卖女装,属于同一行业相同品类的广告, 所以 ...

  2. 垃圾邮件分类-朴素贝叶斯算法

    目录 一.贝叶斯公式原理 二.使用朴素贝叶斯进行文档分类 三.Python代码实现 一.贝叶斯公式原理 在基础的概率学中,经典的有求独立事件的概率以及求关联时间的概率,贝叶斯所要解决的问题就是在有条件 ...

  3. R语言垃圾邮件分类--朴素贝叶斯(机器学习)

    邮件分类练习–朴素贝叶斯 思路 数据导入 数据处理 构建训练集和测试集 词云展示 数据降维 训练模型 模型测试 提升模型 一.数据导入 文件目录为:C:\Users\kelanj\Documents\ ...

  4. 朴素贝叶斯算法实现对邮件的分类

    通过朴素贝叶斯算法来分类垃圾邮件的PYTHON实现(超易懂) 文章目录 通过朴素贝叶斯算法来分类垃圾邮件的PYTHON实现(超易懂) 前言 一.朴素贝叶斯算法分类垃圾邮件原理 二.python实现 1 ...

  5. 利用朴素贝叶斯算法识别垃圾邮件

    转载自:http://blog.csdn.net/wowcplusplus/article/details/25190809 朴素贝叶斯算法是被工业界广泛应用的机器学习算法,它有较强的数学理论基础,在 ...

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

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

  7. 朴素贝叶斯算法实现垃圾邮件过滤(Python3实现)

    目录 1.朴素贝叶斯实现垃圾邮件分类的步骤 2.邮件数据 3.代码实现 4.朴素贝叶斯的优点和缺点 1.朴素贝叶斯实现垃圾邮件分类的步骤 (1)收集数据:提供文本文件. (2)准备数据:将文本文件解析 ...

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

    简介 贝叶斯算法是由英国数学家托马斯·贝叶斯提出的,这个算法的提出是为了解决"逆向概率"的问题.首先我们先来解释下正向概率与逆向概率的含义: 正向概率:假设一个箱子里有5个黄色球和 ...

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

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

最新文章

  1. 百亿级数据分表后怎么分页查询?
  2. 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动6
  3. 微信公众平台开发 微信JSSDK开发
  4. init/main.c中的void init(void)
  5. OpenNESS 的 5GC 融合实践
  6. 匿名内部类的简单使用
  7. 分类模型的评估方法-F分数(F-Score)
  8. 在 C++ 中实现一个轻量的标记清除 gc 系统
  9. flume-elasticsearch-sink indexName
  10. store内部数据调用 与 view使用store数据
  11. android 移除泛型中元素_最新(2020)Android高级面试知识点干货分享(二)
  12. 26个最好免费下载电子书(Ebooks)的网站
  13. 5G协议流程-UE初始接入、F1启动小区激活
  14. 机房内网电脑时间自动同步器
  15. QUAKE 3源代码评测:架构
  16. 微信第三方登录,主要手机没有安装微信处理
  17. tomcat官网下载任意版本包
  18. 物联网安全研究之二:IoT系统攻击面定义分析
  19. 小米路由器 不显示 连接设备连接到服务器,小米路由器隐藏网络后怎么连接
  20. 丘成桐:人类生活在十维宇宙里

热门文章

  1. linux删除pdf密码
  2. 号称下一代互联网的 Web3.0 到底是个啥?
  3. VMware中设置处理器数量的问题
  4. ROS 2 Eloquent Elusor安装和使用汇总
  5. 用无线网卡做wifi热点共享网络的方法
  6. 快剪辑剪辑视频1920*1080
  7. 【贪心】加工生产调度(双机调度贪心问题)
  8. 基于Java+Springmvc+vue+element员工信息管理系统详细设计
  9. 大写金额换算器iOS版源代码
  10. 提升项目经理谈话能力的十个实用技巧