阶段 0:环境准备
1. 基础环境要求
安装 Python 3.8+ 版本
2. 安装项目依赖库
打开终端(Windows:CMD / PowerShell;Mac/Linux:Terminal),执行以下命令:
Bash pip install django pandas scikit-learn jieba joblib |
3. 创建并进入项目主目录
Bash mkdir sms_project cd sms_project |
阶段 1:创建 Django 项目和应用
1. 创建Django主项目
Bash django-admin startproject sms_project . |
✅ 注意:命令末尾的 . 表示在「当前目录」创建项目,避免生成嵌套文件夹
执行后目录结构
Plain Text sms_project/ manage.py sms_project/ __init__.py settings.py urls.py wsgi.py |
2. 创建功能子应用(垃圾短信识别核心)
Bash python manage.py startapp sms_app |
新增应用后的完整目录结构
Plain Text sms_project/ sms_app/ __init__.py admin.py apps.py models.py tests.py views.py migrations/ manage.py sms_project/ __init__.py settings.py urls.py wsgi.py |
阶段 2:准备模型和训练数据 & 训练模型并保存
1. 数据准备
提前准备好训练数据文件 带标签短信.csv,文件存放固定路径:
Plain Text sms_project/data/带标签短信.csv |
2. 创建模型训练脚本
在项目根目录创建文件 train_model.py,完整代码如下:
Python # train_model.py import pandas as pd import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import accuracy_score, classification_report import joblib
# 读取数据(指定gbk编码适配中文) data = pd.read_csv("data/带标签短信.csv", encoding='utf-8')
# 定义中文分词函数 def chinese_tokenizer(text): return " ".join(jieba.lcut(str(text)))
data['分词文本'] = data['文本内容'].apply(chinese_tokenizer)
# 划分训练集和测试集 8:2 X_train, X_test, y_train, y_test = train_test_split( data['分词文本'], data['是否垃圾短信'], test_size=0.2, random_state=42 )
# TF-IDF文本向量化(最多保留5000个特征词) vectorizer = TfidfVectorizer(max_features=5000) X_train_tfidf = vectorizer.fit_transform(X_train) X_test_tfidf = vectorizer.transform(X_test)
# 训练朴素贝叶斯分类模型 model = MultinomialNB() model.fit(X_train_tfidf, y_train)
# 模型效果评估 y_pred = model.predict(X_test_tfidf) print("准确率:", accuracy_score(y_test, y_pred)) print(classification_report(y_test, y_pred))
# 保存训练好的模型和向量器,供Django调用 joblib.dump(model, "sms_model/sms_model.pkl") joblib.dump(vectorizer, "sms_model/vectorizer.pkl") print("模型和向量器保存完成!") |
3. 执行训练脚本
Bash python train_model.py |
执行成功后生成文件
训练完成后会自动创建模型目录并生成2个模型文件,路径如下:
Plain Text sms_model/ sms_model.pkl vectorizer.pkl |
阶段 3:Django 项目核心配置
1. 注册子应用
修改文件 sms_project/settings.py,在 INSTALLED_APPS 列表末尾新增应用注册:
Python INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 新增:注册垃圾短信识别应用 'sms_app', ] |
2. 创建前端模板文件
① 创建模板目录结构
Plain Text sms_app/templates/ sms_form.html |
② 编写模板文件 sms_form.html 完整代码
HTML <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>垃圾短信识别</title> <style> body { font-family: "微软雅黑", Arial, sans-serif; background-color: #f0f2f5; margin: 0; padding: 0; }
.container { max-width: 700px; margin: 50px auto; padding: 30px; background-color: #fff; border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.1); }
h2 { text-align: center; color: #333; margin-bottom: 25px; }
textarea { width: 100%; padding: 12px; font-size: 16px; border-radius: 8px; border: 1px solid #ccc; resize: vertical; }
button { display: block; width: 100%; background-color: #007bff; color: #fff; padding: 12px; font-size: 16px; border: none; border-radius: 8px; margin-top: 15px; cursor: pointer; transition: background-color 0.3s ease; }
button:hover { background-color: #0056b3; }
.result { margin-top: 30px; padding: 20px; border-radius: 8px; background-color: #f7f9fc; border: 1px solid #e0e0e0; }
.result p { font-size: 16px; line-height: 1.6; margin: 8px 0; }
.label-0 { color: green; font-weight: bold; }
.label-1 { color: red; font-weight: bold; } </style> </head> <body> <div class="container"> <h2>垃圾短信识别系统</h2> <form method="post"> {% csrf_token %} <textarea name="sms_text" rows="4" placeholder="请输入短信内容">{{ sms_text|default:"" }}</textarea> <button type="submit">开始识别</button> </form>
{% if label is not none %} <div class="result"> <p><strong>短信内容:</strong>{{ sms_text }}</p> <p><strong>是否垃圾短信:</strong> {% if label == 1 %} <span class="label-1">垃圾短信</span> {% else %} <span class="label-0">正常短信</span> {% endif %} </p> <p><strong>垃圾短信概率:</strong>{{ proba }}</p> </div> {% endif %} </div> </body> </html>
|
阶段 4:编写视图函数(核心业务逻辑)
修改文件 sms_app/views.py,替换为完整代码,负责加载模型、文本处理、预测逻辑、页面渲染:
Python import joblib import jieba from django.shortcuts import render
# 项目启动时加载训练好的模型和向量器(全局加载,只执行一次) model = joblib.load("sms_model/sms_model.pkl") vectorizer = joblib.load("sms_model/vectorizer.pkl")
# 定义短信预测核心函数 def predict_sms(text): # 对输入文本做中文分词 text_seg = " ".join(jieba.lcut(text)) # 文本向量化转换 text_vec = vectorizer.transform([text_seg]) # 预测标签(0/1) pred_label = model.predict(text_vec)[0] # 预测为垃圾短信的概率 pred_proba = model.predict_proba(text_vec)[0][1] return pred_label, float(pred_proba)
# 定义页面视图函数 def sms_form(request): if request.method == "POST": # 获取前端提交的短信内容 sms_text = request.POST.get("sms_text") # 调用预测函数 label, proba = predict_sms(sms_text) # 返回结果到页面 return render(request, "sms_form.html", { "sms_text": sms_text, "label": label, "proba": round(proba, 3) }) # GET请求,仅渲染空表单 return render(request, "sms_form.html") |
阶段 5:配置路由 URL(页面访问路径)
步骤1:创建应用路由文件
在 sms_app 目录下新建文件 urls.py,写入代码:
Python from django.urls import path from . import views
urlpatterns = [ path('', views.sms_form, name='sms_form'), ] |
步骤2:配置项目总路由
修改文件 sms_project/urls.py,引入子应用路由:
Python from django.contrib import admin from django.urls import path, include
urlpatterns = [ path('admin/', admin.site.urls), path('', include('sms_app.urls')), # 根路径指向sms_app ] |
阶段 6:启动并运行 Django 项目
执行启动命令(按顺序执行)
Bash # 步骤1:初始化Django数据库迁移(首次运行必须执行) python manage.py migrate
# 步骤2:启动Django内置开发服务器 python manage.py runserver |
访问项目
启动成功后,打开浏览器,输入以下地址访问:
http://127.0.0.1:8000/
功能效果
页面展示一个文本输入框,输入短信内容后点击「识别」,会立即展示:
1. 你输入的原始短信内容
2. 预测标签:0(正常短信) / 1(垃圾短信)
3. 垃圾短信概率值(保留3位小数)
✨ 补充说明
• 预测逻辑:0 = 正常短信,1 = 垃圾短信
• 概率值范围:0 ~ 1,数值越接近1,判定为垃圾短信的置信度越高
• 技术栈:Django(Web框架) + jieba(中文分词) + TF-IDF(文本特征提取) + 朴素贝叶斯(分类模型)