属性级情感分析

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

属性级情感分析

  • 简介
  • 数据集介绍
  • 数据加载和预处理(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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【1++的Linux】之信号量

👍作者主页:进击的1 🤩 专栏链接:【1的Linux】 文章目录 一,信号量二,基于环形队列的生产消费者模型三,线程池 一,信号量 1,什么是信号量? 任何时候都有一个…

数字技术-IPC专利分类号对应表

数字技术-IPC专利分类号对应表,基于2023年的关键数字技术专利分类体系,通过国际专利分类(IPC)号进行筛选。这些数据涵盖了各种数字技术领域的创新,包括但不限于人工智能、大数据、云计算、物联网、5G通信等。利用关键词…

Python 进阶(十一):高精度计算(decimal 模块)

《Python入门核心技术》专栏总目录・点这里 文章目录 1. 导入decimal模块2. 设置精度3. 创建Decimal对象4. 基本运算5. 比较运算6. 其他常用函数7. 注意事项8. 总结 大家好,我是水滴~~ 在进行数值计算时,浮点数的精度问题可能会导致结果的不准确性。为了…

lua的gc原理

lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁,目前大多数有关这个方面的文章都还是基于lua5.1版本,有一定的滞后性。因此本文通过参考当前的5.3.4版本的Lua源码,希望对Lua的GC算法有一个较为详尽的探讨。 L…

OpenGL之Mesa3D编译for Ubuntu20.04(三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

PGP 遇上比特币

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

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

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

数据结构与算法编程题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…

ubuntu 安装 jetbrains-toolbox

ubuntu 安装 jetbrains-toolbox 官网下载 jetbrains-toolbox jetbrains 官网 jetbrains 官网&#xff1a;https://www.jetbrains.com/ jetbrains-toolbox 官网下载页面 在下载页面点击 Download 安装 jetbrains-toolbox 解压 jetbrains-toolbox 安装包 到指定目录 本案例将…

程序的机器级表示

程序的机器级表示 有关CSAPP第三章一些我关注到的重点的记录 操作指令 .c->.exe的流程 1.选项 -E : 预编译过程,处理宏定义和include&#xff0c;并作语法检查 gcc -E hello.c -o hello.i #将hello.c预处理输出为hello.i文件2.选项 -S : 编译过程,生成通用…

【JavaEE】多线程 (1)

目录 1. 认识线程&#xff08;Thread&#xff09; 1) 线程是什么 2) 为啥要有线程 3) 进程和线程的区别 2.第⼀个多线程程序 3.多线程的其他创建方式 方法二:实现 Runnable 接⼝ 方法三:匿名内部类 方法四:实现Runable, 重写run, 匿名内部类 方法五:使用lambda表达式…

爱满荣山·和美岩窝-垃圾分类趣味微课堂

在利州区民政局的支持下&#xff0c;利州社工协会在荣山镇岩窝村开展儿童垃圾分类趣味小课堂。

计算机毕业设计|基于SpringBoot+MyBatis框架的电脑商城的设计与实现(用户上传头像+用户收货管理)

计算机毕业设计|基于SpringBootMyBatis框架的电脑商城的设计与实现&#xff08;用户上传头像&#xff09; 该项目分析着重于设计和实现基于SpringBootMyBatis框架的电脑商城。首先&#xff0c;通过深入分析项目所需数据&#xff0c;包括用户、商品、商品类别、收藏、订单、购物…

Centos7上面部署redis

Centos7上面部署redis 编写这个部署redis&#xff0c;只是为了另一个文章入侵redis做准备&#xff0c;网上还有好多类似的文章&#xff0c;这个单纯的就是部署安装&#xff0c;并简单的测试使用以下 关联其他文章 [1]VMware上面安装部署centos7镜像系统【详细含镜像】 [2]血的教…

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

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

速通CSAPP(一)计算机系统漫游入门

CSAPP学习 前言 一门经典的计组课程&#xff0c;我却到了大四才学。 anyway&#xff0c;何时都不会晚。 博主参考的教程&#xff1a;本电子书信息 - 深入理解计算机系统&#xff08;CSAPP&#xff09; (gitbook.io)&#xff0c;非常感谢作者的整理。 诚然去看英文版可以学…

谈谈中间件设计的思路

前言 想要设计和真正理解中间件的架构理论和思想。对于开发来说需要具备三个关键的能力 1&#xff1a;基础通用技术的深入理解和运用2&#xff1a;了解和熟悉常见中间件的设计思想&#xff0c;且有自己的感悟,并且能按照自己的理解模仿写一写3&#xff1a;业务的高度理解能力…

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

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

使用elementPlus去除下拉框蓝色边框

// 下拉框去除蓝色边框 .el-select {--el-select-input-focus-border-color: none !important; }

生成EtherCAT从站XML图片信息方法

0 工具准备 1.PS CS6 2.Hex Editor Neo(文件Hex编辑器) 3.DM3E-556步进电机驱动器 4.TwinCAT(验证XML图片修改效果)1 准备一张需要生成图片信息的图片 根据EtherCAT从站XML图片格式规范,我们需要用到的元素名为ImageData16x14,它要求使用16x14分辨率、深度为16bit的bmp…