资讯动态

Flask+深度学习中文情感分析系统源码部署与模型替换实战

发布时间:2026/10/9 2:54:12 来源:尧图企业网站定制
简介本资源是一套面向高校计算机相关专业毕业设计的完整项目资料主题为基于Python与深度学习的中文情感分析系统采用Flask框架搭建Web端后端配合MySQL存储数据适合正在准备毕设、需要可运行项目参考的本科生或初级开发者。压缩包共378个文件约97.54MB包含20个py源码文件、52个js与18个css前端资源、12个html页面模板以及模型相关的npy、pkl、pb权重文件另附sql建库脚本、docx说明文档、pptx演示文稿和mp4演示视频覆盖从数据到部署的完整链路。系统功能涵盖注册登录、后台首页可视化统计、文本情感分类等模块首页以柱状图与饼图汇总分析结果文本分析模块可对输入内容判定正面或负面倾向。目前已有220人学习下载适合作为毕设选题参考、代码复现与二次开发的基础素材。1. 从一份 Flask 情感分析系统源码说起它到底能跑出什么结果如果你正在做计算机方向的毕业设计选题又恰好落在 NLP 或者文本挖掘这个方向大概率会刷到「基于深度学习的中文情感分析系统」这类题目。我拿到这份资源的时候第一反应是又是一个套壳项目吧但拆开看之后发现它把 Flask 后端、MySQL 存储、深度学习模型推理这三层串得比较完整不是那种只跑一个 Jupyter Notebook 就交差的半成品。这份资源的核心价值在于它提供了一个从用户注册登录、后台数据看板、到文本输入实时分类的完整闭环。你输入一段中文评论系统会返回正面或负面的判定结果并且后台首页会用柱状图和饼图把历史分析记录做汇总。适合谁适合那些需要一套能演示、能答辩、能二次开发的中文情感分析系统的人。技术栈是 Python Flask MySQL模型部分走的是深度学习路线常见做法是用 LSTM 或者 BERT 微调具体用哪个得看你拿到的源码里 requirements.txt 写了什么。我见过太多毕业设计项目前端页面花里胡哨后端就一个 predict 接口硬编码返回结果。这份资源至少把登录注册、数据持久化、可视化看板都做了答辩的时候老师问「你的数据存哪」「用户怎么管理」你能答得上来。接下来我会按实际拆包和部署的顺序把这份资源怎么跑起来、参数怎么调、哪里容易翻车一条条讲清楚。2. 环境搭建与依赖安装把 Flask 和深度学习框架装进同一个虚拟环境2.1 为什么必须用虚拟环境而不是全局 Python我见过太多人拿到源码之后直接pip install -r requirements.txt然后发现 TensorFlow 和 PyTorch 版本打架或者 Flask 版本跟 Werkzeug 不兼容整个环境炸掉。血泪经验是先建虚拟环境再装依赖。这份资源大概率同时依赖 Flask 和某个深度学习框架PyTorch 或 TensorFlow这两个东西对 Python 版本和底层库的要求不一样全局装必翻车。# 创建虚拟环境指定 Python 3.8 或 3.9太新的版本深度学习框架可能不支持 python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate # 升级 pip避免安装时出现依赖解析超时 pip install --upgrade pip # 安装依赖建议加国内镜像源加速 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple逻辑说明venv是 Python 标准库自带的虚拟环境工具不需要额外装。激活之后所有 pip 安装的包都只在这个目录下生效不会污染全局环境。参数说明-i后面跟的是镜像源地址清华源对深度学习框架的大包下载速度比较友好。如果你拿到的源码里没有 requirements.txt那就得手动装Flask、Flask-SQLAlchemy、PyMySQL、torch 或 tensorflow、jieba、numpy、pandas这几个是常见组合。提示如果安装 torch 的时候卡在下载阶段可以先单独装 CPU 版本命令是pip install torch --index-url https://download.pytorch.org/whl/cpu毕业设计演示用 CPU 推理足够了没必要折腾 CUDA。2.2 数据库初始化的三个关键步骤这份资源带了数据库文件但你不能直接双击打开就用。MySQL 的版本兼容性是个玄学问题我一般会先确认本机 MySQL 版本然后决定是导入 SQL 文件还是用 Flask 的迁移命令重建表。# 登录 MySQL创建数据库 mysql -u root -p CREATE DATABASE sentiment_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; exit; # 导入 SQL 文件如果资源里带了 .sql 文件 mysql -u root -p sentiment_db database/sentiment_db.sql # 或者用 Flask 的 db.create_all() 重建表 python manage.py db init python manage.py db migrate python manage.py db upgrade逻辑说明utf8mb4字符集是必须的中文情感分析系统里用户输入的文本可能包含 emoji 或者生僻字用utf8会丢数据。参数说明manage.py是 Flask-Migrate 的入口脚本如果你的源码里没有这个文件那就找app.py或者run.py里面通常有db.create_all()的调用。导入 SQL 文件之前先看一眼文件里的表名和字段确认跟源码里的模型定义对得上不然跑起来会报Table doesnt exist。2.3 模型权重文件的放置与加载路径深度学习模型这部分是最容易出问题的地方。源码里通常会有一个model/目录里面放着.pt或.h5权重文件。你需要确认三件事权重文件在不在、路径对不对、推理代码用的框架版本跟权重是否匹配。# 常见的模型加载代码片段以 PyTorch 为例 import torch import torch.nn as nn class SentimentLSTM(nn.Module): def __init__(self, vocab_size, embed_dim, hidden_dim, output_dim): super().__init__() self.embedding nn.Embedding(vocab_size, embed_dim) self.lstm nn.LSTM(embed_dim, hidden_dim, batch_firstTrue) self.fc nn.Linear(hidden_dim, output_dim) def forward(self, x): embedded self.embedding(x) lstm_out, (hidden, _) self.lstm(embedded) return self.fc(hidden[-1]) # 加载权重 model SentimentLSTM(vocab_size5000, embed_dim128, hidden_dim256, output_dim2) model.load_state_dict(torch.load(model/sentiment_lstm.pt, map_locationcpu)) model.eval()逻辑说明map_locationcpu是关键参数如果你在 GPU 机器上训练了模型但部署环境没有 GPU不加这个参数会报RuntimeError: Attempting to deserialize object on a CUDA device。参数说明vocab_size是词表大小embed_dim是词向量维度hidden_dim是 LSTM 隐藏层维度这三个值必须跟训练时一致否则load_state_dict会报 shape mismatch。如果你拿到的源码用的是 BERT那加载方式不一样通常是BertForSequenceClassification.from_pretrained(bert-base-chinese)权重文件放在bert_model/目录下。3. 核心功能模块拆解登录注册、文本分析、后台看板怎么串起来3.1 登录注册模块的表单验证与密码存储登录注册看起来简单但毕业设计答辩的时候老师最爱问「你的密码是怎么存的」。如果你回答「明文存数据库」那基本就凉了。这份资源里注册页面要求重复确认密码和绑定手机号说明作者至少考虑了基本的安全逻辑。from flask import Flask, request, jsonify from werkzeug.security import generate_password_hash, check_password_hash from models import db, User app Flask(__name__) app.route(/register, methods[POST]) def register(): data request.get_json() username data.get(username) password data.get(password) confirm_password data.get(confirm_password) phone data.get(phone) # 校验密码一致性 if password ! confirm_password: return jsonify({code: 400, msg: 两次密码不一致}) # 校验用户名是否已存在 if User.query.filter_by(usernameusername).first(): return jsonify({code: 400, msg: 用户名已存在}) # 密码哈希存储不要明文 hashed_pw generate_password_hash(password, methodpbkdf2:sha256) new_user User(usernameusername, passwordhashed_pw, phonephone) db.session.add(new_user) db.session.commit() return jsonify({code: 200, msg: 注册成功})逻辑说明generate_password_hash是 Werkzeug 提供的哈希函数默认用pbkdf2:sha256每次生成的哈希值都不一样但check_password_hash能验证通过。参数说明method可以改成scrypt或者argon2但需要额外装库毕业设计用默认的就行。手机号绑定这块源码里可能只是存了个字段没有真的发短信验证答辩的时候如果老师问「手机号验证怎么实现的」你就说「预留了短信接口实际部署时可以接入阿里云短信服务」别硬编。3.2 文本分析接口的预处理与推理流程文本分析是这份资源的核心功能。用户在前端文本框输入一段中文后端需要做分词、转 ID、padding、送进模型推理、返回分类结果。这个流程里每一步都有坑。import jieba import numpy as np import torch # 加载词表 with open(model/vocab.txt, r, encodingutf-8) as f: vocab {line.strip(): idx for idx, line in enumerate(f.readlines())} def preprocess(text, max_len128): # 结巴分词 words jieba.lcut(text) # 转 ID未登录词用 UNK 代替 ids [vocab.get(w, vocab.get(UNK, 1)) for w in words] # 截断或 padding if len(ids) max_len: ids ids[:max_len] else: ids ids [0] * (max_len - len(ids)) return torch.tensor([ids]) def predict(text): model.eval() with torch.no_grad(): input_ids preprocess(text) output model(input_ids) prob torch.softmax(output, dim1) pred torch.argmax(prob, dim1).item() return {label: 正面 if pred 1 else 负面, confidence: prob[0][pred].item()}逻辑说明jieba.lcut返回的是列表不是生成器直接遍历就行。vocab.get(w, vocab.get(UNK, 1))这行是双重保险如果词表里连UNK都没有就默认用 ID 1。参数说明max_len128是常见选择中文短文本评论一般不会超过这个长度设太大浪费显存设太小会截断关键信息。torch.no_grad()关闭梯度计算推理阶段必须加不然显存占用会翻倍。如果你拿到的源码用的是 BERT预处理要用BertTokenizerpadding 和 attention_mask 都要处理比 LSTM 麻烦一些。3.3 后台看板的图表数据从哪来后台首页的柱状图和饼图不是静态图片是从数据库里查出来的统计数据。常见做法是用 ECharts 或者 Chart.js 在前端渲染后端提供一个/api/stats接口返回 JSON 数据。from flask import jsonify from models import db, AnalysisRecord from sqlalchemy import func app.route(/api/stats) def stats(): # 按情感标签分组统计 results db.session.query( AnalysisRecord.label, func.count(AnalysisRecord.id) ).group_by(AnalysisRecord.label).all() # 按日期统计最近 7 天的分析量 daily db.session.query( func.date(AnalysisRecord.created_at), func.count(AnalysisRecord.id) ).group_by(func.date(AnalysisRecord.created_at)).order_by( func.date(AnalysisRecord.created_at).desc() ).limit(7).all() return jsonify({ pie: [{name: 正面 if r[0] 1 else 负面, value: r[1]} for r in results], bar: [{date: str(d[0]), count: d[1]} for d in reversed(daily)] })逻辑说明func.count是 SQLAlchemy 的聚合函数配合group_by实现分组统计。参数说明limit(7)控制柱状图只显示最近 7 天避免数据太多挤在一起。reversed(daily)是因为查询用了desc排序前端图表通常按时间正序显示所以反转一下。如果数据库里没有created_at字段你得先加一个不然这个接口跑不通。4. 避坑与排查部署这份资源时最容易翻车的五个地方4.1 现象启动 Flask 报ModuleNotFoundError: No module named flask_sqlalchemy原因依赖没装全或者虚拟环境没激活。很多人装依赖的时候用的是全局 pip跑的时候用的是虚拟环境的 python两边对不上。解决先确认which python和which pip指向的是同一个虚拟环境目录然后重新执行pip install flask-sqlalchemy pymysql。如果还报错检查requirements.txt里有没有拼写错误比如把Flask-SQLAlchemy写成了flask_sqlalchemypip 对大小写不敏感但有些包名确实有差异。4.2 现象模型推理结果全是「正面」或全是「负面」原因词表跟模型不匹配或者预处理的时候 padding 位置搞错了。LSTM 对 padding 位置敏感如果 padding 加在前面而不是后面模型看到的全是 0输出就退化了。解决打印一下preprocess返回的 tensor看看非零元素是不是集中在前面。如果是 BERT检查attention_mask有没有正确设置padding 位置的 mask 应该是 0。另外确认词表文件编码是utf-8用gbk读会乱码导致所有词都变成UNK。4.3 现象MySQL 连接报Access denied for user rootlocalhost原因密码不对或者 MySQL 8.0 的认证插件跟 PyMySQL 不兼容。MySQL 8.0 默认用caching_sha2_password老版本的 PyMySQL 不支持。解决先确认密码没错然后执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码;把认证插件改回mysql_native_password。如果用的是 Flask-SQLAlchemy连接字符串写成mysqlpymysql://root:passwordlocalhost:3306/sentiment_db?charsetutf8mb4charset参数不能省。4.4 现象前端页面样式全乱CSS 文件 404原因Flask 的静态文件目录配置不对或者 HTML 里引用的路径是绝对路径。这份资源的 CSS 文件列表里有layui.css、layer.css、laydate.css这些说明用了 LayUI 框架路径写错一个就全崩。解决确认 Flask 的static_folder和template_folder配置正确通常默认是static/和templates/。HTML 里引用 CSS 用{{ url_for(static, filenamecss/layui.css) }}不要写/static/css/layui.css除非你确认路由配置没问题。打开浏览器开发者工具看 Network 面板里哪些文件 404一个个补。4.5 现象后台看板图表不显示控制台报Uncaught TypeError: Cannot read property length of undefined原因/api/stats接口返回的数据格式跟前端 ECharts 期望的不一致。常见情况是后端返回了空列表前端没做空值判断。解决先在浏览器直接访问/api/stats看返回的 JSON 结构。如果pie或bar是空数组说明数据库里没有分析记录先手动插几条测试数据。然后检查前端代码里option.series[0].data的赋值逻辑加一个|| []兜底。如果用的是 LayUI 的图表模块确认layui.use([echarts], ...)里的模块名跟实际引入的一致。5. 从能跑到能答辩模型替换与效果验证的实操技巧5.1 把 LSTM 换成 BERT 需要改哪几个文件如果你觉得 LSTM 的效果不够好想换成 BERT 来提升答辩亮点需要改三个地方模型定义文件、预处理函数、依赖列表。常见做法是直接用transformers库加载bert-base-chinese然后在分类层接一个Linear(768, 2)。from transformers import BertTokenizer, BertForSequenceClassification import torch # 加载预训练模型和分词器 tokenizer BertTokenizer.from_pretrained(bert-base-chinese) model BertForSequenceClassification.from_pretrained(bert-base-chinese, num_labels2) def predict_bert(text): inputs tokenizer(text, return_tensorspt, max_length128, truncationTrue, paddingmax_length) with torch.no_grad(): outputs model(**inputs) prob torch.softmax(outputs.logits, dim1) pred torch.argmax(prob, dim1).item() return {label: 正面 if pred 1 else 负面, confidence: prob[0][pred].item()}逻辑说明return_tensorspt告诉 tokenizer 返回 PyTorch 张量truncationTrue和paddingmax_length保证所有输入长度一致。参数说明max_length128跟 LSTM 版本保持一致num_labels2是二分类。注意 BERT 的推理速度比 LSTM 慢很多CPU 上单条推理可能要几百毫秒答辩演示的时候别频繁点或者提前缓存几条结果。5.2 用混淆矩阵验证模型效果而不是只看准确率答辩的时候老师问「你的模型准确率多少」你回答「95%」老师接着问「正面样本和负面样本的准确率分别是多少」你就答不上来了。我一般会跑一个混淆矩阵把每一类的表现都看清楚。from sklearn.metrics import confusion_matrix, classification_report import seaborn as sns import matplotlib.pyplot as plt # 假设 y_true 和 y_pred 是真实标签和预测标签 y_true [0, 1, 0, 1, 0, 1, 0, 0, 1, 1] y_pred [0, 1, 0, 0, 0, 1, 1, 0, 1, 1] cm confusion_matrix(y_true, y_pred) print(classification_report(y_true, y_pred, target_names[负面, 正面])) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, xticklabels[负面, 正面], yticklabels[负面, 正面]) plt.xlabel(预测标签) plt.ylabel(真实标签) plt.savefig(confusion_matrix.png, dpi150, bbox_inchestight)逻辑说明classification_report会输出 precision、recall、f1-score比单一准确率有说服力。参数说明fmtd表示热力图里显示整数cmapBlues是配色方案bbox_inchestight防止保存的图片边缘被裁掉。如果发现某一类 recall 特别低说明模型对那类样本学得不好可以考虑加数据增强或者调整类别权重。5.3 答辩演示前的检查清单从那以后我每次帮人看毕业设计项目都会强制走一遍这个检查流程先确认虚拟环境激活了没有再确认数据库连上了没有然后手动跑一条正面和一条负面文本看结果对不对最后打开后台看板确认图表有数据。这三步走完基本不会在答辩现场翻车。还有一个小技巧提前把演示用的文本存在记事本里别现场手打手打容易紧张打错字打错了模型判错老师就会追问越追问越慌。模型替换之后记得同步更新requirements.txt把transformers和torch的版本号写进去不然换台机器部署又得重新踩一遍依赖的坑。如果你拿到的源码里模型文件是.h5格式说明用的是 TensorFlow/Keras替换成 BERT 的话要用TFBertForSequenceClassification别装错库。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑