Python 垃圾邮件检测器 GUI 应用 - 使用 Tkinter 和机器学习
import tkinter as tk
from tkinter import messagebox
import mail_util as mu
import re
target_names = ['正常邮件', '垃圾邮件'] # 正常、 垃圾
class SpamDetectorApp:
def __init__(self):
self.root = tk.Tk()
self.root.geometry('800x600+500+100')
self.root.title('Spam Detector')
# 创建登录页面
self.login_frame = tk.Frame(self.root)
self.username_label = tk.Label(self.login_frame, text='Username:')
self.username_entry = tk.Entry(self.login_frame)
self.password_label = tk.Label(self.login_frame, text='Password:')
self.password_entry = tk.Entry(self.login_frame, show='*')
self.login_button = tk.Button(self.login_frame, text='Login', command=self.login)
self.username_label.pack()
self.username_entry.pack()
self.password_label.pack()
self.password_entry.pack()
self.login_button.pack()
self.login_frame.pack()
# 创建垃圾邮件检测页面
self.spam_detector_frame = tk.Frame(self.root)
self.email_text_label = tk.Label(self.spam_detector_frame, text='Email Text:')
self.email_text_entry = tk.Text(self.spam_detector_frame, width=100, height=30)
self.detect_button = tk.Button(self.spam_detector_frame, text='Detect', command=self.detect_spam)
self.result_label = tk.Label(self.spam_detector_frame, text='')
self.email_text_label.pack()
self.email_text_entry.pack()
self.detect_button.pack()
self.result_label.pack()
self.spam_detector_frame.pack()
def login(self):
username = self.username_entry.get()
password = self.password_entry.get()
# 在这里添加你的登录逻辑
# 检查用户名和密码是否有效
if username == 'admin' and password == 'password':
self.login_frame.pack_forget() # 隐藏登录页面
self.spam_detector_frame.pack() # 显示垃圾邮件检测页面
self.clf = mu.get_classifier()
else:
messagebox.showerror('Error', 'Invalid username or password.')
def detect_spam(self):
email_text = self.email_text_entry.get('1.0', tk.END)
# 在这里添加你的垃圾邮件检测逻辑
# 根据邮件文本判断是否是垃圾邮件
if email_text.strip() == '':
messagebox.showwarning('Warning', 'Please enter email text.')
elif self.is_spam(email_text) & self.is_spam2(email_text):
self.result_label.config(background='red')
self.result_label.config(text='垃圾邮件')
else:
self.result_label.config(background='green')
self.result_label.config(text='正常邮件')
def is_spam2(self, email_text):
pattern = re.compile(r'<[^>]+>', re.S)
content = pattern.sub('', email_text)
content = content.replace('>', '')
prediction = self.clf.predict([email_text])[0]
return prediction
def is_spam(self, email_text):
# 在这里添加垃圾邮件的特征检测逻辑
# 判断邮件文本是否包含垃圾邮件的特征
if 'anonymous' in email_text.lower() or \
'generic greeting' in email_text.lower() or \
'bulk sending' in email_text.lower() or \
'advertisement' in email_text.lower() :
return True
return False
def run(self):
self.root.mainloop()
if __name__ == '__main__':
app = SpamDetectorApp()
app.run()
优点:
- 面向对象的编程风格: 使用类
SpamDetectorApp来组织代码,便于代码的维护和拓展。 - GUI 界面: 使用 Tkinter 库创建图形用户界面,易于用户使用。
- 正则表达式: 使用正则表达式处理邮件文本,提高代码可读性和可维护性。
- 机器学习: 使用
mail_util模块中的机器学习模型进行垃圾邮件检测,提高检测准确性。
不足:
- 登录逻辑简单: 登录逻辑仅使用简单的用户名和密码验证,安全性较低。建议增加更复杂的验证方式,例如密码哈希、验证码等。
- 特征检测逻辑简单:
is_spam函数只检测了几个简单的特征,准确性有限。建议增加更多特征判断,例如邮件主题、发件人地址、邮件内容的词频等。 - GUI 布局简单: 界面布局比较简单,缺乏交互和美化。建议增加更多的交互元素,例如进度条、状态提示等,并使用更美观的主题和布局。
- 缺乏异常处理: 代码中没有进行异常处理,可能会导致程序崩溃或异常退出。建议使用
try...except语句捕获异常,并进行相应的处理。
优化建议:
- 改进登录逻辑: 使用更安全的验证方式,例如密码哈希、验证码等。
- 增强特征检测: 添加更多特征判断,例如邮件主题、发件人地址、邮件内容的词频等。
- 优化 GUI 布局: 使用更美观的主题和布局,增加更多的交互元素,提升用户体验。
- 添加异常处理: 使用
try...except语句捕获异常,并进行相应的处理。 - 增加测试用例: 编写测试用例,对代码进行测试,确保代码的正确性和稳定性。
代码改进示例:
# ... 其他代码 ...
def is_spam(self, email_text):
# 添加更多特征判断
if 'anonymous' in email_text.lower() or \
'generic greeting' in email_text.lower() or \
'bulk sending' in email_text.lower() or \
'advertisement' in email_text.lower() or \
'free' in email_text.lower() or \
'money' in email_text.lower() or \
'discount' in email_text.lower() or \
'click here' in email_text.lower():
return True
return False
def run(self):
try:
self.root.mainloop()
except Exception as e:
messagebox.showerror('Error', f'An error occurred: {e}')
# ... 其他代码 ...
通过以上优化,可以提升垃圾邮件检测器的准确性、安全性、用户体验以及代码的健壮性。
原文地址: https://www.cveoy.top/t/topic/oD1i 著作权归作者所有。请勿转载和采集!