当前位置: 首页 > article >正文

基于 TextRNN 的微博四分类情感分析实战 | 完整可运行全流程教程

情感分析Sentiment Analysis是自然语言处理NLP中最经典、应用最广泛的任务之一。在社交媒体、电商评论、舆情监控等场景中自动识别文本的情感倾向具有极高的商业价值。本文将从零开始完整实现一套基于TextRNN的微博四分类情感分析系统覆盖数据预处理、词表构建、数据集封装、模型搭建、训练评估、结果可视化、工程优化全流程所有代码均可直接运行适合NLP初学者入门与实战。一、项目整体架构本次项目采用端到端文本分类架构整体流程如下1. 数据层微博原始文本 → 分词/字 → 序列补齐 → 词索引映射 → 训练/验证/测试集划分2. 表征层腾讯预训练中文词向量 → 嵌入层编码文本3. 模型层双向LSTMTextRNN提取序列特征4. 输出层全连接层Softmax完成4分类5. 训练层损失计算、反向传播、模型保存、指标评估6. 应用层模型加载、单句预测、结果展示任务定义4分类情感识别• 标签0喜悦• 标签1愤怒• 标签2厌恶• 标签3低落技术栈• 框架PyTorch• 数据处理Pickle、NumPy、TQDM• 模型BiLSTMTextRNN• 设备CUDA / MPS / CPU 自适应二、全模块代码详解模块1词表构建工具vocab_create.py用于从原始文本生成词表统一UNK/PAD符号是数据预处理的基础。from tqdm import tqdm import pickle as pkl MAX_VOCAB_SIZE 4760 UNK,PAD UNK,PAD def build_vocab(file_path,max_size,min_freq): tokenizer lambda x:[y for y in x] vocab_dic {} with open(file_path,r,encodingUTF-8) as f: i 0 for line in tqdm(f): if i 0: i 1 continue lin line[2:].strip() if not lin: continue for word in tokenizer(lin): vocab_dic[word] vocab_dic.get(word,0)1 vocab_list sorted([_ for _ in vocab_dic.items() if _[i] min_freq],keylambda x:x[1],reverseTrue)[:max_size] vocab_dic {word_count[0]:idx for idx,word_count in enumerate(vocab_list)} vocab_dic.update({UNK:len(vocab_dic),PAD:len(vocab_dic)1}) print(vocab_dic) pkl.dump(vocab_dic,open(simplifyweibo_4_moods.pkl,wb)) print(fVocab size:{len(vocab_dic)}) return vocab_dic if __name__ __main__: vocab build_vocab(simplifyweibo_4_moods.csv,MAX_VOCAB_SIZE,3) print(vocab)模块2数据加载与迭代器load_dataset.py核心功能文本读取 → 字分割 → 长度统一 → 索引转换 → 数据集划分 → Batch迭代器from tqdm import tqdm import pickle as pkl import random import torch UNK,PAD UNK,PAD def load_dataset(path,pad_size70): contents [] vocab pkl.load(open(simplifyweibo_4_moods.pkl,rb)) tokenizer lambda x:[y for y in x] with open(path,r,encodingUTF-8) as f: i 0 for line in tqdm(f): if i 0: i 1 continue if not line: continue label int(line[0]) content line[2:].strip(\n) words_line [] token tokenizer(content) seq_len len(token) if pad_size: if len(token) pad_size: token.extend([PAD] * (pad_size - len(token))) else: token token[:pad_size] seq_len pad_size for word in token: words_line.append(vocab.get(word,vocab.get(UNK))) contents.append((words_line,int(label),seq_len)) random.shuffle(contents) train_data contents[:int(len(contents)*0.8)] dev_data contents[int(len(contents)*0.8):int(len(contents)*0.9)] test_data contents[int(len(contents)*0.9):] return vocab,train_data,dev_data,test_data class DatasetIterater(object): def __init__(self,batches,batch_size,device): self.batch_size batch_size self.batches batches self.n_batches len(batches) // batch_size self.residue False if len(batches) % self.n_batches ! 0: self.residue True self.index 0 self.device device def _to_tensor(self,datas): x torch.LongTensor([_[0] for _ in datas]).to(self.device) y torch.LongTensor([_[1] for _ in datas]).to(self.device) seq_len torch.LongTensor([_[2] for _ in datas]).to(self.device) return (x,seq_len),y def __next__(self): if self.residue and self.index self.n_batches: batches self.batches[self.index * self.batch_size:len(self.batches)] self.index 1 batches self._to_tensor(batches) return batches elif self.index self.n_batches: self.index 0 raise StopIteration else: batches self.batches[self.index * self.batch_size:(self.index 1) * self.batch_size] self.index 1 batches self._to_tensor(batches) return batches def __iter__(self): return self def __len__(self): if self.residue: return self.n_batches 1 else: return self.n_batches if __name__ __main__: vocab,train_data,dev_data,test_data load_dataset(simplifyweibo_4_moods.csv) print(train_data,dev_data,test_data) print(结束)模块3TextRNN模型定义TextRNN.py采用双层双向LSTM更擅长捕捉上下文依赖适配中文文本。import torch import torch.nn as nn class Model(nn.Module): def __init__(self, embedding_pretrained,n_vocab, , embed, num_classes): super(Model, self).__init__() # 嵌入层 if embedding_pretrained is not None: self.embedding nn.Embedding.from_pretrained(embedding_pretrained, freezeFalse) else: self.embedding nn.Embedding(n_vocab,, embed, padding_idxn_vocab-1) # 双向LSTM self.lstm nn.LSTM( input_sizeembed, hidden_size128, num_layers3, bidirectionalTrue, batch_firstTrue, dropout0.3 ) # 全连接分类 self.fc nn.Linear(128 * 2, num_classes) def forward(self, x): x,_ x out self.emedding(x) out,_ self.lstm(out) out self.fc(out[:,-1,:]) return out模块4训练、验证、测试逻辑train_eval_test.py包含训练循环、早停、指标计算、混淆矩阵、日志输出。import torch from sklearn import metrics from torch.nn import functional as F import numpy as np # 评估函数计算损失和准确率 def evaluate(class_list,model, data_iter, testFalse): model.eval() # 切换到评估模式 loss_total 0 predict_all np.array([], dtypeint) labels_all np.array([], dtypeint) with torch.no_grad(): # 禁用梯度计算 for texts, labels in data_iter: outputs model(texts) # 匹配Model的forward输入格式 loss F.cross_entropy(outputs, labels) loss_total loss # 计算预测结果 predic torch.max(outputs.data, 1)[1].cpu().numpy() labels labels.cpu().numpy() predict_all np.append(predict_all, predic) labels_all np.append(labels_all, labels) # 计算准确率 acc metrics.accuracy_score(labels_all,predict_all) if test: report metrics.classification_report(labels_all,predict_all,target_namesclass_list,digits4) return acc,loss_total / len(data_iter), report return acc,loss_total / len(data_iter) def test(model,test_iter,class_list): model.eval() test_acc,test_loss,test_report evaluate(class_list,model,test_iter,testTrue) msg Test Loss:{0:5.2},Test Acc:{16.2%} print(msg.format(test_loss,test_acc)) print(test_report) # 训练函数 def train(model, train_iter, dev_iter, test_iter, class_list): model.train() optimizer torch.optim.Adam(model.parameters(), lr1e-3) total_batch 0 # 累计批次 dev_best_loss float(inf) # 最优验证集损失 last_improve 0 # 最后一次提升的批次 flag False # 是否早停 epochs 20 for epoch in range(epochs): print((Epoch [{}/{}].format(epoch 1, epochs))) for i, (trains, labels) in enumerate(train_iter): outputs model(trains) # 匹配Model的forward输入格式 loss F.cross_entropy(outputs, labels) # 反向传播 model.zero_grad() loss.backward() optimizer.step() if total_batch % 100 0: predic torch.max(outputs.data,1)[1].cpu() train_acc metrics.accuracy_score(labels.data.cpu(),predic) dev_acc,dev_loss evaluate(class_list,model,dev_iter) if dev_loss dev_best_loss: dev_best_loss dev_loss torch.save(model.state_dict(),TextRNN.ckpt) last_improve total_batch msg Iter:{0:6},Train Loss:{1:5.2},Train Acc:{2:6.2%},Val Loss:{3:5.2},Val Acc:{4:6.2%} print(msg.format(total_batch,loss.item(),train_acc,dev_loss,dev_acc)) model.train() total_batch 1 if total_batch - last_improve 10000: print(No optimization for a long time,auto-stopping...) flag True if flag: break模块5主程序入口main.py统一调度自动适配设备一键启动训练。import torch import numpy as np import load_dataset import TextRNN from train_eval_test import train # 固定随机种子 np.random.seed(1) torch.manual_seed(1) torch.cuda.manual_seed(1) torch.backends.cudnn.deterministic True # 设备自适应 device cuda if torch.cuda.is_available() else mps if torch.backends.mps.is_available() else cpu print(f使用设备{device}) # 1. 加载数据 vocab, train_data, dev_data, test_data load_dataset.load_dataset(simplifyweibo_4_moods.csv) train_iter load_dataset.DatasetIterater(train_data, 128, device) dev_iter load_dataset.DatasetIterater(dev_data, 128, device) test_iter load_dataset.DatasetIterater(test_data, 128, device) # 2. 加载预训练词向量 embedding_pretrained torch.tensor(np.load(embedding_Tencent.npz)[embeddings].astype(float32)) embed embedding_pretrained.size(1) if embedding_pretrained is not None else 200 # 3. 分类设置 class_list [喜悦,愤怒,厌恶,低落] num_classes len(class_list) # 4. 初始化模型 model TextRNN.Model(embedding_pretrained, len(vocab), embed_dim, num_classes).to(device) # 5. 启动训练 train(model, train_iter, dev_iter, test_iter, class_list)三、模型优化与拓展方向1. 效果提升• 改用BERT/RoBERTa精度可提升至92%• 加入对抗训练FGM• 数据增强回译、同义词替换• 调整LSTM层数、隐藏层维度、学习率2. 工程化拓展• 封装单句预测接口• 构建Web APIFastAPI/Flask• 批量文件情感分析• 前端可视化界面四、项目总结本文完整实现了基于TextRNN的中文微博四分类情感分析系统包含✅ 词表构建✅ 数据预处理✅ 数据集迭代器✅ 双向LSTM模型✅ 训练/验证/测试全流程✅ 最优模型保存✅ 分类指标可视化这是NLP文本分类最标准的工程模板可直接迁移到评论分析、舆情检测、垃圾邮件识别等场景。

相关文章:

基于 TextRNN 的微博四分类情感分析实战 | 完整可运行全流程教程

情感分析(Sentiment Analysis)是自然语言处理(NLP)中最经典、应用最广泛的任务之一。在社交媒体、电商评论、舆情监控等场景中,自动识别文本的情感倾向具有极高的商业价值。本文将从零开始完整实现一套基于TextRNN的微…...

SeleniumBase + Python 自动化工作流优化

在自动化工作流的过程中,如何高效处理网页上的下拉菜单选择问题是许多开发者遇到的挑战。今天,我将结合 SeleniumBase 和 Python 的实例,探讨如何优化自动化脚本以应对网页表单中的下拉选择操作。 背景 在使用 SeleniumBase 进行自动化测试时,我们经常需要与各种类型的表…...

【教学类-160-06】20260414 AI视频培训-练习7“豆包AI视频《幼儿园场景》+豆包图片风格:动漫”

20260414豆包AI视频8《幼儿园场景》风格:动漫背景需求 为了实验“参考图”,我上班时,一路拍摄了园区的环境照片(空镜,没有人) 主要包括大门、操场、教学楼、户外运动设施(滑滑梯、爬龙&#x…...

Paper在多线程环境下的最佳实践:确保数据安全与性能

Paper在多线程环境下的最佳实践:确保数据安全与性能 【免费下载链接】Paper Paper is a fast NoSQL-like storage for Java/Kotlin objects on Android with automatic schema migration support. 项目地址: https://gitcode.com/gh_mirrors/pap/Paper Paper…...

C语言操作EXCEL文件(读写)

C语言操作EXCEL文件(读写) 本文主要介绍通过纯C语言进行EXCEL的读写操作:(修改时间2018.08.28,如果运行结果均是0,请看文章最后一节) 在之前需要使用C语言读取Excel文件内容的功能,查阅了很多资料&#xff…...

FigmaCN:3步告别英文界面困扰,让设计效率提升50%

FigmaCN:3步告别英文界面困扰,让设计效率提升50% 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而分心吗?每次看到"Fram…...

如何构建企业级离线语音合成系统?tts-vue的架构解析与实战应用

如何构建企业级离线语音合成系统?tts-vue的架构解析与实战应用 【免费下载链接】tts-vue 🎤 微软语音合成工具,使用 Electron Vue ElementPlus Vite 构建。 项目地址: https://gitcode.com/gh_mirrors/tt/tts-vue 在数字化办公与智…...

UnityStandaloneFileBrowser快速入门:5分钟学会使用原生文件选择器

UnityStandaloneFileBrowser快速入门:5分钟学会使用原生文件选择器 【免费下载链接】UnityStandaloneFileBrowser A native file browser for unity standalone platforms 项目地址: https://gitcode.com/gh_mirrors/un/UnityStandaloneFileBrowser UnitySta…...

设计租房收支智能监管模拟计算器,登记房东租金流水,自动核算涉税基准金额,展示租客房东收支合规对账明细。

一、实际应用场景描述场景设定:你是一名代账会计 / 住房租赁平台的风控人员,负责监管多个房源的租金流水。典型流程:1. 出租签约- 房东 A 将房屋出租给租客 B- 月租金 6000 元,押一付三2. 资金流动- 租客支付租金- 平台/管家代收代…...

实战分享怎样实现IntelliJ IDEA 打包 Web 项目 WAR 包(含 Tomcat 部署 + 常见问题解决)

在 Java Web 开发中,“本地能跑”只是第一步,真正让很多人头疼的是后续这条链路: 项目打包 → 生成 WAR → 部署 Tomcat → 启动验证 → 排查报错。尤其是刚从 Spring Boot 内嵌容器模式转向传统 WAR 部署、或者接手老项目时,常常…...

DeepBlueCLI高级配置:自定义正则表达式与安全名单优化

DeepBlueCLI高级配置:自定义正则表达式与安全名单优化 【免费下载链接】DeepBlueCLI 项目地址: https://gitcode.com/gh_mirrors/de/DeepBlueCLI DeepBlueCLI是一款功能强大的事件日志分析工具,能够帮助安全分析师快速识别系统中的可疑活动。通过…...

设计直播主播流水记账监控简易仿真程序,自动分类带货收支数据,识别异常隐匿收入账目标,记疑似偷漏税数据项。

一、实际应用场景描述场景设定:你是某 MCN 机构的财务或风控人员,负责监控旗下直播主播的带货流水。典型流程:1. 直播带货- 主播 A 在某平台直播- 观众下单 → 平台结算 → 主播/机构分账2. 资金流向- 平台结算款(含佣金、坑位费、…...

AirPodsDesktop:解锁Windows电脑上AirPods隐藏功能的神奇工具

AirPodsDesktop:解锁Windows电脑上AirPods隐藏功能的神奇工具 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDesktop 还在…...

TinyEditor代码深度解析:揭秘超小型编辑器的实现魔法

TinyEditor代码深度解析:揭秘超小型编辑器的实现魔法 【免费下载链接】TinyEditor A functional HTML/CSS/JS editor in less than 400 bytes 项目地址: https://gitcode.com/gh_mirrors/ti/TinyEditor TinyEditor是一款令人惊叹的超小型HTML/CSS/JS编辑器&a…...

Windows Cleaner:系统优化工具的技术哲学与实践

Windows Cleaner:系统优化工具的技术哲学与实践 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 当C盘空间告急的红色警告成为数字生活的日常&#xff…...

如何构建安全可靠的 myDrive 用户认证系统:JWT访问令牌与刷新令牌完整指南

如何构建安全可靠的 myDrive 用户认证系统:JWT访问令牌与刷新令牌完整指南 【免费下载链接】myDrive Node.js and mongoDB Google Drive Clone 项目地址: https://gitcode.com/gh_mirrors/my/myDrive 在当今数字化时代,用户认证是任何Web应用程序…...

如何解锁NVIDIA显卡隐藏性能:NVIDIA Profile Inspector终极配置指南

如何解锁NVIDIA显卡隐藏性能:NVIDIA Profile Inspector终极配置指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款能够深入调整NVIDIA显卡参数的专业工具&…...

如何高效实现OpenVAS Scanner扫描插件结果数据备份与恢复:完整测试指南

如何高效实现OpenVAS Scanner扫描插件结果数据备份与恢复:完整测试指南 【免费下载链接】openvas-scanner This repository contains the scanner component for Greenbone Community Edition. 项目地址: https://gitcode.com/GitHub_Trending/op/openvas-scanner…...

glogg实战指南:跨平台高效日志分析解决方案深度解析

glogg实战指南:跨平台高效日志分析解决方案深度解析 【免费下载链接】glogg A fast, advanced log explorer. 项目地址: https://gitcode.com/gh_mirrors/gl/glogg 面对海量日志文件时,传统文本编辑器和命令行工具的局限性日益凸显:内…...

5分钟掌握spacetime:轻量级JavaScript时区库的终极入门指南

5分钟掌握spacetime:轻量级JavaScript时区库的终极入门指南 【免费下载链接】spacetime A lightweight javascript timezone library 项目地址: https://gitcode.com/gh_mirrors/sp/spacetime spacetime是一款轻量级JavaScript时区处理库,专为简化…...

Compojure测试驱动开发:如何为路由编写单元测试的终极指南

Compojure测试驱动开发:如何为路由编写单元测试的终极指南 【免费下载链接】compojure A concise routing library for Ring/Clojure 项目地址: https://gitcode.com/gh_mirrors/co/compojure Compojure作为Clojure生态中简洁高效的路由库,其测试…...

终极bufferline.nvim开发者指南:扩展与贡献代码的完整教程

终极bufferline.nvim开发者指南:扩展与贡献代码的完整教程 【免费下载链接】bufferline.nvim A snazzy bufferline for Neovim 项目地址: https://gitcode.com/gh_mirrors/bu/bufferline.nvim bufferline.nvim是一款为Neovim打造的时尚缓冲区管理插件&#x…...

MySQLd Exporter社区贡献指南:从用户到开发者的转变

MySQLd Exporter社区贡献指南:从用户到开发者的转变 【免费下载链接】mysqld_exporter Exporter for MySQL server metrics 项目地址: https://gitcode.com/gh_mirrors/my/mysqld_exporter MySQLd Exporter作为Prometheus生态中重要的MySQL性能指标采集工具&…...

一键部署LongCat-Image-Edit:开箱即用的文本驱动图像编辑模型

一键部署LongCat-Image-Edit:开箱即用的文本驱动图像编辑模型 1. 模型核心能力与技术特点 LongCat-Image-Edit是美团LongCat团队推出的轻量级图像编辑模型,专注于通过自然语言指令实现精准的图像修改。这个6B参数的模型在多项基准测试中达到了开源模型…...

golang如何使用Wails开发桌面应用_golang Wails桌面应用开发步骤

Wails init失败需先检查Node.js和npm版本,换淘宝镜像;Go方法需结构体绑定//wails:export注释,参数返回值受限;前端须在wails.ready()后调用;构建时注意cgo依赖与系统环境。Wails init 项目失败:npm install…...

Chipmunk2D跨平台部署指南:从桌面到移动端的完整解决方案

Chipmunk2D跨平台部署指南:从桌面到移动端的完整解决方案 【免费下载链接】Chipmunk2D A fast and lightweight 2D game physics library. 项目地址: https://gitcode.com/gh_mirrors/ch/Chipmunk2D Chipmunk2D是一款轻量级的2D物理引擎库,它以高…...

DCT-Net多风格人像卡通化:一站式解决方案

DCT-Net多风格人像卡通化:一站式解决方案 一张普通照片,瞬间变成多种风格的卡通形象,这不是魔法,而是AI的力量 你有没有想过,自己的照片能变成各种风格的卡通形象?比如精致的3D动画角色、清新的手绘插画&am…...

5分钟掌握B站视频转文字:免费开源工具bili2text终极指南

5分钟掌握B站视频转文字:免费开源工具bili2text终极指南 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为手动整理B站视频内容而烦恼吗&…...

用超运算统一些常见的运算

Hn(a,b)H_n(a,b)Hn​(a,b) 递归定义如下: Hn(a,b){b1n0,an1,  b0,1n≥2,  b0,Hn−1(a,  Hn(a,b−1))n≥1,  b≥1. H_n(a, b) \begin{cases} b 1 & n 0, \\ a & n 1,\; b 0, \\ 1 & n \ge 2,\; b 0, \\ H_{n-1}\big(a,\;H_n(a, b-1)\big) …...

从Java转行大模型应用,大模型量化实现,AWQ 与 GPTQ 算法

一、算法总览1. AWQ(Activation-aware Weight Quantization,激活感知权重量化)定位:仅权重量化(Weight-only) 的后训练量化(PTQ)算法,专为大语言模型(LLM&…...