赞
踩
笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~
属性级情感分析是指在文本情感分析的基础上,进一步对文本中涉及的具体属性或方面进行情感分析。传统的文本情感分析通常只关注整体文本的情感极性(如正面、负面、中性),而属性级情感分析则致力于识别文本中针对特定属性或方面的情感倾向,从而更细粒度地理解用户对产品、服务或事件各个方面的态度和情感。
属性级情感分析通常涉及以下几个主要步骤:
属性抽取:首先需要从文本中提取出与具体属性相关的词语或短语,这些属性可以是产品的特定特征(如外观、性能、价格)、服务的某个方面(如客户服务、物流配送)、事件的具体方面等。
情感分类:针对每个提取出的属性,对文本中表达的情感进行分类,通常包括积极的、消极的、中性的情感极性。这一步通常需要使用文本分类或情感分类模型来识别文本中针对特定属性的情感倾向。
结果汇总:将针对不同属性的情感分类结果进行汇总,形成对整体文本的属性级情感分析结果。这样可以更清晰地了解用户对各个属性的态度和情感倾向,为产品改进、服务优化或舆情监控提供更详细的参考信息。
属性级情感分析在产品评测、社交媒体舆情分析、消费者意见挖掘等领域具有重要应用,可以帮助企业更全面地了解用户需求和反馈,从而有针对性地改进产品和服务。
训练集 len(train_ds)=800
验证集 len(dev_ds)=100
测试集 len(test_ds)=100
第1列是标签
第2列是属性观点
第3列是原文
数据加载和预处理部分:
Skep模型作为基础模型
SKEP(Sentiment Knowledge Enhanced Pre-training)是一种基于情感知识增强的预训练模型。百度自然语言处理实验室
Skep采用的预训练语言模型是Ernie(Enhanced Representation through kNowledge IntEgration)模型
输入有两部分:
评价的属性(Aspect)、相应的评论文本
将两者拼接之后便可以传入SKEP模型中,SKEP模型对该文本串进行语义编码
根据该语义编码向量进行情感分类
定义了一个基于Skep模型的序列分类器(Sequence Classification)。它使用预训练的Skep模型作为基础,并在其顶部添加了一层线性分类器。
__init__
)接受Skep模型、类别数量和可选的dropout参数作为输入。__init__
方法,然后设置类别数量和Skep模型。forward
方法实现了正向传播逻辑。接受输入的文本序列(input_ids)以及可选的token_type_ids、position_ids和attention_mask参数。# 训练配置:设置训练超参数,如学习率、权重衰减、最大梯度范数等,并创建优化器、学习率调度器和评估指标
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()
训练一个文本分类模型并评估其性能
加载已训练好的文本分类模型并在测试集上进行评估
具体的步骤如下:
data_cls.load_dict
函数加载训练时使用的标签字典,该字典用于将标签映射为类别id和将类别id映射为标签。paddle.load
函数加载之前保存的最佳模型权重。SkepModel.from_pretrained
函数加载Skep模型的预训练权重。SkepForSequenceClassification
模型,该模型包含从Skep模型中提取的特征和一个用于分类的全连接层,并根据类别数量设置了输出维度。best_model.load_dict
方法加载之前保存的最佳模型权重。evaluate
函数,在测试集上评估加载的模型。使用加载好的文本分类模型进行预测
使用加载好的模型对给定的文本进行情感分类预测,并输出预测结果。
具体的步骤如下:
paddle
、SkepModel
、SkepTokenizer
等。data_cls.load_dict
函数加载之前保存的标签字典,用于将标签映射为类别id和将类别id映射为标签。paddle.load
函数加载之前保存的最佳模型权重。SkepModel.from_pretrained
函数加载预训练的Skep模型。SkepTokenizer.from_pretrained
函数加载Skep模型对应的分词器。SkepForSequenceClassification
模型,该模型包含从Skep模型中提取的特征和一个用于分类的全连接层,并根据类别数量设置了输出维度。best_model.load_dict
方法加载之前保存的最佳模型权重。predict
函数,用于对输入的文本进行预测。函数首先将模型切换到评估模式,然后使用Tokenizer对输入进行编码,将编码后的输入转换为Tensor,并通过模型进行推理得到预测结果。最后打印出预测结果。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.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。