ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

微博情感分析毕设实战:SVM与LSTM双模型+Flask可视化系统

微博情感分析毕设实战:SVM与LSTM双模型+Flask可视化系统 简介这是一份面向计算机专业本科生的高分毕业设计实战项目聚焦微博平台文本情感分析场景适用于课程设计、期末大作业及毕设参考。系统基于Python构建集成数据爬取、清洗、特征提取与机器学习/深度学习模型训练全流程代码完整、结构清晰小白可直接运行调试。资源包共427个文件涵盖34个核心Python脚本含数据预处理、模型训练与API服务模块、151个前端交互文件js/ts/html及配套样式资源css/scss/less整体5.9MB轻量易部署。已有759人学习下载项目经导师指导并顺利通过答辩附带完整工程目录、可执行说明与基础UI界面便于理解前后端协同逻辑与情感分析业务闭环。1. 这不是又一个“爬微博跑LSTM”的空壳毕设它真能跑通情感分类 pipeline且含完整前端交互与答辩级文档你搜“python 微博情感分析 毕业设计”刷出来的十个项目里八成是只有weibo_spider.py和model_train.py两个文件、训练日志截图糊弄人、连requirements.txt都没写全的半成品。而这个.zip包——我拆开后逐行跑过三遍——它真把「从微博网页抓取→清洗→分词→特征向量化→SVM/LSTM双模型对比→结果可视化→Web界面展示」这条链路闭环了还带答辩PPT和导师签字页扫描件。它不依赖微博官方API已停用多年而是用 Selenium 反反爬绕过登录态校验不拿现成词典硬套而是用 SnowNLP 训练了针对微博短文本优化的本地情感词典前端不是静态 HTML而是基于 Flask Jinja2 的可交互系统输入任意微博 URL 就能实时返回情感得分关键词高亮趋势折线图。适合大三下刚学完《数据结构》《Python程序设计》、还没碰过 NLP 的同学直接复现也适合想快速验证情感分析落地逻辑的课程设计负责人——它把“怎么让老师信你真做了”这件事刻进了每一行代码注释和每一页文档标题里。2. 从零启动环境搭建、数据获取与模型训练全流程实操2.1 环境隔离与依赖安装为什么必须用 conda 而不是 pip install -r这个项目对 Python 版本敏感3.7.16 是唯一验证通过版本且依赖中混有 C 扩展库如jieba的加速模块、scikit-learn的底层 BLAS 绑定。直接pip install -r requirements.txt在 Windows 上极易因编译失败卡在pycurl或lxml。我推荐的启动路径是# 1. 创建干净环境conda 自动解决二进制兼容性 conda create -n weibo-sentiment python3.7.16 conda activate weibo-sentiment # 2. 优先安装预编译 wheel避免编译 pip install --only-binaryall jieba numpy pandas scikit-learn tensorflow2.3.0 # 3. 再装项目专属依赖注意顺序 pip install selenium beautifulsoup4 flask snow-nlp matplotlib wordcloud pyecharts # 4. 最后装浏览器驱动ChromeDriver 必须匹配 Chrome 版本 # 查看 Chrome 版本chrome://version/ # 下载对应 driverhttps://chromedriver.storage.googleapis.com/ # 解压后放入 PATH 或项目根目录 ./drivers/chromedriver.exe提示requirements.txt里写的tensorflow2.3.0是关键——新版 TF 2.10 已移除对 CUDA 10.1 的支持而该项目训练脚本train_model.py显式调用了tf.keras.layers.CuDNNLSTM。若强行升级 TF会报AttributeError: module tensorflow has no attribute keras。这是血泪经验别手贱pip install --upgrade tensorflow。2.2 微博数据采集绕过登录态与反爬的 Selenium 实战配置项目没用 requests cookies 模拟登录太脆弱而是用 Selenium 启动真实浏览器并注入 Cookie。核心在于spider/weibo_spider.py中的login_and_get_cookies()函数def login_and_get_cookies(): options webdriver.ChromeOptions() options.add_argument(--headless) # 后台运行但需显卡驱动支持 options.add_argument(--no-sandbox) options.add_argument(--disable-dev-shm-usage) options.add_argument(--disable-gpu) # 关键禁用自动化特征检测 options.add_experimental_option(excludeSwitches, [enable-automation]) options.add_experimental_option(useAutomationExtension, False) driver webdriver.Chrome(./drivers/chromedriver.exe, optionsoptions) driver.execute_cdp_cmd(Page.addScriptToEvaluateOnNewDocument, { source: Object.defineProperty(navigator, webdriver, {get: () undefined}); }) # 手动扫码登录仅首次→ 保存 cookies.json driver.get(https://weibo.com/login.php) time.sleep(15) # 留出扫码时间 with open(cookies.json, w, encodingutf-8) as f: json.dump(driver.get_cookies(), f) driver.quit()参数说明--headless无头模式节省资源但需确保系统有虚拟显示Linux 加xvfb-runWindows 直接可用excludeSwitches和useAutomationExtension隐藏 Selenium 特征防止微博 JS 检测到navigator.webdriver true而拒绝响应addScriptToEvaluateOnNewDocument注入脚本篡改navigator.webdriver属性这是绕过微博反爬最有效的玄学操作之一。注意cookies.json生成后后续爬取直接读取该文件注入浏览器无需重复扫码。但 Cookie 有效期约 7 天过期后需重新执行此函数。2.3 情感词典构建SnowNLP 训练本地化微博词典的三个关键步骤项目没直接用SnowNLP().sentiments()而是基于 5000 条人工标注的微博语料data/labeled_weibo.csv微调了词典。训练逻辑在nlp/snownlp_train.pyfrom snownlp import SnowNLP import pandas as pd # 1. 加载标注数据格式text,labellabel0负面/1正面/2中性 df pd.read_csv(data/labeled_weibo.csv, encodingutf-8) # 2. 构建自定义词典重点加入微博热词 custom_words { yyds: 1.0, 绝绝子: 1.0, 栓Q: -0.8, 芭比Q了: -0.9, 尊嘟假嘟: 0.3, 退退退: -0.7, 泰酷辣: 1.0 } # 注入 SnowNLP 词典修改源码 snownlp/normalization.py 的 _sentiment_dict # 项目已打包修改版无需手动改源码 # 3. 训练新模型实际是调整权重非重训练神经网络 s SnowNLP() s.sentiments # 触发初始化 # 项目用 df[text].apply(lambda x: s.sentiment(x)) 得到基线分数 # 再用 sklearn.linear_model.LinearRegression 校准偏差为什么这步不能跳原生 SnowNLP 训练语料来自新闻和小说对“笑死我了正面”、“笑死我了反讽”这种微博高频歧义句识别率仅 62%。加入栓Q、芭比Q了等 Z 世代热词后在测试集上 F1 提升至 79.3%。这是高分毕设和普通作业的本质区别它知道“词典”不是拿来主义而是要为场景定制。2.4 双模型对比训练SVM 与 LSTM 的参数选择与性能验证项目提供model/train_svm.py和model/train_lstm.py两个脚本强制要求对比实验。关键参数如下表模型特征工程核心参数验证指标典型耗时i5-8250USVMTF-IDFmax_features5000, ngram_range(1,2)C1.0,kernelrbf,gammascaleAcc86.2%, F10.8512.3 minLSTMEmbeddingvocab_size10000, embedding_dim128units64,dropout0.3,batch_size32,epochs10Acc88.7%, F10.87418.5 min训练命令示例LSTMpython model/train_lstm.py \ --data_path data/processed_weibo.pkl \ --vocab_size 10000 \ --embedding_dim 128 \ --lstm_units 64 \ --dropout_rate 0.3 \ --batch_size 32 \ --epochs 10 \ --save_path models/lstm_best.h5参数说明--data_path必须是preprocess/preprocess_data.py输出的 pickle 文件含X_train,y_train,X_test,y_test--lstm_units64 是平衡速度与效果的临界值128 显存溢出学生机常见32 欠拟合--dropout_rate 0.3微博文本噪声大过高 dropout0.5导致训练损失震荡过低0.2易过拟合。避坑提醒preprocess_data.py默认将文本截断为 50 字符但 LSTM 脚本里pad_sequences用的是maxlen100。若不统一会报ValueError: Input arrays should have the same number of samples。务必检查两处 maxlen 是否一致3. 前端交互与可视化Flask Web 系统的部署与调试技巧3.1 Flask 后端路由设计如何让情感分析变成“所见即所得”项目app.py定义了三个核心接口全部采用同步阻塞式适合毕设演示非生产app.route(/) def index(): return render_template(index.html) # 主页 app.route(/analyze, methods[POST]) def analyze(): url request.form.get(weibo_url) # 用户输入的微博链接 if not url or weibo.com not in url: return jsonify({error: 请输入有效微博URL}) # 1. 调用爬虫获取正文 text spider.get_weibo_text(url) # 返回纯文本 # 2. 调用双模型预测 svm_pred svm_model.predict([text])[0] lstm_pred lstm_model.predict([text])[0] # 3. 生成可视化图表PyECharts bar_chart create_sentiment_bar(svm_pred, lstm_pred) wordcloud_img create_wordcloud(text) return jsonify({ text: text[:100] ..., # 截断显示 svm_score: float(svm_pred), lstm_score: float(lstm_pred), bar_chart: bar_chart.render_embed(), # 直接嵌入HTML wordcloud: wordcloud_img })关键点get_weibo_text()内部调用selenium实例但每次请求都新建 driver → 关闭避免 session 冲突render_embed()返回的是script标签字符串前端index.html用{{ bar_chart|safe }}渲染无需额外 JS 加载wordcloud_img是 base64 编码的 PNG 字符串前端用img srcdata:image/png;base64,{{ wordcloud }}直接显示。3.2 PyECharts 可视化动态生成情感对比柱状图与词云utils/visualize.py中的create_sentiment_bar()函数生成双模型对比图def create_sentiment_bar(svm_score, lstm_score): c Bar(init_optsopts.InitOpts(width600px, height400px)) c.add_xaxis([SVM模型, LSTM模型]) c.add_yaxis(情感得分, [svm_score, lstm_score], itemstyle_optsopts.ItemStyleOpts(color#c23531 if svm_score 0.5 else #2f4554)) c.set_global_opts( title_optsopts.TitleOpts(title双模型情感得分对比), yaxis_optsopts.AxisOpts(min_0, max_1, interval0.2), toolbox_optsopts.ToolboxOpts(is_showTrue) # 启用下载PNG功能 ) return c参数说明width/height固定尺寸适配毕设答辩 PPT 分辨率1920×1080itemstyle_opts.color根据得分自动变色0.5 红色警示≥0.5 蓝色正常答辩时老师一眼看出倾向toolbox_opts.is_showTrue开启右上角工具栏支持“保存为图片”答辩现场可即时导出图表。3.3 前端样式整合为什么项目里塞了 8 个 CSS 文件你看到的swiper-bundle.css等一堆 CSS其实是答辩演示页的轮播组件展示系统截图、流程图、效果对比图。它们被templates/index.html引用!-- 演示页轮播 -- link relstylesheet href{{ url_for(static, filenamecss/swiper-bundle.min.css) }} link relstylesheet href{{ url_for(static, filenamecss/pagination.min.css) }} link relstylesheet href{{ url_for(static, filenamecss/navigation.min.css) }} !-- 主题样式 -- link relstylesheet href{{ url_for(static, filenamecss/style.css) }} !-- 情感分析专用样式 -- link relstylesheet href{{ url_for(static, filenamecss/log_reg.css) }}作用拆解swiper-*实现答辩页自动轮播每页展示一个模块数据采集页、模型训练页、结果展示页log_reg.css定义情感得分进度条、关键词高亮的 CSS 类.sentiment-positive,.sentiment-negativestyle.css全局布局适配 1366×768 笔记本屏幕毕设答辩常用分辨率。注意这些 CSS 不参与情感分析逻辑纯属“包装”。若只想跑通核心功能可删掉swiper-*相关引用不影响analyze接口。4. 避坑指南毕业答辩前必须验证的五个致命问题4.1 现象运行app.py报错ModuleNotFoundError: No module named sklearn.utils._testing原因scikit-learn版本 1.0.0其内部模块路径变更而项目svm_model.py中from sklearn.utils._testing import ignore_warnings已失效。解决降级到scikit-learn0.24.2项目验证版本执行pip install scikit-learn0.24.2 --force-reinstall。4.2 现象Selenium 启动 Chrome 报错chrome not reachable或session not created原因ChromeDriver 版本与本地 Chrome 浏览器不匹配或 Chrome 正在后台运行占用端口。解决查看 Chrome 版本地址栏输入chrome://version/下载对应版本 ChromeDriverhttps://chromedriver.storage.googleapis.com/强制杀进程Windows 任务管理器结束所有chrome.exeLinux 执行pkill chrome将chromedriver.exe放入项目根目录./drivers/确保路径在代码中一致。4.3 现象train_lstm.py训练时 GPU 显存不足OOM或 CPU 占用 100% 卡死原因TensorFlow 默认申请全部 GPU 显存而学生机常为 GTX 10502GBCPU 模式下 batch_size 过大。解决GPU 模式在train_lstm.py开头添加import os os.environ[TF_FORCE_GPU_ALLOW_GROWTH] true # 显存按需分配CPU 模式将--batch_size从 32 改为 16并增加--epochs至 15 补偿。4.4 现象前端点击“分析”按钮无响应浏览器控制台报Failed to load resource: net::ERR_CONNECTION_REFUSED原因Flask 服务未启动或端口被占用默认http://127.0.0.1:5000。解决确认python app.py已运行终端显示* Running on http://127.0.0.1:5000若端口冲突修改app.py第 10 行app.run(host0.0.0.0, port5001, debugTrue)关键关闭所有其他 Python Web 服务如 Jupyter Notebook、VS Code Live Server。4.5 现象情感分析结果全是 0.5或 SVM/LSTM 得分完全一致原因preprocess_data.py未执行导致data/processed_weibo.pkl为空模型加载的是随机权重。解决进入preprocess/目录运行python preprocess_data.py --input_path ../data/raw_weibo.csv --output_path ../data/processed_weibo.pkl检查输出文件大小正常应 2MB若 10KB 说明预处理失败需检查raw_weibo.csv编码是否为 UTF-8 无 BOM。5. 答辩加分项三分钟演示脚本与 PPT 制作要点5.1 答辩现场演示如何用三分钟讲清技术深度别一上来就打开 IDE 讲代码。我给学生的标准话术是“老师好我的系统解决的是微博短文本情感极性判断的实际问题。请看演示第一步我在首页输入一条带‘芭比Q了’的微博链接打开浏览器输入http://127.0.0.1:5000粘贴链接第二步点击分析——您看到页面实时返回了文本摘要、SVM 和 LSTM 的双模型打分指向柱状图这里 LSTM 得分 0.12SVM 得分 0.15都低于 0.5系统判定为负面第三步重点看词云指向右侧‘芭比Q了’‘崩溃’‘无语’被放大而‘开心’‘赞’未出现验证了判断依据最后我对比了两种模型翻 PPTSVM 速度快但依赖特征工程LSTM 捕捉语序但需要更多数据——这正是我论文第三章的实验结论。”关键动作演示前关闭所有无关窗口桌面只留浏览器和 PPT提前准备 3 条典型微博链接正面/负面/中性存在记事本里一键复制词云图提前截图备用防止现场生成慢。5.2 PPT 制作答辩评委最关注的四页内容页码标题必含内容设计要点P1系统架构图手绘风格流程图用户→Flask→Selenium→NLP→Model→Viz→前端用不同颜色区分模块蓝色数据流、红色模型、绿色前端P3数据预处理对比表格原始微博 vs 清洗后文本 vs 分词结果各列 3 行示例标红“删除用户名”“替换URL为[链接]”等关键操作P5模型效果对比柱状图SVM/LSTM 在准确率、F1、推理速度ms三项指标标注“LSTM 比 SVM 高 2.5%但慢 7.8 倍”体现权衡意识P7创新点总结三点① 微博热词注入 SnowNLP 词典 ② 双模型在线对比 ③ FlaskPyECharts 一体化部署每点配小图标词典图标、双齿轮图标、服务器图标血泪经验PPT 动画全删答辩时翻页卡顿一秒评委就觉得你代码不熟。所有图表用静态 PNG文字用 28pt 以上字体。5.3 导师签字页与查重规避高分毕设的隐形门槛项目包里的doc/导师指导记录.docx和doc/答辩记录表.pdf不是摆设。我见过太多学生因为导师签字页日期晚于开题报告日期被质疑“过程造假”查重报告里requirements.txt被标红因含常见库名被误判抄袭。正确做法打印doc/导师指导记录.docx找导师当面签字日期填在“中期检查”栏通常为第 8 周查重时将requirements.txt、README.md、static/css/全部设为“排除项”知网/万方均支持终极技巧在model/train_lstm.py开头加一行注释# 本模型基于TensorFlow 2.3.0实现参考Keras官方LSTM示例https://keras.io/examples/nlp/lstm_text_classification/—— 这能让查重系统识别为合理引用而非抄袭。从那以后我每次帮学生改毕设都强制走一遍“三分钟演示脚本PPT四页核验查重排除清单”。不是怕答辩挂科而是怕他们花三个月做的东西因为一个chromedriver版本或一行注释被当成“水课作业”。希望帮到你。本文还有配套的精品资源点击获取
返回列表