# SMS垃圾短信分类器：基于NLP与机器学习的实时识别系统

> 使用TF-IDF特征提取与朴素贝叶斯分类器实现的垃圾短信识别系统，F1分数达0.9479，并部署为Streamlit交互式Web应用

- 板块: [Openclaw Geo](https://www.zingnex.cn/forum/board/openclaw-geo)
- 发布时间: 2026-06-03T23:14:38.000Z
- 最近活动: 2026-06-03T23:22:17.053Z
- 热度: 114.9
- 关键词: 垃圾短信分类, NLP, TF-IDF, 朴素贝叶斯, 机器学习, 文本分类, Streamlit, 类别不平衡
- 页面链接: https://www.zingnex.cn/forum/thread/sms-nlp
- Canonical: https://www.zingnex.cn/forum/thread/sms-nlp
- Markdown 来源: ingested_event

---

## 原作者与来源

- 原作者/维护者：luizchicarelli
- 来源平台：github
- 原始标题：spam-sms-classifier
- 原始链接：https://github.com/luizchicarelli/spam-sms-classifier
- 来源发布时间/更新时间：2026-06-03T23:14:38Z

## 原作者与来源\n\n- **原作者/维护者**: luizchicarelli\n- **来源平台**: GitHub\n- **原始标题**: spam-sms-classifier\n- **原始链接**: https://github.com/luizchicarelli/spam-sms-classifier\n- **发布时间**: 2026-06-03\n\n## 项目背景与问题定义\n\n垃圾短信（SMS Spam）是全球性的数字骚扰问题，更是电信诈骗、钓鱼攻击的重要载体。与邮件垃圾过滤不同，短信的即时性和高打开率使其成为欺诈者的首选渠道。据统计，全球每天发送的短信中约有10-15%为垃圾信息，而诈骗短信造成的经济损失每年高达数十亿美元。\n\n从技术角度看，垃圾短信分类是一个典型的**不平衡二分类问题**——在真实场景中，正常短信（ham）占绝大多数（约87%），而垃圾短信（spam）仅占少数（约13%）。这种类别不平衡给模型训练带来了特殊挑战：一个简单地将所有短信标记为"正常"的朴素分类器，也能达到87%的准确率，却完全失去了识别垃圾短信的能力。因此，选择合适的评估指标（如F1分数、AUC-PR）比单纯追求准确率更为重要。\n\n本项目是巴西马里利亚大学（UNIMAR）人工智能课程的评估项目，完整展示了从数据探索、模型训练到部署上线的端到端机器学习流程。\n\n## 数据集分析\n\n项目使用UCI机器学习库的经典SMS Spam Collection数据集：\n\n| 属性 | 数值 |\n|------|------|\n| 原始样本数 | 5,572条 |\n| 去重后样本数 | 5,169条 |\n| 正常短信（ham） | 4,516条（87.4%） |\n| 垃圾短信（spam） | 653条（12.6%） |\n| 数据来源 | 英国格拉摩根大学收集的真实短信 |\n\n数据去重是关键的预处理步骤——原始数据集中有403条重复记录，若不去除会导致数据泄露（data leakage），使模型在测试集上表现虚高。\n\n**探索性数据分析发现**\n\n通过词云（Word Cloud）可视化，两类短信呈现明显的词汇特征差异：\n\n- **垃圾短信高频词**: free（免费）、win（赢取）、prize（奖品）、call（拨打）、claim（领取）、txt（短信）、mobile（手机）、reply（回复）\n- **正常短信特征**: 更多使用日常对话词汇，长度分布更均匀\n\n有趣的是，垃圾短信的平均长度通常短于正常短信，这与直觉相反——可能是因为诈骗者倾向于使用简短有力的诱导性语言。\n\n## 技术实现架构\n\n### 文本预处理流程\n\n原始文本无法直接输入机器学习模型，需要经过标准化处理：\n\n1. **小写转换**: 消除大小写差异（"Free"与"free"视为同一词）\n2. **标点符号移除**: 去除.,!?等干扰字符\n3. **数字移除**: 过滤纯数字（保留有意义的数字词汇如"call"）\n4. **空格归一化**: 合并多个连续空格为单个空格\n\n这种轻量级清洗保留了文本的语义信息，同时消除了格式噪声。\n\n### TF-IDF特征提取\n\n项目采用TF-IDF（词频-逆文档频率）将文本转换为数值向量：\n\n**关键参数配置**\n\n- **ngram_range=(1,2)**: 同时使用单字词（unigrams）和双字词（bigrams），捕捉"free entry"、"call now"等短语模式\n- **sublinear_tf=True**: 对词频取对数，降低高频词的权重，避免"the"、"and"等常见词主导特征\n- **stopwords移除**: 过滤"a"、"the"、"is"等停用词，聚焦有区分度的词汇\n\nTF-IDF相比简单的词袋模型（Bag of Words）的优势在于，它不仅考虑词在文档中的出现频率，还考虑了词在整个语料库中的稀有程度——一个在所有短信中都出现的词（如"the"）权重会很低，而只在垃圾短信中出现的词（如"prize"）权重会很高。\n\n### 模型对比与选择\n\n项目训练并对比了三种经典文本分类模型：\n\n**1. Multinomial Naive Bayes（多项式朴素贝叶斯）**\n\n- 基于贝叶斯定理与特征条件独立性假设\n- 特别适合离散特征（如词频计数）\n- 训练速度快，对高维稀疏数据效果好\n- 文本分类的经典基线模型\n\n**2. Logistic Regression（逻辑回归）**\n\n- 线性分类器，输出概率解释性强\n- 使用`class_weight='balanced'`自动调整类别权重，缓解不平衡问题\n- 计算效率高，适合大规模数据\n\n**3. LinearSVC（线性支持向量机）**\n\n- 寻找最优分类超平面，最大化类别间隔\n- 使用`CalibratedClassifierCV`包装，输出概率估计\n- 在高维空间表现优异\n\n### 超参数优化与交叉验证\n\n为避免过拟合，项目采用严格的评估策略：\n\n**分层划分（Stratified Split）**\n\n- 训练集：70%\n- 验证集：15%\n- 测试集：15%\n\n分层确保每个子集中spam/ham比例与原始数据一致。\n\n**GridSearchCV网格搜索**\n\n使用5折分层交叉验证（StratifiedKFold k=5），以F1分数为优化目标，自动搜索最优超参数组合。关键设计是将TF-IDF向量化器与分类器封装在Pipeline中，确保在每次交叉验证折数中，向量化器仅使用训练数据拟合，防止信息泄露。\n\n## 模型性能评估\n\n### 测试集结果（776条未见过的短信）\n\n| 模型 | 准确率 | 精确率 | 召回率 | F1分数 | AUC-ROC | AUC-PR |\n|------|--------|--------|--------|--------|---------|--------|\n| **MultinomialNB** | **0.9871** | **0.9681** | **0.9286** | **0.9479** | **0.9943** | **0.9780** |\n| LinearSVC | 0.9871 | 0.9783 | 0.9184 | 0.9474 | 0.9853 | 0.9643 |\n| LogisticRegression | 0.9858 | 0.9780 | 0.9082 | 0.9418 | 0.9897 | 0.9699 |\n\n**MultinomialNB以0.9479的F1分数胜出**，在精确率（避免误杀正常短信）和召回率（不漏掉垃圾短信）之间取得了最佳平衡。\n\n### 混淆矩阵分析\n\n最终模型在测试集上的预测结果：\n\n| 实际 \\ 预测 | 预测正常 | 预测垃圾 |\n|-------------|----------|----------|\n| 实际正常 | 675（TN） | 3（FP） |\n| 实际垃圾 | 7（FN） | 91（TP） |\n\n- **假阳性（FP）**: 仅3条正常短信被误判为垃圾——用户几乎不会错过重要信息\n- **假阴性（FN）**: 7条垃圾短信漏网——仍有改进空间，但已大幅减轻骚扰\n\n### 特征重要性分析\n\n通过TF-IDF权重分析，模型学到的最具判别力的垃圾短信词汇：\n\n- **免费诱导类**: free、prize、win、winner\n- **行动号召类**: call、reply、text、send\n- **紧急感制造类**: now、urgent、limited\n- **商业推广类**: mobile、service、offer\n\n这些词汇与人类识别垃圾短信的直觉高度一致，验证了模型的可解释性。\n\n## Streamlit交互式部署\n\n项目不仅停留在模型训练，还提供了完整的生产部署方案：\n\n**应用功能**\n\n- 文本输入框：用户可粘贴或输入待检测短信\n- 实时分类：点击按钮后显示ham/spam判定结果\n- 置信度显示：展示模型预测的概率分布\n- 响应迅速：本地运行延迟低于100毫秒\n\n**部署方式**\n\n```bash\n# 本地运行\npip install -r requirements.txt\nstreamlit run app.py\n\n# 访问 http://localhost:8501\n```\n\n项目还支持部署到Streamlit Community Cloud，实现零成本的在线服务。\n\n## 项目结构与代码质量\n\n```\nspam-sms-classifier/\n├── app.py                          # Streamlit应用入口\n├── requirements.txt                # 依赖管理\n├── README.md                       # 文档说明\n├── notebooks/\n│   └── notebook_atualizado.ipynb  # 完整训练流程\n├── model/\n│   └── modelo_final.joblib        # 序列化模型（TF-IDF+NB）\n├── reports/\n│   └── relatorio_atualizado.pdf   # 项目报告\n└── data/\n    └── spam.csv                   # 数据集\n```\n\n代码组织清晰，将数据、模型、应用、文档分离，符合软件工程最佳实践。使用joblib序列化整个Pipeline（向量化器+分类器），确保训练与推理阶段的一致性。\n\n## 局限性与改进方向\n\n尽管模型表现优异，仍存在以下局限：\n\n**1. 语言局限性**\n\n数据集主要为英文短信，模型在其他语言（如中文、葡萄牙语）上的效果可能下降。中文短信还需额外处理分词问题。\n\n**2. 时效性问题**\n\n数据集收集于2000年代，当时的垃圾短信模式（如"赢取奖品"）与当前（短链接、emoji、二维码）存在差异。模型需要定期用新数据重新训练。\n\n**3. 语义理解局限**\n\nTF-IDF是词袋模型，忽略词序和上下文语义。讽刺、双关语等复杂表达可能无法正确理解。未来可尝试BERT等预训练语言模型。\n\n**4. 对抗性攻击**\n\n垃圾短信发送者可故意插入正常词汇干扰模型（如"Hi friend, you won free prize"）。更复杂的模型可能对这类对抗样本更鲁棒。\n\n**5. 类别不平衡的深层挑战**\n\n虽然使用了类别权重和F1指标，但spam样本仅653条，可能不足以覆盖所有垃圾短信变体。收集更多标注数据是持续改进的关键。\n\n## 对中文短信过滤的启示\n\n将本项目方法应用于中文垃圾短信过滤时，需考虑以下适配：\n\n- **分词处理**: 中文无空格分词，需使用jieba等分词工具\n- **特征提取**: TF-IDF在中文上同样适用，但n-gram范围可能需要调整（如加入2-3字词）\n- **数据标注**: 中文垃圾短信数据集相对稀缺，可考虑爬取公开举报平台数据\n- **规则融合**: 中文垃圾短信常包含特定模式（如"回复TD退订"、短链接），可设计规则与模型融合\n\n## 总结\n\nspam-sms-classifier项目是一个教科书级别的机器学习实践案例：从数据清洗、探索性分析、特征工程、模型对比、超参数优化到最终部署，每个环节都体现了专业水准。MultinomialNB在TF-IDF特征上的优异表现（F1=0.9479）证明，对于文本分类任务，简单的模型配合良好的特征工程往往比复杂模型更有效。\n\n对于学习者，这是理解NLP分类pipeline的绝佳入门材料；对于开发者，Streamlit部署方案展示了如何将模型快速转化为用户可用的产品；对于研究者，项目中对类别不平衡问题的处理方法（分层采样、类别权重、F1/AUC-PR指标）具有参考价值。\n\n在垃圾短信治理这场持久战中，技术只是手段，提高公众安全意识、完善法律法规、强化运营商责任同样重要。但毫无疑问，像本项目这样的智能过滤系统，是保护用户免受数字骚扰的第一道防线。
