恶意邮件检测软件:数据处理与机器学习模型
恶意邮件检测软件:数据处理与机器学习模型
简介
本软件使用Python语言开发,利用Tkinter库构建用户界面,实现对恶意邮件数据的处理和分析。软件主要功能包括:
- 数据读取与预处理:从CSV文件读取邮件数据,进行文本清洗和预处理。
- 训练集测试集划分:将数据集划分为训练集和测试集,用于模型训练和评估。
- 朴素贝叶斯模型构建:使用朴素贝叶斯算法构建邮件分类模型。
- 预测:对新邮件进行分类,判断是否为恶意邮件。
使用说明
- 安装所需库:
pip install tkinter pandas numpy matplotlib scikit-learn wordcloud pillow
- 运行程序: 在Python环境中运行程序,软件会自动启动登陆界面。
- 登陆或注册: 输入用户名和密码进行登陆。若未注册,可点击“注册”按钮进行注册。
- 主界面: 登陆成功后进入主界面。通过“文件”菜单可以读取数据集、查看数据集、描述数据集。 通过“数据处理”菜单可以进行数据预处理。 通过“机器学习模型”菜单可以进行训练集测试集划分、模型构建和预测等操作。
代码示例
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}
')
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 = 'EmailText' # 修改为正确的列名
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['EmailText'], 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()
注意事项
- 确保已安装所有必要的库。
- 在使用软件前,请将邮件数据集保存为CSV格式,并将文件命名为“emails.csv”,并确保“emails.csv”与程序文件位于同一目录下。
- 邮件数据集应包含至少两列:
- EmailText:邮件文本内容。
- Label:邮件标签,用于标识邮件是否为恶意邮件(例如,使用“spam”表示恶意邮件)。
- 可以根据实际情况修改程序代码,以适应不同的数据集和需求。
联系方式
如有任何问题或建议,请随时联系我。
版权声明
本软件仅供学习交流使用,不得用于任何商业用途。
原文地址: https://www.cveoy.top/t/topic/oyLl 著作权归作者所有。请勿转载和采集!