1. 项目背景与核心需求
垃圾短信和邮件的泛滥已经成为现代通信中的顽疾。根据行业数据,全球每天约有120亿条垃圾短信被发送,占所有短信流量的45%以上。这些未经请求的信息不仅干扰用户正常通信,还可能包含诈骗、钓鱼等安全威胁。
这个毕业设计项目的核心目标,是构建一个能够自动区分垃圾与正常短信/邮件的分类系统。与传统规则过滤不同,我们采用机器学习方法,通过分析文本特征实现智能识别。这种方案的优势在于:
- 适应性强:可自动学习新型垃圾信息的特征模式
- 维护成本低:无需人工维护庞大的过滤规则库
- 准确率高:实测在标准数据集上能达到95%以上的分类准确率
2. 技术方案选型
2.1 算法对比分析
我们对比了三种主流分类算法在垃圾短信识别任务中的表现:
| 算法类型 | 准确率 | 训练速度 | 可解释性 | 适合场景 |
|---|---|---|---|---|
| 朴素贝叶斯 | 92.3% | 快 | 高 | 小规模数据 |
| 逻辑回归 | 94.7% | 中等 | 中 | 平衡数据集 |
| 随机森林 | 95.2% | 慢 | 低 | 大规模数据 |
最终选择逻辑回归作为基础模型,因其在准确率和训练效率间取得了良好平衡。对于追求更高准确率的场景,可以采用集成学习方法。
2.2 特征工程方案
文本分类的关键在于特征提取。我们采用TF-IDF(词频-逆文档频率)方法将文本转化为数值特征:
python复制from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(
max_features=5000, # 保留最重要的5000个特征词
ngram_range=(1,2), # 同时考虑单个词和双词组合
stop_words='chinese' # 过滤中文停用词
)
X_train = vectorizer.fit_transform(train_texts)
这种方法的优势在于:
- 自动突出文档特异性词汇
- 降低常见词的权重
- 支持n-gram特征捕获上下文信息
3. 数据准备与预处理
3.1 数据集构建
我们收集了包含10,000条标注数据的中文短信数据集,类别分布如下:
- 正常短信:6,200条
- 垃圾短信:3,800条
数据来源包括:
- 公开数据集(如CCERT中文垃圾邮件数据集)
- 模拟生成的营销短信
- 用户自愿提供的匿名短信数据
3.2 数据清洗流程
原始数据需要经过严格清洗:
- 去除特殊字符和表情符号
- 统一全角/半角字符
- 中文分词处理
- 去除停用词
示例清洗代码:
python复制import jieba
import re
def clean_text(text):
# 去除特殊字符
text = re.sub(r'[^\w\s]', '', text)
# 中文分词
words = jieba.cut(text)
# 过滤停用词
return [w for w in words if w not in stopwords]
4. 模型训练与优化
4.1 基础模型实现
使用scikit-learn实现逻辑回归分类器:
python复制from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(
features, labels, test_size=0.2, random_state=42
)
# 模型训练
model = LogisticRegression(
penalty='l2',
C=1.0,
max_iter=1000
)
model.fit(X_train, y_train)
关键参数说明:
- penalty:正则化类型,L2防止过拟合
- C:正则化强度,值越小正则化越强
- max_iter:最大迭代次数
4.2 模型评估指标
我们采用多维度评估指标:
| 指标 | 计算公式 | 本项目结果 |
|---|---|---|
| 准确率 | (TP+TN)/(TP+TN+FP+FN) | 94.7% |
| 精确率 | TP/(TP+FP) | 96.2% |
| 召回率 | TP/(TP+FN) | 93.5% |
| F1值 | 2*(精确率*召回率)/(精确率+召回率) | 94.8% |
提示:在实际应用中,通常需要根据业务需求调整评估重点。如反诈骗场景更关注召回率(不漏判),而普通过滤则更看重精确率(不错判)。
5. 部署与应用实践
5.1 实时分类服务
将训练好的模型部署为REST API服务:
python复制from flask import Flask, request, jsonify
import pickle
app = Flask(__name__)
# 加载模型
with open('spam_model.pkl', 'rb') as f:
model = pickle.load(f)
@app.route('/predict', methods=['POST'])
def predict():
data = request.json
text = data['text']
# 特征提取
features = vectorizer.transform([text])
# 预测
proba = model.predict_proba(features)[0]
return jsonify({
'is_spam': proba[0] > 0.5,
'spam_probability': float(proba[0])
})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
5.2 移动端集成方案
在Android应用中集成分类功能:
- 将模型转换为TensorFlow Lite格式
- 开发原生推理模块
- 实现本地特征提取流水线
- 添加用户反馈机制持续优化模型
6. 常见问题与解决方案
6.1 样本不平衡问题
当垃圾短信样本远少于正常短信时,可以:
- 采用过采样(SMOTE)或欠采样技术
- 使用类别权重参数
python复制model = LogisticRegression(class_weight='balanced')
6.2 新词识别问题
对于未登录词(如新型诈骗术语):
- 定期更新特征词典
- 添加字符级n-gram特征
- 结合预训练词向量
6.3 对抗样本防御
针对刻意规避检测的垃圾短信:
- 引入对抗训练
- 使用深度学习模型(如LSTM)捕捉更深层特征
- 结合规则引擎进行二次验证
7. 进阶优化方向
对于希望进一步提升性能的开发者,可以考虑:
- 模型融合:
- 将逻辑回归与朴素贝叶斯结果加权平均
- 使用stacking集成多个基模型
- 深度学习方案:
python复制from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense
model = Sequential([
Embedding(vocab_size, 100),
LSTM(128),
Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy', optimizer='adam')
- 在线学习:
- 实现模型的热更新机制
- 设计用户反馈闭环系统
在实际部署中发现,结合简单规则(如包含"退订回T"等关键词)可以显著提升短文本的分类准确率。同时建议定期(如每周)用新数据重新训练模型,以应对垃圾短信内容的快速演变。
