基于UIE的情感分析技术开源,小样本能力强悍!助力评论洞察与舆情分析

基于UIE的情感分析技术开源,小样本能力强悍!助力评论洞察与舆情分析

情感分析(Sentiment Analysis)是近年来国内外研究的热点,旨在对带有情感色彩的主观性文本进行分析、处理、归纳和推理。情感分析具有广泛的应用场景,可以被应用于消费决策、舆情分析、个性化推荐等领域。

按照分析粒度可以大致分为三类:篇章级的情感分析(Document-Level Sentiment Classification)、语句级的情感分析(Sentence-Level Sentiment Classification)和属性级的情感分析(Aspect-Level Sentiment Classification)。其中属性级的情感分析又包含多项子任务,例如属性抽取(Aspect Term Extraction)、观点抽取(Opinion Term Extraction)、属性级情感分析(Aspect-Based Sentiment Classification)等。

PaddleNLP情感分析应用立足真实企业用户对情感分析方面的需求,同时针对情感分析领域的痛点和难点,基于前沿模型开源了细粒度的情感分析解决方案,助力开发者快速分析业务相关产品或服务的用户感受。针对情感分析应用,本项目不仅提供了基于Taskflow开箱即用的情感分析能力,还提供了从输入数据到情感分析结果可视化的能力,另外考虑到一些企业用户需要针对业务场景进行适配,本项目同时提供了完整的情感分析定制方案:数据标注 - 模型训练 - 模型测试 - 模型部署 - 情感分析可视化。

图1 情感分析示例图

更多信息,请参考PaddleNLP情感分析

安装环境

开始运行之前请先确保安装如下依赖。

!pip install -U paddlenlp
!pip install wordcloud==1.8.2.2

1. 快速体验:开箱即用的情感分析能力

本项目以通用信息抽取模型UIE为训练底座,提供了语句级情感分析和属性级情感分析能力、覆盖情感分类、属性抽取、观点抽取等常用情感分析能力,如下图所示。

图1 情感分析示例图

为方便用户体验和使用,本项目提供的情感分析能力已经集成到了 Taskflow,可以通过Taskflow开箱即用的的能力快速体验情感分析的功能。下面赶快体验一下吧~

1.1 语句级情感分析

from paddlenlp import Taskflow
from pprint import pprint

schema = ['情感倾向[正向,负向]']
senta = Taskflow("sentiment_analysis", model="uie-senta-base", schema=schema)
pprint(senta('蛋糕味道不错,店家服务也很好'))

1.2 属性级情感分析

除语句级情感分析之外,本项目同时支持属性级情感分析,包括属性抽取(Aspect Term Extraction)、观点抽取(Opinion Term Extraction)、属性级情感分析(Aspect Based Sentiment Classification)等等。可以通过设置相应的schema进行对应信息的抽取,其调用示例如下。

from paddlenlp import Taskflow
from pprint import pprint

schema =  [{"评价维度":["观点词", "情感倾向[正向,负向,未提及]"]}]
senta = Taskflow("sentiment_analysis", model="uie-senta-base", schema=schema)
pprint(senta('蛋糕味道不错,店家服务也很热情'))

更进一步地,在某些业务场景中,特别是一些垂域场景,用户可能比较关注固定的某些属性。在这种情况下,可以预先提供相应的属性集合,则本项目将只会在该属性集上进行情感分析,分析和抽取该集合中各个属性的信息。

针对固定属性的情感分析示例如下,需要将属性集合传入参数 aspects 中,后续将只针对这些属性进行分析。可以看到在示例中,传入了属性 房间,位置 和 价格,针对 房间 和 价格 均分析到了观点词和情感倾向,但是位置由于在样本中并未提及,因此相应观点词为空,情感倾向为 未提及。

from paddlenlp import Taskflow
from pprint import pprint

# define schema for pre-defined aspects, schema
schema = ["观点词", "情感倾向[正向,负向,未提及]"]
aspects = ["房间", "位置", "价格"]
# set aspects for Taskflow
senta = Taskflow("sentiment_analysis", model="uie-senta-base", schema=schema, aspects=aspects)
pprint(senta("这家店的房间很大,店家服务也很热情,就是价格有点贵"))

1.3 多版本模型选择

为方便用户实际业务应用情况,本项目多个版本的模型,可以根据业务对于精度和速度方面的要求进行选择,下表展示了不同版本模型的结构以及在测试集上的指标。

图3 不同模型对比图

在Taskflow中,可以直接指定相应模型名称进行使用,使用uie-senta-mini版本的示例如下:

from paddlenlp import Taskflow
from pprint import pprint

schema =  [{"评价维度":["观点词", "情感倾向[正向,负向,未提及]"]}]
senta = Taskflow("sentiment_analysis", model="uie-senta-mini", schema=schema)
pprint(senta("蛋糕味道不错,店家服务也很热情"))

2. 批量处理:从数据到情感分析可视化

为方便使用,本项目提供了批量处理的功能,支持以文件形式输入,批量进行情感分析。同时打通了从数据到情感分析结果可视化的流程,帮助用户可以更加快速获取情感分析结果,聚焦于业务分析方面。

2.1 数据描述

输入数据如下方式进行组织,每行表示一个文本评论。

非常好的酒店 不枉我们爬了近一个小时的山,另外 大厨手艺非常棒 竹筒饭 竹筒鸡推荐入住的客人必须要点,
房间隔音效果不好,楼下KTV好吵的
酒店的房间很大,干净舒适,服务热情
怎么说呢,早上办理入住的,一进房间闷热的一股怪味,很臭,不能开热风,好多了,虽然房间小,但是合理范围
总台服务很差,房间一般

2.2 批量情感分析

通过脚本 batch_predict.py 批量进行情感分析,通过 file_path 指定要进行情感分析的文件路径,处理完后,结果将会保存在 save_path 指定的文件中,示例如下:

!python batch_predict.py \
    --file_path "./data/data184040/test_hotel.txt" \
    --save_path "./outputs/sentiment_analysis.json" \
    --model "uie-senta-base" \
    --schema "[{'评价维度': ['观点词', '情感倾向[正向,负向,未提及]']}]" \
    --batch_size 4 \
    --max_seq_len 512

2.3 情感分析可视化

在情感分析处理之后,可以根据情感分析的保存结果进行可视化展示,帮助用户更友好地分析业务特点。默认情况下,可视化功能支持围绕属性、观点、属性+观点、属性+情感、指定属性+观点分析功能。在各项分析中,均支持词云和直方图两类图像展示。特别说明的是,当前只支持如下schema分析后的数据,后续将支持自定义不同分析类型的可视化。

schema = [{'评价维度': ['观点词', '情感倾向[正向,负向,未提及]']}]
!python visual_analysis.py \
    --file_path "./outputs/sentiment_analysis.json" \
    --save_dir "./outputs/images" \
    --font_path "./SimHei.ttf"

运行后图片将保存在save_dir指定的目录中,其中可视化结果展示如下。

图4 情感分析可视化结果图

3. 更进一步:结合业务分析经验,定制情感分析

考虑到用户在对业务数据进行情感分析时,往往聚焦于某个特定场景或领域,为满足用户更高的情感分析要求,本项目支持从以下方面协助用户,结合业务经验,进一步定制情感分析能力,提高模型对业务数据的理解和分析能力。

  • 数据层面:打通 label-studio 平台,定制了情感信息的标注规则,支持根据标注数据自动转换为模型输入样本。
  • 属性聚合:结合业务经验,支持传入同义的属性集合,可以增强模型对于数据聚合的能力。
  • 隐性观点抽取:结合业务经验,支持自定义隐性观点词表,可以增强模型对于隐性观点的抽取能力。

在本AiStudio项目中,默认已处理好相应的训练、验证和测试数据,并已将相应的训练、验证和测试集存放于data目录下。关于数据标注,样本构建,属性聚合、隐性观点抽取等能力,请参考PaddleNLP情感分析

下面以酒店场景为例,讲解定制酒店垂域的情感分析能力。

3.1 数据描述

我们开源了4000+条训练数据、530条验证数据和530条测试数据,其中每份数据集包含一些负样本。下面展示了部分数据示例。

{"content": "房间干净,服务员态度也不错,只是隔音一般吧", "result_list": [{"text": "干净", "start": 2, "end": 4}, {"text": "一般", "start": 18, "end": 20}, {"text": "不错", "start": 11, "end": 13}], "prompt": "观点词"}
{"content": "感觉卫生一般,房间比较旧,设施还是齐全的,性价比一般,", "result_list": [{"text": "旧", "start": 11, "end": 12}], "prompt": "房间的观点词"}
{"content": "只能睡后面的房间,房间很大,浴室也超大,干净卫生,老板自己家的别墅,川菜味道很好,第一二张是别墅外景,视野很好很漂亮", "result_list": [{"text": "未提及", "start": -5, "end": -2}], "prompt": "接送机服务的情感倾向[负向,正向,未提及]"}

3.2 模型训练

本项目将基于uie-senta-base模型进行训练,命令如下。

!python finetune.py \
  --train_path ./data/data184040/train.json \
  --dev_path ./data/data184040/dev.json \
  --save_dir ./checkpoint \
  --learning_rate 1e-5 \
  --batch_size 16 \
  --max_seq_len 512 \
  --num_epochs 3 \
  --model uie-senta-base \
  --seed 1000 \
  --logging_steps 10 \
  --valid_steps 100 \
  --device gpu

3.3 模型评估

通过运行以下命令进行对酒店场景的测试集进行评估:

!python evaluate.py \
    --model_path ./checkpoint/model_best \
    --test_path ./data/data184040/test.json \
    --batch_size 16 \
    --max_seq_len 512

3.4 模型预测

paddlenlp.Taskflow装载定制模型,通过task_path指定模型权重文件的路径,路径下需要包含训练好的模型权重文件model_state.pdparams。

from paddlenlp import Taskflow
from pprint import pprint

schema = [{'评价维度': ['观点词', '情感倾向[正向,负向,未提及]']}]
senta = Taskflow("sentiment_analysis", model="uie-senta-base", schema=schema, task_path="./checkpoint/model_best")
pprint(senta("这家点的房间很大,店家服务也很热情,就是房间隔音不好"))

加入交流群,一起学习吧

更多信息请参考PaddleNLP情感分析。 以上实现基于PaddleNLP,如有帮助,欢迎Star⭐支持~

GitHub地址:https://github.com/PaddlePaddle/PaddleNLP

  • 加入交流群,一起创造吧

欢迎加入PaddleNLP微信群,交流更多前沿技术、调优经验。


此文章为搬运
原项目链接

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值