Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/zjunlp/openue
[EMNLP 2020] OpenUE: An Open Toolkit of Universal Extraction from Text
https://github.com/zjunlp/openue
bert event-extraction intent-classification named-entity-recognition natural-language-processing nlp nlp-extraction-tasks openue pytorch relation-extraction slot-filling triple-extraction
Last synced: about 1 month ago
JSON representation
[EMNLP 2020] OpenUE: An Open Toolkit of Universal Extraction from Text
- Host: GitHub
- URL: https://github.com/zjunlp/openue
- Owner: zjunlp
- License: mit
- Created: 2020-06-11T06:09:45.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2022-09-19T11:57:20.000Z (over 2 years ago)
- Last Synced: 2024-07-24T16:49:20.886Z (5 months ago)
- Topics: bert, event-extraction, intent-classification, named-entity-recognition, natural-language-processing, nlp, nlp-extraction-tasks, openue, pytorch, relation-extraction, slot-filling, triple-extraction
- Language: Python
- Homepage: http://openue.zjukg.org
- Size: 78.8 MB
- Stars: 321
- Watchers: 11
- Forks: 62
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- StarryDivineSky - zjunlp/openue
README
[**中文说明**](https://github.com/zjunlp/OpenUE/blob/main/README.md) | [**English**](https://github.com/zjunlp/OpenUE/blob/main/README_EN.md)
OpenUE is a lightweight toolkit for knowledge graph extraction.
[OpenUE](https://aclanthology.org/2020.emnlp-demos.1/) 是一个轻量级知识图谱抽取工具。
**特点**
- 基于预训练语言模型的知识图谱抽取任务 (兼容BERT, Roberta等预训练模型.)
- 实体关系抽取
- 事件抽取
- 槽位和意图抽取
- 更多的任务
- 训练和测试接口
- 快速部署NLP模型## 环境
- python3.8
- requirements.txt## 框架图
![框架](./imgs/overview1.png)
其中主要分为三个模块,`models`,`lit_models`和`data`模块。
### models 模块
其存放了我们主要的三个模型,针对整句的关系识别模型,针对已知句中关系的命名实体识别模型,还有将前两者整合起来的推理验证模型。其主要源自`transformers`库中的已定义好的预训练模型。
### lit_models 模块
其中的代码主要继承自`pytorch_lightning.Trainer`。其可以自动构建单卡,多卡,GPU,TPU等不同硬件下的模型训练。我们在其中定义了`training_steps`和`validation_step`即可自动构建训练逻辑进行训练。
由于其硬件不敏感,所以我们可以使用多种不同环境下调用OpenUE训练模块。
### data 模块
`data`中存放了针对不同数据集进行不同操作的代码。使用了`transformers`库中的`tokenizer`先对数据进行分词处理再根据不同需要将数据变成我们需要的features。
## 快速开始
### 安装
#### Anaconda 环境
```
conda create -n openue python=3.8
conda activate openue
pip install -r requirements.txt
conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch -c nvidia # 视自己Nvidia驱动环境选择对应的cudatoolkit版本
python setup.py install
```#### pip安装
```shell
pip install openue
```#### pip本地开发
```shell
python setup.py develop
```#### 使用方式
数据格式为`json`文件,具体例子如下。
```json
{
"text": "查尔斯·阿兰基斯(Charles Aránguiz),1989年4月17日出生于智利圣地亚哥,智利职业足球运动员,司职中场,效力于德国足球甲级联赛勒沃库森足球俱乐部",
"spo_list": [{
"predicate": "出生地",
"object_type": "地点",
"subject_type": "人物",
"object": "圣地亚哥",
"subject": "查尔斯·阿兰基斯"
}, {
"predicate": "出生日期",
"object_type": "Date",
"subject_type": "人物",
"object": "1989年4月17日",
"subject": "查尔斯·阿兰基斯"
}]
}
```### 训练模型
将数据存放在`./dataset/`目录下之后进行训练。如目录为空,运行以下脚本,将自动下载数据集和预训练模型并开始训练,过程中请保持网络畅通以免模型和数据下载失败。
```shell
# 训练NER命名实体识别模块
./scripts/run_ner.sh
# 训练SEQ句中关系分类模块
./scripts/run_seq.sh
```下面使用一个小demo简要展示训练过程,其中仅训练一个batch来加速展示。
![框架](./imgs/demo.gif)### 验证模型
由于我们使用pipeline模型,所以无法联合训练,需要分别训练后进行统一验证。 在运行了两个训练脚本后,在`output`路径下会得到两个模型权重`output/ner/${dataset}`以及`output/seq/${dataset}`根据不同数据集放在对应的目录中。将模型权重目录分别作为`ner_model_name_or_path`和`seq_model_name_or_path`输入到 `run_infer.yaml`或者是`run_infer.sh`运行脚本中,即可进行验证。
### Notebook快速开始
[ske数据集训练notebook](https://github.com/zjunlp/OpenUE/blob/pytorch/ske.ipynb)
使用中文数据集作为例子具体介绍了如何使用openue中的`lit_models`,`models`和`data`。方便用户构建自己的训练逻辑。[![Colab 打开](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1VNhFYcqDbXl1b3HzU8sc-NgbhV2ZyYzW?usp=sharing)
使用colab云端环境,无需配置环境。### 支持自动调参(wandb)
```python
# 在代码中将logger 部分替换成wandb logger即可支持wandb
logger = pl.loggers.WandbLogger(project="openue")
```### 支持英文
针对英文数据集,唯一需要改变的参数为`model_name_or_path`即预训练语言模型的权重参数,由于`transformers`库强大的兼容性,所以针对英文只需要将原先的中文预训练语言模型`bert-base-chinese`改为英文的预训练语言模型`bert-base-uncased`即可运行。
## 快速部署模型
### 下载torchserve-docker
[docker下载](https://github.com/pytorch/serve/blob/master/docker/README.md)
### 创建模型对应的handler类
我们已经在`deploy`文件夹下放置了对应的部署类`handler_seq.py`和`handler_ner.py`。
```shell
# 使用torch-model-archiver 将模型文件进行打包,其中
# extra-files需要加入以下文件
# config.json, setup_config.json 针对模型和推理的配置config。
# vocab.txt : 分词器tokenizer所使用的字典
# model.py : 模型具体代码torch-model-archiver --model-name BERTForNER_en \
--version 1.0 --serialized-file ./ner_en/pytorch_model.bin \
--handler ./deploy/handler.py \
--extra-files "./ner_en/config.json,./ner_en/setup_config.json,./ner_en/vocab.txt,./deploy/model.py" -f# 将打包好的.mar文件加入到model-store文件夹下,并使用curl命令将打包的文件部署到docker中。
sudo cp ./BERTForSEQ_en.mar /home/model-server/model-store/
curl -v -X POST "http://localhost:3001/models?initial_workers=1&synchronous=false&url=BERTForSEQ_en.mar&batch_size=1&max_batch_delay=200"
```
## 项目成员浙江大学:[张宁豫](https://person.zju.edu.cn/ningyu)、谢辛、毕祯、王泽元、陈想、余海阳、邓淑敏、叶宏彬、田玺、郑国轴、陈华钧
达摩院:陈漠沙、谭传奇、黄非
## 引用
如果您使用或扩展我们的工作,请引用以下文章:
```
@inproceedings{DBLP:conf/emnlp/ZhangDBYYCHZC20,
author = {Ningyu Zhang and
Shumin Deng and
Zhen Bi and
Haiyang Yu and
Jiacheng Yang and
Mosha Chen and
Fei Huang and
Wei Zhang and
Huajun Chen},
editor = {Qun Liu and
David Schlangen},
title = {OpenUE: An Open Toolkit of Universal Extraction from Text},
booktitle = {Proceedings of the 2020 Conference on Empirical Methods in Natural
Language Processing: System Demonstrations, {EMNLP} 2020 - Demos,
Online, November 16-20, 2020},
pages = {1--8},
publisher = {Association for Computational Linguistics},
year = {2020},
url = {https://doi.org/10.18653/v1/2020.emnlp-demos.1},
doi = {10.18653/v1/2020.emnlp-demos.1},
timestamp = {Wed, 08 Sep 2021 16:17:48 +0200},
biburl = {https://dblp.org/rec/conf/emnlp/ZhangDBYYCHZC20.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
```
# 其他开源知识抽取工具- [CogIE](https://github.com/jinzhuoran/CogIE)
- [OpenNRE](https://github.com/thunlp/OpenNRE)
- [OmniEvent](https://github.com/THU-KEG/OmniEvent)
- [DeepKE](https://github.com/zjunlp/deepke)
- [OpenIE](https://stanfordnlp.github.io/CoreNLP/openie.html)
- [RESIN](https://github.com/RESIN-KAIROS/RESIN-pipeline-public)