图谱构建的基石: 实体关系抽取总结与实践|社区征文

社区征文
引言

作为一个专注于NLP的算法技术团队,我们一直致力于知识智能在各业务场景的价值落地,随着NLP技术的逐渐演变:从词表为王到词向量,再到以BERT为代表的预训练模型,再到最近横空出世的ChatGPT,让“技术赋能业务”逐渐成为了现实。在一些常见的NLP任务中,有一类任务扮演了举足轻重的作用,也是当下的研究热点,这类任务就是:实体关系抽取,目的是从自然语言文本中识别并判定实体对之间存在的特定关系,为智能检索、语义分析等提供基础支持,有助于提高搜索效率。

2022年,团队以构建知识智能为导向,这对个人的知识储备提出了更高的挑战,作为团队的一员,我利用业余时间又重温了经典的实体关系抽取论文,并运用所学在相关算法大赛中进行了实践,取得了第四名的成绩。

问题研究

问题定义

从结构化(如表格)、半结构化(如JSON)和非结构化(如纯文本)数据中获取形式为(事物1,关系,事物2)的三元组的过程称为关系抽取(relation extraction)。一般情况下,我们会尽量把关系抽取抽象成若干三元组的抽取,而不会做n元组(n>3)的抽取。在NLP中,实体关系抽取则是致力于从自然语言文本中识别出实体对并判断实体间特定语义关系的任务,输入的是一句文本,输出的是SPO三元组(Subject-Predicate-Object)。

举例说明:

例:渣津龙岗坪商周遗址位于渣津镇东郊河对岸台地上(水车村)。据许智范撰写的《江西考古资料汇编·修水发现二处古文化遗址》称:龙岗坪商周遗址,长200米,宽100米,文化堆积1米。

可以抽取出的实体关系三元组有:

  1. (渣津龙岗商周遗址-所在地-渣津镇东郊河对岸台地上(水车村))
  2. (渣津龙岗商周遗址-相关人物-许智范)
  3. (渣津龙岗商周遗址-相关文献-《江西考古资料汇编·修水发现二处古文化遗址》)。

问题分析

实际上,常见的实体及其关系并不都是相互独立的,往往存在嵌套、一对多等问题。常见的关系类型如图所示:

picture.image

  1. 正常关系。
  2. 一对多。句子:张学友演唱过《吻别》《在你身边》。三元组:(张学友-歌手-吻别),(张学友-歌手-在你身边)
  3. 一对实体间存在多种关系。句子:周杰伦作曲并演唱《七里香》。三元组:(周杰伦-歌手-七里香),(周杰伦-作曲-七里香)。
  4. 实体重叠。句子:《叶圣陶散文选集》。三元组:(叶圣陶-作品-叶圣陶散文选集)。
  5. 关系交叉。句子:张学友、周杰伦分别演唱过《吻别》《七里香》。三元组:(张学友-歌手-吻别),(周杰伦-歌手-七里香)。

解决方案

常见的抽取方法有两类,一类是管道式抽取,另一类是联合抽取。

管道式抽取的特点如下:

  1. 优点:架构灵活,数据更容易收集和标注,作为独立任务可以分别开发、各自优化。
  2. 缺点:采取管道的方式会造成误差传播;由于是独立任务,会带来效率问题;拆成独立任务可能会影响效果。

联合抽取的特点如下:

  1. 优点:可以考虑到两个子任务之间的相关性,减少误差传播,解决关系重叠的问题。
  2. 缺点:模型设计起来相对复杂,容易造成冗余计算。

管道式抽取

方案说明

管道式关系抽取是将任务转化为命名实体识别文本分类任务。典型的代表有PURE。

实现方式:

  1. 先对文本段进行命名实体识别任务,抽出实体。
  2. 再对每个文本段的实体进行两两配对,形成主客体的实体对。
  3. 最后将实体对与文本段进行拼接,进行文本分类。例如:[CLS]实体对[SEP]文本段[SEP],文本分类的类别数为:关系类别数+1,以区分两两配对过程中产生的无效主客体。

典型算法说明

PURE算法

该方法来自于论文《A Frustrating Easy Approach for Entity and Relation Extraction》。主体架构如图所示:

picture.image

  1. Entity Model

    1. 首先输入句子到预训练Encoder(如BERT)中去,任一token xtx_{t} 得到上下文表征 XtX_{t}

    2. 计算span representation: he(si)=[xSTART(i);xEND(i);ϕ(si)]\mathbf{h}_{e}\left(s_{i}\right)=\left[\mathbf{x}_{S T A R T(i)} ; \mathbf{x}_{E N D(i)} ; \phi\left(s_{i}\right)\right]

    3. 将span representation输入到两层FFN去生成实体标签概率: Pe(esi)=softmax(WeFFNN(he(si))P_{e}\left(e \mid s_{i}\right)=\operatorname{softmax}\left(\mathbf{W}_{e} \operatorname{FFNN}\left(\mathbf{h}_{e}\left(s_{i}\right)\right)\right.

  2. Relation Model

    1. 输入层添加包含了实体类别信息的text marker,然后将其插入到每个实体span的头尾,如:X^=,xSTART(i),,xEND(i),,,,xSTART(j),,xEND(j),,\widehat{\mathbf{X}}=, x_{S T A R T(i)}, \ldots, x_{E N D(i)},, \ldots,, x_{S T A R T(j)}, \ldots, x_{E N D(j)},, \ldots

    2. X^\widehat{\mathbf{X}}输入另一个预训练Encoder中去,但是为了提高计算效率,做如下改动:a. 将一个句子中所有实体span的text marker都加到句子末尾,直到text marker的数量超过250,如上图(c)所示。b. 修改attention mask:文本token只能看到文本token,text marker可以同时看到文本token和text marker。c. 修改positional embedding:表示实体span起始和终止的text marker的position embedding分别等于自身修饰的span的第一个文本token和最后一个文本token的position embedding。

    3. 基于(2)中输入任意token x^t\widehat{x}_{t} 得到的 X^t\widehat{X}_{t} 计算span pair的representation: hr(si,sj)=[x^STAR^T(i);x^STAR^T(j)]\mathbf{h}_{r}\left(s_{i}, s_{j}\right)=\left[\widehat{\mathbf{x}}_{S \widehat{T A R} T(i)} ; \widehat{\mathbf{x}}_{S \widehat{T A R} T(j)}\right]

    4. 将span pair的representation输入到FFN中去,生成关系标签预测概率。

两个模型使用各自任务loss进行训练。在训练关系模型时,直接把正确的entity span及其label丢给relation model去学习;在推理阶段,则是将实体模型预测出的实体span输入到关系模型中去预测关系标签。

联合抽取

方案说明

一把梭哈,直接生成三元组。典型的代表有CasRel,TPLinker。

典型算法说明

CasRel算法

该方法来自论文《A Novel Cascade Binary Tagging Framework for Relational Triple Extraction》。主体架构如图所示:

picture.image

  1. 确定句子中所有的subject。
  2. 对于每个subject, 使用特定关系的标签器一并标识所有可能的关系与相关的objects。
fr(s)0f_{r}(s) \rightarrow 0

模型在训练过程中,把关系建模为subjects到objects的映射函数。不是关系分类,而是特定关系的标记器fr(s)f_{r}(s), 也就是识别出subject某种指定关系的所有可能object,当然有可能找不到这样的object。

TPLinker算法

该方法来自论文《TPLinker: Single-stage Joint Extraction of Entities and Relations Through Token Pair Linking》。主体架构如图所示:

picture.image

picture.image

  1. 给定一个句子,枚举所有可能的token pair,并用矩阵标记token link,其中:EH-ET 实体头到实体尾;SH-OH 主体头到客体头;ST-OT 主体尾到客体尾。然后通过握手标注方案解决矩阵稀疏的问题。

  2. 将其摊成一个序列,整个句子过一遍encoder,然后将token两两拼接输入到一个全连接层,再激活一下输出作为token对的向量表示。最后对token进行分类。

  3. 解码过程中,对于每个relation,从EH-to-ET序列中提取所有的实体span,并通过一个字典D将每个头部位置映射到从这个位置开始的相应实体;从ST-to-OT序列中解码(subject尾部位置,object尾部位置)元组并将它们加入到一个集合E中;从SH-to-OH序列中解码(subject头部位置,object头部位置)元组并在字典D中查找所有可能的以头部位置开始的实体;遍历所有候选subject-object对,检查其尾部位置是否在E中。

算法实践

在温习知识点的过程中,关注到讯飞AI开发者大赛正在如火如荼的进行中,其中一个赛道刚好是关于实体关系抽取的,赛道题目为:《遗址文化领域知识抽取与问答挑战赛》,团队随即报名加入了赛道中。该比赛由两阶段组成,其中第一阶段是典型的SPO问题。

数据描述

子任务1:遗址文化知识抽取,从遗迹文化类自然语言文本中抽取预定义的知识。

给定遗址文化领域信息抽取schema约束集合及待抽取语料,其中schema定义了关系P以及其对应的主体S和客体O的类别,例如(S_TYPE:遗址,P:馆藏地点,O_TYPE:地址)、(S_TYPE:文物,P:所属年代,O_TYPE:年代)等。任务要求参评系统自动地对句子进行分析,输出句子中所有满足schema约束的SPO三元组知识Triples=[(S1, P1, O1), (S2, P2, O2)…]

输入/输出:

(1) 输入:schema约束集合及句子sent

(2) 输出:句子sent中包含的符合给定schema约束的三元组知识Triples

题目包含17类关系,但是训练集只有1000条数据,对于模型来说,是个不小的挑战。 picture.image

实验方案

比赛代码使用了bert4torch框架,通过修改参数便可以很便捷的使用各个版本的预训练模型,该框架给出了很多示例,如TPLinker等,同时,该框架实现了很多tricks,可以直接拿来使用,总得来说二次开发很方便。

参赛方案中,改进了TPLinker,最终实现代码结构如下:

picture.image

  1. 首先运行data_process.py,根据样本数据生成模型所需的训练数据。
  2. 优化schema,通过优化schema来提升模型的性能。
  3. 模型训练,train_spo.sh。
  4. 模型预测,test_spo.sh。

具体代码就不展开讲解了,感兴趣可以参考bert4torch代码库,或者留言取得全部参赛文件。

实验结果

团队最终取得了第4名的成绩,如图:

picture.image

后记

随着最近ChatGPT的大火,有没有一种可能,实体关系抽取也能用生成式模型来解决。带着这个疑问,决定去尝试一下。

  1. 先来一个简单的例子,句子:姚明出生地是上海。

chatGPT回复:

picture.image

可以看到,chatGPT很轻松的答了出来,而且非常正确。

  1. 接下来我们加大难度,句子:张学友、周杰伦分别演唱过《吻别》《七里香》。

chatGPT回复:

picture.image

似乎Predicate的名称有一点问题,但Subject和Object的关系是正确的。

  1. 最后,我们来看一下片头提到的句子,这个看上去是有一些难度了,句子:渣津龙岗坪商周遗址位于渣津镇东郊河对岸台地上(水车村)。据许智范撰写的《江西考古资料汇编·修水发现二处古文化遗址》称:龙岗坪商周遗址,长200米,宽100米,文化堆积1米。

chatGPT回复:

picture.image

可以看到,虽然没有完全识别正确三元组,但chatGPT已经体现出了足够的智能,毕竟该例子包含了领域壁垒。

随着以chatGPT为代表的超大生成模型不断成熟,也许,在不久的将来,仅对于实体关系抽取这个领域,我们不必再纠结于管道式抽取效果好,还是联合抽取效果好,只需要告诉大模型,我们有什么,我们希望得到什么,剩下的都交给大模型处理,只需要静静地等结果就行。这样的场景,有点未来的样子了,认知智能的大一统,真正的智能时代。

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论