一个模型解决所有信息抽取任务!(含代码)
- 论文标题:Unified Structure Generation for Universal Information Extraction
- 下载地址:https://arxiv.org/pdf/2203.12277.pdf
信息抽取任务包括命名实体识别(NER)、关系抽取(RE)、事件抽取(EE)等各种各样的任务。不同的信息抽取任务针对的任务不同,希望得到的输出也不同。例如下面的例子中,对于NER任务,需要识别Steve是PER、Apple是ORG;而对于关系抽取任务,则需要识别出Steve和Apple是Work For的关系。此外,不同场景的同一个信息抽取任务的输出可能也是不同的。
目前业内比较常见的做法是针对每个场景的每种信息抽取任务,分别独立的训练一个模型。这种方法成本很高,每种任务、每种场景都要建立模型。此外,独立的训练模型导致不同任务之间无法共享知识,没有发挥出数据和模型的全部能力。
中科院、百度在ACL 2022中提出了一种可以实现统一建模各类信息抽取任务的框架UIE,在4种信息检索任务的13个数据集上都取得了显著效果。
1
统一多种信息抽取任务
要想实现使用一个模型解决多种信息抽取任务的目标,一个核心问题是如何统一各种信息抽取任务的输入和输出。作者提出所有信息抽取任务都可以抽象成Spotting和Associating两个步骤:在Spotting步骤中,确定输入文本中的实体以及该实体对应的实体类型;在Associating中,建立两个实体之间的关系。
例如下面是Steve became CEO of Apple in 1997这句话使用上述方法抽象出来的描述语言。蓝色的代表关系抽取,红色的代表事件抽取,其他的是命名实体识别。首先能够识别出person、organization、time三种实体。此外Steve可以识别出work for的关系,而事件以became作为start-position,关联employee、employer、time。
通过上述方法,可以实现将所有信息抽取任务都抽象为相同结构的语言描述,为后续的多任务统一建模打下了基础。
2
基于prompt的多任务统一建模
基于上面的关系抽取统一描述,本文提出了UIE框架,在输入侧构造每个任务structural schema instructor (SSI),以及原始文本,使用Encoder编码后,使用Decoder解码统一的信息抽取语言描述。整个过程如下图所示。
仍然以上面文本为例,输入由SSL原始文本组成。对于关系抽取任务,SSL对应的是[spot] person [asso] word for。这会作为一个前缀prompt,用来指导模型根据特定的任务进行文本生成。而对于NER任务,SSL对应的是[spot] person [spot] organization [spot] time。SSL后面接一个[text]标识符以及原来的文本。整体的输入文本拼接模式如下:
上述文本会通过Encoder进行编码,然后利用Decoder进行文本生成,生成的目标文本即为根据信息抽取的label生成的统一描述。在具体的模型结构上,BART、T5等生成式模型,都可以作为框架的主模型的backbone。这种基于前缀的生成方式,也可以比较容易的适应到一个新的信息抽取任务上。
3
模型训练
为了训练上面说的从SSL+文本到描述的生成式模型,文中采用了三个预训练任务联合学习。构造了3种数据,分别是SSL+原始文本到结构化文本的pair对、单独的原始文本以及单独的结构化文本。第一个任务是SSL+原始文本到结构化文本的匹配关系,匹配的label为1,不匹配label为0,label为0的样本是通过随机替换spot或associate实现的。第二个任务是使用结构化文本训练Decoder,这一步是为了让Decoder适应结构化文本的语言形式。第三个任务是在训练过程中引入一般的mask language modeling任务,目的是防止模型在训练过程中丢失了文本原始的语义信息。最终的预训练loss是下面3个loss的和:
预训练好的模型可以在下游任务进行finetune以应用到各类任务上。同时作者引入rejection mechanism,在结构化文本中插入一些在原始输入中没有的实体以及NULL,让模型可以通过生成NULL避免被误导生成不正确的结果。
4
实验结果
UIE框架在信息抽取任务中的整体效果如下,主要对比了UIE和各个数据集上各类SOTA模型的效果。可以看到在大部分数据集上,UIE的效果都是最优的。对比没有经过预训练的模型(SEL),UIE取得非常显著的提升,通过将多任务使用统一框架联合训练,实现了知识的共享和效果的互相促进。
除了在正常的有监督任务上效果外,本文也对小样本场景的效果进行了实验,主要对比了使用T5模型finetune和使用UIE方法的效果,UIE在小样本上的效果非常显著。
5
开源代码
与此论文相应的开源代码发布在百度PaddleNLP上https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/uie。
感兴趣的同学可以去github中尝试UIE的效果,主页上有详细的使用示例部署方式~
END
相关文章
- pycharm中tensorflow代码不能自动补全或import红线问题解决
- 计算机设备问题代码43,双击unknown device由于该设备有问题Windows已将其停止(代码 43)怎么办解决教程…「建议收藏」
- 【说站】python多行代码如何录入
- 解决RStudio 每次第一句代码出现警告InormalizePath(path.expand(path), winslash, mustWork)[通俗易懂]
- 电脑蓝屏代码0x000000ed的解决方法_蓝屏错误代码0xc000007b
- JS常用功能代码片段
- 【经验科普】实战分析C工程代码可能遇到的编译问题及其解决思路
- 什么是低代码?低代码平台能解决什么样的问题?
- python中使用马尔可夫决策过程(MDP)动态编程来解决最短路径强化学习问题|附代码数据
- 20 个解决日常问题的 Python 代码片段
- 在 Java 代码中来一段 JavaScript?聊聊 Flowable 中的脚本任务
- 用数据告诉你出租车资源配置是否合理|附代码数据
- Python用KShape对时间序列进行聚类和肘方法确定最优聚类数k可视化|附代码数据
- [Git]如何解决Git代码冲突
- 远程代码托管平台--GitHub、Gitee的使用
- 代码这样写,同事乐开花
- 数字化转型第一步,“低代码”搭建更靠谱! | Q推荐
- github 解决推拉代码提示 REMOTE HOST IDENTIFICATION HAS CHANGED 失败
- ORA-01810:格式代码出现两次 解决方法详解数据库
- eclipse里面的alt+/不给提示, 只是补全代码的解决方法详解程序员
- 代码质量管理 开源平台SonarQube v6.3.2 发布详解编程语言
- Linux C格式:如何让你的代码更美观易读?(linuxc格式)
- 了解Oracle报错代码01219如何解决常见数据库问题(oracle 01219)
- aspupload文件重命名及上传进度条的解决方法附代码
- 一行代码解决perl输入排序输出问题
- Chrome内核下由ashx输出的js代码不起作用的解决方法
- Java解决约瑟夫问题代码实例
- 解决phpcms更换javascript的幻灯片代码调用图片问题