信息抽取是自然语言处理界中比较广泛研究以及应用的一个领域,用专业的学术表达就是将文本这中非结构化的数据结构化。因为计算机对于非结构化的信息处理起来很困难,但是对于结构化的信息就可以很轻松的进行处理,可以进行后续的检索,统计,相似度计算等后续应用。在深度学习火起来之后,采用深度学习进行信息抽取越来越成为一种范式。但是由于关系抽取和事件抽取等不同类型的任务的输出有着一定的区别,所以大家会设计不同的模型去完成不同类型的信息抽取任务。最近UIE提出采用一个模型完成这些不同类型的信息抽取任务,实现了信息抽取任务的大一统,同时UIE可以在大量的语料上进行预训练,在小样本训练上也有着出色的效果。
UIE模型简介
UIE模型全称是Unified Structure Generation for Universal Information Extraction。字面意思就是用一个大一统的模型完成各种各样的信息抽取的工作。如下图所示:以前完成上述关系抽取和事件抽取等任务,需要设计不同的模型架构去完成,而UIE的目的则是采用一个同一的模型完成以前需要用四个模型才能完成的任务。
而其中最UIE的的主要思想如下图所示: 就是设计是一种基于Schema的SSI(Structural Schema Instructor) + 输入句子 生成一种结构化抽取语言(Structural Extraction Language, SEL),
(1)SSL 作为 prompt 去指导模型做那种信息抽取任务。
(2)而不同的信息抽取任务的结果都可以表示成一种特殊SEL
(3)模型输入SSL + Text 生成 SLE,原文采用的是Seq2Seq的句子生成式模型进行的训练。 image.png
虽然原版的UIE采用的式句子生成式的方式进行的,但UIE也可以采用 阅读理解式(MRC)的抽取式 +一些后处理 进行SLE的生成。比如百度paddleNLP开源的UIE就是基于抽取式的方式进行训练的。
image.png
细粒度情感分析任务简介
细粒度的情感分析这个任务:主要任务是判断判断句子在某方面的情感极性。
其具体建模过程如下:
输入:文本是“这家餐厅的环境还不错,可以菜做的不怎么样”
输出 :"环境"这个维度, 以及"环境"的观点词"还不错",和 "环境"的情感极性正向;
"菜"这个维度,以及"菜"的观点词 "不怎么样"和"菜"的情感极性负向。
这也是一个信息抽取类型的任务。在舆情分析,用户评论分析等方面都有着巨大的用处。。接下来笔者就用百度PaddleNLP开源的基于ernie3.0训练的抽取式的UIE进行细粒度文本分类的实战。
实战部分
其具体的过程完成按照https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/uie文档的教程进行操作。
数据标注
这里采用的doccano开源标注工具进行10条数据的标注。需要采用关系抽取的标注方式进行标注。其具体的标注过程如图所示:
比如: 保湿效果不错这句话
- 其中"保湿效果" 需要标注成 评价维度##正向span
- "很不错" 需要标标注成 观点词span
- 最后将"保湿效果" 和"不错" 用 观点词relation 这个关系连接
数据预处理
标注完成后,将数据导出,采用下方脚本进行标注数据预处理。
python doccano.py --doccano_file test.json --task_type "ext" --save_dir ./data --splits 0.8 0.1 0.1 --prompt_prefix "情感倾向" --options "正向" "负向" --separator "##"
image.png
处理后的训练数据如下图所示,完全式一个抽取式任务的训练数据格式,比如第一条样本是在做评价维度的抽取
模型输入:"值得囤的一款面膜,价格实惠,肤感也不错" + "评价维度" 。
模型输出:"肤感" 的在句子序列中 index(14,16] 。
而情感倾向的抽取如最后一条样本:
模型输入:"值得囤的一款面膜,价格实惠,肤感也不错" + "肤感的情感倾向[负向,正向]" 。
模型输出:"正向" 的在句子序列中 index(-4,-2] 。
{"content": "值得囤的一款面膜,价格实惠,肤感也不错。", "result_list": [{"text": "价格", "start": 9, "end": 11}, {"text": "肤感", "start": 14, "end": 16}], "prompt": "评价维度"}
{"content": "值得囤的一款面膜,价格实惠,肤感也不错。", "result_list": [{"text": "实惠", "start": 11, "end": 13}, {"text": "也不错", "start": 16, "end": 19}], "prompt": "观点词"}
{"content": "值得囤的一款面膜,价格实惠,肤感也不错。", "result_list": [{"text": "实惠", "start": 11, "end": 13}], "prompt": "价格的观点词"}
{"content": "值得囤的一款面膜,价格实惠,肤感也不错。", "result_list": [{"text": "也不错", "start": 16, "end": 19}], "prompt": "肤感的观点词"}
{"content": "值得囤的一款面膜,价格实惠,肤感也不错。", "result_list": [{"text": "正向", "start": -7, "end": -5}], "prompt": "价格的情感倾向[正向,负向]"}
{"content": "值得囤的一款面膜,价格实惠,肤感也不错。", "result_list": [{"text": "正向", "start": -4, "end": -2}], "prompt": "肤感的情感倾向[负向,正向]"}
UIE模型finetune
运行下方脚本进行模型微调。可以看到模型的loss在进行下降,F1在进行上升。
python finetune.py --train_path ./data/train.txt --dev_path ./data/dev.txt --save_dir ./checkpoint --learning_rate 1e-5 --batch_size 4 --max_seq_len 512 --num_epochs 4 --model uie-base --seed 1000 --logging_steps 10 --valid_steps 10
image.png
UIE模型测试
先采用百度开源的默认的UIE模型进行 一条新样本的 SEL的抽取。我们发现抽取出来了
: "肤感" + "不错" + "正向" ; "成分" + "安全" + "正向"; "效果" + "好" + "正向"
而并没有将保湿效果这个评价维度抽取出来。
接下来我们采用微调后的模型进行 SEL的抽取,抽取出来的信息则是: "肤感" + "不错" + "正向" ; "成分" + "安全" + "正向"; "保湿效果" + "好" + "正向"
确实微调后的新模型就将我们想要的信息抽取出来了。
image.png
结语
百度官方其实也作过测试,放出了在不同领域采用小样本微调UIE后模型的效果提升。在ERNIE3.0的加持下,UIE在金融,医疗和互联网领域只需要5条标注数据微调就可以将指标提升20%-30%,确实UIE不仅实现了信息抽取任务的大一统,还对于小样本的信息抽取有着很好的效果。
image.png
参考
https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/uie
https://zhuanlan.zhihu.com/p/495315026
网友评论