简介本资源面向NLP初学者与进阶开发者提供基于百度预训练大模型ERNIE的情感分析完整实战方案覆盖句子级与属性级两类任务。包内共24个文件以json数据配置、py源码脚本、pdf说明文档为主另有少量pyc缓存与license等辅助文件压缩包约25.54MB目录按任务模块划分清晰。已有220人学习下载。读者可获取数据预处理、ERNIE模型加载、特征提取、分类器构建、训练调优与预测评估的全流程代码并借助配套数据集完成训练、验证与测试。属性级部分还涉及属性与观点抽取便于理解细粒度情感极性判断句子级部分则以IMDB影评为例演示整体情感倾向分类。整体可作为预训练模型落地NLP任务的模板帮助快速迁移至其他文本分类场景。1. 拿到这份 ERNIE 情感分析源码先别急着 pip install很多做 NLP 的朋友第一次接触属性级情感分析ABSA都是被「一句话里同时夸了屏幕、骂了续航」这种场景逼出来的。句子级情感分析只能告诉你整句是正面还是负面但真实业务里一条评论往往包含多个评价对象每个对象的情感极性还不一样。这份emotional-analysis-master资源包就是冲着这个痛点来的它用 Python 加百度 ERNIE 预训练模型把句子级和属性级两条任务线都跑通了源码、数据集、脚本一应俱全。它适合谁如果你已经会写 Python、装过 PyTorch 或 PaddlePaddle想找一个能直接跑起来、又能拆开改的 ABSA 入门工程这份代码值得花一个下午拆一遍。但如果你连虚拟环境都没配过建议先把 Python 安装和 vscode python 环境配置这两件事搞定再回来。资源包里分了两个独立目录一个做 IMDB 句子级情感分析一个做属性级情感分析后者又拆成「属性观点抽取」和「属性级情感分类」两步。下面我按实际拆包顺序把每个环节的参数、坑和验证方法讲清楚。2. 环境与依赖把 ERNIE 跑起来需要哪些前置条件2.1 为什么选 ERNIE 而不是直接上 BERTERNIE 和 BERT 同属 Transformer 编码器架构但 ERNIE 在预训练阶段引入了知识增强它不只做随机掩码还对实体、短语做整段掩码让模型学到更完整的语义单元。放到属性级情感分析里这个差异很关键。ABSA 需要模型理解「这家店的服务很周到但价格偏高」中「服务」和「价格」各自对应的情感词ERNIE 对短语边界的敏感度更高抽取属性词和观点词的准确率通常比同量级 BERT 好一截。常见做法是直接用transformers库加载nghuyong/ernie-3.0-base-zh或ernie-2.0-base-en前者对应中文任务后者对应英文 IMDB。资源包里两个目录分别覆盖了这两种场景你按数据集语言选模型即可。2.2 依赖安装与版本锁定先建虚拟环境再装依赖。不要全局装否则后面换模型版本会互相污染。python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install torch transformers datasets scikit-learn pandas numpy tqdm参数说明torch建议 1.13 以上transformers用 4.30 左右比较稳太新的版本有时会改BertTokenizer的默认行为。datasets不是必须但读 IMDB 的 csv 或 tsv 时比手写open()省事。装完后跑一句验证from transformers import AutoTokenizer, AutoModel tok AutoTokenizer.from_pretrained(nghuyong/ernie-3.0-base-zh) model AutoModel.from_pretrained(nghuyong/ernie-3.0-base-zh) print(tok.tokenize(这家餐厅的服务很好但价格太贵))如果输出里能看到##开头的子词切分说明 tokenizer 正常。注意第一次运行会下载权重国内网络环境下建议提前把模型缓存到本地或者用cache_dir参数指定路径。2.3 目录结构与脚本职责拆开压缩包后核心文件分布如下路径职责基于ERNIE完成IMDB情感分析/main.py句子级二分类训练与推理入口基于ERNIE完成IMDB情感分析/utils.py数据加载、tokenize、指标计算基于ERNIE完成属性级情感分析/main.py属性级任务总入口基于ERNIE完成属性级情感分析/属性观点抽取.py从句子中抽属性词和观点词基于ERNIE完成属性级情感分析/属性级情感分类.py对每个属性做极性分类dataset/训练、验证、测试数据先跑 IMDB 那条线因为它最简单能帮你确认环境和模型加载没问题。再跑属性级那条线依赖前一步的抽取结果。3. 句子级情感分析从 IMDB 数据到可复现的训练脚本3.1 数据预处理的关键参数IMDB 数据集是英文影评二分类正面/负面。资源包里的utils.py通常包含一个load_data函数把文本和标签读成列表。你需要关注三个参数max_length、padding、truncation。from transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(bert-base-uncased) def encode(texts, labels, max_len256): enc tokenizer( texts, paddingmax_length, truncationTrue, max_lengthmax_len, return_tensorspt ) enc[labels] torch.tensor(labels) return enc逻辑说明paddingmax_length会把所有句子补到 256 个 token短句补零长句截断。IMDB 影评平均长度在 200 词左右256 能覆盖大部分样本。如果你显存不够降到 128 会丢信息但训练快一倍。truncationTrue必须开否则遇到超长评论会直接报错。3.2 模型构建与分类头ERNIE 本体输出的是每个 token 的隐状态做句子分类要取[CLS]位置的向量再接一个全连接层。import torch.nn as nn from transformers import AutoModel class SentimentClassifier(nn.Module): def __init__(self, model_name, num_labels2): super().__init__() self.encoder AutoModel.from_pretrained(model_name) self.dropout nn.Dropout(0.3) self.classifier nn.Linear(self.encoder.config.hidden_size, num_labels) def forward(self, input_ids, attention_mask): out self.encoder(input_idsinput_ids, attention_maskattention_mask) cls_vec out.last_hidden_state[:, 0, :] return self.classifier(self.dropout(cls_vec))参数说明hidden_size对 base 模型通常是 768num_labels2对应正负二分类。Dropout(0.3)是防止过拟合的常规操作如果训练集很大可以降到 0.1。注意attention_mask一定要传否则 padding 的零会被模型当成真实 token 参与注意力计算准确率会掉得莫名其妙。3.3 训练循环与学习率设置from torch.optim import AdamW from transformers import get_linear_schedule_with_warmup optimizer AdamW(model.parameters(), lr2e-5, weight_decay0.01) scheduler get_linear_schedule_with_warmup( optimizer, num_warmup_steps100, num_training_stepslen(train_loader) * 3 )逻辑说明预训练模型微调时学习率不能大2e-5是 BERT 系模型的经典值ERNIE 也适用。weight_decay0.01做 L2 正则。warmup让学习率在前 100 步线性上升避免一开始就大步更新破坏预训练权重。训练 3 个 epoch 通常足够再多会过拟合。每个 epoch 后在验证集上算准确率和 F1如果 F1 连续两轮不升就停。3.4 推理与结果验证训练完保存state_dict推理时加载回来对单条文本做预测model.eval() with torch.no_grad(): logits model(input_ids, attention_mask) pred torch.argmax(logits, dim-1)验证方法拿几条明显正负面的影评手动测比如 This movie is a masterpiece 应该输出正面Waste of time 输出负面。如果结果反了检查标签映射是不是{0: neg, 1: pos}很多数据集是反的这是血泪经验。4. 属性级情感分析抽取与分类两步走的工程实现4.1 属性观点抽取的任务定义属性级情感分析的第一步是从句子中找出「评价对象」和「评价词」。比如「这家餐厅的服务很好但价格太贵」属性词是「服务」和「价格」观点词是「好」和「贵」。资源包里的属性观点抽取.py通常用序列标注思路把每个 token 标成 B-ASP、I-ASP、B-OPI、I-OPI、O 五类。常见做法是复用 ERNIE 编码器接一个Linear(hidden_size, num_tags)做 token 级分类。数据标注格式一般是 BIO你需要确认dataset里的标签文件和代码里的label2id对得上。4.2 抽取模型的训练与解码class SpanExtractor(nn.Module): def __init__(self, model_name, num_tags5): super().__init__() self.encoder AutoModel.from_pretrained(model_name) self.classifier nn.Linear(self.encoder.config.hidden_size, num_tags) def forward(self, input_ids, attention_mask): out self.encoder(input_idsinput_ids, attention_maskattention_mask) return self.classifier(out.last_hidden_state)逻辑说明输出维度是[batch, seq_len, num_tags]训练时用CrossEntropyLoss注意要把 padding 位置的 loss 忽略掉设ignore_index-100。解码时用argmax得到每个 token 的标签再按 BIO 规则合并成完整 span。这里有个坑中文 tokenizer 会把一个词切成多个子词合并时要按字符偏移还原不能直接按 token 下标截原文。4.3 属性级情感分类的输入构造抽取出属性词后第二步是判断每个属性对应的情感极性。输入格式通常是[CLS] 句子 [SEP] 属性词 [SEP]让模型聚焦到该属性相关的上下文。def build_pair(sentence, aspect): return f{sentence} [SEP] {aspect} encoded tokenizer( build_pair(这家餐厅的服务很好但价格太贵, 价格), max_length128, truncationTrue, paddingmax_length, return_tensorspt )参数说明max_length128对单句加属性词足够。[SEP]是 ERNIE 的句子分隔符tokenizer 会自动转成对应 id。分类头和句子级一样只是num_labels可能变成 3正面/负面/中性。训练时学习率同样用2e-5但 batch size 可以小一点因为输入变长了。4.4 两步串联的完整推理流程实际使用时先跑抽取模型拿到(aspect, opinion)对再把每个 aspect 喂给分类模型aspects extract_aspects(sentence) for asp in aspects: polarity classify(sentence, asp) print(f属性{asp}情感{polarity})验证方法构造一条包含两个属性的句子看输出是否分别给出不同极性。如果两个属性输出一样检查分类模型的输入里 aspect 有没有被正确拼接很多时候是拼接顺序反了导致模型忽略属性词。5. 避坑与排查跑这份源码最容易翻车的五个地方5.1 模型下载卡住或报 ConnectionError现象from_pretrained一直转圈最后抛连接错误。原因默认从境外源拉权重网络不稳定。解决提前用cache_dir指定本地缓存目录或者手动下载pytorch_model.bin、config.json、vocab.txt放到同一文件夹再用本地路径加载。5.2 标签映射反了导致准确率 50% 以下现象训练 loss 正常下降但验证准确率一直在 0.5 附近。原因数据集里0表示正面、1表示负面但代码里写反了。解决打印前 10 条样本的文本和标签人工确认映射关系改label2id字典。5.3 中文 tokenizer 切分导致 span 偏移错位现象抽取出的属性词在原文里对不上多一个字或少一个字。原因ERNIE 中文 tokenizer 按字切分但代码用 token 下标去截原字符串。解决用tokenizer.convert_ids_to_tokens配合offset_mapping还原字符位置或者直接用tokenizer.decode再匹配。5.4 显存不足 OOM现象训练到一半报 CUDA out of memory。原因max_length设太大或 batch size 太高。解决先把 batch size 降到 8再把max_length从 256 降到 128同时开gradient_accumulation_steps2模拟大 batch。如果还不行换ernie-3.0-nano这种小模型先跑通流程。5.5 推理时忘记 model.eval() 和 torch.no_grad()现象单条推理结果每次都不一样或者显存越用越多。原因模型还在训练模式Dropout 和 BatchNorm 没切到推理状态且梯度一直在累积。解决推理前固定写model.eval()和with torch.no_grad():这两行是后悔药少一行都出玄学结果。6. 进阶技巧用 offset_mapping 把抽取结果还原成可读文本属性抽取跑通后你拿到的是一串 token 级标签但业务方要的是原文里的属性词。这一步如果处理不好前面训练再准也白搭。我一般会强制走一遍offset_mapping还原流程下面是一个可直接抄的片段def decode_spans(text, offsets, pred_ids, id2label): spans [] current None for idx, (start, end) in enumerate(offsets): if start end: # 特殊 token跳过 continue label id2label[pred_ids[idx]] if label.startswith(B-): if current: spans.append(current) current {type: label[2:], start: start, end: end} elif label.startswith(I-) and current: current[end] end else: if current: spans.append(current) current None if current: spans.append(current) return [(s[type], text[s[start]:s[end]]) for s in spans]逻辑说明offsets是 tokenizer 返回的字符级偏移每个 token 对应原文的[start, end)区间。遇到B-开标签就新建 span遇到I-就延长当前 span 的结束位置遇到O就收尾。这样还原出来的属性词和观点词直接是原文子串不会出现多字少字。参数上要注意return_offsets_mappingTrue必须在 tokenizer 调用时显式打开否则拿不到 offsets。另外中文 tokenizer 对空格和标点的处理跟英文不同建议在拼接输入时保留原始标点不要提前做去除停用词否则偏移会整体错位。验证方法很简单拿 20 条测试集样本把还原出的 span 和人工标注对比如果字符级完全匹配率低于 90%就回去检查 tokenizer 的do_lower_case和strip_accents设置。我自己的习惯是每次换模型或换数据集都先跑一遍这个小验证脚本确认偏移对齐了再开始训练。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
计算机组成原理:DMA方式原理、三种传送方式与408考点解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 1:51:20
H5U PLC通过CANopen控制步进伺服全流程实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 1:51:20
Python实现生成对抗网络GAN:从DCGAN到cGAN的图像生成实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 1:51:20
Python搭建QQ聊天机器人极简教程 随着QQ粉丝群管理需求的不断增长,简单的群管工具难以满足复杂的信息响应和自动化需求。现有的自动回复机器人虽然功能强大,但其高昂的年费成为不少用户的顾虑。因此,通过搭建一个自定义机器人来实现自动回复,成为解决这一问题的有效途径。
基于此需求,本文介绍了使用go-c… · 2026/9/28 2:14:08
Python整理百度云盘文件大量重复无用文件 百度云盘容量有限,当文件数量逐渐增多,空间很容易被填满。删除重复文件可以帮助释放大量空间。通过获取云盘缓存目录并使用Python脚本来整理数据,可以高效识别重复文件并避免手动操作的繁琐。
此方法基于 sqlite3 和 pandas 进行数据处理,简单快捷。 文章目录 云盘数据整理… · 2026/9/28 2:14:07
Python实现将图片转化为具有视觉震撼效果的字符图 字符画是一种将图片转化为字符的艺术表现形式,它通过字符的密度和排列来模拟图片的色彩和形状效果。这种技术不仅在视觉上充满了创造力,还在文字处理领域展示了字符的丰富表现力。通过Python,可以将图片转换为字符画,生成具有视觉冲击力的字符艺术。
本文将通过具体步骤和… · 2026/9/28 2:13:48
Python实现将目录下的图片合并成PDF文件 在图像处理和文档管理中,经常需要将一系列图片文件合并为PDF格式,以便于传输、存档和阅读。Python凭借其丰富的第三方库,为图像处理和PDF操作提供了便捷的解决方案。
本文将详细介绍如何通过Python脚本,将目录中的所有图片合并为一个PDF文件,内容包括从基础环境配置到代码… · 2026/9/28 2:13:48
Python实现文件移动到指定文件夹 在编程过程中,经常需要对文件进行整理和管理,将不同类型的文件分类存放在指定文件夹中。Python提供了强大的文件操作模块,使得文件的移动操作变得简单高效。这篇教程将详细讲解如何使用Python实现将文件移动到指定文件夹的功能,帮助理解并掌握文件操作的基本方法和常见应用… · 2026/9/28 2:13:47
【PyQt】PyQT6制作一个Django项目启动器 在现代的桌面和Web应用开发中,Python以其简单高效的特点获得了广泛的应用。通过集成PyQt和Django框架,将桌面应用的便捷操作与Django项目的后端处理相结合,不仅能够提升用户体验,更能显著提高开发的便利性和效率。
本文将聚焦于如何构建一个基于PyQt的Django项目启动器,实… · 2026/9/28 2:13:40
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
制作网页比较方便的软件怎么选?一文搞懂避坑指南 制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25