Code Monkey home page Code Monkey logo

bert-in-relation-extraction's Introduction

Bert In Relation Extraction

大创所需,所以写了一个模型用来完成关系抽取(模型很简单,一拍脑袋想的然后就写了)

假如项目对你有用的话,欢迎Star。(别光fork不给star哇 (´・ω・`) 搞得没啥动力更新和回复Issue了。。。 )

最后在百度DuIE数据集的完整测试集上达到95.37%正确率

PS1:最近:我弄的一个自然语言处理仓库,用Pytorch实现了很多自然语言处理常用的任务,可以参考参考 https://github.com/Ricardokevins/Kevinpro-NLP-demo

PS2:我目前不再做关系抽取的相关工作,所以这个repo理论上不会增加新的feature了,但是有bug或者需要升级代码api可以在issue里留言,我会收到邮件并回复,请不要用私人联系方式

效果:

Source Text:  《在夏天冬眠》是容祖儿演唱的一首歌曲,收录于专辑《独照》中
Entity1:  独照  Entity2:  在夏天冬眠  Predict Relation:  所属专辑  True Relation:  所属专辑


Source Text:  2.花千骨花千骨是由慈文传媒集团制作并发行,高林豹、林玉芬、梁胜权联合执导,霍建华 、赵丽颖领衔主演,蒋欣、杨烁、张丹峰、马可、徐海乔、李纯等主演的古装仙侠玄幻 仙侠剧
Entity1:  赵丽颖  Entity2:  花千骨  Predict Relation:  主演  True Relation:  主演


Source Text:  在与王祖贤恋爱期间的齐秦,也是他事业最辉煌的时期,《大约在冬季》《无情的雨》《不让我的眼泪陪我过夜》《如果云知道》《夜夜夜夜》等经典曲目都是他为王祖贤所创作的,从这些歌也能感受到两个人是真爱,但是为什么就是没有一个结果呢
Entity1:  齐秦  Entity2:  大约在冬季  Predict Relation:  歌手  True Relation:  歌手


Source Text:  《甜蜜与厮杀》是连载在红袖添香网上的一部奇幻魔法小说,作者是kijimi1
Entity1:  kijimi1  Entity2:  甜蜜与厮杀  Predict Relation:  作者  True Relation:  作者

使用方法

准备

  1. 将DUIE文件路径放置于代码同目录(或者自己的数据,具体可见loader.py),更加具体的获取和数据处理见下文

  2. 将bert-base-chinese放置于同目录下的bert-base-chinese下或者自行指定位置

  3. 安装pytorch,cuda,transformer,numpy等组件(实际测试可运行环境为pytorch=1.5.1 transformers=2.5.1)

train and eval

(注意,在此之前,请做好数据的获取和预处理,步骤见文)

python3 main.py执行训练,并得到Fine-Tuing后的BERT

python3 demo.py得到样例输出,或自行阅读代码,修改test函数的传入参数内容即可自定义。

如果仅用于测试和实际使用,可以下载已经训练好的Model,然后调用demo.py下对应函数

caculate_acc:计算每一个类别的正确率

demo_output:随机选择样本,输出原文,实体对以及预测的关系,即实例输出

Model download(92.5%正确率的) 链接:https://pan.baidu.com/s/1f-sXZTzvb0Bn0qGAdTRSSg 提取码:bert

Model download(95.37%正确率的) 链接:https://pan.baidu.com/s/1nbC4qZUWT3DZUIAGVT1Tyw 提取码:bert

PS:截至2021.12.18 模型被下载了300多次了,只有43个star...... QAQ

数据

数据使用的是百度发布的DUIE数据,包含了实体识别和关系抽取

旧链接:

原数据地址:https://ai.baidu.com/broad/download?dataset=dureader

由于百度可能重新组织了数据集的页面,所以旧链接似乎用不了了,我去AIStduio里找了一个我印象里差不多的(关键词是DUIE,Knowledge Extraction) 你们可以根据自己的需要去找自己喜欢的数据集

新链接:https://aistudio.baidu.com/aistudio/datasetdetail/88472

打开后在左侧栏选择knowledge extraction,然后如下界面点击下载train_data.json和dev_data.json,然后放到对应的位置

运行loader.py里的prepare_data,观察到目录里生成了train.json和dev.json

截止这里,数据的预处理完成了,可以运行main和demo

Inkedimage-20210204112312401_LI

我对数据进行了预处理,提取关系抽取需要的部分

关系设定有49类,还是非常的丰富的

id2rel={0: 'UNK', 1: '主演', 2: '歌手', 3: '简称', 4: '总部地点', 5: '导演', 
        6: '出生地', 7: '目', 8: '出生日期', 9: '占地面积', 10: '上映时间',
        11: '出版社', 12: '作者', 13: '号', 14: '父亲', 15: '毕业院校', 
        16: '成立日期', 17: '改编自', 18: '主持人', 19: '所属专辑', 
        20: '连载网站', 21: '作词', 22: '作曲', 23: '创始人', 24: '丈夫', 
        25: '妻子', 26: '朝代', 27: '民族', 28: '国籍', 29: '身高', 30: '出品公司', 
        31: '母亲', 32: '编剧', 33: '首都', 34: '面积', 35: '祖籍', 36: '嘉宾', 
        37: '字', 38: '海拔', 39: '注册资本', 40: '制片人', 41: '董事长', 42: '所在城市',
        43: '气候', 44: '人口数量', 45: '邮政编码', 46: '主角', 47: '官方语言', 48: '修业年限'}   
    

数据的格式如下,ent1和ent2是实体,rel是关系

image.png

Model

模型就是直接使用Bert用于序列分类的(BertEncoder+Fc+CrossEntropy)

具体的处理就是把ent1,ent2和sentence直接拼接送进模型

相对我之前对Bert的粗糙处理,这里加上了MASK-Attention一起送进模型

Result

从百度的原数据中选择20000条,测试数据2000条(原数据相对很小的一部分)

训练参数:10 Epoch,0.001学习率,设置label共有49种(包含UNK,代表新关系和不存在关系)

然后在训练前和训练后的分别在测试数据上测试,可以看到Fine-Tuing高度有效

测试集正确率达到 92.5%

修正:后来在所有的数据上训练和测试,测试数据36w,测试数据4w,eval正确率95+%

image.png

实际测试

在数据中抽取一部分实际测试

效果不错

image.png

image.png

2020.11.6:修复了demo.py里的Bug,无需bert-base-chinese依赖

2021.2.3 :更新了demo.py,优化了结构

2021.2.4: 更新了readme关于数据获取部分的说明,上传和更新了第二次训练95%Acc的模型文件

2021.3.6: 修改了模型的定义,更新了代码的结构

2022.2.23: 修复了对旧模型文件的兼容性BUG,目前可以流畅的用demo.py加载新训练的模型和我公开的训练后模型

bert-in-relation-extraction's People

Contributors

ricardokevins avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

bert-in-relation-extraction's Issues

没有测试集test

请问是没有测试集吗?只有训练集、验证集,test.py的111行是读取train.json训练集来做测试的?

有问题

您好 请问我为啥报这个错误呀
Uploading mmexport1645277170516.png…

大佬 ,运行main.py时候报错了,是格式的问题吗

Traceback (most recent call last):
File "main.py", line 64, in
data=load_train()
File "/data/xinhao/nlpCode/Bert-In-Relation-Extraction-main/loader.py", line 108, in load_train
sent=dic['ent1']+dic['ent2']+dic['text']
TypeError: unsupported operand type(s) for +: 'dict' and 'str'

gpu/cpu?

博主你好,我下载的是cpu版的pytorch,运行报错:raise RuntimeError('Attempting to deserialize object on a CUDA '
RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False.想问一下这个程序是只支持gpu环境吗

训练过程不收敛

你好,我在使用您的项目时,训练的结果不收敛,ACC一直在0.16左右,请问您之前有出现过这种情况吗

data

大佬,您好,在github看了您的bert关系抽取项目,冒昧打扰您。您的训练数据和测试数据为什么都是用的一个呀?
那我要将这个模型用于抽取输入的文本,那也要把输入文本处理成train.json格式吗?

关于模型结构

请问博主 整个模型是单独bert的应用还是bert加上其他lstm等神经网络 就是有没有那种模型的整体结构图呢? 如果有能参考一下吗 谢谢啦

loader.py

运行这个没反应
没得到dev.json

demo.py

79-83行有一些git合并冲突

<<<<<<< HEAD
            outputs = net(indexed_tokens, mask=att_mask)
=======
            outputs = net(indexed_tokens, att_mask)
>>>>>>> 16d86b2eeb56099ab75c63f83bb2b572bcd172dd

请教一下

您好,看了您的代码,请问下是已知句子本身,以及两个实体去预测关系对吧?可以输入句子,直接提取出实体和他们的关系吗?

运行main.py的错误

执行时提示ValueError: Connection error, and we cannot find the requested files in the cached path. Please try again or make sure your Internet connection is on. 请问要怎么处理

demo.py报错

使用python3.7+readme中给的环境要求
运行main.py正常,运行demo.py 第79行报错,提示mask问题
outputs = net(indexed_tokens, mask=att_mask)
改为outputs = net(indexed_tokens, attention_mask=att_mask)后,解决

但是81行 logits = outputs[1]报错
IndexError: tuple index out of range

调用demo的问题

我在调用博主你上传的已训练文件进行测试时 出现了'BertConfig' object has no attribute 'return_dict'的问题 请问改怎么解决 ,我自己尝试了一下没有解决成功

效果复现

hi
拜读了你的代码,有几个问题烦请解答一下:
1、修正:后来在所有的数据上训练和测试,测试数据36w,测试数据4w,eval正确率95+%
源训练数据共17W左右,源测试数据2W左右,请问36W、4W是如何构建的?
2、id2rel={0: 'UNK', 1: '主演', 2: '歌手', 3: '简称', 4: '总部地点', 5: '导演',
6: '出生地', 7: '目', 8: '出生日期', 9: '占地面积', 10: '上映时间',
11: '出版社', 12: '作者', 13: '号', 14: '父亲', 15: '毕业院校',
16: '成立日期', 17: '改编自', 18: '主持人', 19: '所属专辑',
20: '连载网站', 21: '作词', 22: '作曲', 23: '创始人', 24: '丈夫',
25: '妻子', 26: '朝代', 27: '民族', 28: '国籍', 29: '身高', 30: '出品公司',
31: '母亲', 32: '编剧', 33: '首都', 34: '面积', 35: '祖籍', 36: '嘉宾',
37: '字', 38: '海拔', 39: '注册资本', 40: '制片人', 41: '董事长', 42: '所在城市',
43: '气候', 44: '人口数量', 45: '邮政编码', 46: '主角', 47: '官方语言', 48: '修业年限'}
源数据schema有一个关系标签‘专业代码’,而id2rel却没有,是用“UNK”替换。
3、整个网络架构,ent1+ent2+sentence 组成新的sentence,取last_hidden_states 中‘[CLS]’处的表征信息,
再通过一个Linear Layer 输出,请问是否对bert fine-tune?
4、相同的网络结构并没达到你92%的效果,训练过程如下:
image

请问怎么用自己的数据做关系抽取?

很高的准确率! 非常期待可以试试.
我现在已经实现了NER, 也有很多自己的数据, 现在先通过自己的NER和文本数据做关系抽取, 怎么应该怎么实现啊?

gpu训练运行环境

您好,大佬,请问各个组件的版本是多少:
pytorch、cuda
我想尽快调试,然后跑通代码

关于transformers 2.5.1

您好,我尝试了conda install transformers=2.5.1
和pip install transformers==2.5.1均找不到包,有什么好的办法吗

英文数据集训练

如果使用英文数据集进行训练的话是否只需要修改为相应格式的英文数据集,以及将bert-base-chinese改成英文的bert模型即可?

main.py

挺好的,main函数导的包利用率10%

语言

您好,可以使用别的语言训练模型吗?别的语言关系抽取准确率怎么样呢

预处理问题

您好,我想请教一下为什么我按照readmem里面对训练集预处理后报错了
image
image

demo,py问题

在demo中,直接替换test函数中保存后的.pth模型,在windows下,exit那出现问题怎么解决,非常感谢解答

sent = ent1 + ent2+ text

请问test.py里,为什么sent是ent1 + ent2+ text的结合,他们之后还会被分开吗,还是说作为一个sent整体进行识别了?如果是后者,那么他怎么知道要判别哪两个实体之间的关系?

请问 能从一句话中发现新的关系吗?

你好,我是新手,想问下这个问题
比如 我的老家在东北 ,
我 家乡 东北
比如 我的XX在东北
新的关系词 如何发现呢?
id2rel 这里的关系是怎么得到的?

调用训练后model的问题

博主你好,在弄好数据和预处理之后我尝试自己用main.py训练(train的训练次数调成了3次)然后调用demo.py输出成功了,但应该是因为训练不够的原因(三次训练最后一次产生的用acc当文件名的文件acc有0.6799) , 所以在demo.py输出的正确率比较低(如图)
123123,所以我下载了博主给的训练之后的model.pth,然后把它放在了bert-base-chinere文件夹下(和main.py生成test.pth同一个文件夹) , 然后在demo.py的test函数中把路径最后的test.pth改成了model.pth,但是运行的时候就会有报错了,报的错是

ModuleNotFoundError: No module named 'transformers.modeling_bert'

请问这是什么原因呢?谢谢

运行test时报错

老师你好,我完成了你仓库中训练的部分,现在希望对模型结果进行检测,在运行test.py时,报错信息如下:
Traceback (most recent call last): File "test.py", line 126, in <module> test(model,text_list,ent1,ent2,result) File "test.py", line 92, in test _, predicted = torch.max(logits.data, 1) AttributeError: 'NoneType' object has no attribute 'data'

想请教这是什么原因,应该如何解决,谢谢!

您好,关于运行mian的问题,已star,望解答,谢谢!

您好,我刚接触深度学习不久,所以问题比较简单,希望您别介意。

问题一:

我遵循了您readme中的步骤,现在正在运行main.py,但是一直卡在epoch 0 loss 就不往下进行了,运行过程如下所示
---Regenerate Data---
49
{0: 'UNK', 1: '主演', 2: '歌手', 3: '简称', 4: '总部地点', 5: '导演', 6: '出生地', 7: '目', 8: '出生日期', 9: '占地面积', 10: '上映时间', 11: '出版社', 12: '作者', 13: '号', 14: '父亲', 15: '毕业院校', 16: '成立日期', 17: '改编自', 18: '主持人', 19: '所属专辑', 20: '连载网站', 21: '作词', 22: '作曲', 23: '创始人', 24: '丈夫', 25: '妻子', 26: '朝代', 27: '民族', 28: '国籍', 29: '身高', 30: '出品公司', 31: '母亲', 32: '编剧', 33: '首都', 34: '面积', 35: '祖籍', 36: '嘉宾', 37: '字', 38: '海拔', 39: '注册资本', 40: '制片人', 41: '董事长', 42: '所在城市', 43: '气候', 44: '人口数量', 45: '邮政编码', 46: '主角', 47: '官方语言', 48: '修业年限'}
Some weights of the model checkpoint at ./bert-base-chinese were not used when initializing BertModel: ['cls.predictions.decoder.weight', 'cls.seq_relationship.bias', 'cls.seq_relationship.weight', 'cls.predictions.transform.dense.weight', 'cls.predictions.transform.LayerNorm.bias', 'cls.predictions.transform.dense.bias', 'cls.predictions.bias', 'cls.predictions.transform.LayerNorm.weight']

  • This IS expected if you are initializing BertModel from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).
  • This IS NOT expected if you are initializing BertModel from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).
    --train data--
    torch.Size([200, 1, 128])
    torch.Size([200, 1, 128])
    torch.Size([200])
    --train data--
    torch.Size([200, 1, 128])
    torch.Size([200, 1, 128])
    torch.Size([200])
    --eval data--
    torch.Size([45558, 1, 128])
    torch.Size([45558, 1, 128])
    torch.Size([45558])
    epoch 0 loss: 2.12479829788208 right 51 total 200 Acc: 0.255

问题二:
另外,请问一下,看了您的readme,如果能够跑通,或者直接使用您的模型,修改test,然后运行demo,就可以了吧?

demo

老师,为什么我用您的main训练出模型后,运行demo出错,AttributeError: 'NoneType' object has no attribute 'data'。

英文数据集

你好 我想问一下能否修改模型为bert-base-cased,并将英文数据写入并运行,我简单改了一下模型和数据,但报错很多,能帮我看一下吗?
QQ图片20231130163732
QQ图片20231130163737

训练结果的一些问题

image
博主您好,我尝试用您的36w条数据+4w验证集训练了一下,这个结果算是复现了您的训练结果吗?
还有一个问题,这个报错是不是因为我服务器的空间不足了所以模型保存不了了呀

当时跑的时候
image
当时跑的时候一直在这里卡着不动,就是这个using GPU这里,这个情况正常吗?

Demo问题

博主你好,我在运行完main.py之后原文件夹有了一个新的pth文件,名字是一串数字。然后运行demo.py的时候会报出
E FileNotFoundError: [Errno 2] No such file or directory: './bert-base-chinese/test.pth'
但是bert-base-chinese文件夹里就只有vocab.txt pytorch_model.bin 和 config.json三个文件哇,请问这是哪里出错了吗

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.