背景介绍
在日常工作和生活中,我们经常需要处理大量待办事项。传统的手动分类效率低下,而基于机器学习的智能分类系统可以自动识别”工作”、”学习”、”生活”等类别。本文将介绍如何使用Python构建一个带GUI界面的智能分类器,结合朴素贝叶斯算法实现实时分类和增量学习。
技术架构
- 前端:Tkinter图形界面
- 算法:Scikit-learn文本分类
- 持久化:JSON数据存储
- 核心流程:
mermaid
graph TD
A[用户输入] --> B(TF-IDF向量化)
B --> C[朴素贝叶斯分类]
C --> D{置信度>80%?}
D -->|是| E[自动分类]
D -->|否| F[人工确认]
完整实现代码
import tkinter as tk
from tkinter import ttk, messagebox
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
import json
import os
class TodoClassifier:
def __init__(self):
# 初始化训练数据
self.training_data = [
("完成季度报表", "工作"),
("复习线性代数", "学习"),
("超市买牛奶", "生活"),
("看新上映电影", "娱乐")
]
self.load_model()
def load_model(self):
"""加载或训练模型"""
if os.path.exists('model.json'):
with open('model.json') as f:
data = json.load(f)
self.vectorizer = TfidfVectorizer(vocabulary=data['vocab'])
self.clf = MultinomialNB()
self.clf.fit(data['X'], data['y'])
else:
self.train_model()
def train_model(self):
"""训练初始模型"""
texts, labels = zip(*self.training_data)
self.vectorizer = TfidfVectorizer()
X = self.vectorizer.fit_transform(texts)
self.clf = MultinomialNB()
self.clf.fit(X, labels)
def predict(self, text):
"""预测分类"""
vec = self.vectorizer.transform([text])
proba = self.clf.predict_proba(vec)[0]
pred = self.clf.predict(vec)[0]
confidence = max(proba) * 100
return pred, round(confidence, 2)
def add_feedback(self, text, label):
"""增量学习"""
self.training_data.append((text, label))
self.train_model()
self.save_model()
def save_model(self):
"""保存模型"""
vocab = self.vectorizer.get_feature_names_out().tolist()
X, y = zip(*[(self.vectorizer.transform([t]), l)
for t, l in self.training_data])
data = {
'vocab': vocab,
'X': X,
'y': y
}
with open('model.json', 'w') as f:
json.dump(data, f)
class App:
def __init__(self, root):
self.classifier = TodoClassifier()
# GUI布局
root.title("智能待办分类器")
ttk.Label(root, text="输入待办事项:").pack(pady=5)
self.entry = ttk.Entry(root, width=40)
self.entry.pack()
ttk.Button(root, text="分类", command=self.classify).pack(pady=10)
# 结果显示区域
self.result_frame = ttk.LabelFrame(root, text="分类结果")
self.result_frame.pack(fill='x', padx=5, pady=5)
self.category_var = tk.StringVar()
self.confidence_var = tk.StringVar()
ttk.Label(self.result_frame, text="预测类别:").grid(row=0, column=0)
ttk.Label(self.result_frame, textvariable=self.category_var).grid(row=0, column=1)
ttk.Label(self.result_frame, text="置信度:").grid(row=1, column=0)
ttk.Label(self.result_frame, textvariable=self.confidence_var).grid(row=1, column=1)
# 反馈按钮
self.feedback_frame = ttk.Frame(root)
self.feedback_frame.pack(pady=5)
ttk.Label(self.feedback_frame, text="修正为:").pack(side='left')
self.correct_combo = ttk.Combobox(
self.feedback_frame,
values=["工作", "学习", "生活", "娱乐"]
)
self.correct_combo.pack(side='left', padx=5)
ttk.Button(self.feedback_frame, text="提交", command=self.feedback).pack(side='left')
def classify(self):
text = self.entry.get()
if not text:
messagebox.showwarning("提示", "请输入待办事项")
return
category, confidence = self.classifier.predict(text)
self.category_var.set(category)
self.confidence_var.set(f"{confidence}%")
def feedback(self):
corrected = self.correct_combo.get()
if not corrected:
return
self.classifier.add_feedback(
self.entry.get(),
corrected
)
messagebox.showinfo("成功", "模型已更新!")
if __name__ == "__main__":
root = tk.Tk()
app = App(root)
root.mainloop()
关键实现解析
- TF-IDF向量化:
vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(["完成季度报表", "复习线性代数"]) - 朴素贝叶斯分类:
clf = MultinomialNB() clf.fit(X, ["工作", "学习"]) - 增量学习机制:
- 用户修正后重新训练模型
- 自动保存更新后的模型参数
效果演示
输入示例:
"明天要交数学作业"
输出结果:
预测类别: 学习
置信度: 92%
扩展建议
- 增强特征:
python
# 添加时间特征
time_pattern = r"\d{1,2}点" - 多线程处理:
from threading import Thread Thread(target=self.train_model).start() - 部署为Web服务:
from flask import Flask app = Flask(__name__) @app.route('/classify', methods=['POST'])
总结
本项目实现了:
– 文本分类核心算法
– 友好的GUI交互界面
– 持续学习能力
– 本地化数据存储
完整代码已包含所有关键功能,读者可直接运行体验。通过这个项目,可以掌握机器学习在实际应