基于 LDA 主题模型的手机用户评论情感分析及可视化
创建于 2026 年 4 月 1 日
项目介绍
手机厂商和电商平台每天都在产生海量用户评论,但这些评论大多是非结构化文本,直接阅读既耗时又难有全局结论。本项目针对京东手机评论数据,构建了一条从原始 CSV 到主题洞察的完整分析链路:先通过导入服务完成编码识别、字段映射与去重入库,再进行文本清洗、语言判定与 jieba 分词,接着用规则词典完成情感打分,最后用 LDA(Latent Dirichlet Allocation)主题模型把数千条评论收敛为若干个可解释的主题,并通过 FastAPI 接口与 ECharts 大屏把结论呈现出来。
项目是”可落地”而非”纯演示”的设计:数据按接入层、原始层、标准层、分析层四层入库(MySQL),每次分析运行都会留下完整的模型元信息(候选主题数得分、一致性、困惑度、主题关键词、主题名置信度),大屏上可以看到每一次训练 run 的 id 与主题数。系统还支持在线下载公开数据、补全商品的价格段与发布时间等元数据,并能按周期定时重跑分析,适合持续跟踪评论舆情变化。
技术栈上,后端采用 Python 3.11 + FastAPI + SQLAlchemy 2.0 + MySQL 8.0,分析部分使用 scikit-learn 的 LatentDirichletAllocation 与 jieba 分词,前端大屏使用 ECharts 5。整个项目可以用一条命令从建表跑到出图,也可以分步执行以便调试。
项目架构
系统按数据流方向分为五个层次,代码按职责拆分在 code/src/phone_review_analysis/ 下:
CSV 文件
-> IngestService(读文件、字段映射、去重)
-> review_raw / review_fact / product_dim
-> AnalysisService(清洗、分词、情感打分、LDA)
-> review_preprocess / sentiment_result / topic_*
-> Query 服务聚合
-> FastAPI
-> dashboard.html(ECharts)
- 接入层:
services/ingest.py负责扫描数据集目录、自动识别 CSV 编码(utf-8-sig / gb18030 等回退链)、按config/datasets.yml的字段映射读入评论(机型、时间、星级、正文、昵称),并通过 sha256 校验和避免重复导入。 - 分析层:
services/analysis.py是核心,完成文本清洗、语言判定(优先列内语言,否则按中文字符检测)、停用词过滤、jieba 分词、情感打分和 LDA 训练入库;utils/topic_naming.py负责主题语义命名。 - 查询层:
services/queries.py聚合大屏所需的品牌声量、主题分布、主题情感、主题趋势、品牌热力、推荐机型、机型雷达等指标。 - API 层:
api/routes.py提供数据接口与任务接口(导入、分析、元数据补齐)以及注册登录、用户管理等认证能力。 - 展示层:
web/dashboard.html + dashboard.js + dashboard.css组成 ECharts 大屏页面,通过GET /dashboard访问。
数据库按职责分层:接入层 dataset / dataset_file / ingest_batch,原始层 review_raw,标准层 review_fact / product_dim,分析层 review_preprocess / sentiment_result / topic_model_run / topic_dim / review_topic_fact,另有 dashboard_snapshot、system_user、user_session 支撑快照与认证。
核心功能
CSV 导入与去重入库。按 datasets.yml 中的数据集定义(编码、分隔符、字段映射、清洗规则)读取评论 CSV,自动识别品牌与机型(从商品 URL slug 或标题提取),用机型 + 昵称 + 时间 + 正文的联合键去重,入库前计算 sha256 校验和,重复文件直接跳过,并记录每次导入批次。
规则词典情感分析。内置中英文正负情感词表(如”流畅/清晰/超值”与”卡顿/发热/退货”等),对分词结果计数打分;若词典未命中,则回退用归一化星级(1–5 星映射到 -1~1)打分。最终输出 positive / neutral / negative 标签与正、中、负三档概率,结果按模型名 + 版本写入 sentiment_result,便于后续替换为更复杂的情感模型。
LDA 主题建模与自动选 K。对分词后的语料用 CountVectorizer 向量化(保留 5000 词表),在候选主题数(默认 4、6、8、10、12,可自定义)上分别训练 batch 模式的 LDA(max_iter=12),用 U-Mass 一致性(coherence)与困惑度(perplexity)两个指标对每个候选打分,最终选取一致性最优的主题数;大样本时训练与评估各自独立随机采样(固定随机种子保证可复现),并支持 Windows 下单进程降级。每条评论会计算完整主题分布,主导主题及权重写入 review_topic_fact,供大屏聚合。
主题语义命名与人工修正。根据主题 Top10 关键词命中语义规则(用户评价、续航充电、拍照影像、性能体验、屏幕显示、网络通信、音频通话、系统软件、外观做工、价格价值、存储内存等)自动生成中英文主题名并给出置信度;未命中的主题标记为”综合讨论/待确认”。set_topic_labels.py 可查看最新 run 的主题并一键写入人工标签(manual_label),让主题名更贴合实际评论语义。
可视化大屏与任务触发。大屏以指标卡 + 8 张图表呈现:品牌声量、主题分布、主题情感、主题关注度趋势、主题关键词、主题-品牌热力图、推荐机型列表、机型雷达(联动)。页面内置登录/注册与管理员用户管理,支持在页面上直接触发”执行分析”与”补齐元数据”任务。配套脚本还支持在线下载数据(CSV/ZIP/GZ)、元数据补齐(价格段/发布时间)与定时调度(按分钟周期自动重跑导入与分析)。
功能截图
暂无运行截图。
快速上手
前置条件:Python 3.11+、MySQL 8.0+。先在 code/config/.env 中配置数据库连接:
APP_DATABASE_URL=mysql+pymysql://user:pass@127.0.0.1:3306/phone_review_analysis?charset=utf8mb4
安装依赖后,把评论 CSV 放入数据集目录(如 code/data/incoming/jd_preview/),执行一键全流程:
python -m venv .venv && source .venv/bin/activate
pip install -r code/requirements.txt
python code/scripts/one_click_mysql.py --run-metadata-enrich --run-analysis
该命令依次完成建表、导入 CSV、元数据补齐、预处理、情感分析、LDA 训练入库并启动 API 服务,默认开启快速分析模式(自动限制样本与候选主题数),需要全量训练时追加 --full-analysis。启动后访问:
- 健康检查:
http://127.0.0.1:8000/api/v1/health - 可视化大屏:
http://127.0.0.1:8000/dashboard
首次启动会自动创建管理员账号 admin / Admin@123456,大屏数据接口需要登录后访问。
调试时也可以分步执行:init_db.py 只建表,run_ingest.py 只导入(支持 --limit 20000 小样本),run_analysis.py 只做分析与训练(支持 --topic-candidates 与 --max-docs),run_api.py 只启动服务。例如:
python code/scripts/run_analysis.py --dataset jd_phone_reviews --max-docs 20000 --topic-candidates 4,6,8,10,12
python code/scripts/set_topic_labels.py --dataset jd_phone_reviews --set 1=续航与充电体验 --set 2=拍照与影像质量
总结
这个项目的价值在于把”评论文本 → 结构化洞察”的每个环节都做成了可运行、可重跑、可替换的模块:数据导入有校验有去重,情感分析留了模型版本位,LDA 有客观的选 K 依据和可解释的主题名,展示层则直接对应论文/报告需要的图表。对以论文答辩或毕设展示为目标的场景,set_topic_labels.py 的人工主题命名、模型 run 的元信息留存和”一键出大屏”的能力尤其实用。
如果继续演进,比较自然的方向有三个:把规则词典情感模型替换为 SnowNLP 或微调后的中文预训练模型(架构上已预留模型名/版本字段);为 run_scheduler.py 接入 crontab、Airflow 或云调度,形成真正的舆情监控闭环;以及在 queries.py 中扩展更多聚合视角,比如价格段 × 主题的情感交叉分析。整体而言,这是一条结构清晰、忠于真实数据的评论分析参考实现。