OpenNRE 是 OpenSKL 的一个子项目,提供一个开源的神经关系抽取工具包,用于从纯文本中提取结构化知识,其中 ATT 作为关键特性,以考虑与关系相关的文本信息。
OpenNRE 是一个开源、可扩展的工具包,提供了统一框架来实现关系抽取模型。我们统一了不同关系抽取模型的输入和输出接口,并为每个模型提供了可扩展的选项。该工具包涵盖了监督学习和远程监督两种设置,并兼容传统神经网络和预训练语言模型。
关系抽取是一项自然语言处理(NLP)任务,旨在抽取实体(例如 比尔·盖茨 和 微软)之间的关系(例如 创始人)。例如,从句子 比尔·盖茨创立了微软 中,我们可以抽取关系三元组(比尔·盖茨,创始人,微软)。
关系抽取是自动构建知识图谱的关键技术。通过使用关系抽取,我们可以不断积累新的关系事实并扩展知识图谱,这作为机器理解人类世界的一种方式,具有许多下游应用,如问答系统、推荐系统和搜索引擎。如果您想了解更多关于神经关系抽取的内容,请访问我们的另一个项目(NREPapers)。
我们很荣幸能通过 OpenNRE 工具包帮助您更好地探索关系抽取!您可以参考我们的文档以了解更多项目细节。
在此工具包中,我们支持基于 CNN 的关系抽取模型,包括标准 CNN 和我们提出的 CNN+ATT。我们还实现了基于预训练语言模型(BERT)的方法。
为了验证此工具包的有效性,我们采用包级关系抽取任务进行评估。
我们使用 NYT10 数据集,这是一个基于纽约时报语料和 FreeBase 的远程监督集合。我们主要在 CNN-ATT 模型上进行实验,该模型采用实例级注意力机制,相比普通 CNN 模型表现出更优的性能。
我们报告两个模型的 AUC 和 F1 分数。标有 (*) 的最右两列表示来自 Gao et al.(2021) 和 Lin et al.(2016) 的结果。结果显示,我们实现的 CNN-ATT 模型略优于原始论文,同时也证实了 CNN-ATT 相对标准 CNN 模型的更优性能。
| 模型 | AUC | F1 | AUC(论文*) | F1(论文*) |
|---|---|---|---|---|
| CNN | - | - | 0.212 | 0.318 |
| CNN-ATT | 0.333 | 0.397 | 0.318 | 0.380 |
我们目前正在努力将 OpenNRE 部署为 Python 包。敬请期待!
从我们的 GitHub 页面克隆仓库(别忘了给我们点个星!)
git clone https://github.com/thunlp/OpenNRE.git
如果速度太慢,您可以尝试
git clone https://github.com/thunlp/OpenNRE.git --depth 1
然后安装所有依赖:
pip install -r requirements.txt
注意:请根据您的机器(与 CUDA 版本相关)选择合适的 PyTorch 版本。有关详细信息,请参阅 https://pytorch.org/。
然后使用以下命令安装包:
python setup.py install
如果您还想修改代码,请运行:
python setup.py develop
请注意,为了快速部署,我们已排除了所有数据和预训练文件。你可以通过运行 benchmark 和 pretrain 文件夹中的脚本手动下载它们。例如,如果您想下载 FewRel 数据集,可以运行
bash benchmark/download_fewrel.sh
您可以进入 benchmark 文件夹并使用我们的脚本下载数据集。我们还在此文档中列出了一些关于数据集的信息。我们提供了两个带有手动标注测试集的远程监督数据集:NYT10m 和 Wiki20m。请参阅数据集部分了解详情。
确保您已按上述说明安装了 OpenNRE。然后导入我们的包并加载预训练模型。
>>> import opennre
>>> model = opennre.get_model('wiki80_cnn_softmax')
请注意,第一次下载检查点和数据可能需要几分钟。然后使用 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)
您将获得关系结果及其置信度分数。
如果您想在 GPU 上使用该模型,只需在调用推理函数之前运行
>>> model = model.cuda()
目前,我们提供以下可用模型:
wiki80_cnn_softmax:使用 CNN 编码器在 wiki80 数据集上训练。wiki80_bert_softmax:使用 BERT 编码器在 wiki80 数据集上训练。wiki80_bertentity_softmax:使用 BERT 编码器(通过实体表示拼接)在 wiki80 数据集上训练。tacred_bert_softmax:使用 BERT 编码器在 TACRED 数据集上训练。tacred_bertentity_softmax:使用 BERT 编码器(通过实体表示拼接)在 TACRED 数据集上训练。您可以使用 OpenNRE 在自己的数据上训练模型。在 example 文件夹中,我们提供了监督关系抽取模型和包级关系抽取模型的示例训练代码。您可以使用我们提供的数据集,也可以使用自己的数据集。例如,您可以使用以下脚本在带有手动测试集的 NYT10 数据集上训练 PCNN-ATT 包级模型。ATT 算法是一种典型的方法,用于组合句子包以抽取实体间的关系。
python example/train_bag_cnn.py \
--metric auc \
--dataset nyt10m \
--batch_size 160 \
--lr 0.1 \
--weight_decay 1e-5 \
--max_epoch 100 \
--max_length 128 \
--seed 42 \
--encoder pcnn \
--aggr att
或者使用以下脚本在 Wiki80 数据集上训练 BERT 模型:
python example/train_supervised_bert.py \
--pretrain_path bert-base-uncased \
--dataset wiki80
示例训练代码中提供了许多选项,您可以查看这些选项以获取详细说明。
如果您觉得 OpenNRE 对您的研究有帮助,请考虑引用以下论文:
@inproceedings{han-etal-2019-opennre,
title = "{O}pen{NRE}: An Open and Extensible Toolkit for Neural Relation Extraction",
author = "Han, Xu and Gao, Tianyu and Yao, Yuan and Ye, Deming and Liu, Zhiyuan and Sun, Maosong",
booktitle = "Proceedings of EMNLP-IJCNLP: System Demonstrations",
year = "2019",
url = "https://www.aclweb.org/anthology/D19-3029",
doi = "10.18653/v1/D19-3029",
pages = "169--174"
}
此包主要由 Tianyu Gao、Xu Han、Shulian Cao、Lumin Tang、Yankai Lin、Zhiyuan Liu 贡献。
OpenSKL 项目旨在通过表示学习利用结构化知识和自然语言的力量。OpenSKL 的所有子项目按算法、资源和应用分类如下。