垃圾邮件识别,算是一个二分类问题,也是一个相对简单的文本分类问题。

本文数据来自UCI机器学习仓库中的垃圾信息数据集,从http://archive.ics.uci.edu/ml/datasets/sms+spam+collection下载。

文件中每一行由两部分组成,行首是标签 spam/ham(spam 代表垃圾邮件),中间空一格,之后是邮件内容。

以下代码是一个整体,如需复制,将除了函数部分的代码按顺序复制,函数需要放在库和其它代码之间


需要用到的库:

import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB

数据提取

源文件无类型后缀,就当作普通文本文件读取:

sms_data = open('.\SMSSpamCollection', 'r', encoding='utf-8')
x = []
y = []
for line in sms_data.readlines():data = line.split('\t')y.append(data[0])x.append(text_dispose(data[1].split('\n')[0]))
sms_data.close()

数据预处理

上面倒数第二行里面使用了一个自定义函数,把与邮件内容关系不大的单词(停用词等)去除,这样做能减少特征数量但对训练精度没什么影响

因为数据集中的内容为英文,这里我使用 NLTK 库进行处理,如果选择中文数据更推荐使用 jieba 库

def text_dispose(text):# 将每个单词和符号分开sentences = nltk.sent_tokenize(text)words = [word for sent in sentences for word in nltk.word_tokenize(sent)]stops = stopwords.words('english')# 去除停用词words = [word for word in words if words not in stops]words = [words.lower() for words in words if len(words) >= 3]# 词汇化lemmatizer = WordNetLemmatizer()words = [lemmatizer.lemmatize(words) for  words in words]dispose_text = ' '.join(words)return dispose_text

数据拆分及文本特征处理

数据拆分成常见的三七开

特征处理是文本分类的关键部分,因为我们不可能把整个文本内容直接放进模型中训练,所以需要将文本表示为计算机可以识别的、能够代表该文档特征的特征矩阵

# 拆分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)
# 特征处理
vectorizer = TfidfVectorizer(min_df=2, ngram_range=(1,2), stop_words='english', strip_accents='unicode',norm='l2')
X_train = vectorizer.fit_transform(x_train)
X_test = vectorizer.transform(x_test)

TfidfVectorizer 可以把原始文本转化为 TF-IDF 的特征矩阵


选择模型并训练

这里使用朴素贝叶斯分类器

model = MultinomialNB()
model.fit(X_train,y_train)
score = model.score(X_test, y_test)
print(score)

因为 sklearn 的高度封装,只需几行代码就可以使用特定算法。我们不需要写出算法的流程,只要知道其功能即可,所以 sklearn 适用于快速构建模型。当然如果想让算法定制性更强,则需要自行构建

看评分结果:

0.9689181111775254

sklearn垃圾邮件识别相关推荐

  1. 垃圾邮件识别-朴素贝叶斯算法

    1.数据集 垃圾邮件识别使用的数据集为Enron-Spam数据集,该数据集是目前在电子邮件相关研究中使用最多的公开数据集,其邮件数据是安然公司(Enron Corporation, 原是世界上最大的综 ...

  2. python垃圾邮件识别_【Python】垃圾邮件识别

    下载W3Cschool手机App,0基础随时随地学编程 导语 利用简单的机器学习算法实现垃圾邮件识别. 让我们愉快地开始吧~ 相关文件 密码: qa49 数据集源于网络,侵歉删. 开发工具 Pytho ...

  3. python垃圾邮件识别_Python 手写朴素贝叶斯分类器检测垃圾邮件/短信

    自己从头手写一下这些经典的算法,不调用 sklearn 等 API,调一调参数,蛮有收获和启发. 数据集 概要:5572 条短信,13% 的 spam. 选择这个数据集的原因:短信的文本预处理要比 e ...

  4. python垃圾邮件识别_Python贝叶斯推理垃圾邮件分类

    针对贝叶斯垃圾邮件分类,阮一峰大神在多年前曾经写过一篇博客文章,他写的有些观点看起来很简单明了,不过我有点不是很理解其推导过程,虽然最后的结果等价,但是我还是觉得他的那套简单推导,感觉不太容易理解,可 ...

  5. 基于朴素贝叶斯的垃圾邮件识别

    在网上看到很多用朴素贝叶斯算法来实现垃圾邮件分类的,有直接调用库的,也有自己写的.出于对贝叶斯算法的复习,我也想用贝叶斯算法写写邮件识别,做一个简单的识别系统. 一.开发环境 Python3.6,邮件 ...

  6. 使用BloomFilter布隆过滤器解决缓存击穿、垃圾邮件识别、集合判重

    Bloom Filter是一个占用空间很小.效率很高的随机数据结构,它由一个bit数组和一组Hash算法构成.可用于判断一个元素是否在一个集合中,查询效率很高(1-N,最优能逼近于1). 在很多场景下 ...

  7. 机器学习贝叶斯-垃圾邮件识别

    文章目录 一.何为贝叶斯 二.项目实战-垃圾分类 1. 导包 2. 代码示例 3. 测试代码 4.测试结果 一.何为贝叶斯 贝叶斯基本公式:P(A|B)=P(B|A)*P(A)/P(B) 假设事件 B ...

  8. 《Web安全之机器学习入门》笔记:第十五章 15.7与15.8 TensorFlow识别垃圾邮件

    本小节通过识别垃圾邮件,讲解tensorflow通过神经网络DNN在网络安全方向的应用,同时还对比了NB算法的垃圾邮件识别效果. 1.数据集与特征化 本小节使用SpamBase这个入门级垃圾邮件数据集 ...

  9. python发邮件不进入垃圾箱_Python识别垃圾邮件|python3教程|python入门|python教程

    https://www.xin3721.com/eschool/pythonxin3721/ 本文转载至知乎ID:Charles(白露未晞)知乎个人专栏 下载W3Cschool手机App,0基础随时随 ...

  10. Python识别垃圾邮件

    导语 利用简单的机器学习算法实现垃圾邮件识别. 让我们愉快地开始吧~ 相关文件 百度网盘下载链接: https://pan.baidu.com/s/1Hsno4oREMROxWwcC_jYAOA 密码 ...

最新文章

  1. HTTP协议类POST 和GET的区别
  2. 64位openSUSE12.3最完整的安装QQ的方法
  3. linux如何扩展根分区,linux扩展根分区详细步骤
  4. 串口服务器常见异常情况排除方法介绍
  5. Scrapy爬取hupu论坛标题统计数量并生成wordcloud
  6. 远程 mysql error 2003_远程连接MySQL报错ERROR 2003解决办法
  7. Webshell管理工具
  8. 修改root用户文件权限为普通用户
  9. redis 集群扩容方案
  10. 图形 3.6 纹理压缩——包体瘦身术——RGBA与ASTC与ETC2压缩与实际对比体验
  11. 5G大规模MIMO技术
  12. 通过禁用文件夹权限解决微信pc端朋友圈自动播放视频的问题
  13. 11 | 向埃隆·马斯克学习任务分解
  14. burntest Linux参数,限拷机软件IntelBurnTest 2.0
  15. 怎样可以在线将pdf转换成jpg格式
  16. Eclipse安装与使用教程
  17. Java读取txt格式文件打印到控制台
  18. UMLChina建模竞赛第3赛季第8轮:交友辅助系统,赵雅芝
  19. 各进制之间的转换(二、八、十、十六)
  20. 人工智能之搜索策略-A*算法进阶

热门文章

  1. Java new一个对象的过程
  2. skyline在海洋及管线类3DGIS应用综述
  3. ffmpeg 解决视频边播放边加载的问题
  4. 画出传输门、三态门、开路门_传输门和三态门什么区别
  5. 2.3Java NIO
  6. Tbase 源码 (三)
  7. 飞行管理计算机组成,飞行模拟中飞行管理计算机系统CDU组件设计与仿真
  8. Timer的源码分析
  9. 【Elasticsearch】Elasticsearch启动索引恢复流程
  10. 软件项目计划书的内容