资讯 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

实体关系抽取

一对一实体关系抽取

任务简介

  • 实体关系抽取是信息抽取的关键任务;实体关系抽取是指从一段文本中抽取关系三元组
  • 实体关系抽取举例:“任正非在深圳创办了华为公司。”这个句子中“任正非”是实体1,“华为”是实体2,而它们之间的关系是“创办”,最终抽取的三元组为(任正非,创办,华为)。
  • 可以将实体属性抽取中的“属性”和“属性值”分别对应理解成实体关系抽取中的“关系”和“实体2”。

快速开始

1. 代码结构说明

以下是本项目主要代码结构及说明:

代码目录: wenxin-premium/tasks/entity_relation_extraction

.
├── __init__.py
├── inference_api_demo.py                                  ## 实体关系抽取预测结果解析脚本
├── run_with_json.py                                       ## 只依靠json进行模型训练的入口脚本                       
├── run_infer.py                                           ## 只依靠json进行模型预测的入口脚本
├── examples                                               ## 各典型网络的json配置文件
│   ├── ie_ernie_2.0_base_fc_ch_infer.json
│   ├── ie_ernie_2.0_base_fc_ch.json
│   └── test_infer_api.json
├── data                                                   ## 示例数据文件夹,包括各任务所需训练集(train_data)、测试集(test_data)、验证集(dev_data)和预测集(predict_data)
│   ├── train_data
│   │   └── train.txt
│   ├── test_data
│   │   └── test.txt
│   ├── dev_data
│   │   └── dev.txt
│   └── predict_data
│       └── predict.txt
└── dict                                                   ## 词表文件夹,包含标签词表label_map
     └── vocab_label_map.txt

2. 数据准备

  • 这里我们提供一份已标注的示例数据集。该任务预置网络基于ERNIE的模型进行训练,数据集不需要分词且无需准备词表。
  • 训练集、测试集、验证集和预测集分别存放在./data目录下的train_data、test_data、dev_data和predict_data文件夹下,对应的示例标签词表存放在./dict目录下。
  • 注:数据集(包含词表)均为utf-8格式。
训练集/测试集/验证集
  • 训练集、测试集和验证集的数据格式相同,如下所示。数据分为三列,列与列之间用\t进行分隔。
  • 第一列为文本
  • 第二列为标签(实体1 实体2 关系,三者之间用空格分隔)
  • 第三列为两个实体的下标(实体在原文中的位置,包含词的起始点和结束点,用空格分隔)。不需要提供“关系”的下标。
如何演好自己的角色,请读《演员自我修养》《喜剧之王》周星驰崛起于穷困潦倒之中的独门秘笈         喜剧之王 周星驰 主演         21 24 26 28
茶树茶网蝽,StephanitischinensisDrake,属半翅目网蝽科冠网椿属的一种昆虫         茶树茶网蝽 半翅目 目         0 4 33 35
丝角蝗科,Oedipodidae,昆虫纲直翅目蝗总科的一个科         丝角蝗科 直翅目 目         0 3 20 22
预测集
  • 预测集无需进行标签预占位,其格式如下所示:
查尔斯阿兰基斯(CharlesArnguiz),1989417日出生于智利圣地亚哥,智利职业足球运动员,司职中场,效力于德国足球甲级联赛勒沃库森足球俱乐部
《离开》是由张宇谱曲,演唱
《愤怒的唐僧》由北京吴意波影视文化工作室与优酷电视剧频道联合制作,故事以喜剧元素为主,讲述唐僧与佛祖打牌,得罪了佛祖,被踢下人间再渡九九八十一难的故事
词表
  • 标签词表分为两列,列与列之间用\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

3. 训练第一个模型

开始训练
  • 使用预置网络进行训练的方式为使用./run_with_json.py入口脚本,通过--param_path参数来传入./examples/目录下的json配置文件。
  • 训练分为以下几个步骤:

    1. 请使用以下命令在../model_files/中通过对应脚本download_ernie_2.0_base_ch.sh下载模型参数文件,其对应配置文件ernie_2.0_base_ch_config.json和词表vocab_ernie_2.0_base_ch.txt分别位于../model_files/目录下的config/和dict/文件夹,用户无需更改;
    # download_ernie_2.0_base_ch.sh 模型下载
    # 进入model_files目录
    cd ../model_files/
    # 运行下载脚本
    sh download_ernie_2.0_base_ch.sh
    1. 请在./env.sh中根据提示配置相应环境变量的路径
    2. 基于示例的数据集,可以运行以下命令在训练集(train.txt)上进行模型训练,并在测试集(test.txt)上进行验证;
    # 实体关系抽取--训练
    # 需要提前参照env.sh进行环境变量配置,在当前shell内去读取
    source env.sh
    # 基于json实现预置网络训练。其调用了配置文件./examples/ie_ernie_2.0_base_fc_ch.json
    python run_with_json.py --param_path ./examples/ie_ernie_2.0_base_fc_ch.json
    1. 训练运行的日志会自动保存在./log/test.log文件中;
    2. 训练中以及结束后产生的模型文件会默认保存在./output/目录下,其中save_inference_model/文件夹会保存用于预测的模型文件,save_checkpoint/文件夹会保存用于热启动的模型文件

4. 模型预测

开始预测
  • 使用预置网络进行预测的方式为使用./run_infer.py入口脚本,通过--param_path参数来传入./examples/目录下的json配置文件。
  • 预测分为以下几个步骤:

    1. 基于示例的数据集,可以运行以下命令在预测集(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
    1. 预测运行的日志会自动保存在./output/predict_result.txt文件中。

多对多实体关系抽取

任务简介

  • 实体关系抽取是信息抽取的关键任务;实体关系抽取是指从一段文本中抽取关系三元组;相对于之前的上述版本,本次新版本除了支持一对一之外还支持了一对多,多对一,多对多的情况:
  • 一对一:“张三男汉族硕士学历”含有一对一的属性三元组(张三,民族,汉族)。
  • 一对多:“华扬联众数字技术股份有限公司于2017年8月2日在上海证券交易所上市”,含有一对多的属性三元组(华扬联众数字技术股份有限公司,上市时间,2017年8月2日)和(华扬联众数字技术股份有限公司,上市地点,上海证券交易所上市)
  • 多对一:“上海森焱软件有限公司和上海欧提软件有限公司的注册资本均为100万人民币”,含有多对一的属性三元组(上海森焱软件有限公司,注册资本,100万人民币)和(上海欧提软件有限公司,注册资本,100万人民币)
  • 多对多:“大华种业稻麦种子加工36.29万吨、销售37.5万吨;苏垦米业大米加工22.02万吨、销售24.86万吨”,含有多对多的属性三元组(大华种业,稻麦种子产量,36.29万吨)和(苏垦米业,大米加工产量,22.02万吨)

快速开始

1. 代码结构说明

以下是本项目主要代码结构及说明:

代码目录: wenxin-premium/tasks/entity_relation_extraction_many_to_many

.
├── __init__.py
├── run_with_json.py                                       ## 只依靠json进行模型训练的入口脚本                       
├── run_infer.py                                           ## 只依靠json进行模型预测的入口脚本
├── examples                                               ## 各典型网络的json配置文件
│   ├── cls_ernie_2.0_base_duie_ch.json
│   ├── cls_ernie_2.0_base_duie_ch_infer.json
│   ├── cls_ernie_ie_1.0_base_duie_ch.json
│   └── cls_ernie_ie_1.0_base_duie_ch_infer.json
├── data                                                   ## 示例数据文件夹,包括各任务所需训练集(train_data)、测试集(test_data)、验证集(dev_data)和预测集(predict_data)
│   ├── train_data
│   │   └── train.json
│   ├── test_data
│   │   └── test.json
│   ├── dev_data
│   │   └── dev.json
│   └── predict_data
│       └── predict.json
└── dict                                                   ## 词表文件夹,包含标签词表label_map
     └── label_map.json

2. 数据准备

  • 这里我们提供一份已标注的示例数据集。该任务预置网络基于ERNIE的模型进行训练,数据集不需要分词且无需准备词表。
  • 训练集、测试集、验证集和预测集分别存放在./data目录下的train_data、test_data、dev_data和predict_data文件夹下,对应的示例标签词表存放在./dict目录下。
  • 注:数据集(包含词表)均为utf-8格式。
训练集/测试集/验证集
  • 训练集、测试集和验证集的数据格式相同,每个样例为一个json字符串,有两个key:1. "text"表示相关文本,2."spo_list"是一个SPO列表,其中每一项有三个key("predicate"表示关系类型,"subject"表示主体起始和终止位置,"object"表示客体起始和终止位置)
{"text": "倪金德,1916年生,奉天省营口(今辽宁省营口市)人", "spo_list": [{"predicate": "出生日期", "subject": [0, 3], "object": [4, 9]}, {"predicate": "出生地", "subject": [0, 3], "object": [11, 16]}]}
{"text": "基本介绍克里斯蒂娜·塞寇丽(Christina Sicoli)身高163cm,在加拿大安大略出生和长大,毕业于伦道夫学院", "spo_list": [{"predicate": "毕业院校", "subject": [4, 13], "object": [55, 60]}]}
预测集
  • 预测集只有一个key("text"):
{"text": "倪金德,1916年生,奉天省营口(今辽宁省营口市)人"}
{"text": "基本介绍克里斯蒂娜·塞寇丽(Christina Sicoli)身高163cm,在加拿大安大略出生和长大,毕业于伦道夫学院"}
词表
  • 标签列表是一个json字符串,key是标签值,value是标签对应id,示例词表采用BIO标注,B表示关系,分为主体(S)与客体(O),如下所示:
{
     "O": 0,
     "I": 1,
     "B-毕业院校@S": 2,
     "B-毕业院校@O": 3,
     "B-出生地@S": 4,
     "B-出生地@O": 5,
     "B-祖籍@S": 6,
     "B-祖籍@O": 7,
     "B-国籍@S": 8,
     "B-国籍@O": 9,
     "B-出生日期@S": 10,
     "B-出生日期@O": 11
}
  • 注意:O, I对应的ID必须是0, 1,B-XXX@O对应的id需要必须为B-XXX@S对应的id+1

3. 训练第一个模型

开始训练
  • 使用预置网络进行训练的方式为使用./run_with_json.py入口脚本,通过--param_path参数来传入./examples/目录下的json配置文件。
  • 训练分为以下几个步骤:

    1. 请使用以下命令在../model_files/中通过对应脚本download_ernie_ie_1.0_base_ch.sh下载模型参数文件,其对应配置文件ernie_ie_1.0_base_ch_config.json和词表vocab_ernie_ie_1.0_base_ch.txt分别位于../model_files/目录下的config/和dict/文件夹,用户无需更改;
      # download_ernie_ie_1.0_base_ch.sh 模型下载
    # 进入model_files目录
    cd ../model_files/
    # 运行下载脚本
    sh download_ernie_ie_1.0_base_ch.sh
    1. 请在./env.sh中根据提示配置相应环境变量的路径
    2. 基于示例的数据集,可以运行以下命令在训练集(train.json)上进行模型训练,并在测试集(test.json)上进行验证;
  # 实体关系抽取--训练
# 需要提前参照env.sh进行环境变量配置,在当前shell内去读取
source env.sh
# 基于json实现预置网络训练。其调用了配置文件./examples/cls_ernie_ie_1.0_base_duie_ch.json
python run_with_json.py --param_path ./examples/cls_ernie_ie_1.0_base_duie_ch.json
  1. 训练运行的日志会自动保存在./log/test.log文件中;
  2. 训练中以及结束后产生的模型文件会默认保存在./output/目录下,其中save_inference_model/文件夹会保存用于预测的模型文件,save_checkpoint/文件夹会保存用于热启动的模型文件

4. 模型预测

开始预测
  • 使用预置网络进行预测的方式为使用./run_infer.py入口脚本,通过--param_path参数来传入./examples/目录下的json配置文件。
  • 预测分为以下几个步骤:

    1. 基于示例的数据集,可以运行以下命令在预测集(predict.txt)上进行预测:
    # 实体关系抽取--预测
    # 基于json实现预测。其调用了配置文件./examples/cls_ernie_ie_1.0_base_duie_ch_infer.json
    python run_infer.py --param_path ./examples/cls_ernie_ie_1.0_base_duie_ch_infer.json
    1. 预测运行的日志会自动保存在./output/predict_result.txt文件中。