目录

得到全量数据集

得到采样数据集

模型训练

全部代码:

结果

已完结


接上: 垃圾邮件分类(trec06c数据集)数据处理-特征提取 https://blog.csdn.net/qq_39321513/article/details/111997173

我是将分词前的文本数据存文件了,这样就得取数据,分词,向量化,输入模型;当然也可以将分词之后的存成文件,一封邮件样本存成一行,然后取数据,向量化,输入模型进行训练。

接下来就对 mailcorous.txt 文件进行操作就可以啦

得到全量数据集

(这个一般不用,内存容易爆满,但我也贴上来了)

def get_train_data(train_path):"""获取数据集----全量数据集"""train_file = open(train_path, encoding='utf8')# 加载训练数据corpus = train_file.readlines() # 列表中的每个元素为一行文本 也就是一封邮件(包含4个特征)split_corpus = []#分词for c in corpus:split_corpus.append(" ".join(jieba.lcut(c)))train_file.close()cv = CountVectorizer(token_pattern=r'(?u)\b\w\w+\b')# 保留两个及以上的特征词X = cv.fit_transform(split_corpus).toarray() # 特征向量# 垃圾邮件是1 正常邮件是0# 垃圾邮件42854封  正常邮件21766封y = [0] * 21766 + [1] * 42854 #构造分类标签return X, y

得到采样数据集

def Sample(train_path, k=3000, random_state=10):# 从原始数据集中各抽取3000个样本  # 垃圾邮件42854封  正常邮件21766封# 设置随机种子random.seed(random_state)# 正常邮件的ham_range = range(0, 21766)ham_rdnum = random.sample(ham_range, k)# 垃圾邮件的spam_range = range(21766, 64620)spam_rdnum = random.sample(spam_range, k)train_file = open(train_path, encoding='utf8')# 加载训练数据corpus = train_file.readlines()  # 列表中的每个元素为一行文本 也就是一封邮件(包含4个特征)split_corpus = []# 分词for i, c in enumerate(corpus):if i in ham_rdnum:split_corpus.append(" ".join(jieba.lcut(c))) # 前k个--正常邮件for i, c in enumerate(corpus):if i in spam_rdnum:split_corpus.append(" ".join(jieba.lcut(c))) # 后k个--垃圾邮件train_file.close()cv = CountVectorizer(token_pattern=r'(?u)\b\w\w+\b')X = cv.fit_transform(split_corpus).toarray()  # 特征向量# 垃圾邮件是1 正常邮件是0y = [0] * k + [1] * k # [0 0  0 0 1 1 1 1 ]return X, y

模型训练

这里我使用SVM训练分类模型

def Model_train_test(X, y):"""模型的训练及验证"""# 切分训练集和测试集x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)# 使用SVM训练分类模型SVM_model = svm.SVC(C=1.0,kernel='sigmoid',gamma='auto',verbose=True)SVM_model.fit(x_train, y_train)# 测试分类性能y_test_predict = SVM_model.predict(x_test)print("准确率: ", SVM_model.score(x_test, y_test))print("分类报告: ", metrics.classification_report(y_test,y_test_predict))print("混淆矩阵: ", metrics.confusion_matrix( y_test, y_test_predict))

主函数

if __name__ == '__main__':train_path = 'trec06c/data/mailcorous.txt'X, y = Sample(train_path, k=3000, random_state=10)Model_train_test(X, y)

全部代码:

import pandas as pd
import jieba
from sklearn.feature_extraction.text import CountVectorizer
import random
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn import metricsdef get_train_data(train_path):"""获取数据集----全量数据集"""train_file = open(train_path, encoding='utf8')# 加载训练数据corpus = train_file.readlines() # 列表中的每个元素为一行文本 也就是一封邮件(包含4个特征)split_corpus = []#分词for c in corpus:split_corpus.append(" ".join(jieba.lcut(c)))train_file.close()cv = CountVectorizer(token_pattern=r'(?u)\b\w\w+\b')X = cv.fit_transform(split_corpus).toarray() # 特征向量# 垃圾邮件是1 正常邮件是0# 垃圾邮件42854封  正常邮件21766封y = [0] * 21766 + [1] * 42854return X, ydef Sample(train_path, k=3000, random_state=10):# 从原始数据集中各抽取3000个样本  # 垃圾邮件42854封  正常邮件21766封# 设置随机种子random.seed(random_state)# 正常邮件的ham_range = range(0, 21766)ham_rdnum = random.sample(ham_range, k)# 垃圾邮件的spam_range = range(21766, 64620)spam_rdnum = random.sample(spam_range, k)train_file = open(train_path, encoding='utf8')# 加载训练数据corpus = train_file.readlines()  # 列表中的每个元素为一行文本 也就是一封邮件(包含4个特征)split_corpus = []# 分词for i, c in enumerate(corpus):if i in ham_rdnum:split_corpus.append(" ".join(jieba.lcut(c))) # 前k个--正常邮件for i, c in enumerate(corpus):if i in spam_rdnum:split_corpus.append(" ".join(jieba.lcut(c))) # 后k个--垃圾邮件train_file.close()cv = CountVectorizer(token_pattern=r'(?u)\b\w\w+\b')X = cv.fit_transform(split_corpus).toarray()  # 特征向量# 垃圾邮件是1 正常邮件是0y = [0] * k + [1] * k # [0 0  0 0 1 1 1 1 ]return X, ydef Model_train_test(X, y):"""模型的训练及验证"""# 切分训练集和测试集x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)# 使用SVM训练分类模型SVM_model = svm.SVC(C=1.0,kernel='sigmoid',gamma='auto',verbose=True)SVM_model.fit(x_train, y_train)# 测试分类性能y_test_predict = SVM_model.predict(x_test)print("准确率: ", SVM_model.score(x_test, y_test))print("分类报告: ", metrics.classification_report(y_test,y_test_predict))print("混淆矩阵: ", metrics.confusion_matrix( y_test, y_test_predict))if __name__ == '__main__':train_path = 'trec06c/data/mailcorous.txt'X, y = Sample(train_path, k=3000, random_state=10)Model_train_test(X, y)

结果

咦 ~~~ 准确率太低了,哈哈效果不好~  只邮件正文的特征准确率都能达到90%以上,我费了劲儿还让准确率降低了 呵呵o(* ̄︶ ̄*)o

这是我的一个课程小作业,就这样吧,啊哈哈哈~ 不看效果,反正整个流程走下来还是学习到很多东西的,感觉挺充实的~

整个过程可调整可优化的地方其实还有很多,但不想再弄了 哈哈~

已完结

欢迎转发~ 评论讨论~ 点赞~

转载请注明出处~

谢谢大家的支持!~ O(∩_∩)O~

垃圾邮件分类(trec06c数据集)特征分词、特征向量化、模型训练相关推荐

  1. python训练opencb分类器_垃圾邮件分类.ipynb

    { "cells": [ { "cell_type": "markdown", "metadata": {}, &quo ...

  2. 垃圾邮件分类(trec06c数据集)数据处理-特征提取

    目录 目标:我要提取 发件人(From).收件人(To).邮件主题(Subject).邮件正文(zhengwen) 作为邮件特征,然后输入到线性分类模型中进行训练 首先是这四个特征提取的部分 发件人 ...

  3. 基于朴素贝叶斯的垃圾邮件分类系统(包含黑白名单和特征库功能)

    目录 一.数据预处理 二.训练 三.测试 四.全部代码及数据集 一.数据预处理 经过常用的数据预处理,如删除停用词等后,统计所有训练集中垃圾邮件的内容,经分词后输出频次,得到垃圾邮件的特征库并画出词云 ...

  4. 朴素贝叶斯(西瓜数据集分类,社区恶意留言分类,垃圾邮件分类,新浪新闻分类),AODE分类器 代码实现

    朴素贝叶斯(西瓜数据集分类,社区恶意留言分类,垃圾邮件分类,新浪新闻分类),AODE分类器 代码实现 以下代码为本人学习后,修改或补充后的代码实现,数据集和原代码请参考:https://github. ...

  5. 朴素贝叶斯分类实验(垃圾邮件分类以及垃圾短信过滤数据集)

    文章目录 贝叶斯公式 先验概率 后验概率 贝叶斯定理 朴素贝叶斯分类器 拉普拉斯修正 防溢出策略 实现垃圾邮件分类 实现垃圾短信过滤(SMS数据集) 实验总结 贝叶斯公式 先验概率 P(cj)P(c_ ...

  6. 机器学习项目-垃圾邮件分类-KNN-SVM-DT-RF-GBDT-Bayes

    文章目录 1.读取文件 2.数据预处理 3.模型训练预测 3.1 KNN 3.2 SVM 3.3 Decision Tree 3.4 Random forest 3.5 GBDT 3.6 Bayes ...

  7. 【人工智能项目】机器学习中文垃圾邮件分类任务

    [人工智能项目]机器学习中文垃圾邮件分类任务 本次采用机器学习模型对中文邮件是否为垃圾邮件进行判别.那么工友们,学起来吧!!! 任务说明 0,商业秘密的秘密性那是维系其商业价值和垄断地位的前提条件之一 ...

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

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

  9. 基于Bayes和SVM的垃圾邮件分类实现(改进版)

    对本文标题进行分词和提取关键词,本文关键词如下:分类.垃圾邮件分类(spam).Bayes.SVM.改进版(体现在哪里?).本文不对Bayes.SVM原理做过多的摄入和解释,主要是使用这些算法做一个基 ...

最新文章

  1. javascript之iframe
  2. input type 属性
  3. 打造智慧城市 让市场成为主角
  4. android工作注意事项
  5. nginx配置wordprocess访问wp-admin自动加斜杠配置实例
  6. soapui返回值类型都有哪些_滚珠丝杠的常用类型都有哪些?
  7. c# 的messageBox的各种用法
  8. doc转docx文件会乱吗_利用python将doc文件转换为docx
  9. Class.forName()方法抛出异常
  10. LC-1186 连续子数组中可删除一个数的最大和
  11. 面向对象的三大特性 - 继承、多态、封装
  12. Lighttpd 启用 HTTPS 并重定向 HTTP 为 HTTPS 访问配置
  13. cactiEZ 使用
  14. 鼠标落在文字上变成小手标志
  15. Qt界面无法切换输入法的解决方法
  16. 洛谷 1938 [USACO09NOV]找工就业Job Hunt
  17. oracle汉字排序
  18. try语句的基本用法
  19. 实战攻防之紫队视角下的实战攻防演习组织
  20. 全球最奢侈的运动品牌中国十大顶级学生儿童平衡自行车品牌排行榜

热门文章

  1. C++11 解决内存泄露问题的智能指针:shared_ptr、unique_ptr、weak_ptr
  2. css行高line-height研究
  3. 勒索软件攻击的第一步就是钓鱼邮件 从概念到防御思路 这里面都有了
  4. 电子西塔琴音源 Orange Tree Samples Evolution Sitardelic Kontakt
  5. timepicker时间选择控件 时:分:秒
  6. Mysql服务端(三)--- 索引及设计建议
  7. maven js css 压缩,使用wro4j和maven在编译期间压缩js和css文件(经典)
  8. AES加密/解密报错,Input length must be multiple of 16 when decrypting with padded cipher
  9. 服务器电源ic芯片,AC-DC适配器电源IC芯片方案选型表
  10. 微商截图王app 好用的截图工具