恶意邮件检测系统 - 基于朴素贝叶斯算法的邮件分类
{ "title": "恶意邮件检测", "description": "基于朴素贝叶斯算法的恶意邮件检测系统,提供用户界面进行操作。", "keywords": "恶意邮件检测, 朴素贝叶斯, 邮件分类, Python, Tkinter, 数据处理, 机器学习", "content": "import tkinter as tk from tkinter import messagebox from tkinter import filedialog from tkinter import ttk from PIL import Image, ImageTk from wordcloud import WordCloud import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import accuracy_score import os
创建主窗口
root = tk.Tk() root.title('恶意邮件检测') root.geometry('600x400')
data = None model = None X_train = None X_test = None Y_train = None Y_test = None
检查是否用户已注册
def check_user(username): with open('users.txt', 'r') as f: for line in f: if line.strip().split(':')[0] == username: return True return False
登陆页面
def login_page(): # 清空页面 for widget in root.winfo_children(): widget.destroy()
# 设置背景图片
bg_image = Image.open('sjkx.png')
bg_image = bg_image.resize((600, 400), Image.ANTIALIAS)
bg_image = ImageTk.PhotoImage(bg_image)
tk.Label(root, image=bg_image).place(x=0, y=0, relwidth=1, relheight=1)
# 创建登陆页面
tk.Label(root, text='用户名:').grid(row=0, column=1, padx=10, pady=10)
username_entry = tk.Entry(root)
username_entry.grid(row=0, column=2, padx=10, pady=10)
tk.Label(root, text='密码:').grid(row=1, column=1, padx=10, pady=10)
password_entry = tk.Entry(root, show='*')
password_entry.grid(row=1, column=2, padx=10, pady=10)
# 点击登录按钮对应执行命令
def login():
username = username_entry.get()
password = password_entry.get()
if not username or not password:
messagebox.showerror('错误', '请同时输入账户和密码')
return
with open('users.txt', 'r') as f:
for line in f:
if line.strip().split(':')[0] == username:
if line.strip().split(':')[1] == password:
messagebox.showinfo('成功', '登陆成功')
# 登录成功,跳转到主界面
main_page()
return
else:
messagebox.showerror('错误', '密码错误')
return
messagebox.showerror('错误', '账户名未注册')
tk.Button(root, text='登陆', command=login).grid(row=2, column=0, columnspan=2, padx=10, pady=10)
tk.Button(root, text='注册', command=register_page).grid(row=2, column=2, columnspan=2, padx=10, pady=10)
root.mainloop()
注册页面
def register_page(): # 点击注册按钮对应执行命令 def register(): username = username_entry.get() password = password_entry.get() if not username or not password: messagebox.showerror('错误', '请同时输入账号密码') return if check_user(username): messagebox.showerror('错误', '账户名已存在.') return if password_entry.get() != confirm_entry.get(): messagebox.showerror('错误', '密码不一致!') else: with open('users.txt', 'a') as f: f.write(f'{username}:{password}\n') messagebox.showinfo('提示', '注册成功!') login_page()
# 清空页面
for widget in root.winfo_children():
widget.destroy()
# 创建注册页面
tk.Label(root, text='用户名:').grid(row=0, column=0, padx=10, pady=10)
username_entry = tk.Entry(root)
username_entry.grid(row=0, column=1, padx=10, pady=10)
tk.Label(root, text='密码:').grid(row=1, column=0, padx=10, pady=10)
password_entry = tk.Entry(root, show='*')
password_entry.grid(row=1, column=1, padx=10, pady=10)
tk.Label(root, text='确认密码:').grid(row=2, column=0, padx=10, pady=10)
confirm_entry = tk.Entry(root, show='*')
confirm_entry.grid(row=2, column=1, padx=10, pady=10)
tk.Button(root, text='注册', command=register).grid(row=3, column=0, columnspan=2, padx=10, pady=10)
主页面
def main_page(): # 清空页面 for widget in root.winfo_children(): widget.destroy()
# 设置背景图片
bg_image = Image.open('sjkx.png')
bg_image = bg_image.resize((600, 400), Image.ANTIALIAS)
bg_image = ImageTk.PhotoImage(bg_image)
tk.Label(root, image=bg_image).place(x=0, y=0, relwidth=1, relheight=1)
# 创建菜单栏
menubar = tk.Menu(root)
file_menu = tk.Menu(menubar, tearoff=0)
file_menu.add_command(label='读取数据集', command=read_data)
file_menu.add_command(label='查看数据集', command=show_data)
file_menu.add_command(label='描述数据集', command=describe_data)
file_menu.add_command(label='退出', command=root.destroy)
menubar.add_cascade(label='文件', menu=file_menu)
process_menu = tk.Menu(menubar, tearoff=0)
process_menu.add_command(label='预处理', command=preprocess)
menubar.add_cascade(label='数据处理', menu=process_menu)
model_menu = tk.Menu(menubar, tearoff=0)
model_menu.add_command(label='划分训练集测试集', command=train_test)
model_menu.add_command(label='构建朴素贝叶斯模型')
model_menu.add_command(label='对数据进行预测')
menubar.add_cascade(label='机器学习模型', menu=model_menu)
root.config(menu=menubar)
# 创建欢迎信息
tk.Label(root, text='欢迎使用数据处理软件!', font=('Arial', 20)).pack(pady=50)
tk.Label(root, text='请先点击文件选择数据集', font=('Arial', 15)).pack(pady=50)
root.mainloop()
def read_data(): global data
# 弹出文件选择对话框
file_path = filedialog.askopenfilename()
if file_path:
try:
# 读取数据
data = pd.read_csv(file_path, encoding='ISO-8859-1')
messagebox.showinfo('提示', '数据读取成功!')
except:
messagebox.showerror('错误', '数据读取失败!')
def show_data(): global data # 创建 tkinter 窗口 window = tk.Tk() window.title('恶意邮件检测--查看数据集')
# 创建 ttk 表格控件
table = ttk.Treeview(window)
# 设置表格列名
table['columns'] = list(data.columns)
for col in table['columns']:
# 设置每一列的宽度和对齐方式
table.column(col, width=200, anchor='center')
# 设置表头的标题
table.heading(col, text=col)
# 插入数据集中的每一行数据
for i, row in data.iterrows():
table.insert('', 'end', text=i, values=list(row))
# 显示表格
table.pack(expand=True, fill='both')
def describe_data(): global data # 创建 tkinter 窗口 window = tk.Tk() window.title('恶意邮件检测--描述数据集')
# 创建一个Text小部件
text = tk.Text(window)
text.pack()
# 将数据框描述转换为字符串格式
table_str = str(data.describe())
text.insert(tk.END, table_str)
def preprocess():
global data
column = 'text'
data[column] = data[column].str.lower() # 转为小写
data[column] = data[column].str.replace('[^a-zA-Z ]', '') # 只保留字母和空格
data[column] = data[column].str.strip() # 去除多余空格
messagebox.showinfo('提示:', '数据预处理成功!')
def train_test(): def train_test_select(): global X_train,X_test,Y_train,Y_test select = float(train_test_entry.get())
if select <= 0 or select >= 1:
messagebox.showerror('错误', '请确保输入值大于0小于1')
return
labels = np.array([1 if 'spam' in filename else 0 for filename in os.listdir('.') if filename.endswith('.txt')])
X_train, X_test, Y_train, Y_test = train_test_split(data['text'].tolist(), labels, test_size=select, random_state=42)
messagebox.showinfo('提示', '训练集测试集划分成功!')
train_test_desk.destroy()
global data
if data is None:
messagebox.showerror('错误', '请先读取数据!')
return
train_test_desk = tk.Tk()
train_test_desk.title('恶意邮件检测--划分训练集测试集')
train_test_desk.geometry('350x150')
tk.Label(train_test_desk, text='设置测试集占比').grid(row=0, column=0)
train_test_entry = tk.Entry(train_test_desk)
train_test_entry.grid(row=0, column=1)
tk.Button(train_test_desk, text='划分训练集测试集', command=train_test_select).grid(row=1, column=0, columnspan=2)
默认显示登陆页面
login_page()
root.mainloop()
原文地址: https://www.cveoy.top/t/topic/oyLF 著作权归作者所有。请勿转载和采集!