Paruchuri-Rajesh/Large_Scale_Product-Review
GitHub: Paruchuri-Rajesh/Large_Scale_Product-Review
一个面向Amazon商品评论的端到端大数据分析管道,集成了情感分析、虚假评论检测、流式推理和LLM驱动的欺诈解释生成能力。
Stars: 1 | Forks: 1
## 数据集
| 属性 | 值 |
|----------|-------|
| 来源 | McAuley-Lab Amazon Reviews 2023 (Hugging Face) |
| 类别 | Cell Phones & Accessories |
| 原始大小 | 11 GiB JSONL |
| 源记录数 | 20,812,945 |
| 清洗后记录数 | 20,518,120 |
| 训练集 / 测试集划分 | 16,413,084 / 4,105,036 (80/20, seed 42) |
| 欺诈正样本率 | 3.57% (731,542 行) |
### Schema 映射
在导入期间:`rating` -> `star_rating` (int), `timestamp` (ms) -> `event_ts` (sec), `asin` -> `product_id`。注意:该数据集缺少 unhelpful-votes,因此 `total_votes = helpful_votes`,并且 helpfulness-ratio 特征未被使用。
## Pipeline 阶段
### 1. 导入 / ETL (AWS)
原始 JSONL (11 GB) 被上传至 **Amazon S3**(`cellphonesandaccessories` 存储桶)。一个 **AWS Glue** 作业(`json-to-parquet`)使用 4 个 DPU 在大约 2 分钟内将 JSONL 转换为压缩的 Parquet(约 3.3 GB)。**Amazon Athena** 连接到 Parquet 之上,用于基于 SQL 的验证(记录计数、样例行、schema 检查)。
### 2. Spark 批处理 ETL
批处理 ETL 模块(`src/etl/batch_etl.py`)通过严格的 schema 读取原始 JSONL,应用文本清洗,计算基于窗口的特征,生成弱欺诈标签,执行 80/20 随机划分,并写入四个 Parquet 输出:
- `train.parquet`
- `test.parquet`
- `product_agg.parquet`
- `reviewer_agg.parquet`
**Spark 配置:** 8 GB 驱动内存,200 个 shuffle 分区,Adaptive Query Execution (AQE),Kryo 序列化。如果没有这些设置,在 16 GB 内存笔记本上对 2080 万行进行窗口聚合会导致 OOM。**ETL 总挂钟时间:约 24 分钟。**
### 3. 特征工程
特征被分为三类:
**行级(基于文本):** `body_len`, `body_word_count`, `exclam_count`
**评论者级(行为):** 总撰写评论数,平均给出评分,5 星评论百分比,评论的不同产品数,同日发帖数,验证购买占比
**产品级:** 总评论数,平均评分,5 星评论百分比,重复评论文本数
### 4. 弱欺诈标签与数据泄露预防
该数据集不包含真实的欺诈标签,因此通过规则生成弱标签:
- 针对同一产品的重复/雷同评论文本
- 评论者发布大量评论,且大多数为 5 星评分和低验证购买量
- 同一用户在同一天发布多条评论
为了防止模型简单地记住这些规则,应用了两项缓解措施:
1. **从训练输入中移除基于规则的特征**(任何在代数逻辑上与标签逻辑相似的特征均被排除)
2. **添加可控的标签噪声**,通过随机翻转小部分标签实现
这促使欺诈模型倾向于学习更具泛化能力的模式,并产生了 0.845 的诚实 ROC-AUC,而不是人为虚高的分数。
### 5. 模型训练
两个模型均通过 scikit-learn Pipelines 进行训练,并记录到 MLflow 实验 `amazon_reviews_sentiment_fraud` 下。
**情感模型**
- TF-IDF 向量化(unigrams + bigrams,词表上限为 50,000)
- Logistic Regression(saga 求解器,类别平衡)
- 3 个类别:0 = 负面(1-2 星),1 = 中性(3 星),2 = 正面(4-5 星)
**欺诈模型**
- ColumnTransformer 拼接稀疏 TF-IDF(15k 特征)+ 12 个数值型行为特征
- 并行训练两个候选模型:SGDClassifier(log loss)和 LogisticRegression(saga);保存 F1 较高的模型
- 最初计划使用的 GradientBoostingClassifier 被弃用,因为它是单线程的,无法在 1640 万行数据上在合理的时间内完成
内存优化:仅加载所需列,float64 -> float32 降精度,紧凑整数格式。所有内容均在 MLflow 中跟踪(参数、指标、分类报告、joblib pipelines)。
### 6. 流式评分
Spark Structured Streaming(`src/stream/score_stream_kafka.py`)订阅 Kafka topic `reviews`,通过 `foreachBatch` 使用持久化的 joblib pipelines 对每个微批次进行评分,并写入 JSON 输出。`foreachBatch` 模式避免了脆弱的 pandas-UDF 广播路径。
**吞吐量:**约 153 条消息/秒(在 13 秒内完成 2,000 条消息评分)。端到端延迟:在 5 秒触发间隔下约为 5 秒。
## 模型诊断
### 阈值调优
默认 0.5 阈值产生了高召回率但精确率很差,因为欺诈很罕见(3.57%)。将阈值从 0.05 扫描至 0.95:
| 阈值 | 精确率 | 召回率 | F1 |
|-----------|-----------|--------|-----|
| 0.50 | 0.147 | 0.721 | 0.244 |
| 0.60 | 0.193 | 0.635 | 0.296 |
| 0.70 | 0.242 | 0.549 | 0.336 |
| **0.80** | **0.292** | **0.457** | **0.356** |
| 0.90 | 0.358 | 0.265 | 0.305 |
阈值 0.80 被保存并用于生产环境。
### 概率校准
原始模型概率本身并不可靠。在 N=2,052,518 上测试了 Platt 缩放和等渗回归:
| 方法 | Brier | ECE | ROC-AUC |
|--------|-------|-----|---------|
| Raw | 0.143 | 0.302 | 0.846 |
| Sigmoid (Platt) | 0.030 | 0.002 | 0.846 |
| **Isotonic (best)** | **0.029** | **0.000146** | **0.846** |
等渗校准在不影响排序质量的情况下,将 ECE 降低了三个数量级。
### 分布漂移
群体稳定性指数 (PSI) 被用于比较训练集和测试集的分布;正如随机 80/20 划分所预期的那样,漂移微乎其微。相同的监控可以在生产环境中复用,以检测何时需要重新训练。
## 服务层
### A. FastAPI REST 服务
模型通过 joblib 懒加载以实现快速启动。七个端点:
| 方法 | 路径 | 描述 |
|--------|------|-------------|
| GET | `/healthz` | 存活探针 |
| GET | `/metadata` | 训练指标,特征列,漂移报告 |
| POST | `/predict` | 评分单条评论;返回情感,fraud_proba,LLM 解释 |
| POST | `/predict/batch` | 评分多达 1,000 条评论 |
| GET | `/aggregates/products` | 来自 ETL 汇总的 Top-N 产品 |
| GET | `/aggregates/fraud-reviewers` | Top-N 可疑评论者 |
| GET | `/stream/recent` | 最新的 Kafka 评分行 |
### B. Streamlit Dashboard
用于整体指标、手动评论评分、热门产品、可疑评论者和流式处理结果的直观界面。
### C. MCP Server (Claude Desktop)
MCP 服务器(`src/serve/mcp_server.py`)向 Claude Desktop 暴露了三个工具:
- `predict_review` — 评分单条评论的情感和欺诈情况
- `get_fraud_reviewers` — 来自 ETL 汇总的最可疑评论者
- `get_top_products` — 按评论数或欺诈率排名的热门产品
用户可以提出自然语言问题,例如“欺诈最严重的前 5 款产品是什么?”,Claude 会调用相应的工具。也适用于 Cowork 以供非开发人员使用。
### D. LLM 欺诈解释
评分后,**Ollama with Llama 3.2** 会生成一段关于该评论为何可能可疑的人类可读解释(重复措辞、异常评论者行为、极端评分等)。基于规则的回退机制确保了在 LLM 不可用时 API 仍能返回解释。
### E. 自主评论审计器
在 `src/agents/review_auditor.py` 中实现。一个由 LLM 驱动的多步循环(最多 8 次迭代),它会调用工具 —— `get_product_aggregate`、`get_product_reviews`、`get_top_fraud_reviewers`、`score_review` —— 来调查产品并输出结构化的风险判定。在 ASIN B01415QHYW(42,644 条评论,约 12% 欺诈率)上进行了测试,仅在几次工具调用后便正确标记为高风险。
### F. Kafka 扇出
设置 `PUBLISH_PREDICT_TO_KAFKA=1` 后,FastAPI 服务会返回同步预测结果,*并*同时将评论发布到 Kafka 进行流式处理。两条路径产生一致的结果。
## 数据库 Schema (MySQL)
分为两个区域的八张核心表:
**源与处理**
- `RAW_REVIEW` — 每条导入的记录,以 `review_id` 为主键
- `FEATURED_REVIEW` — 带有衍生特征、弱 `fraud_label`、已清洗正文的 ETL 输出
- `PRODUCT_AGG` — 每种产品的汇总 (review_count, avg_rating, pct_5star, fraud_rate)
- `REVIEWER_AGG` — 每个评论者的汇总 (reviewer_review_count, avg_rating, fraud_rate, verified_share)
**建模与产出**
- `MLFLOW_RUN` — 训练实验 (run_id, hyperparameters, metrics, artifact paths)
- `MODEL_ARTIFACT` — 序列化的 joblib pipeline 字节 + `META_JSON` + `THRESHOLDS_JSON`
- `SCORED_REVIEW` — 每次推理 (raw fraud_proba, fraud_flag, sentiment label, batch_id)
- `DIAGNOSTIC_REPORT` — 以 `report_kind` 为主键的校准和漂移报告
## 实验结果
### 全量 Spark 性能
在单机上分四个阶段对全部 2050 万条评论(处理了约 3.8 GB 数据)进行的 Spark 聚合在 **30.8 秒**内完成。主要汇总结果:
- 产品平均评分:4.008
- 整体欺诈率:3.57%
- 评论数最多的产品:B01415QHYW (42,644 条评论,约 12% 欺诈)
- 满足充足数据量且欺诈率最高的产品:B00BI9AKJI(41.3% 欺诈率,363 条评论)
### 测试套件
11 个单元测试和集成测试覆盖了文本清洗、情感标签映射、推理时的特征存在性、FastAPI 端点响应以及欺诈解释格式。所有测试均在约 13.4 秒内通过。
### 运行耗时总结 (16 GB 内存笔记本)
| 阶段 | 耗时 |
|-------|------|
| 数据导入 + schema 转换 | ~3.5 分钟 |
| Spark ETL | ~24 分钟 |
| 情感模型训练 | ~52 分钟 |
| 欺诈模型训练 (SGD) | ~30 分钟 |
| 欺诈模型训练 (LogReg) | ~3.5 小时 |
| 诊断(阈值、校准、漂移) | ~15 分钟 |
| **总端到端耗时** | **~6 小时** |
## 技术栈
- **云 / 存储:** AWS S3, AWS Glue, Amazon Athena
- **大数据:** Apache Spark 3.5 (批处理 + Structured Streaming)
- **流处理:** Apache Kafka (KRaft 模式,无 ZooKeeper)
- **机器学习:** scikit-learn (TF-IDF, Logistic Regression, SGDClassifier)
- **实验跟踪:** MLflow
- **服务层:** FastAPI, Streamlit
- **LLM:** Ollama + Llama 3.2
- **智能体 / 工具:** MCP server, Claude Desktop, Cowork
- **数据库:** MySQL
## 局限性
- **单一类别** — 仅包含 Cell Phones & Accessories类别级特征增加的价值很小。扩展到多个类别将提高泛化能力。
- **数据集中无 unhelpful-votes**;helpfulness-ratio 特征毫无意义。
- **收敛问题** — 情感 LogReg (saga) 在完全收敛之前达到了最大迭代次数。
- **无真实欺诈标签** — 训练和评估使用弱启发式标签,因此报告的性能可能无法完全反映真实世界的准确率。
- **无 GBT** — Gradient Boosted Trees 原本在计划之中,但在单台机器上处理这种规模的数据并不现实;线性模型扩展性更好,但可能会错过复杂的模式。
## 未来工作
- 将调优后的阈值(0.80)和校准后的概率直接集成到服务层
- 扩展到多个产品类别以获得更有意义的类别特征
- 构建一个小型的人工标注欺诈基准(约 1,000 条评论)以进行客观评估
- 使用 Docker Compose 打包整个 pipeline 以实现单命令部署
- 使用 MLflow Model Registry 进行版本控制并受控地推送到生产环境
- 用实时特征存储替换静态行为特征
## 参考文献
1. D. Kotzias, M. Denil, N. de Freitas, and P. Smyth, "From group to individual labels using deep features," in *Proc. ACM KDD*, 2015, pp. 597-606.
2. M. Pontiki et al., "SemEval-2014 Task 4: Aspect based sentiment analysis," in *Proc. SemEval*, 2014, pp. 27-35.
3. A. Mukherjee, B. Liu, and N. Glance, "Spotting fake reviewer groups in consumer reviews," in *Proc. WWW*, 2012, pp. 191-200.
4. G. Fei, A. Mukherjee, B. Liu, M. Hsu, M. Castellanos, and R. Ghosh, "Exploiting burstiness in reviews for review spammer detection," in *Proc. AAAI ICWSM*, 2013.
5. X. Meng et al., "MLlib: Machine learning in Apache Spark," *J. Mach. Learn. Res.*, vol. 17, pp. 1-7, 2016.
6. M. Zaharia et al., "Apache Spark: A unified engine for big data processing," *Commun. ACM*, vol. 59, no. 11, pp. 56-65, 2016.
7. J. Ni, J. Li, and J. McAuley, "Justifying recommendations using distantly-labeled reviews and fine-grained aspects," in *Proc. EMNLP-IJCNLP*, 2019, pp. 188-197.
8. S. J. Pan and Q. Yang, "A survey on transfer learning," *IEEE Trans. Knowl. Data Eng.*, vol. 22, no. 10, pp. 1345-1359, 2010.
9. J. Platt, "Probabilistic outputs for support vector machines and comparisons to regularized likelihood methods," *Adv. Large Margin Classifiers*, vol. 10, no. 3, pp. 61-74, 1999.
标签:AI风险缓解, Amazon Athena, Amazon S3, Apache Spark, Apex, AV绕过, AWS, AWS Glue, C语言, DPI, ETL数据管道, FastAPI, Hugging Face, Kubernetes, MLflow, MLOps, Parquet, PMD, Python, Spark Structured Streaming, SQL验证, TF-IDF, 亚马逊商品评论, 大数据管线, 实时流处理, 情感分析, 批处理ETL, 数据工程, 数据清洗, 数据看板, 无后门, 机器学习, 梯度提升树(GBT), 欺诈检测, 特征工程, 电商评论分析, 端到端机器学习, 网络安全, 网络测绘, 自然语言处理(NLP), 软件成分分析, 逆向工具, 逻辑回归, 隐私保护