属性级情感分析

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~

属性级情感分析

  • 简介
  • 数据集介绍
  • 数据加载和预处理(data_utils.py)
  • 预训练模型(skep)
  • 模型定义模块(model.py)
  • 训练配置(config.py)
  • 模型训练(train.py)
  • 模型测试(test.py)
    • 准确率、精确率、召回率和F1值
  • 模型预测(predict.py)
  • 参考

简介

属性级情感分析是指在文本情感分析的基础上,进一步对文本中涉及的具体属性或方面进行情感分析。传统的文本情感分析通常只关注整体文本的情感极性(如正面、负面、中性),而属性级情感分析则致力于识别文本中针对特定属性或方面的情感倾向,从而更细粒度地理解用户对产品、服务或事件各个方面的态度和情感。

属性级情感分析通常涉及以下几个主要步骤:

  1. 属性抽取:首先需要从文本中提取出与具体属性相关的词语或短语,这些属性可以是产品的特定特征(如外观、性能、价格)、服务的某个方面(如客户服务、物流配送)、事件的具体方面等。

  2. 情感分类:针对每个提取出的属性,对文本中表达的情感进行分类,通常包括积极的、消极的、中性的情感极性。这一步通常需要使用文本分类或情感分类模型来识别文本中针对特定属性的情感倾向。

  3. 结果汇总:将针对不同属性的情感分类结果进行汇总,形成对整体文本的属性级情感分析结果。这样可以更清晰地了解用户对各个属性的态度和情感倾向,为产品改进、服务优化或舆情监控提供更详细的参考信息。

属性级情感分析在产品评测、社交媒体舆情分析、消费者意见挖掘等领域具有重要应用,可以帮助企业更全面地了解用户需求和反馈,从而有针对性地改进产品和服务。

数据集介绍

训练集 len(train_ds)=800
验证集 len(dev_ds)=100
测试集 len(test_ds)=100

第1列是标签
第2列是属性观点
第3列是原文
在这里插入图片描述

数据加载和预处理(data_utils.py)

数据加载和预处理部分:

  1. 加载数据集:从文件中加载训练、验证和测试数据集
    在这里插入图片描述
  2. 数据映射:使用预训练模型skep_ernie_1.0_large_ch的分词器对文本进行分词和编码,将每个样本的文本转换成特征形式。
    在这里插入图片描述
  3. 构造DataLoader:创建训练、验证和测试数据的批次采样器,构造数据加载器。
    len(train_loader) 200= len(train_ds) 800 / batch_size 4 # batch_size每个批次(batch)包含的样本数

预训练模型(skep)

Skep模型作为基础模型
SKEP(Sentiment Knowledge Enhanced Pre-training)是一种基于情感知识增强的预训练模型。百度自然语言处理实验室
Skep采用的预训练语言模型是Ernie(Enhanced Representation through kNowledge IntEgration)模型
在这里插入图片描述
输入有两部分:
评价的属性(Aspect)、相应的评论文本
将两者拼接之后便可以传入SKEP模型中,SKEP模型对该文本串进行语义编码
根据该语义编码向量进行情感分类

模型定义模块(model.py)

定义了一个基于Skep模型的序列分类器(Sequence Classification)。它使用预训练的Skep模型作为基础,并在其顶部添加了一层线性分类器。

在这里插入图片描述

  • 初始化方法(__init__)接受Skep模型、类别数量和可选的dropout参数作为输入。
  • 在初始化方法中,首先调用父类的__init__方法,然后设置类别数量和Skep模型。
  • 初始化方法还通过检查dropout参数是否提供来确定是否使用默认的隐藏层dropout概率。
  • forward方法实现了正向传播逻辑。接受输入的文本序列(input_ids)以及可选的token_type_ids、position_ids和attention_mask参数。
  • 在正向传播过程中,它通过调用Skep模型获取最后一层的隐藏状态和池化输出(pooled_output)。
  • 然后,将池化输出应用于dropout操作,并通过线性分类器将结果映射到类别数量为num_classes的输出空间中。
  • 最终,返回分类器的输出(logits)。

训练配置(config.py)

# 训练配置:设置训练超参数,如学习率、权重衰减、最大梯度范数等,并创建优化器、学习率调度器和评估指标num_epoch = 20      	# 训练的轮数,即遍历整个训练数据集的次数
learning_rate = 4e-5    	# 初始学习率,表示每次参数更新时的步长大小
weight_decay = 0.01    	 # 正则化项的权重衰减系数,用于防止过拟合
warmup_proportion = 0.1 	    # 学习率预热的比例,用于在训练初期逐渐增加学习率,以提高训练的稳定性
max_grad_norm = 1.0    	 # 梯度裁剪的最大范数,用于控制梯度的大小,防止梯度爆炸问题log_step = 20      		 # 每隔多少步打印一次训练日志信息
eval_step = 100   		  # 每隔多少步进行一次模型评估
seed = 1000     		# 随机种子,用于控制随机过程的可重现性
checkpoint = "./checkpoint/"        # 保存模型训练参数的路径num_training_steps = len(train_loader) * num_epoch# 学习率调度器 lr_scheduler,使用的是线性衰减加预热的策略。
lr_scheduler = LinearDecayWithWarmup(learning_rate=learning_rate, total_steps=num_training_steps, warmup=warmup_proportion)# 获取模型中不属于偏置(bias)或归一化(norm)参数的所有其他参数的名称
decay_params = [p.name for n, p in model.named_parameters() if not any(nd in n for nd in ["bias", "norm"])]# 梯度裁剪器,通过全局梯度范数对梯度进行裁剪,用于控制梯度的最大范数,防止梯度爆炸问题
grad_clip = paddle.nn.ClipGradByGlobalNorm(max_grad_norm)# 优化器,使用的是 AdamW 优化算法
optimizer = paddle.optimizer.AdamW(learning_rate=lr_scheduler, parameters=model.parameters(), weight_decay=weight_decay, apply_decay_param_fun=lambda x: x in decay_params, grad_clip=grad_clip)# 同时计算准确率(Accuracy)和 F1 值
metric = AccuracyAndF1()

模型训练(train.py)

训练一个文本分类模型并评估其性能
在这里插入图片描述

  1. 定义训练模型的函数train,该函数使用训练集进行模型训练,并在一定步骤上评估模型并保存最佳模型。
  2. 在train函数中,切换模型到训练模式,然后遍历每个epoch和每个batch的数据。
  3. 对于每个batch的数据,计算模型的预测结果并计算损失值。
  4. 根据损失值进行反向传播计算梯度,并使用优化器更新模型参数。
    在这里插入图片描述
  5. 定义评估模型的函数evaluate,该函数会在验证集上计算准确率、精确率、召回率和F1值。
  6. 每隔一定步骤(log_step),打印训练状态信息,包括当前epoch、batch数、global_step和损失值。
  7. 每隔一定步骤(eval_step)或达到总训练步数(num_training_steps),在验证集上评估模型性能。
    调用evaluate函数计算准确率、精确率、召回率和F1值。
    如果F1值超过之前记录的最佳F1值,则更新最佳F1值并保存模型参数。
    打印评估结果,包括准确率、精确率、召回率和F1值。
  8. 最后,保存最终的模型参数。

模型测试(test.py)

加载已训练好的文本分类模型并在测试集上进行评估
在这里插入图片描述

具体的步骤如下:

  1. 导入所需的库和模块。
  2. 使用data_cls.load_dict函数加载训练时使用的标签字典,该字典用于将标签映射为类别id和将类别id映射为标签。
  3. 使用paddle.load函数加载之前保存的最佳模型权重。
  4. 使用SkepModel.from_pretrained函数加载Skep模型的预训练权重。
  5. 创建一个新的SkepForSequenceClassification模型,该模型包含从Skep模型中提取的特征和一个用于分类的全连接层,并根据类别数量设置了输出维度。
  6. 使用best_model.load_dict方法加载之前保存的最佳模型权重。
  7. 调用evaluate函数,在测试集上评估加载的模型。
  8. 打印评估结果,包括准确率、精确率、召回率和F1值。

准确率、精确率、召回率和F1值

在这里插入图片描述

模型预测(predict.py)

使用加载好的文本分类模型进行预测
在这里插入图片描述
使用加载好的模型对给定的文本进行情感分类预测,并输出预测结果。
具体的步骤如下:

  1. 导入所需的库和模块,包括paddleSkepModelSkepTokenizer等。
  2. 使用data_cls.load_dict函数加载之前保存的标签字典,用于将标签映射为类别id和将类别id映射为标签。
  3. 使用paddle.load函数加载之前保存的最佳模型权重。
  4. 使用SkepModel.from_pretrained函数加载预训练的Skep模型。
  5. 使用SkepTokenizer.from_pretrained函数加载Skep模型对应的分词器。
  6. 创建一个新的SkepForSequenceClassification模型,该模型包含从Skep模型中提取的特征和一个用于分类的全连接层,并根据类别数量设置了输出维度。
  7. 使用best_model.load_dict方法加载之前保存的最佳模型权重。
  8. 定义了一个predict函数,用于对输入的文本进行预测。函数首先将模型切换到评估模式,然后使用Tokenizer对输入进行编码,将编码后的输入转换为Tensor,并通过模型进行推理得到预测结果。最后打印出预测结果。
  9. 定义了三个文本示例及其对应的文本对。
  10. 分别调用predict函数对这三个示例进行预测,并打印预测结果。

预测文本:
在这里插入图片描述

预测结果:
在这里插入图片描述

参考

[1] 属性级情感分析:https://aistudio.baidu.com/projectdetail/6671795
[2] H. Tian, C. Gao, X. Xiao, H. Liu, B. He, H. Wu, H. Wang, and F. Wu, ‘‘SKEP: Sentiment knowledge enhanced pre-training for sentiment analysis,’’ 2020, arXiv:2005.05635.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/173575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element 的 Notification 通知,自定义内容

通知事件: // 商户后台通知 MerchantBackgroundNotice() {// 禁止消息通知弹出多条if(this.notifyInstance) {this.notifyInstance.close();}const h this.$createElement; // 创建文本节点this.notifyInstance this.$notify({showClose: false, // 禁止关闭按钮…

vue随意置换页面元素位置

写在前面,博主是个在北京打拼的码农,从事前端工作5年了,做过十多个大大小小不同类型的项目,最近心血来潮在这儿写点东西,欢迎大家多多指教。 对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何…

Redis Cluster主从模式详解

在软件的架构中,主从模式(Master-Slave)是使用较多的一种架构。主(Master)和从(Slave)分别部署在不同的服务器上,当主节点服务器写入数据时,同时也会将数据同步至从节点服…

图解算法数据结构-LeetBook-树03_层序遍历奇数偶数行方向不同

一棵圣诞树记作根节点为 root 的二叉树,节点值为该位置装饰彩灯的颜色编号。请按照如下规则记录彩灯装饰结果: 第一层按照从左到右的顺序记录 除第一层外每一层的记录顺序均与上一层相反。即第一层为从左到右,第二层为从右到左。 示例 1&…

自动化测试-Selenium

一. Selenium介绍 selenium 是用来做web自动化测试的框架,支持各种浏览器,各种,支持各种语言 原理: 二. 元素定位 2.1 XPath 定位 绝对路径: /html/head/title 相对路径以双斜杠开头,常见的相对路径定位有以下几种: <1>相对路径索引: 索引是从1开始的 <2>相…

探索深度学习:从理论到实践的全面指南

探索深度学习&#xff1a;从理论到实践的全面指南 摘要&#xff1a; 本文旨在提供一个关于深度学习的全面指南&#xff0c;带领读者从理论基础到实践应用全方位了解这一技术。我们将介绍深度学习的历史、基本原理、常用算法和应用场景&#xff0c;并通过Python代码示例和Tens…

讯飞星火知识库文档问答Web API的使用(二)

上一篇提到过星火spark大模型&#xff0c;现在有更新到3.0&#xff1a; 给ChuanhuChatGPT 配上讯飞星火spark大模型V2.0&#xff08;一&#xff09; 同时又看到有知识库问答的web api&#xff0c;于是就测试了一下。 下一篇是在ChuanhuChatGPT 中单独写一个基于星火知识库的内容…

【Android Jetpack】Navigation的使用

引入 单个Activity嵌套多个Fragment的UI架构模式&#xff0c;非常非常普遍。但是&#xff0c;对Fragment的管理一直是一件比较麻烦的事情。工程师需要通过FragmentManager和FragmentTransaction来管理Fragment之间的切换。页面的切换通常还包括对应用程序App bar的管理、Fragme…

[个人笔记] Zabbix实现Webhook推送markdown文本

系统工程 - 运维篇 第四章 Zabbix实现Webhook推送markdown文本 系统工程 - 运维篇系列文章回顾Zabbix实现Webhook推送markdown文本前言实施步骤 Zabbix新增报警媒介类型Zabbix给用户新增报警媒介Zabbix修改动作的执行操作和恢复操作验证&测试 参考来源 系列文章回顾 第一章…

探索RockPlus SECS/GEM平台 - 赋能半导体行业设备互联

SECS/GEM协议&#xff0c;全称为半导体设备通讯标准/通用设备模型&#xff08;SECS/Generic Equipment Model&#xff09;&#xff0c;是一种广泛应用于半导体制造行业的通信协议。它定义了半导体设备与工厂主控系统&#xff08;如MES&#xff09;之间的通信方式&#xff0c;使…

PGP 遇上比特币

重复使用 PGP 密钥作为比特币密钥 介绍 在数字安全领域&#xff0c;密码学在确保数据的完整性和真实性方面发挥着至关重要的作用。 一种广泛使用的加密技术是使用 Pretty Good Privacy (PGP1)。 PGP 为安全通信&#xff08;例如电子邮件、文件传输和数据存储&#xff09;提供加…

解密Spring Cloud微服务调用:如何轻松获取请求目标方的IP和端口

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享。 目的 Spring Cloud 线上微服务实例都是2个起步&#xff0c;如果出问题后&#xff0c;在没有ELK等日志分析平台&#xff0c;如何确定调用到了目标服务的那个实例&#xff0c;以此来排…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑氢储一体化协同的综合能源系统低碳优化》

这个标题涉及到考虑了多个方面的能源系统优化&#xff0c;其中关键的关键词包括"氢储一体化"、"协同"、"综合能源系统"和"低碳优化"。以下是对这些关键词的解读&#xff1a; 氢储一体化&#xff1a; 氢储存&#xff1a; 指的是氢气的存…

计算机组成原理-Cache替换算法

文章目录 总览随机算法&#xff08;RAND&#xff09;先进先出算法&#xff08;FIFO&#xff09;近期最少使用算法&#xff08;LRU&#xff09;最不经常使用算法&#xff08;LFU&#xff09;总结 总览 随机算法&#xff08;RAND&#xff09; 没有选择性地考虑替换哪一块Cache&a…

功率整流器的作用是什么?SURS8340T3G车规级功率整流器的介绍

汽车级功率整流器是一种用于汽车电子系统的功率电子器件&#xff0c;用于将交流电转换为直流电以供电子设备使用。汽车级功率整流器需要具有高效率、高可靠性、高稳定性和高温度工作能力等特点。其中&#xff0c;SURS8340T3G 是一种常见的汽车级功率整流器。 SURS8340T3G 是一…

基于单片机寻迹巡线避障智能小车系统设计

**单片机设计介绍&#xff0c; 基于单片机寻迹巡线避障智能小车系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的寻迹巡线避障智能小车系统是一种能够自动跟随线路并避开障碍物的智能小车。下面是一个简要的系…

数据结构与算法编程题28

计算二叉树结点总数 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct BiTNode {ElemType data;BiTNode* lchild, * rchild; }B…

科研工具推荐之ReadPaper

科研工具推荐之ReadPaper 之前也用很多朋友在问英文文献如何阅读&#xff0c;一直推荐的是Adobe PDF有道翻译。 但是呢&#xff0c;最近了解到了另外一个神器 ReadPaper 自己稍微体验了一下 感觉非常nice&#xff0c;特此推荐给大家。 想体验的朋友可以通过下面的方式注册呢…

提升APP软件的用户体验方法

提升APP软件的用户体验是确保用户满意度和应用成功的关键。以下是一些方法&#xff0c;可以帮助提升APP的用户体验&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.简洁的用户界面设计&#xff1a; …

「C++」类和对象1

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;C启航 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 文章目录 &#x1f349;前言&#xff1a;初识面向对象&#x1f349;类&#x1f34c;类的定义&#x1f34c;访问限定符&#x1f95d;类的…