草庐IT

关系抽取(三)实体关系联合抽取:CasRel

满腹的小不甘_静静 2023-08-10 原文

目录

关系抽取两大类方法

CasRel(HBT)——ACL2020

1. 基本思想 

2. 模型细节

2.1 头实体识别层

2.2 关系、尾实体联合识别层

2.3 原理解释 

3. 实验


NLP 关系抽取 — 概念、入门、论文、总结 - 知乎 (zhihu.com)

关系抽取两大类方法

        按模型结构分类,关系抽取主要分为 Pipeline 和 Joint 方法。 对于 联合抽取(Joint extraction),又可以分为 "参数共享的联合模型" 和 "联合解码的联合模型":

关系抽取要考虑的问题,如下图所示:

  • SEO:SingleEntityOverlap,如上图中的Los Angeles与多个实体有关系
  • EPO:EntityPairOverlap,如上图的China与Beijing有capital city和contains两个关系
  • SOO:Subject Object Overlap,也有称为HOO(HeadTailOverlap)的,Subject和Object有nest嵌套的情况。

        前沿的方法基本都能解决Overlap问题。而应用时,要看实际场景会不会遇到这些问题,假如没有的话,其实大部分方法都可以进行简化的。

CasRel(HBT)——ACL2020

论文名称:《A Novel Cascade Binary Tagging Framework for Relational Triple Extraction》

论文链接:https://aclanthology.org/2020.acl-main.136.pdf

代码地址:https://github.com/weizhepei/CasRel

                  pytorch 版本:https://github.com/powerycy/Lic2020-

文章: 

一文详解关系抽取模型 CasRel - 知乎 (zhihu.com)

【关于 关系抽取 之 HBT】 那些的你不知道的事-技术圈 (proginn.com)

CasRel,SpERT,TPLinker?从标注框架入手介绍几篇SOTA实体关系抽取论文 (qq.com) 

1. 基本思想 

        CasRel 本质上是基于参数共享的联合实体关系抽取方法,它通常被大家称作层叠指针网络

        CasRel提出的动机最主要就是解决OverLap问题,至于CasRel里面提到的先抽主语,再把Predict和Object同时抽出来,并非CasRel的首创,最开始提到的应该是叫ETL的方法。

        实际上,CasRel 的核心思想或者说作者改进现有模型的重点在于子层的设计

  • 因为CasRel 对于关系抽取这个任务的拆分不同,所以子任务及子任务求解顺序也不同。具体地:(1)首先CasRel 会识别所有可能的主语(头实体);(2)然后在给定类别关系R下,再去识别与主语相关的宾语(尾实体)
  • 更形式化的表达,如果说以前关系抽取/关系分类是这样一个映射函数,现在在CasRel关系抽取对应的映射函数则是。与之相似的思想很早之前就有出现在知识图谱表示学习方法当中,比如在下图的TransE模型中就有h+r≈t(这里h为头实体,t为尾实体)。

2. 模型细节

        现在我们再来看CasRel的模型细节。CasRel是一个基于联合解码的实体关系抽取模型,其思想和模型都很简单,主要包括三层:

  • 编码端:基于BERT的编码层用于获取上下文语义信息对字/词进行表征;
  • 解码端:解码端主要包括了头实体识别层关系与尾实体联合识别层

        在这里,基于BERT的编码层就不做过多的介绍了,感兴趣的读者可以下载论文《Pre-trained Models for Natural Language Processing》进行阅读学习。接下来,将着重介绍CasRel解码端

2.1 头实体识别层

        CasRel头实体识别层直接对编码层的结果进行解码,去识别所有可能的头实体。这里CasRel是识别头实体span,也就是start和end位置,所以它采用的是二分类。这点和实体识别BERT-MRC论文阅读笔记实体识别LEAR论文阅读笔记 中类似。

因此,模型本身很简单:

  • 首先,利用一个(线性层 + 一个sigmoid激活函数)判断每个token是不是头实体的开始token或结束token;

  • 然后,利用最近匹配原则将识别到的start和end配对获得候选头实体集合

2.2 关系、尾实体联合识别层

        识别头实体后就要进行关系和尾实体的联合识别了。这里,CasRel是通过一组关系相关的尾实体识别层来实现的。每一层尾实体识别层的结构其实与头实体识别层是一样的,不同主要在于输入:

  • 头实体识别层的输入直接就是编码层的输出
  • 而尾实体识别层的输入还考虑了头实体的特征:

这里是第k个候选头实体所包含的所有token的向量的平均

2.3 原理解释 

(1)优化目标

        假设D为训练集,xj是第j个输入样本,是文本xj中含有的所有三元组,CasRel的训练目标自然是如下似然函数值最大:

 (2)概率公式变换

        根据联合概率=边缘概率*条件概率,我们有:

         这里s∈Tj表示出现在Tj中的一个头实体,(r,o)∈Tj|s表示出现在Tj中且其头实体为s的一组关系-尾实体对。P(s|xj)为先验概率,P((r,o)|s,xj)为条件概率。

(3)关系作为先验知识

        然后,把关系作为先验知识,我们可以进一步把上式右端第二项拆成两部分,即出现在Tj中且头实体为s的关系、其他关系:

        这里,R是所有关系的集合,r∈Tj|s表示出现在Tj中且头实体为s的一组关系,r∈R∖Tj|s是R与r∈Tj|s的差集,也就是没有出现在Tj中的其他关系。

表示对于文本xj与头实体s以及没有出现在Tj中的关系r来说,尾实体识别结果应当为空。所以最终我们有:

(4)结论

可以发现,最终这个式子与CasRel抽取实体关系三元组的子任务顺序一致:

  • 首先识别文本中所有可能的头实体;
  • 然后在每个关系类别下,去抽取与识别到的头实体存在该关系的所有可能的尾实体。

另一方面,这个任务拆解方式也很自然解决了重叠实体关系三元组的提取问题。

3. 实验

        实验主要在两个公开的数据集 NYT 和 WebNLG 上进行。此外,需要注意的是CasRel模型本身还有两个变体:

  • CasRelrandom:表示编码端的BERT参数是随机初始化的;
  • CasRelLSTM:表示编码端使用的是LSTM而不是BERT

当然CasRel则表示采用预训练好的BERT作为编码端。

(1)整体实验效果比对

        上图中展示了CasRel及其变体模型、与其他基准方法在两个数据集上的效果。可以看到CasRel 及其变体的效果都高于其他方法;尤其在WebNLG数据上,相对提升得更多。仔细看 NYTWebNLG两个数据分布差异还是蛮大的:

  • NYTWebNLG两个数据中都有Normal类型的三元组、SEO类型的三元组、EPO类型的三元组,且三者在两个数据集中占比不同;
  • NormalSEOEPO分别代表常规实体关系三元组、单个实体重叠的实体关系三元组、实体对重叠的实体关系三元组;
  • NYT 中的实体关系三元组类型多为Normal类型,即数据中常规实体关系三元组居多。
  • WebNLG 中的实体关系三元组多为SEO类型,即单个实体重叠的实体关系三元组居多。

CasRel 在两个数据集上相对稳定的表现说明了在实体关系重叠这种复杂场景下,其框架的有效性

(2)不同三元组重叠类型实验对比

        上图展示了在不同三元组重叠类型的样本上各个基准方法与CasRel的实验结果。可以发现随着场景逐渐复杂(Normal->EPO、SEO),基准方法的效果都逐渐下降,但CasRel则取得了相对稳定且优异的表现。这个对比实验进一步说明了CasRel在重叠三元组场景下的有效性

(3)不同三元组个数实验对比

         随着样本中三元组个数的增多,每个方法的效果都或多多少地受到了影响,尤其在N>5即多于五个三元组的样本上,基准方法效果基本都大幅度下降,而CasRel相对要好一些。同时,在N>5的样本上CasRel的效果相对于基准方法提升的最多。

        这个对比实验反映了CasRel相比其他基准方法在处理多实体关系三元组下的能力更强

参考:

NLP 关系抽取 — 概念、入门、论文、总结

一文详解关系抽取模型 CasRel - 知乎 (zhihu.com)

有关关系抽取(三)实体关系联合抽取:CasRel的更多相关文章

  1. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  2. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  3. ruby - Rails 组合多个 activerecord 关系 - 2

    我想合并多个事件记录关系例如,apple_companies=Company.where("namelike?","%apple%")banana_companies=Company.where("namelike?","%banana%")我想结合这两个关系。不是合并,合并是apple_companies.merge(banana_companies)=>Company.where("namelike?andnamelike?","%apple%","%banana%")我要Company.where("名字像?还是名字像?","%apple%","%banana%")之后,我会写代

  4. ruby-on-rails - Ruby on Rails - has_one 关系,如何检查它是否具有现有关联? - 2

    我有一个简单的问题,与关联有关。我有一个书的模型,它有_onereservation。预订属于_书本。我想在预订Controller的创建方法中确保在预订时没有预订一本书。换句话说,我需要检查该书是否存在任何其他预订。我该怎么做?编辑:Aaa我做到了,感谢大家的提示,学到了一些新东西。当我尝试提供的解决方案时,出现no_method错误或nil_class等。这让我开始思考,我尝试处理的对象根本不存在。Krule给了我使用book.find的想法,所以我尝试使用它。最终我得到了它的工作:book=Book.find_by_id(reservation_params[:book_id])

  5. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  6. ruby-on-rails - Ruby/Rails - 检查 HABTM 关系记录中是否存在子 ID - 2

    我有一组名为Tasks和Posts的资源,它们之间存在has_and_belongs_to_many(HABTM)关系。还有一个连接它们的值的连接表。create_table'posts_tasks',:id=>falsedo|t|t.column:post_id,:integert.column:task_id,:integerend所以我的问题是如何检查特定任务的ID是否存在于从@post.tasks创建的数组中?irb(main):011:0>@post=Post.find(1)=>#@post.tasks=>[#,#]所以我的问题是,@post.tasks中是否存在"@task

  7. Ruby On Rails 模型、 View 和 Controller 之间的关系 - 2

    根据我目前的理解,如果我必须描述Rails应用程序的各个组件如何协同工作以响应请求,我会说以下内容:1)路由确定哪些请求URL映射到哪些Controller方法。2)Controller方法从模型中获取信息并将该信息(以全局变量的形式)传递给相应的View模板。3)View模板使用存储在全局变量中的数据来构造最终响应。在上面的解释中,几个组件之间的关系是明确的,不可否认的;即:1)路由和Controller方法2)Controller方法和View模板其实上面的关系是一对一的。但是,模型类与其相邻组件类型(即Controller)的关系并不明确。是的,Controller从模型中检索信

  8. ruby-on-rails - 本地 gem 的“bundle 安装”没有解决依赖关系,而 'gem install' 可以 - 2

    我在目录“/home/enterprise/pkg”中有一个本地gem(enterprise-0.0.1.gem)。它依赖于active_directorygem(v1.5.5),这是在它的enterprise.gemspec文件中指定的,如下所示:-gem.add_dependency("active_directory")在我的应用程序的Gemfile中,我添加了以下行:-gem'enterprise','0.0.1',path=>'/home/enterprise/pkg'当我做的时候bundleinstall在我的应用程序的源目录中,只安装了企业gem。因此,我遇到了引用act

  9. ruby-on-rails - Rails/Mongoid 与 Struct 的关系问题 - 2

    我正在构建这个图书馆应用程序,它有3个类。国家、图书馆和书籍。国家有许多图书馆,图书馆属于一个国家。图书馆有很多书,书是嵌入图书馆的。但是,当我执行此auto_pick_job时,我们到达top_free_book并调用library.state。由于某种原因,library.state为nil。我希望恢复状态但没有骰子。我调用和创建库的方式如下。所以图书馆将永远属于一个现有的国家。state=Stats.find(x)library=state.libaries.new(info)library.save_optimistic!我也很感激使用Struct的关系帮助。classStat

  10. ruby-on-rails - 如何 stub 事件记录关系以使用 rspec 测试 where 子句? - 2

    我有一个看起来像这样的类:classFoo在测试#nasty_bars_present?我想编写一个rspec测试来对bars关联进行stub,但允许where自然执行。像这样的东西:describe"#nasty_bars_present?"docontext"withnastybars"dobefore{foo.stub(:bars).and_return([mock(Bar,bar_type:"Nasty")])}it"shouldreturntrue"doexpect(foo.nasty_bars_present?).tobe_trueendendend上面的测试给出了一个关于

随机推荐