目录
Universal Information Extraction (UIE):Yaojie Lu等人提出了开放域信息抽取的统一框架,这一框架在实体抽取、关系抽取、事件抽取、情感分析等任务上都有着良好的泛化效果。本示例基于这篇工作的prompt设计思想,提供了以ERNIE为底座的阅读理解型信息抽取模型,用于关键信息抽取。同时,针对不同场景,支持通过构造小样本数据来优化模型效果,快速适配特定的关键信息配置。
-
使用简单:用户可以使用自然语言自定义抽取目标,无需训练即可统一抽取输入文本中的对应信息。实现开箱即用,并满足各类信息抽取需求。
-
降本增效:以往的信息抽取技术需要大量标注数据才能保证信息抽取的效果,为了提高开发过程中的开发效率,减少不必要的重复工作时间,开放域信息抽取可以实现零样本(zero-shot)或者少样本(few-shot)抽取,大幅度降低标注数据依赖,在降低成本的同时,还提升了效果。
-
效果领先:开放域信息抽取在多种场景,多种任务上,均有不俗的表现。
UIE可以从自然语言文本中,抽取出结构化的关键字段信息,以下是UIE在医疗、金融等领域的应用示例。
在医疗场景下,医生需要从病历中快速重要信息以便分析病人病情,UIE可将专病信息进行结构化处理,快速抽取病历内容中的检查内容、炎症部位、结节大小等信息,大幅提升医务人员对患者的诊断效率以及准确率,协助医务人员高效诊断病情。
在金融场景下,工作人员想要整理一份资产评估证明,UIE可以根据抽取内容自定义抽取目标,大幅提升工作人员的工作效率及准确率,协助工作人员对数据进行整理和调研。
paddlenlp.Taskflow
提供通用信息抽取、评价观点抽取等能力,可抽取多种类型的信息,包括但不限于命名实体识别(如人名、地名、机构名等)、关系(如电影的导演、歌曲的发行时间等)、事件(如某路口发生车祸、某地发生地震等)、以及评价维度、观点词、情感倾向等信息。用户可以使用自然语言自定义抽取目标,无需训练即可统一抽取输入文本中的对应信息。实现开箱即用,并满足各类信息抽取需求
>>> from pprint import pprint
>>> from paddlenlp import Taskflow
>>> schema = ['时间', '选手', '赛事名称'] # Define the schema for entity extraction
>>> ie = Taskflow('information_extraction', schema=schema)
>>> pprint(ie("2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!"))
[{'时间': [{'end': 6,
'probability': 0.9857378532924486,
'start': 0,
'text': '2月8日上午'}],
'赛事名称': [{'end': 23,
'probability': 0.8503089953268272,
'start': 6,
'text': '北京冬奥会自由式滑雪女子大跳台决赛'}],
'选手': [{'end': 31,
'probability': 0.8981548639781138,
'start': 28,
'text': '谷爱凌'}]}]
更多不同任务的使用方法请参考Taskflow信息抽取
对于简单的抽取目标可以直接使用paddlenlp.Taskflow
实现零样本(zero-shot)抽取,对于细分场景我们推荐使用轻定制功能(标注少量数据进行模型微调)以进一步提升效果。下面通过报销工单信息抽取
的例子展示如何通过5条训练数据进行UIE模型微调。
.
├── utils.py # 数据处理工具
├── model.py # 模型组网脚本
├── doccano.py # 数据标注脚本
├── doccano.md # 数据标注文档
├── finetune.py # 模型微调脚本
├── evaluate.py # 模型评估脚本
└── README.md
我们推荐使用数据标注平台doccano 进行数据标注,本示例也打通了从标注到训练的通道,即doccano导出数据后可通过doccano.py脚本轻松将数据转换为输入模型时需要的形式,实现无缝衔接。
原始数据示例:
深大到双龙28块钱4月24号交通费
抽取的目标(schema)为:
schema = ['出发地', '目的地', '费用', '时间']
标注步骤如下:
- 在doccano平台上,创建一个类型为
序列标注
的标注项目。 - 定义实体标签类别,上例中需要定义的实体标签有
出发地
、目的地
、费用
和时间
。 - 使用以上定义的标签开始标注数据,下面展示了一个doccano标注示例:
-
标注完成后,在doccano平台上导出文件,并将其重命名为
doccano_ext.json
后,放入./data
目录下。 -
这里我们提供预先标注好的文件doccano_ext.json,可直接下载并放入
./data
目录。执行以下脚本进行数据转换,执行后会在./data
目录下生成训练/验证/测试集文件。
python doccano.py \
--doccano_file ./data/doccano_ext.json \
--task_type "ext" \
--save_dir ./data \
--splits 0.1 0.9 0
可配置参数说明:
doccano_file
: 从doccano导出的数据标注文件。save_dir
: 训练数据的保存目录,默认存储在data
目录下。negative_ratio
: 负样本与正样本的比例,该参数只对抽取类型任务有效。使用负样本策略可提升模型效果,负样本数量 = negative_ratio * 正样本数量。splits
: 划分数据集时训练集、验证集所占的比例。默认为[0.8, 0.1, 0.1]表示按照8:1:1
的比例将数据划分为训练集、验证集和测试集。task_type
: 选择任务类型,可选有抽取和分类两种类型的任务。options
: 指定分类任务的类别标签,该参数只对分类类型任务有效。prompt_prefix
: 声明分类任务的prompt前缀信息,该参数只对分类类型任务有效。is_shuffle
: 是否对数据集进行随机打散,默认为True。seed
: 随机种子,默认为1000.
更多不同类型任务(关系抽取、事件抽取、评价观点抽取等)的标注规则及参数说明,请参考doccano数据标注指南。
通过运行以下命令进行模型微调:
python finetune.py \
--train_path "./data/train.txt" \
--dev_path "./data/dev.txt" \
--save_dir "./checkpoint" \
--learning_rate 1e-5 \
--batch_size 16 \
--max_seq_len 512 \
--num_epochs 100 \
--model "uie-base" \
--seed 1000 \
--logging_steps 10 \
--valid_steps 100 \
--device "gpu"
可配置参数说明:
train_path
: 训练集文件路径。dev_path
: 验证集文件路径。save_dir
: 模型存储路径,默认为./checkpoint
。learning_rate
: 学习率,默认为1e-5。batch_size
: 批处理大小,请结合显存情况进行调整,若出现显存不足,请适当调低这一参数,默认为16。max_seq_len
: 文本最大切分长度,输入超过最大长度时会对输入文本进行自动切分,默认为512。num_epochs
: 训练轮数,默认为100。model
: 选择模型,程序会基于选择的模型进行模型微调,可选有uie-base
和uie-tiny
,默认为uie-base
。seed
: 随机种子,默认为1000.logging_steps
: 日志打印的间隔steps数,默认10。valid_steps
: evaluate的间隔steps数,默认100。device
: 选用什么设备进行训练,可选cpu或gpu。
模型选择:
模型 | 结构 |
---|---|
uie-tiny |
6-layers, 768-hidden, 12-heads |
uie-base (默认) |
12-layers, 768-hidden, 12-heads |
通过运行以下命令进行模型评估:
python evaluate.py \
--model_path "./checkpoint/model_best" \
--test_path "./data/dev.txt" \
--batch_size 16 \
--max_seq_len 512
可配置参数说明:
model_path
: 进行评估的模型文件夹路径,路径下需包含模型权重文件model_state.pdparams
及配置文件model_config.json
。test_path
: 进行评估的测试集文件。batch_size
: 批处理大小,请结合显存情况进行调整,若出现显存不足,请适当调低这一参数,默认为16。max_seq_len
: 文本最大切分长度,输入超过最大长度时会对输入文本进行自动切分,默认为512。
paddlenlp.Taskflow
装载定制模型,通过task_path
指定模型权重文件的路径,路径下需要包含训练好的模型权重文件model_state.pdparams
。
>>> from pprint import pprint
>>> from paddlenlp import Taskflow
>>> schema = ['出发地', '目的地', '费用', '时间']
# 设定抽取目标和定制化模型权重路径
>>> my_ie = Taskflow("information_extraction", schema=schema, task_path='./checkpoint/model_best')
>>> pprint(my_ie("城市内交通费7月5日金额114广州至佛山"))
[{'出发地': [{'end': 17,
'probability': 0.9975287467835301,
'start': 15,
'text': '广州'}],
'时间': [{'end': 10,
'probability': 0.9999476678061399,
'start': 6,
'text': '7月5日'}],
'目的地': [{'end': 20,
'probability': 0.9998511131226735,
'start': 18,
'text': '佛山'}],
'费用': [{'end': 15,
'probability': 0.9994474579292856,
'start': 12,
'text': '114'}]}]
我们在互联网、医疗、金融三大垂类自建测试集上进行了实验:
金融 | 医疗 | 互联网 | ||||
---|---|---|---|---|---|---|
0-shot | 5-shot | 0-shot | 5-shot | 0-shot | 5-shot | |
uie-tiny | 41.11 | 64.53 | 65.40 | 75.72 | 78.32 | 79.68 |
uie-base | 46.43 | 70.92 | 71.83 | 85.72 | 78.33 | 81.86 |
0-shot表示无训练数据直接通过paddlenlp.Taskflow
进行预测,5-shot表示基于5条标注数据进行模型微调。实验表明UIE在垂类场景可以通过少量数据(few-shot)进一步提升效果。