sms-castle-walls/README.md
e081ed9329 fix: 更新pandera导入路径并修改贡献指南
更新pandera的导入路径以使用pandas子模块,同时根据实际贡献情况修改README中的贡献指南内容
2026-01-15 13:27:15 +08:00

202 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 垃圾短信分类系统
## 项目概述
本项目是一个基于**传统机器学习 + LLM + Agent**的垃圾短信分类系统,旨在实现可落地的智能预测与行动建议。系统使用传统机器学习完成可量化的垃圾短信预测任务,再用 LLM + Agent 把预测结果变成可执行的决策/建议,并保证输出结构化、可追溯、可复现。
## 技术栈
| 组件 | 技术 | 版本要求 |
|------|------|----------|
| 项目管理 | uv | 最新版 |
| 数据处理 | polars + pandas | polars>=0.20.0, pandas>=2.2.0 |
| 数据验证 | pandera | >=0.18.0 |
| 机器学习 | scikit-learn + lightgbm | sklearn>=1.3.0, lightgbm>=4.0.0 |
| LLM 框架 | openai | >=1.0.0 |
| Agent 框架 | pydantic + pydantic-ai | pydantic>=2.0.0 |
| 可视化 | streamlit | >=1.20.0 |
| 文本处理 | nltk | >=3.8.0 |
## 项目结构
```
├── src/
│ ├── data/ # 数据处理模块
│ │ ├── __init__.py
│ │ ├── preprocess.py # 数据预处理
│ │ └── validation.py # 数据验证
│ ├── models/ # 机器学习模型
│ │ ├── __init__.py
│ │ ├── train.py # 模型训练
│ │ ├── evaluate.py # 模型评估
│ │ └── predict.py # 模型预测
│ ├── agent/ # Agent 模块
│ │ ├── __init__.py
│ │ ├── agent.py # Agent 核心逻辑
│ │ └── tools.py # Agent 工具定义
│ ├── llm/ # LLM 服务
│ │ ├── __init__.py
│ │ └── llm_service.py # DeepSeek API 集成
│ ├── main.py # 主程序入口
│ └── streamlit_app.py # Streamlit 可视化应用
├── data/ # 数据集目录
│ └── spam.csv # 垃圾短信数据集
├── models/ # 模型保存目录
├── .env.example # 环境变量示例
├── .gitignore # Git 忽略文件
├── pyproject.toml # 项目配置
└── README.md # 项目说明文档
```
## 快速开始
### 1. 安装依赖
```bash
# 安装 uv如果尚未安装
pip install uv -i https://mirrors.aliyun.com/pypi/simple/
# 配置 PyPI 镜像
uv config set index-url https://mirrors.aliyun.com/pypi/simple/
# 同步依赖
uv sync
```
### 2. 配置 API 密钥
```bash
# 复制环境变量示例文件
cp .env.example .env
# 编辑 .env 文件,填入你的 DeepSeek API Key
# DEEPSEEK_API_KEY="your-key-here"
```
### 3. 运行应用
#### 方式 AStreamlit 可视化应用(推荐)
```bash
uv run streamlit run src/streamlit_app.py
```
#### 方式 B命令行 Agent Demo
```bash
uv run python src/agent_app.py
```
#### 方式 C运行模型训练
```bash
uv run python src/models/train.py
```
## 使用说明
### 1. Streamlit 应用
启动 Streamlit 应用后,你可以:
- **单条短信分类**:在左侧输入框中输入短信内容,点击「开始分类」按钮,系统将返回分类结果、解释和建议
- **批量分类**:上传包含 `text` 列的 CSV 文件,系统将自动对所有短信进行分类
- **模型选择**:在侧边栏选择使用 LightGBM 或 Logistic Regression 模型
- **语言选择**:在侧边栏选择输出结果的语言(中文/英文)
- **重新训练模型**:在「模型训练」展开栏中点击「重新训练模型」按钮
### 2. 命令行使用
```python
from src.agent import agent
# 分类并解释短信
result = agent.classify_and_explain("Free entry in 2 a wkly comp to win FA Cup final tkts 21st May 2005.")
print(f"分类结果: {result['classification']['label']}")
print(f"分类概率: {result['classification']['probability']}")
print(f"解释: {result['explanation']['classification_reason']}")
print(f"建议: {result['explanation']['suggestions']}")
```
## 模型训练
### 训练流程
1. **数据加载**:使用 Polars 加载 `data/spam.csv` 数据集
2. **数据预处理**
- 清洗文本(去除 HTML 实体、特殊字符、多余空格)
- 转换标签spam → 1ham → 0
- 数据验证(使用 Pandera 验证数据质量)
3. **数据分割**:按 8:2 比例分割训练集和测试集
4. **特征工程**:使用 TF-IDF 进行文本向量化
5. **模型训练**
- 基线模型Logistic Regression
- 强模型LightGBM
6. **模型评估**计算准确率、精确率、召回率、F1 分数
7. **模型保存**:将训练好的模型保存到 `models/` 目录
### 评估结果
| 模型 | 准确率 | 精确率Macro | 召回率Macro | F1 分数Macro |
|------|--------|----------------|----------------|------------------|
| Logistic Regression | 0.978 | 0.964 | 0.954 | 0.959 |
| LightGBM | 0.985 | 0.974 | 0.968 | 0.971 |
## 系统架构
### 1. 数据层
- **数据加载**:使用 Polars 高效加载和处理大规模数据
- **数据清洗**:实现可复现的数据清洗流水线
- **数据验证**:使用 Pandera 定义数据 Schema确保数据质量
### 2. 模型层
- **特征工程**TF-IDF 文本向量化
- **模型训练**支持多种模型LightGBM、Logistic Regression
- **模型评估**:全面的评估指标和可视化
- **模型管理**:模型保存、加载和版本控制
### 3. LLM 层
- **文本翻译**:将英文短信翻译成中文
- **结果解释**:解释模型分类结果的原因
- **行动建议**:根据分类结果生成可执行的建议
- **模式分析**:分析垃圾短信的常见模式
### 4. Agent 层
- **工具定义**
- `predict_spam`:使用机器学习模型预测短信是否为垃圾短信
- `explain_prediction`:使用 LLM 解释分类结果并生成行动建议
- `translate_text`:将文本翻译成目标语言
- **Agent 逻辑**:实现工具调用、结果整合和自然语言生成
- **结构化输出**:确保输出结果可追溯、可复现
## 贡献指南
1. 朱指乐-仓库创建-项目初始化-数据获取-数据预处理-模型训练-模型评估-模型保存
2. 肖康-LLM服务-实现文本解释和建议生成功能-agent实现-工具调用-结构化输出
3. 龙思富-可视化-交互式可视化应用-文档编写
## 许可证
MIT License
## 致谢
- 感谢 [DeepSeek](https://www.deepseek.com/) 提供的 LLM API
- 感谢 Kaggle 提供的 [SMS Spam Collection](https://www.kaggle.com/datasets/uciml/sms-spam-collection-dataset) 数据集
- 感谢所有开源库的贡献者
## 联系方式
如有问题或建议,欢迎通过以下方式联系:
- 项目地址:[http://hblu.top:3000/MachineLearning2025/CourseDesign](http://hblu.top:3000/MachineLearning2025/CourseDesign)
- 邮箱your-email@example.com
---
**© 2026 垃圾短信分类系统 | 基于传统机器学习 + LLM + Agent**