属性级情感分析

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

简介

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

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

  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) 环境依赖
python >= 3.6
paddlenlp >= 2.2.2
paddlepaddle-gpu >= 2.2.1

(2) 运行环境准备 在运行之前,请在本目录下新建目录 data 和 checkpoints,分别用于存放数据和保存模型。

数据集

https://bj.bcebos.com/v1/paddlenlp/data/cls_data.tar.gz

参考

[1] 属性级情感分析:https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/sentiment_analysis/ASO_analysis
[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.

  • 17
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
智能情绪分析技术_⼈⼯智能技术应⽤:情感分析概述 情感分析概述 与其他的⼈⼯智能技术相⽐,情感分析(Sentiment Analysis)显得有些特殊,因为其他的领域都是根据客观的数据来进⾏分析和预测,但情 感分析则带有强烈的个⼈主观因素。情感分析的⽬标是从⽂本中分析出⼈们对于实体及其属性所表达的情感倾向以及观点,这项技术最早的 研究始于2003年Nasukawa和Yi两位学者的关于商品评论的论⽂。 随着推特等社交媒体以及电商平台的发展⽽产⽣⼤量带有观点的内容,给情感分析提供了所需的数据基础。时⾄今⽇,情感识别已经在多个 领域被⼴泛的应⽤。例如在商品零售领域,⽤户的评价对于零售商和⽣产商都是⾮常重要的反馈信息,通过对海量⽤户的评价进⾏情感分 析,可以量化⽤户对产品及其竞品的褒贬程度,从⽽了解⽤户对于产品的诉求以及⾃⼰产品与竞品的对⽐优劣。在社会舆情领域,通过分析 ⼤众对于社会热点事件的点评可以有效的掌握舆论的⾛向。在企业舆情⽅⾯,利⽤情感分析可以快速了解社会对企业的评价,为企业的战略 规划提供决策依据,提升企业在市场中的竞争⼒。在⾦融交易领域,分析交易者对于股票及其他⾦融衍⽣品的态度,为⾏情交易提供辅助依 据。 ⽬前,绝⼤多数的⼈⼯智能开放平台都具备情感分析的能⼒,如图所⽰是玻森中⽂语义开放平台的情感分析功能演⽰,可以看出除了通⽤领 域的情感分析外,还有汽车、厨具、餐饮、新闻和微博⼏个特定领域的分析。 玻森中⽂语义开放平台的情感分析⽰例 那么到底什么是情感分析呢?从⾃然语⾔处理技术的⾓度来看,情感分析的任务是从评论的⽂本中提取出评论的实体,以及评论者对该实体 所表达的情感倾向,⾃然语⾔所有的核⼼技术问题,例如:词汇语义,指代消解,此役⼩⽓,信息抽取,语义分析等都会在情感分析中⽤ 到。因此,情感分析被认为是⼀个⾃然语⾔处理的⼦任务,我们可以将⼈们对于某个实体⽬标的情感统⼀⽤⼀个五元组的格式来表⽰: (e,a,s,h,t) e表⽰情感分析的⽬标实体,可以是⼀个具体的实例,也可以是⼀个类,但必须是唯⼀的对象。 a表⽰实体e中⼀个观点具体评价的属性。 s表⽰对实体e的a属性的观点中所包含的情感,通常来讲会分为正向褒义、负向贬义和中性三种分类。也可以通过回归算法转化为1星到5星 的评价等级。 h是情感观点的持有者,有可能是评价者本⼈,也有可能是其他⼈。 t是观点发布的时间。 以图为例,e是指某餐厅,a为该餐厅的性价⽐属性,s是对该餐厅的性价⽐表⽰了褒义的评价,h为发表评论者本⼈,t是19年7⽉27⽇。所 以这条评论的情感分析可以表⽰为五元组(某餐厅,性价⽐,正向褒义,评论者,19年7⽉27⽇)。 ⽤户对某餐厅的评价 情感分析根据处理⽂本颗粒度的不同,⼤致可以分为三个级别的任务,分别是篇章级、句⼦级和属性级。我们分别来看⼀下。 1. 篇章级情感分析 篇章级情感分析的⽬标是判断整篇⽂档表达的是褒义还是贬义的情感,例如⼀篇书评,或者对某⼀个热点时事新闻发表的评论,只要待分析 的⽂本超过了⼀句话的范畴,即可视为是篇章级的情感分析。 对于篇章级的情感分析⽽⾔有⼀个前提假设,那就是全篇章所表达的观点仅针对⼀个单独的实体e,且只包含⼀个观点持有者h的观点。这种 做法将整个⽂档视为⼀个整体,不对篇章中包含的具体实体和实体属性进⾏研究,使得篇章级的情感分析在实际应⽤中⽐较局限,⽆法对⼀ 段⽂本中的多个实体进⾏单独分析,对于⽂本中多个观点持有者的观点也⽆法辨别。 例如评价的⽂本是:"我觉得这款⼿机很棒。"评价者表达的是对⼿机整体的褒义评价,但如果是:"我觉得这款⼿机拍照功能很不错,但 信号不是很好"这样的句⼦,在同⼀个评论中出现了褒义词⼜出现了贬义词,篇章级的分析是⽆法分辨出来的,只能将其作为⼀个整体进⾏ 分析。 不过好在有很多的场景是不需要区分观点评价的实体和观点持有者,例如在商品评论的情感分析中,可以默认评论的对象是被评论的商品, 评论的观点持有者也是评论者本⼈。当然,这个也需要看被评论的商品具体是什么东西,如果是亲⼦旅游这样的旅游服务,那么评论中就很 有可能包含⼀个以上的观点持有者。 在实际⼯作中,篇章级的情感分析⽆法满⾜我们对于评价更细致,如果需要对评论进⾏更精确,更细致的分析,我们需要拆分篇章中的每⼀ 句话,这就是句⼦级的情感分析研究的问题。 2. 句⼦级情感分析 与篇章级的情感分析类似,句⼦级的情感分析任务是判断⼀个句⼦表达的是褒义还是贬义的情感,虽然颗粒度到了句⼦层级,但是句⼦级分 析与篇章级存在同样的前提假设是,那就是⼀个句⼦只表达了⼀个观点和⼀种情感,并且只有⼀个观点持有⼈。如果⼀个句⼦中包含了两种 以上的评价或多个观点持有⼈的观点,句⼦级的分析是⽆法分辨的。好在现实⽣活中,绝⼤多数的句⼦都只表达了⼀种情感。 既然句⼦级的情感分析在局限性

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zz的学习笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值