信息抽取:一对一关系抽取
更新时间:2022-07-28
任务简介
- 实体关系,实体属性抽取是信息抽取的关键任务;实体关系抽取是指从一段文本中抽取关系三元组,实体属性抽取是指从一段文本中抽取属性三元组
- 实体关系抽取举例:“任正非在深圳创办了华为公司。”这个句子中“任正非”是实体1,“华为”是实体2,而它们之间的关系是“创办”,最终抽取的三元组为(任正非,创办,华为)。
- 实体属性抽取举例:“张三男汉族硕士学历 刘邦文 汉族 民族。”这个句子中“张三”是实体,“民族”是属性,“汉族”是属性值,最终抽取的三元组为(张三,民族,汉族)。
- 可以将实体属性抽取中的“属性”和“属性值”分别对应理解成实体关系抽取中的“关系”和“实体2”。
快速开始
安装说明
请参考环境配置与安装。
- 请使用以下命令进入训练目录(以实体关系抽取为例,实体属性抽取类似,不再赘述)。
cd wenxin_appzoo/tasks/information_extraction/
代码结构说明
以下是本项目主要代码结构及说明:
.
├── data ## 示例数据文件夹,包括各任务所需训练集(train_data)、测试集(test_data)、验证集(dev_data)和预测集(predict_data)
│ ├── download_data.sh
│ ├── entity_attribute_data
│ │ ├── dev_data
│ │ │ └── dev.txt
│ │ ├── predict_data
│ │ │ └── predict.txt
│ │ ├── test_data
│ │ │ └── test.txt
│ │ └── train_data
│ │ └── train.txt
│ ├── entity_relation_data
│ │ ├── dev_data
│ │ │ └── dev.txt
│ │ ├── predict_data
│ │ │ └── predict.txt
│ │ ├── test_data
│ │ │ └── test.txt
│ │ └── train_data
│ │ └── train.txt
│ └── prepare_data.py ## 数据预处理
├── dict ## 词表文件夹,包含标签词表label_map
│ ├── vocab_label_map_attribute.txt
│ └── vocab_label_map_relation.txt
├── examples ## 各典型网络的json配置文件
│ ├── ie_attribute_ernie_fc_ch_infer.json
│ ├── ie_attribute_ernie_fc_ch.json
│ ├── ie_relation_ernie_fc_ch_infer.json
│ └── ie_relation_ernie_fc_ch.json
├── inference
│ ├── custom_inference.py
│ └── __init__.py
├── log
│ ├── test.log
│ └── test.log.wf
├── model
│ ├── ernie_fc_ie.py
│ ├── __init__.py
│ └── __pycache__
│ ├── ernie_fc_ie.cpython-37.pyc
│ └── __init__.cpython-37.pyc
├── run_infer.py ## 只依靠json进行模型预测的入口脚本
├── run_infer_server.py
├── run_trainer.py ## 只依靠json进行模型训练的入口脚本
└── trainer
├── custom_dynamic_trainer.py
├── custom_trainer.py
├── __init__.py
└── __pycache__
├── custom_dynamic_trainer.cpython-37.pyc
├── custom_trainer.cpython-37.pyc
└── __init__.cpython-37.pyc
数据准备
- 这里我们提供一份已标注的示例数据集。该任务预置网络基于ERNIE的模型进行训练,数据集不需要分词且无需准备词表。
- 训练集、测试集、验证集和预测集分别存放在./data/entity_relation_data目录下的train_data、test_data、dev_data和predict_data文件夹下,对应的示例标签词表存放在./dict目录下。(属性抽取在./data/entity_attribute_data下)
- 注:数据集(包含词表)均为utf-8格式。
训练集/测试集/验证集
- 训练集、测试集和验证集的数据格式相同,如下所示。数据分为三列,列与列之间用\t进行分隔。
- 第一列为文本
- 第二列为标签(实体1 实体2 关系,三者之间用空格分隔)
- 第三列为两个实体的下标(实体在原文中的位置,包含词的起始点和结束点,用空格分隔)。不需要提供“关系”的下标。
如何演好自己的角色,请读《演员自我修养》《喜剧之王》周星驰崛起于穷困潦倒之中的独门秘笈 喜剧之王 周星驰 主演 21 24 26 28
茶树茶网蝽,StephanitischinensisDrake,属半翅目网蝽科冠网椿属的一种昆虫 茶树茶网蝽 半翅目 目 0 4 33 35
丝角蝗科,Oedipodidae,昆虫纲直翅目蝗总科的一个科 丝角蝗科 直翅目 目 0 3 20 22
预测集
- 预测集无需进行标签预占位,其格式如下所示:
查尔斯阿兰基斯(CharlesArnguiz),1989年4月17日出生于智利圣地亚哥,智利职业足球运动员,司职中场,效力于德国足球甲级联赛勒沃库森足球俱乐部
《离开》是由张宇谱曲,演唱
《愤怒的唐僧》由北京吴意波影视文化工作室与优酷电视剧频道联合制作,故事以喜剧元素为主,讲述唐僧与佛祖打牌,得罪了佛祖,被踢下人间再渡九九八十一难的故事
词表
- 在./dict下,标签词表分为两列,列与列之间用\t进行分隔。示例词表采用BIO标注,B表示关系,分为主体(subject:S)与客体(object:O),如下所示:
- 并且需要注意词表中BIO的顺序,B排在最前面,I次之,O最后。
B-主演@S 0
B-主演@O 1
B-目@S 2
B-目@O 3
...
I 98
O 99
数据预处理
- 使用./data/prepare_data.py脚步转换./data/entity_relation_data(./data/entity_attribute_data)目录下的训练集、测试集、评语集和预测集
#以关系抽取为例
cd ./data
python prepare_data.py entity_relation_data/train_data/
python prepare_data.py entity_relation_data/test_data/
python prepare_data.py entity_relation_data/dev_data/
训练我的第一个模型
开始训练
- 使用预置网络进行训练的方式为使用./run_with_json.py入口脚本,通过--param_path参数来传入./examples/目录下的json配置文件。
- 训练分为以下几个步骤:
- 请使用以下命令在../models_hub/中通过对应脚本download_ernie_3.0_base_ch.sh下载模型参数文件,其对应配置文件和词表分别位于../models_hub/ernie_3.0_base_ch_dir目录下的ernie_config.json和vocab.txt,用户无需更改;
### download_ernie_3.0_base_ch.sh 模型下载
### 进入model_files目录
cd ../models_hub/
### 运行下载脚本
sh download_ernie_3.0_base_ch.sh
- 基于示例的数据集,可以运行以下命令在训练集(train.txt)上进行模型训练,并在测试集(test.txt)上进行验证;
## 实体关系抽取--训练
### 基于json实现预置网络训练。其调用了配置文件./examples/ie_relation_ernie_fc_ch.json
python run_trainer.py --param_path ./examples/ie_relation_ernie_fc_ch.json
- 训练运行的日志会自动保存在./log/test.log文件中;
- 训练中以及结束后产生的模型文件会默认保存在./output/目录下,其中save_inference_model/文件夹会保存用于预测的模型文件,save_checkpoint/文件夹会保存用于热启动的模型文件
预测我的第一个模型
开始预测
- 使用预置网络进行预测的方式为使用./run_infer.py入口脚本,通过--param_path参数来传入./examples/目录下的json配置文件。
- 预测分为以下几个步骤:
- 基于示例的数据集,可以运行以下命令在预测集(predict.txt)上进行预测:
## 实体关系抽取--预测
### 基于json实现预测。其调用了配置文件./examples/ie_ernie_2.0_base_fc_ch_infer.json
python run_infer.py --param_path ./examples/ie_ernie_2.0_base_fc_ch_infer.json
- 预测运行的日志会自动保存在./output/predict_result.txt文件中。