属性级情感分析

news2024/11/24 20:43:31

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

属性级情感分析

  • 简介
  • 数据集介绍
  • 数据加载和预处理(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.coloradmin.cn/o/1257954.html

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

相关文章

DevEco Studio对同一套HarmonyOS代码进行多设备端预览

鸿蒙代码有一个很大的优势 不需要其他的语法 只需要一套HarmonyOS代码 就可以在 手机 平板 电脑上运行 我们可以在DevEco Studio预览器上 点击如下图指向位置 弹出的这个窗口中 我们将右上角的开关勾选上 这样 我们调试器向下滚动 就可以看到多端预览的一个效果了

汽车转向桥设计转向节转向桥机械设计

wx供重浩:创享日记 对话框发送:转向桥 获取完整报告说明书工程源文件 转向节图 装配图 本文设计的是JY1061A型采用前置后轮驱动的载货汽车转向桥,因此该转向桥为从动桥。从动桥的功用:从动桥也称非驱动桥,又称从动车轴…

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

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

【Cisco Packet Tracer】电子邮箱仿真搭建

本文使用Cisco Packet Tracer,搭建电子邮箱仿真系统,使得zhangsancisco.com可以和lisicisco.com可以互相发送邮件。 电子邮箱账号(为了简单起见,账号密码设置一致):zhangsan/lisi 域名:cisco.…

运动款蓝牙耳机哪个品牌好?运动耳机品牌排行榜前十名

​选择一款好的运动耳机非常重要,因为它们能够提高你的运动体验,帮助你更好地享受音乐和锻炼。在选择运动耳机时,你需要考虑到它们的稳固性、舒适度、音质和防水等方面,这些因素将直接影响你的运动效果和体验。今天我为大家挑选了…

基于单片机体温心率脉搏检测仪系统设计

**单片机设计介绍, 基于单片机体温心率脉搏检测仪系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机体温心率脉搏检测仪是一种用于检测人体体温、心率和脉搏等基本生理指标的医疗设备。下面是一个简要…

OpenAi Q* (Q Star)项目入门介绍

为初学者解释 Open Ai 的 Q*(Q Star) Q* 的两个可能来源。 1)Q 可能是指 "Q-learning",这是一种用于强化学习的机器学习算法。 Q 名称的由来*:把 "Q*"想象成超级智能机器人的昵称。 Q 的意思是这个机器人非常善于做决定。 它从经验中学习,就像你从玩…

C#开发的OpenRA游戏之属性SelectionDecorations(10)

C#开发的OpenRA游戏之属性SelectionDecorations(10) 前面分析了选择属性,继续分析前面的内容,不过这里不再是选择,而是选择相关的属性。 当用玩家选择地图上一个物品,或者士兵,或者坦克时,就会在周边画上一些指示标记,并且有一个状态条。 通过上图,可以看到建筑物周…

计算机毕业设计|基于SpringBoot+MyBatis框架的电脑商城的设计与实现(系统概述与环境搭建)

计算机毕业设计|基于SpringBootMyBatis框架的电脑商城的设计与实现(系统概述与环境搭建) 该项目分析着重于设计和实现基于SpringBootMyBatis框架的电脑商城。首先,通过深入分析项目所需数据,包括用户、商品、商品类别、收藏、订单…

【Java】使用IntelliJ IDEA搭建SSM(MyBatis-Plus)框架并连接MySQL数据库

步骤 0 准备工作1 创建Maven项目2 配置Maven依赖3 配置数据源4 项目结构5 创建实体类6 创建数据访问层7 创建服务层8 创建Controller层9 启动项目10 使用Postman测试接口 0 准备工作 下载并安装 IntelliJ IDEA下载并安装 MySQL 数据库下载并安装Postman测试工具使用 Navicat 创…

k8s环境排查nginx转发nacos请求失败问题

一、问题背景 k8s部署两个服务,一个nginx,一个nacos, 服务信息如下(nacos有两个端口): 服务 serviceNameservice类型porttargetPort nodePortnginxmonitor-cp-nginxNodePort808031082nacosmonitor-cp-nacosClusterIP88488848-98489848- ng的default.conf配置文件…

2023年低代码无代码产业大会 - 重塑数字化引擎,畅享现代化篇章:核心PPT资料下载

一、大会简介 2023年低代码无代码产业大会以“重塑数字化引擎,畅享现代化篇章”为主题,旨在探讨低代码、无代码技术的最新发展趋势、研究成果及在多个行业的深度应用。 随着数字化场景爆发式增长,低代码无代码技术发挥其“短平快”开发的优势…

js最新随机字符串,进制数随机字符串,更优秀的随机字符串方式,你绝对没用过的随机字符串方式,可控制位数!

js最新随机字符串,进制数随机字符串,更优秀的随机字符串方式,你绝对没用过的随机字符串方式,可控制位数! 函数封装和传参 首先我们,要封装这样一个函数,首先要确定,传入哪些参数。…

队列实现方式、效率分析及应用场景

文章目录 一、什么是队列二、队列特性阻塞和非阻塞有界和无界单向链表和双向链表 三、Java队列接口继承图四、Java队列常用方法五、队列实现方式与效率分析六、队列的应用场景七、Python中队列与优先级队列使用 一、什么是队列 队列是一种特殊的线性表,遵循先入先出…

WebSocket协议在java中的使用

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

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

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

使用opencv实现图片相似度检测

1.为什么学这个,我对图像处理非常感兴趣,我联想到海尔的指纹识别门锁是如何进行检测的,我在想不应该呀,单片机性能这么差,应该是使用了训练后的数据去检测图片的,如果我要实现草莓检测,知道它是不是草莓,我觉得单纯使用图片处理是不够的,我考虑过使用指纹模块来接触草莓从而实现…

Bypass open_basedir的方法

文章目录 open_basedir概念绕过方法命令执行绕过symlink 绕过 (软连接)利用chdir()与ini_set()组合绕过 例题 [suctf 2019]easyweb open_basedir概念 open_basedir是php.ini的设置 在open_basedir设置路径的话 那么网站访问的时候 无法访问除了设置以外的…

【Android Jetpack】Navigation的使用

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

Pinctrl子系统和GPIO子系统实验

驱动入口出口函数: static int __init led_init(void) {return 0; } static void __exit led_exit(void) { }module_init(led_init);module_exit(led_exit);MODULE_LICENSE("GPL");字符设备驱动那一套 先创建设备结构体 (cdev) 1…