结构化数据抽取成三元组_bert4keras 任务更新,非结构化文本数据抽取三元组,预训练模型在百度知识抽取数据集上面的表现...

三元组抽取任务,基于“半指针-半标注”结构

文章介绍:https://kexue.fm/archives/7161

数据集:http://ai.baidu.com/broad/download?dataset=sked

最优f1=0.82198

代码来源 bert4keras examples

苏神鼓励大家进行小改动后发文章出来哟。

Baidu Research Open-Access Dataset​ai.baidu.com
8c82bd4d3703cdf3471ed0768a7d8e2c.png

这个数据集是一个中文的三元组抽取的数据集

{
    "text": "《新駌鸯蝴蝶梦》是黄安的音乐作品,收录在《流金十载全记录》专辑中",
    "spo_list": [
        {
            "subject": "新駌鸯蝴蝶梦",
            "predicate": "所属专辑",
            "object": "流金十载全记录",
            "subject_type": "歌曲",
            "object_type": "音乐专辑"
        },
        {
            "subject": "新駌鸯蝴蝶梦",
            "predicate": "歌手",
            "object": "黄安",
            "subject_type": "歌曲",
            "object_type": "人物"
        }
    ]
}

安装bert4keras

pip install git+https://www.github.com/bojone/bert4keras.git

训练代码如下


import json
import codecs
import numpy as np
import tensorflow as tf
from bert4keras.backend import keras, set_gelu, K
from bert4keras.layers import LayerNormalization
from bert4keras.tokenizer import Tokenizer
from bert4keras.bert import build_bert_model
from bert4keras.optimizers import Adam, ExponentialMovingAverage
from bert4keras.snippets import sequence_padding, DataGenerator
from keras.layers import *
from keras.models import Model
from tqdm import tqdm


maxlen = 128
batch_size = 64
config_path = 'wwm/bert_config.json'
checkpoint_path = 'wwm/bert_model.ckpt'
dict_path = 'wwm/vocab.txt'


def load_data(filename):
    D = []
    with codecs.open(filename, encoding='utf-8') as f:
        for l in f:
            l = json.loads(l)
            D.append({
                'text': l['text'],
                'spo_list': [
                    (spo['subject'], spo['predicate'], spo['object'])
                    for spo in l['spo_list']
                ]
            })
    return D


# 加载数据集
train_data = load_data('kg_huge/train_data.json')
valid_data = load_data('kg_huge/dev_data.json')
predicate2id, id2predicate = {}, {}

with codecs.open('kg_huge/all_50_schemas') as f:
    for l in f:
        l = json.loads(l)
        if l['predicate'] not in predicate2id:
            id2predicate[len(predicate2id)] = l['pre
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 课程大作业基于bert4keras开放领域的关系抽取python源码+部署说明.zip 1、该资源内项目代码都是经过测试运行功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能。 欢迎下载,欢迎交流,互相学习进步! 本项目是利用深度学习技术进行开放领域的关系抽取,算法模型可以处理多个三元组。 开放领域关系抽取是从文本抽取三元组,不同于限定域的关系抽取,开放关系抽取并不限制关系的种类和数量,即所识别的关系(relation)在文本中体现。于是将("n", 标签)组合一个大类,然后可以将开放关系抽取为一个NER问题,其中n对应的是文本三元组的数量。对于NER任务,我们采用[GPLinker模型](https://kexue.fm/archives/8926),相应代码在openRE_train_v2中。 所需环境 Python==3.6 tensorflow==1.14.0 keras==2.3.1 bert4keras==0.10.9 项目目录 ├── bert4keras ├── data    存放数据 ├── pretrained_model    存放训练模型 ├── extract_chinese_and_punct.py ├── openRE_train.py    训练代码 ├── openRE_train_v2.py    训练代码v2 ├── openRE_predict.py    评估和测试代码 数据集 采用[COER语料库],对原始数据进行了筛选,处理好的数据存放在data/CORE文件夹下。 ``` "text": "巴基斯坦国家灾害管理局局长法鲁克、巴内阁事务部长穆罕默德", "sro_list": [{"subject": "巴", "relation": "内阁事务部长", "object": "穆罕默德"}, {"subject": "巴基斯坦国家灾害管理局", "relation": "局长", "object": "法鲁克"}] ``` 三元组中的实体和关系均出现在文本中。 训练集和验证集中的每个句子都有n个三元组(2=<n<=4),数据统计情况: | 数据集 | 2个 | 3个 | 4个 | | :------:| :------: | :------: | :------: | | train | 8858 | 767 | 264 | | dev | 2238 | 177 | 58 | 使用说明 1.[下载训练语言模型] 可采用BERT-Base, Chinese等模型 2.构建数据集(数据集已处理好)   train.json和dev.json 3.训练模型 ``` python openRE_train.py ``` 4.评估和测试 ``` python openRE_predict.py ``` 结果 | 数据集 | f1 | precision | recall | | :------:| :------: | :------: | :------: | | train | 0.92781 | 0.92947 | 0.92616 | | dev | 0.62125 | 0.61854 | 0.62397 | | dev(v2) | 0.76922 | 0.80624 | 0.73545 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值