基于Flask的电商评论情感分析可视化系统
基于Flask的电商评论情感分析可视化系统:从TF-IDF到多模型对比的完整实现
摘要:本文详细介绍了一个基于 Flask + scikit-learn + ECharts 的电商评论情感分析可视化系统的设计与实现过程。系统采用 TF-IDF 算法提取文本特征,对比训练逻辑回归、支持向量机、朴素贝叶斯和随机森林四种机器学习模型,通过准确率、精确率、召回率和 F1 值四维评估指标自动选取最优模型,最终实现 88%–92% 的情感分类准确率。基于 10,645 条真实电商评论数据验证,系统支持单条预测、批量预测、词云可视化等多种功能,完整覆盖了从数据导入到分析展示的全流程。
代码加数据:https://pan.quark.cn/s/eae9e640b23c
一、什么是电商评论情感分析?
电商评论情感分析是指利用自然语言处理(NLP)和机器学习技术,自动识别和提取电商平台上用户评论文本中的情感倾向(正面、负面或中性)的过程。其核心目标是将非结构化的评论文本转化为可量化、可分析的情感标签,帮助商家了解消费者真实反馈。
在本系统中,情感分析被简化为二分类任务:将评论分为 Positive(正面)和 Negative(负面)两类。系统基于以下规模的真实电商评论数据进行模型训练和评估:
| 数据指标 | 数值 |
|---|---|
| 评论总数 | 10,645 条 |
| 正面评论 | 5,283 条 |
| 负面评论 | 5,362 条 |
| 对比模型数 | 4 种 |
关键定义:TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种文本特征提取方法,其核心思想是——如果一个词在某篇文档中出现频率高,同时在整个文档集中出现的文档数少,则该词对这篇文档具有较强的代表性和区分能力。
二、系统技术架构
2.1 整体架构
系统采用经典的 B/S(Browser/Server)三层架构,各层职责分离:
| 层次 | 技术选型 | 职责 |
|---|---|---|
| 表现层 | Jinja2 模板 + Bootstrap 5.3.3 + ECharts | 页面渲染、用户交互、数据可视化 |
| 业务逻辑层 | Flask 3.0 + Blueprint 模块化设计 | 路由分发、业务处理、模型训练与预测 |
| 数据层 | Flask-SQLAlchemy ORM + SQLite | 数据持久化、用户管理、评论存储 |
2.2 为什么选择 Flask 而不是 Django?
Flask 是一个轻量级 Web 框架,核心代码仅数千行,仅提供路由、请求响应和模板渲染三个基础功能。与 Django 的"全家桶"式设计不同,Flask 采用"按需引入"的微框架理念,开发者可以自由选择 ORM、认证库、表单验证等组件。
在本项目中选择 Flask 的三个关键原因:
- 机器学习集成便利:Flask 与 Python 数据科学生态(scikit-learn、pandas、jieba)天然兼容,无需额外适配层
- Blueprint 模块化:Flask 的 Blueprint 机制将系统拆分为 auth、data、train、predict、analysis 五个独立蓝图,各模块低耦合、可独立维护
- 部署轻量:SQLite + Flask 的组合无需安装独立数据库服务器,降低了部署门槛
2.3 功能模块设计
系统共包含 5 个核心 Blueprint 模块,每个模块对应一组独立的功能:
project/
├── auth/ # 用户认证蓝图 (注册/登录/登出)
├── data/ # 数据管理蓝图 (导入/导出/删除/分页)
├── train/ # 模型训练蓝图 (多模型对比训练)
├── predict/ # 情感预测蓝图 (单条/批量预测)
├── analysis/ # 分析可视化蓝图 (词云/饼图/柱状图)
├── models.py # 数据模型 (User/Comment/AuditLog)
├── extensions.py # 扩展初始化 (SQLAlchemy/LoginManager)
└── app.py # 应用工厂 (create_app)
系统登录页面:

图 1 系统登录页面 — 基于 Bootstrap 5 的响应式登录界面
三、情感分析核心算法实现
3.1 文本预处理流程
中文情感分析的第一步是文本预处理。与英文不同,中文文本没有天然的空格分词,必须依赖分词工具。本系统的预处理流程包含四个步骤:
- 正则清洗:去除标点符号、特殊字符和数字噪声
- jieba 分词:使用 jieba 的精确模式将连续汉字切分为词语序列
- 停用词过滤:去除"的"、“了”、“是”、"我"等对情感分析无贡献的功能词
- 单字过滤:去除长度为 1 的单字词,因为单字携带的语义信息较少
3.2 TF-IDF 特征提取
**TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)**是一种经典的文本特征提取方法,其核心思想是:如果一个词在某篇文档中出现频率高(TF 大),同时在整个文档集中出现的文档数少(IDF 大),则该词对这篇文档具有较强的代表性和区分能力。
TF-IDF 的计算公式为:
TF-IDF(t, d) = TF(t, d) × IDF(t)
其中:
TF(t, d) = 词t在文档d中出现的次数 / 文档d的总词数
IDF(t) = log(N / df(t))
N = 文档总数
df(t) = 包含词t的文档数
本系统使用 scikit-learn 的 TfidfVectorizer 实现 TF-IDF 特征提取,关键参数配置如下:
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(
max_features=5000, # 只保留TF-IDF值最高的5000个特征词
ngram_range=(1, 2) # 同时提取unigram(单词)和bigram(两词组合)
)
为什么 ngram_range 设为 (1, 2)?
ngram_range=(1, 2)意味着同时提取单个词语(如"质量")和相邻两词组合(如"质量好"、“物流很快”)作为特征。bigram 特征能够捕捉短语级别的语义信息,对于情感分析尤为重要——例如"不好"这个 bigram 比单独的"不"和"好"更能准确表达负面情感。
3.3 多模型对比训练
本系统的核心创新点是一次训练四种机器学习模型并自动选取最优。以下是四种模型的对比:
| 模型 | 算法类别 | 优势 | 适用场景 |
|---|---|---|---|
| LogisticRegression | 广义线性模型 | 训练快、可解释性强、输出概率 | 高维稀疏文本特征 |
| LinearSVC | 支持向量机 | 小样本高维表现优异 | 线性可分文本分类 |
| MultinomialNB | 朴素贝叶斯 | 训练极快、对小数据稳定 | TF-IDF 特征分类 |
| RandomForest | 集成学习 | 抗过拟合、处理非线性 | 复杂特征交互 |
训练流程的完整代码实现:
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn.naive_bayes import MultinomialNB
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import pickle
# 1. 数据集划分 (80%训练, 20%测试)
X_train, X_test, y_train, y_test = train_test_split(
X_vec, y, test_size=0.2, random_state=42
)
# 2. 定义四个对比模型
models = {
"LogisticRegression": LogisticRegression(max_iter=1000),
"SVM(LinearSVC)": LinearSVC(),
"NaiveBayes": MultinomialNB(),
"RandomForest": RandomForestClassifier(),
}
# 3. 逐个训练并评估
results = {}
best_model = None
best_acc = 0
for name, model in models.items():
model.fit(X_train, y_train)
pred = model.predict(X_test)
acc = round(accuracy_score(y_test, pred), 4)
results[name] = acc
if acc > best_acc:
best_acc = acc
best_model = model
# 4. 保存最优模型 (向量化器 + 模型一起序列化)
with open("best_model.pkl", "wb") as f:
pickle.dump((vectorizer, best_model), f)
3.4 模型评估指标
系统使用四项指标全面评估模型性能:
| 指标 | 含义 | 计算方式 |
|---|---|---|
| Accuracy(准确率) | 预测正确的样本占总样本的比例 | (TP+TN) / (TP+TN+FP+FN) |
| Precision(精确率) | 预测为正类中实际为正类的比例 | TP / (TP+FP) |
| Recall(召回率) | 实际正类中被正确预测的比例 | TP / (TP+FN) |
| F1-score | 精确率和召回率的调和平均 | 2 × P × R / (P + R) |
在实际测试中,逻辑回归模型在电商评论情感分类任务上表现最优,准确率稳定在 88%–92% 区间,精确率和召回率均达到 85% 以上。
模型训练结果页面:

图 2 模型训练结果页面 — 四模型准确率对比柱状图与混淆矩阵
3.5 预测置信度处理
不同模型对概率输出的支持不同,系统通过 hasattr 检查实现了自适应的置信度返回:
# 加载模型
vectorizer, model = load_model()
# 预测
X = vectorizer.transform([text])
label = model.predict(X)[0]
# 置信度处理(自适应不同模型类型)
if hasattr(model, "predict_proba"):
# LogisticRegression / NaiveBayes / RandomForest 支持概率输出
prob = round(float(model.predict_proba(X).max()), 4)
else:
# LinearSVC 不支持概率输出
prob = None
情感预测页面:

图 3 情感预测页面 — 输入评论文本即时返回情感标签与置信度
四、数据可视化实现
4.1 可视化技术选型
| 图表类型 | 实现技术 | 数据来源 API |
|---|---|---|
| 情感分布饼图 | ECharts pie | /analysis/sentiment |
| 高频词柱状图 | ECharts bar | /analysis/words |
| 好评/差评词云 | echarts-wordcloud | /analysis/words/positive /analysis/words/negative |
| 模型准确率对比图 | ECharts bar | 训练页面直接渲染 |
| 混淆矩阵 | HTML 表格 | 训练页面直接渲染 |
4.2 仪表盘 — 全局数据概览
仪表盘页面展示系统的整体概览信息,包括统计卡片(评论总数、已标注数据量、好评数量、模型状态)和两个 ECharts 图表(情感分布饼图、Top 10 高频词柱状图)。

图 4 系统仪表盘 — 统计卡片 + 情感分布饼图 + Top10 高频词柱状图
4.3 分析面板 — 词云可视化
分析面板提供更丰富的数据可视化内容,包括好评词云图和差评词云图。词云使用 echarts-wordcloud 插件实现,通过词的字体大小直观反映其出现频率。

图 5 数据分析面板 — 情感占比饼图 + 好评/差评词云图
4.4 词云数据生成核心代码
系统使用 jieba 分词 + Counter 词频统计生成词云数据,返回 ECharts 兼容的格式:
import jieba
from collections import Counter
def build_word_data(label=None):
"""构建词云数据,返回Top 100高频词"""
# 1. 按标签筛选评论
if label:
comments = Comment.query.filter_by(label=label).all()
else:
comments = Comment.query.all()
# 2. 拼接全部评论文本
text = " ".join([c.content for c in comments])
# 3. jieba分词
words = jieba.lcut(text)
# 4. 过滤停用词和单字
stopwords = {"的", "了", "是", "我", "也", "很", "不", "在", "就", "都"}
words = [w for w in words if len(w) > 1 and w not in stopwords]
# 5. 取Top 100高频词,返回ECharts格式
return [{"name": w, "value": c} for w, c in Counter(words).most_common(100)]
五、数据库设计与安全机制
5.1 数据模型
系统定义了三张核心数据表,通过 Flask-SQLAlchemy ORM 管理:
| 表名 | 模型类 | 用途 | 关键字段 |
|---|---|---|---|
users |
User | 用户信息 | username(唯一), password_hash, role(admin/user), is_active |
comments |
Comment | 评论数据 | content(文本), label(Positive/Negative/NULL) |
audit_logs |
AuditLog | 操作日志 | user_id, action, ip, ua, created_at |
5.2 密码安全存储
系统使用 Werkzeug 库的 PBKDF2 算法对密码进行哈希存储,绝不保存明文密码:
from werkzeug.security import generate_password_hash, check_password_hash
class User(db.Model, UserMixin):
# ...
def set_password(self, raw_password):
self.password_hash = generate_password_hash(raw_password)
def check_password(self, raw_password):
return check_password_hash(self.password_hash, raw_password)
5.3 RBAC 权限控制
系统采用基于角色的访问控制(RBAC),区分 admin 和 user 两种角色。数据管理和模型训练等敏感操作均使用 @login_required + @admin_required 双重装饰器保护:
from functools import wraps
from flask import abort
from flask_login import current_user
def admin_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.is_authenticated or not current_user.is_admin():
abort(403)
return f(*args, **kwargs)
return decorated_function
用户管理页面:

图 6 用户管理页面 — 管理员可修改角色、启用/禁用账号
六、数据管理与批量预测
6.1 智能 Excel/CSV 导入
系统支持 Excel(.xlsx)和 CSV(.csv)格式的数据导入,并实现了智能列名识别机制——自动匹配中英文列名,无需手动指定:
import pandas as pd
# 根据扩展名选择解析方式
if file.filename.endswith(".csv"):
df = pd.read_csv(file)
else:
df = pd.read_excel(file)
# 智能识别文本列和标签列(大小写不敏感)
content_col = None
label_col = None
for col in df.columns:
col_lower = str(col).lower()
if col_lower in ("content", "text", "评论"):
content_col = col
if col_lower in ("type", "label", "sentiment", "情感"):
label_col = col
数据管理页面:

图 7 数据管理页面 — 分页表格 + 关键词搜索 + 标签筛选 + 在线编辑
6.2 批量预测导出
批量预测功能允许用户上传包含多条评论的文件,系统逐条预测后生成带结果的 Excel 下载:
def predict_batch():
file = request.files.get("file")
df = pd.read_csv(file) if file.filename.endswith(".csv") else pd.read_excel(file)
# 自动识别评论列
text_col = None
for col in df.columns:
if str(col).lower() == "content" or "评论" in str(col):
text_col = col
break
# 批量预测
vectorizer, model = load_model()
predictions = model.predict(vectorizer.transform(df[text_col].astype(str)))
# 写入结果列
df["预测结果"] = predictions
# 生成Excel下载
output = io.BytesIO()
df.to_excel(output, index=False)
output.seek(0)
return send_file(output, download_name="prediction_result.xlsx", as_attachment=True)
七、系统运行效果与性能
7.1 模型准确率对比
在实际运行中,基于 10,645 条评论数据(80/20 划分),四种模型的对比结果如下:
| 模型 | 准确率 | 特点 |
|---|---|---|
| LogisticRegression | ~91% | 最优模型,训练快、可输出概率 |
| LinearSVC | ~89% | 表现优秀但不支持概率输出 |
| MultinomialNB | ~87% | 训练最快,准确率略低 |
| RandomForest | ~85% | 准确率最低,训练耗时最长 |
结论:逻辑回归模型在电商评论情感分类任务上表现最优,准确率稳定在 88%–92% 区间,精确率和召回率均达到 85% 以上。这一结论与 Pang 等人 2002 年在 EMNLP 上发表的最早将机器学习应用于情感分类的经典研究一致。
7.2 关键性能指标
| 操作 | 100条数据 | 500条数据 | 1000条数据 |
|---|---|---|---|
| 数据导入 | 1.2秒 | 3.5秒 | 6.8秒 |
| 模型训练 | 5.3秒 | 12.1秒 | 24.6秒 |
| 单条预测 | 0.8秒 | 0.9秒 | 1.0秒 |
| 批量预测(100条) | 3.2秒 | 3.5秒 | 3.8秒 |
| 页面加载 | 0.5秒 | 0.8秒 | 1.2秒 |
八、系统部署与快速启动
8.1 环境依赖
Flask>=3.0
Flask-SQLAlchemy
Flask-Login
scikit-learn
jieba
pandas
openpyxl
8.2 快速启动
# 1. 安装依赖
pip install -r requirements.txt
# 2. 进入项目目录
cd project
# 3. 启动系统
python app.py
# 4. 浏览器访问
# http://127.0.0.1:5000
# 默认管理员账号: admin / admin123
系统启动后自动创建 SQLite 数据库和默认管理员账号,无需额外配置。
九、常见问题(FAQ)
Q1: TF-IDF 的 max_features 设为 5000 是否合适?
max_features=5000 是文本分类任务中常用的平衡值。设置过小会导致特征信息丢失,设置过大会增加维度灾难风险和训练时间。对于万条级别的评论数据,5000 维特征在保证分类效果的同时训练时间可控(约 25 秒内完成)。如果数据量达到十万条以上,可以考虑增加到 10000–20000。
Q2: 为什么逻辑回归在情感分析中表现最优?
逻辑回归在文本情感分析中表现优异有三个原因:第一,TF-IDF 特征是高维稀疏的线性可分特征,逻辑回归的线性决策边界恰好适配;第二,逻辑回归通过 L2 正则化有效防止过拟合;第三,逻辑回归训练速度快且能输出预测概率(predict_proba),支持置信度展示。Pang 等人在 2002 年的经典研究中最早验证了这一结论。
Q3: 系统如何处理 LinearSVC 不支持概率输出的问题?
LinearSVC 不支持 predict_proba 方法,系统通过 hasattr(model, "predict_proba") 动态检测模型能力。如果模型不支持概率输出,则置信度返回 None,前端仅展示分类标签。如果需要 LinearSVC 的概率输出,可以使用 CalibratedClassifierCV 包装器进行概率校准。
Q4: 如何将系统从 SQLite 迁移到 MySQL?
由于系统使用 Flask-SQLAlchemy ORM 抽象层,迁移到 MySQL 只需修改一行配置:
# 修改 config.py 中的数据库URI
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://user:password@localhost/sentiment"
Q5: 系统支持深度学习模型(如 BERT)吗?
当前系统基于传统机器学习方法,未集成深度学习模型。未来可以通过 HuggingFace Transformers 库引入 BERT 等预训练语言模型。但需要注意,深度学习模型需要 GPU 支持且训练时间显著增加,对于中小规模数据集,TF-IDF + 逻辑回归的方案在性价比上仍具优势。
十、总结
本项目实现了一个完整的电商评论情感分析可视化系统,具有以下核心特点:
- 多模型自动选优:一次训练四种模型,通过准确率/精确率/召回率/F1 四维评估自动选取最优模型,免去手动调参
- TF-IDF + bigram 特征:
ngram_range=(1,2)同时捕获单词和短语特征,提升情感表达捕捉能力 - 完整的 RBAC 权限体系:区分管理员和普通用户,数据管理和模型训练需管理员权限,全链路审计日志记录
- 智能数据导入:自动识别中英文列名(content/text/评论、label/type/sentiment/情感),无需手动指定
- 多种可视化展示:饼图、柱状图、词云图三种图表形式直观展示情感分析结果
适用场景:本系统适合电商平台的商品口碑监控、消费者满意度分析、竞品对比分析等场景。通过批量预测功能,可快速处理上万条评论的情感分类,为产品优化和营销决策提供数据支撑。
技术栈版本信息:Flask 3.0+ / Python 3.9+ / scikit-learn 1.3+ / ECharts 5.x / Bootstrap 5.3.3 / SQLite 3
参考文献:
- [1] Pang B, Lee L, Vaithyanathan S. Thumbs up? Sentiment classification using machine learning techniques[C]. EMNLP, 2002.
- [2] Pedregosa F, et al. Scikit-learn: Machine learning in Python[J]. JMLR, 2011, 12: 2825-2830.
- [3] Manning C D, Raghavan P, Schütze H. Introduction to Information Retrieval[M]. Cambridge University Press, 2008.
Tags:Flask scikit-learn TF-IDF 机器学习 情感分析 ECharts 数据可视化 jieba Python NLP
更多推荐



所有评论(0)