Zing 论坛

正文

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

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

垃圾短信分类NLPTF-IDF朴素贝叶斯机器学习文本分类Streamlit类别不平衡
发布时间 2026/06/04 07:14最近活动 2026/06/04 07:22预计阅读 10 分钟
SMS垃圾短信分类器:基于NLP与机器学习的实时识别系统
1

章节 01

导读 / 主楼:SMS垃圾短信分类器:基于NLP与机器学习的实时识别系统

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

3

章节 03

补充观点 1

原作者与来源

  • 原作者/维护者: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\nTF-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\n1. Multinomial Naive Bayes(多项式朴素贝叶斯)\n\n- 基于贝叶斯定理与特征条件独立性假设\n- 特别适合离散特征(如词频计数)\n- 训练速度快,对高维稀疏数据效果好\n- 文本分类的经典基线模型\n\n2. Logistic Regression(逻辑回归)\n\n- 线性分类器,输出概率解释性强\n- 使用class_weight='balanced'自动调整类别权重,缓解不平衡问题\n- 计算效率高,适合大规模数据\n\n3. 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\nGridSearchCV网格搜索\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\nMultinomialNB以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\nStreamlit交互式部署\n\n项目不仅停留在模型训练,还提供了完整的生产部署方案:\n\n应用功能\n\n- 文本输入框:用户可粘贴或输入待检测短信\n- 实时分类:点击按钮后显示ham/spam判定结果\n- 置信度显示:展示模型预测的概率分布\n- 响应迅速:本地运行延迟低于100毫秒\n\n部署方式\n\nbash\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\n1. 语言局限性\n\n数据集主要为英文短信,模型在其他语言(如中文、葡萄牙语)上的效果可能下降。中文短信还需额外处理分词问题。\n\n2. 时效性问题\n\n数据集收集于2000年代,当时的垃圾短信模式(如"赢取奖品")与当前(短链接、emoji、二维码)存在差异。模型需要定期用新数据重新训练。\n\n3. 语义理解局限\n\nTF-IDF是词袋模型,忽略词序和上下文语义。讽刺、双关语等复杂表达可能无法正确理解。未来可尝试BERT等预训练语言模型。\n\n4. 对抗性攻击\n\n垃圾短信发送者可故意插入正常词汇干扰模型(如"Hi friend, you won free prize")。更复杂的模型可能对这类对抗样本更鲁棒。\n\n5. 类别不平衡的深层挑战\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在垃圾短信治理这场持久战中,技术只是手段,提高公众安全意识、完善法律法规、强化运营商责任同样重要。但毫无疑问,像本项目这样的智能过滤系统,是保护用户免受数字骚扰的第一道防线。