benitodev/Olist_NLP
GitHub: benitodev/Olist_NLP
基于巴西电商数据集的端到端 NLP 差评检测与推荐系统,涵盖冷热启动策略和生产级部署方案。
Stars: 0 | Forks: 0
# Olist DS — NLP(差评检测)与推荐系统(冷/热启动)
基于 **Olist 巴西电子商务数据集** (Kaggle) 构建的端到端数据科学 / ML 项目,包含两个主要模块:
1. **NLP + 分类**:从葡萄牙语文本中检测负面评论(*差评*)以及主题建模 (NMF)。
2. **推荐系统**:针对 **冷启动**(新用户)和 **热启动**(回访用户)的基线与模型。
该项目还包含可复现的 **数据工程** 方法 (ETL),以及面向生产的 **Postgres + Docker** 技术栈和用于模型服务的 **FastAPI**。
## 解决的问题
- 从评论中 **自动检测糟糕的客户体验**(以便优先处理支持/QA)。
- 根据用户情境(新用户 vs 回访用户)及可用历史数据的数量,使用不同策略 **推荐产品**。
## 数据集
**来源**:Olist Brazilian E-Commerce Public Dataset (Kaggle)
https://www.kaggle.com/datasets/olistbr/brazilian-ecommerce
使用的表(来自公共数据集):
- Orders, Customers, Products, Sellers, Geolocation
- Reviews(葡萄牙语文本)
## 模块 1 — NLP:差评检测
### 目标
使用的定义:
- `bad_review = 1` 如果 `review_score <= 2`
- `bad_review = 0` 如果 `review_score > 2`
### 流程(高层)
- 文本清洗与归一化:
- 小写化
- 变音符归一化
- 葡萄牙语停用词(保留如 `não` 等否定词)
- 向量化:
- **TF-IDF 词 n-grams**
- 可选的 **字符 n-grams**(有助于处理噪声/拼写错误)
- 评估的模型(强健、可复现的基线):
- Logistic Regression
- Linear SVM / 校准变体
### 划分与评估
- **基于时间的划分**(以避免泄露)。
- 指标:
- ROC-AUC, PR-AUC
- 针对少数类(差评)的 F1 / Precision / Recall
- 根据业务目标进行阈值分析(*threshold tuning*)
### 结果(基线)
示例(TF-IDF + Logistic Regression):
- **ROC-AUC ≈ 0.95**
- **PR-AUC ≈ 0.82**
- **F1 (bad)** ≈ 0.83
- **Recall (bad)** ≈ 0.91
- 混淆矩阵(示例):`[[5665, 640], [183, 1641]]`
## 模块 2 — 推荐系统(冷启动 vs 热启动)
该数据集在用户-物品层面非常 **稀疏**。
使用这里采用的时间划分,大多数用户在 TRAIN 中 **只有 1 次购买**,这限制了纯协同方法的使用。
### 为什么要区分场景
- **冷启动(新用户)**:无历史记录 → 使用热度/上下文基线。
- **热启动(回访用户)**:有一些历史记录 → 尝试 CF / item-item / 混合方法。
### 场景 A — 冷启动(新用户)
#### 基线 1:全局热度
推荐全局最受欢迎的 Top-K 物品。
示例 **HitRate@K**(冷启动):
- K=10 → ~0.0119
- K=50 → ~0.0385
- K=80 → ~0.0600
#### 基线 2:类别热度(上下文相关)
模拟“类别页面”:给定类别上下文,推荐该类别内的 Top-K 物品。
示例 **HitRate@K**(冷启动,类别热度):
- K=10 → ~0.1110
- K=20 → ~0.1676
- K=50 → ~0.2464
在冷启动中,**类别热度** 通常优于全局热度,因为它利用了上下文。
### 场景 B — 热启动(回访用户)
#### 热启动评估
- **留一法 / 基于时间** 的划分:在过去的记录上训练,并在用户的“最近”一次购买上进行评估。
#### 协同过滤 (ALS) — 侧重热启动
- 从 TRAIN 构建 user-item 矩阵 (CSR)。
- 训练 ALS(例如,`implicit` 库或等效实现)。
重要观察:
- 稀疏性严重(拥有 ≥2 次购买的用户很少)。TRAIN 中的示例:
- `>=2` 次交互:~6%
- `>=3`:~0.9%
- 由于用户历史记录太少,ALS 往往覆盖率/召回率较低。
示例(ALS 产品级 HitRate@K):
- K=10 → 0.0
- K=15 → ~0.0238
- K=30 → ~0.0476
实践结论:对于此数据集,**纯 CF** 本身是不够的;建议使用 **带有回退机制的混合方法**。
### Item-to-Item(共现) + Postgres 中的“真实邻居”
基于订单中的共现(购物篮分析)构建 item-item 图:
- 仅考虑包含 **2+ 个物品** 的订单。
- 基于计数的余弦式评分:`cooc / sqrt(freq_a * freq_b)`
- 仅在数据库中存储“真实邻居”(top-K)以实现高效服务。
示例(来自训练):
- 包含 2+ 个物品的订单:~2560
- 共现对:~3135
- 典型超参数:`TOPK=30`, `MIN_COOC=2`(更高的精度,更低的覆盖率)
推荐的服务逻辑:
1. 如果查询物品有邻居 → 推荐 item-item 邻居。
2. 否则 → 回退到 **类别热度**。
3. 如果类别缺失 → 回退到 **全局热度**。
### NLP 相似度(文本 KNN)— “问题相似度”
额外内容:TF-IDF + 余弦相似度以检索相似评论(可用于):
- 聚类反复出现的问题(客户支持)
- 调试产品/物流问题
- 探索性主题/索赔分析
## 建议的仓库结构
```
OLIST_DS/
│
├── data/
│ ├── raw/ # Original Kaggle CSVs
│ ├── processed/ # Clean datasets / features
│ └── README.md
│
├── notebooks/
│ ├── 1_eda_python.ipynb
│ ├── 2_build_dataset.ipynb
│ ├── 3_eda_text_quality.ipynb
│ ├── 4_baseline_text_vs_nontext.ipynb
│ ├── 5_recommender_baseline.ipynb
│ ├── 6_warm_evaluation_split.ipynb
│ ├── 7_issue_similarity_Knn.ipynb
│ ├── 8_colaborative_filtering.ipynb
│ └── 9_item_item_recs_cooccurrence_store_real_neighbors.ipynb
│
├── src/
│ ├── etl/ # Load to Postgres / cleaning
│ ├── nlp/ # training/eval NLP
│ ├── recsys/ # baselines + ALS + item-item
│ └── utils/
│
├── docker-compose.yml # Postgres (and optional API)
├── .env.example # env vars (do not commit real .env)
└── README.md
```
## 安装与运行(可复现)
### 1) 克隆
```
git clone https://github.com//.git
cd
```
### 2) 数据集
下载 Kaggle 数据集并将 CSV 文件放入:
```
data/raw/
```
### 3) 环境 (Conda)
```
conda create -n olist_ds python=3.11 -y
conda activate olist_ds
# 如果你有 requirements.txt
pip install -r requirements.txt
```
### 4) (可选)使用 Docker 启动 Postgres
```
docker compose up -d
```
在 `.env` 中配置环境变量(示例):
- `POSTGRES_HOST`
- `POSTGRES_PORT`
- `POSTGRES_DB`
- `POSTGRES_USER`
- `POSTGRES_PASSWORD`
### 5) ETL 至 Postgres(如适用)
```
python -m src.etl.load_data
```
### 6) 运行 notebooks
```
jupyter lab
```
打开 `notebooks/` 并按顺序运行(EDA → 数据集 → NLP 基线 → 推荐系统)。
## 指标(如何解读)
### 分类
- **ROC-AUC / PR-AUC**:排序质量,对不平衡数据具有鲁棒性。
- **F1 / Recall / Precision**:取决于所选阈值。
### 推荐
- **HitRate@K**:如果至少有 1 个推荐物品在用户的真实集合中,则等于 1;否则为 0。
- 一个简单、清晰的基线和冷启动指标。
## 关键设计决策
- **基于时间的划分**以避免泄露(NLP 和 RecSys)。
- 由于数据集稀疏性而进行 **冷启动 vs 热启动** 分离。
- 使用 **回退机制**(item-item → 类别 → 全局)的稳健服务。
## 路线图 / 未来改进
- **FastAPI** 服务用于:
- `POST /predict_bad_review`
- `GET /recommend?user_id=...`(热启动)
- `GET /recommend?item_id=...`(item-item)
- 实验跟踪 (MLflow) + 数据集版本控制。
- Transformer 模型(BERTimbau / multilingual)vs TF-IDF 基线。
- 混合推荐系统(ALS + item-item + 内容)和/或基于会话的方法。
- 其他指标:MAP@K / NDCG@K(热启动),覆盖率/多样性。
标签:Apex, AV绕过, Docker, ETL, FastAPI, JavaCC, Kaggle数据集, NMF, PostgreSQL, Python, TF-IDF, Web服务, 主题建模, 冷启动, 安全防御评估, 客户体验管理, 差评检测, 巴西电商, 情感分析, 推荐系统, 支持向量机, 数据科学, 文本分类, 无后门, 机器学习, 测试用例, 特征工程, 电子商务, 请求拦截, 资源验证, 逆向工具, 逻辑回归