OpenNRE 2.0:可一键运行的开源关系抽取工具包

OpenNRE( https://github.com/thunlp/OpenNRE.git )是清华大学自然语言处理实验室推出的一款开源的 神经网络关系抽取工具包 ,包括了多款常用的关系抽取模型,发布仅一年即在 Github 上获得了 1700+ 星标。

现在这款工具包已经悄悄更新到了 2.0 版本!在原版 TensorFlow 实现的基础上,不仅采用了现在大热的 PyTorch 作为基础,设计了更加模块化的框架,还囊括了句子级别关系抽取、远监督关系抽取和少次学习关系抽取等丰富设定,可以说是加量不加价,值得你拥有!

  OpenNRE框架图

同时,该工作也以 DEMO Paper 的形式发表在了 EMNLP 2019 上,这里是 paper 的地址: 

OpenNRE: An Open and Extensible Toolkit for Neural Relation Extraction  

https://arxiv.org/abs/1909.13078  

作者在介绍文档中还写道,相比于原版主要面对关系抽取研究者的设定,新版的 OpenNRE 受众更加广泛:

  • 对于初学者: OpenNRE 提供了详尽的介绍文档,可以快速帮助入门

  • 对于开发者: 提供了简洁易用的 API 和若干预训练模型,可方便调用

  • 对于研究者: 模块化设计、多种任务设定、state-of-the-art 模型,可以帮助研究者更快更高效的进行探索

  • 想要在 NLP 课上交一份满意大作业的同学: 这个项目里的模型绝对能让你的教授眼前一亮

什么是关系抽取

关系抽取是自然语言处理当中的一项重要任务,致力于从文本中抽取出实体之间的关系。比如从句子“达芬奇绘制了蒙娜丽莎”中,我们可以抽取出(达芬奇,画家,蒙娜丽莎)这样一个关系三元组。

关系抽取技术是自动构建知识图谱的重要一环。知识图谱是由真实世界中的实体和实体间复杂关系构成的结构化表示,是帮助机器理解人类知识的重要工具,在问答系统、搜索引擎、推荐系统中都有着重要的应用。

  关系图谱示例

关系抽取十八变

由于数据和需求的不同,关系抽取这一任务也发展出了许多不同的任务场景。 下面简单介绍几种,他们也都被包括在了 OpenNRE 这一工具包中。

句子级别关系抽取 顾名思义,句子级别的关系抽取,就是对每一个给定的句子,和在句子中出现的实体,判断他们之间的关系。 在这样的设定下,通常会使用人工精标的数据进行训练和测试,如 SemEval 2010 Task8,TACRED,ACE2005 等。 OpenNRE 中还提供了一个新的数据集 Wiki80,包含 80 种 Wikidata 关系和 56,000 个句子,与以往的数据集相比,规模更大。

包级别关系抽取 包级别的关系抽取产生于远程监督(Distant Supervision)的设定中。 我们都知道,传统的机器学习方法需要大量数据,而标注数据费时费力,因此研究者们提出了远程监督这一方法,通过将知识图谱中的关系三元组与文本对齐,自动进行标注。 然而这一方法也带来了大量的噪声数据,为了减小噪声的影响,多样本多标签(multi-instance multi-label)的方法被引入,模型不再对单个句子进行分类,而是对包含相同实体对的句子集(称为包)进行分类。

少次学习关系抽取 少次学习( Few-Shot)是一种探索如何让模型快速适应新任务的设定,通过学习少量的训练样本,即可获得对新类型事物的分类能力。 刘知远老师组发布的数据集  FewRel 正是进行了这方面的探索。

篇章级别的关系抽取 :相比于针对句子的关系抽取,篇章级别的关系抽取难度更大,但包含的信息也更丰富。要想在这方面做的更好,就需要模型具有一定的推理、指代消解的能力。这一领域的代表数据集是同样来自刘知远老师组的DocRED( https://github.com/thunlp/DocRED )。

上述任务场景基本涵盖了目前关系抽取领域的最新进展,OpenNRE 也提供了较为便利的接口以支持上述场景的进一步工作研究。

上手教程:如何使用OpenNRE

OpenNRE 的使用十分简单,首先 git clone 项目并安装依赖:

git clone https://github.com/thunlp/OpenNRE.git
pip install -r requirements.txt

随后在目录下打开 Python,并 import opennre:

>>> import opennre

可以使用 get_model 命令加载预训练模型:

>>> model = opennre.get_model('wiki80_cnn_softmax')

这是一个在 wiki80 数据集上进行训练的句子级别的 CNN 模型,可以在 80 个关系上对句子进行分类。随后我们可以用 infer 函数进行预测:

>>> model.infer({'text': 'He was the son of Máel Dúin mac Máele Fithrich, and grandson of the high king Áed Uaridnach (died 612).', 'h': {'pos': (18, 46)}, 't': {'pos': (78, 91)}})
('father', 0.5108704566955566)

可以看到模型正确推理出了关系 father,并给出了模型预测的置信度。

关于 OpenNRE 更详细的说明,可以查看项目主页:

https://github.com/thunlp/OpenNRE

或文档:

https://opennre-docs.readthedocs.io/en/latest/

关于作者

OpenNRE 由孙茂松教授领导的清华大学自然语言处理实验室(THUNLP)师生研发维护。目前 THUNLP 的 Github 主页( https://github.com/thunlp )已有 92 个项目,其中有许多高星项目。

OpenNRE 项目的两位主要作者——高天宇( https://gaotianyu.xyz/about/ )和韩旭( https://thucsthanxu13.github.io/ )都是 THUNLP 实验室刘知远老师的学生。

其中,高天宇是大四的本科生,韩旭是博士三年级的学生。 从主页上可以看出,两人的研究方向均为自然语言处理、信息抽取、图谱表示和机器学习。 其中,高天宇作为大四的本科生,已经在相关领域国际会议上发表了三篇论文; 而韩旭除了在相关领域发表多篇论文外,也是 OpenNRE、OpenKE 和 FewRel 等多个开源项目的主要开发者与参与者,在开源社区十分活跃。 更多的信息可以参考作者个人主页以及项目文档。