完整 Django 项目构建指南:垃圾短信识别

2026年01月15日 22:07


阶段 0:环境准备

1. 基础环境要求

安装 Python 3.8+ 版本

2. 安装项目依赖库

打开终端(WindowsCMD / PowerShellMac/LinuxTerminal),执行以下命令:

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

 

阶段 3Django 项目核心配置

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(文本特征提取) + 朴素贝叶斯(分类模型)