基于Python、机器学习的垃圾邮件分类与安全宣传网站-(获取方式访问文末官网)
一、项目简介
该该系统是一个基于Python的邮件分类和安全宣传网站,结合了机器学习和数据处理技术,旨在提升邮件安全意识与管理效率。
在后端,系统采用Flask框架,通过PyMySQL与MySQL数据库交互,实现系统数据的存储与管理。前端则通过LAYUI和JavaScript构建用户友好的交互界面,并使用Echarts进行数据可视化,将复杂的数据以图表形式直观展示给用户。
该网站提供安全信息资讯列表及管理功能,用户进入首页后可浏览与邮件安全相关的资讯内容,并通过安全资讯管理功能进行信息维护和更新。
邮件分类功能基于朴素贝叶斯算法和TF-IDF特征提取,利用Scikit-learn库训练分类模型,将邮件分类为垃圾邮件或正常邮件,并自动存储相关检测日志。系统通过可视化技术展示邮件分类比例、检测趋势和关键词词云,让用户直观了解邮件处理情况。
此外,后台还提供用户管理、检测日志管理和安全信息资讯管理功能,确保系统在提供邮件分类服务的同时具备完善的后台管理能力。
二、开发环境
开发环境 | 版本/工具 |
---|---|
PYTHON | 3.6.8 |
开发工具 | PyCharm |
操作系统 | Windows 10 |
内存要求 | 8GB 以上 |
浏览器 | Firefox (推荐)、Google Chrome (推荐)、Edge |
数据库 | MySQL 8.0 (推荐) |
数据库工具 | Navicat Premium 15 (推荐) |
项目框架 | FLASK、Skite-learn |
三、项目技术
Python: 作为开发语言,用于编写后端逻辑和数据处理。
Flask: Python的Web框架,用于搭建后端数据接口和处理HTTP请求。
PyMySQL: 用于Python与MySQL数据库的交互,实现数据的存储和读取。
Echarts: JavaScript的数据可视化库,将数据转化为图表形式展示给用户。
LAYUI: 轻量级前端UI框架,用于构建用户友好的交互界面。
JavaScript: 用于实现前端交互和处理用户输入。
HTML和CSS: 用于构建前端界面和样式设计。
scikit-learn、pandas和numpy: Python的数据处理和机器学习库,用于数据预测和分析。
AJAX: 用于实现前后端数据交互,异步请求后端数据接口。
MySQL: 数据库管理系统,用于持久化数据。
四、功能结构
该系统分为四个主要模块:机器学习模块、数据可视化分析模块、后台管理模块和客户端模块。
机器学习模块负责邮件分类任务,基于TF-IDF特征提取和朴素贝叶斯算法对邮件进行分类,将邮件判定为垃圾邮件或正常邮件,并支持模型加载与预测。
数据可视化分析模块通过Echarts展示检测流量曲线、邮件分类分布以及关键词词云,帮助用户直观了解系统的检测情况和邮件内容特征。
后台管理模块提供用户登录、注册、后台首页等功能,并支持用户管理、资讯信息管理和检测日志管理,管理员可维护用户数据并管理邮件检测记录和安全资讯内容。
客户端模块为用户提供安全资讯列表、资讯详情查看以及邮件检测输入功能,用户可提交邮件进行检测并查看分类结果。
该系统整合了邮件分类、数据分析和管理功能,全面提升了邮件安全管理的效率。
该系统还配备了相关论文资料,其目录和内容如下所示。
五、运行截图
首页
检测页面
登录注册页面
个人中心
用户管理
资讯管理
日志管理模块页面
检测日志词云分析
检测日志分类分析
检测日志流量分析
六、数据库设计
表名:news
字段名 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
---|---|---|---|---|---|
id | int | None | NO | None | |
title | varchar | 255 | YES | None | 新闻标题 |
content | longtext | 4294967295 | YES | None | 新闻内容 |
user_id | int | None | YES | None | 录入人 |
user_name | varchar | 255 | YES | None | 录入人姓名 |
image_path | varchar | 255 | YES | None | 图片路径 |
time | datetime | None | YES | CURRENT_TIMESTAMP | 时间 |
表名:slog
字段名 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
---|---|---|---|---|---|
id | int | None | NO | None | |
content | longtext | 4294967295 | YES | None | 检测内容 |
result | int | None | YES | None | 检测结果 |
create_time | datetime | None | YES | CURRENT_TIMESTAMP | 检测时间 |
user_name | varchar | 255 | YES | None | 用户昵称 |
user_id | int | None | YES | None | 用户ID |
表名:user
字段名 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
---|---|---|---|---|---|
id | int | None | NO | None | |
name | varchar | 255 | YES | None | 用户名称(供应商名称) |
account | varchar | 255 | YES | None | 用户账号 |
password | varchar | 255 | YES | None | 用户密码 |
company | varchar | 255 | YES | None | 企业名称 |
varchar | 255 | YES | None | 邮箱 | |
type | int | None | YES | None | 0管理员,1普通用户 |
status | int | None | YES | None | 0禁用1启用 |
七、功能实现
机器学习预测核心代码
# 绘制混淆矩阵
def plot_confusion_matrix(cm, classes, title='Confusion matrix', cmap=plt.cm.Blues):
plt.imshow(cm, interpolation='nearest', cmap=cmap)
plt.title(title)
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=0)
plt.yticks(tick_marks, classes)
thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
plt.text(j, i, cm[i, j],
horizontalalignment="center",
color="white" if cm[i, j] > thresh else "black")
plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')
def train():
content_list, label_list = get_train_data() # 获取训练数据
stopword_list = get_stop_word() # 获取停用词
cutWords_list = split_words(content_list, stopword_list) # 分词+停用词处理
counts = calc_tf(cutWords_list) # 统计词频
tfidf_matrix = calc_idf(counts) # 计算概率
train_X, test_X, train_y, test_y = train_test_split(tfidf_matrix, label_list, test_size=0.2,
random_state=0) # 分割数据集
print("训练集:", train_X[0].shape)
mnb = MultinomialNB() # 创建模型
startTime = time.time()
mnb.fit(train_X, train_y) # 训练过程
print('贝叶斯分类器训练用时%.2f秒' % (time.time() - startTime))
sc1 = mnb.score(test_X, test_y) # 在测试集上计算得分
print('准确率为:', sc1)
y_pred1 = mnb.predict(test_X)
joblib.dump(mnb, "./mnb.joblib")
print('召回率为:', recall_score(test_y, y_pred1))
plot_confusion_matrix(confusion_matrix(test_y, y_pred1), [0, 1])
print(test_X[0])
print(y_pred1[0])
plt.show()
创建数据库连接核心代码
def connect(self):
self.conn = pymysql.connect(
host=DB_CONFIG["host"],
port=DB_CONFIG["port"],
user=DB_CONFIG["user"],
passwd=DB_CONFIG["passwd"],
db=DB_CONFIG["db"],
charset=DB_CONFIG["charset"],
cursorclass=pymysql.cursors.DictCursor)
self.cursor = self.conn.cursor()
检测接口核心代码
import jieba
from machine_learning import predict as pt
from service.slog_service import insert_slog
# 简单统计模块
# 连续字母且不成单词
# 连续数字且不具备含义
# 连续标点符号
def isPunctuation(word):
'''判断是否为特殊字符'''
string = "《》?“”:{}+——!~@#¥%……&*()/*-,。‘’;】【、|·,.;'][`\!$^()_"
if word in string:
return True
else:
return False
def isChinese(word):
'''判断是否为中文汉字'''
for i in word:
if word >= u'\u4e00' and word <= u'\u9fa5':
continue
else:
return False
return True
# 文本统计学分析
# number_minlen 字母串长度(最小长度,大于则统计)
# letter_minlen 字母串长度(最小长度,大于则统计)
# alnum_minlen 混合长度(最小长度,大于则统计)
def wordAnalysis(text, number_minlen, letter_minlen, alnum_minlen):
words_arr = jieba.cut(text)
word_num, words_num, punctuation_num, letter_num, number_num, alnum_num, chi_len, num_len, letter_len = 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001
for word in words_arr:
word_len = len(word)
if isChinese(word):
if word_len >= 2:
words_num += 1
else:
word_num += 1
chi_len += len(word)
else:
if isPunctuation(word):
punctuation_num += 1
elif word_len > letter_minlen and word.isalpha():
letter_num += 1
letter_len += word_len
elif word_len > number_minlen and word.isdigit():
number_num += 1
num_len += word_len
elif word_len > alnum_minlen and word.isalnum():
alnum_num += 1
for i in word:
if i.isalpha():
letter_len += 1
else:
num_len += 1
return word_num, words_num, punctuation_num, letter_num, number_num, alnum_num, chi_len, num_len, letter_len
# 预测邮件
def predict(text):
y = pt.predict([text])
y = 1 if len(y) <= 0 else y[0]
insert_slog({'content': text, 'result': y})
return y
八、源码获取
源码、安装教程文档、项目简介文档以及其它相关文档已经上传到是云猿实战官网,可以通过下面官网进行获取项目!
标签:plt,word,优秀论文,Python,下载方式,用户,len,num,邮件 From: https://blog.csdn.net/m0_47220500/article/details/143325099