基于Bert的实体关系抽取模型

关注微信公众号:NLP分享汇。【喜欢的扫波关注,每天都在更新自己之前的积累】

文章链接:https://mp.weixin.qq.com/s/OebxnvwjQiVbBZZFL2Un3A


前言

信息抽取(Information Extraction, IE)是从自然语言文本中抽取实体、属性、关系及事件等事实类信息的文本处理技术,是信息检索、智能问答、智能对话等人工智能应用的重要基础,一直受到业界的广泛关注。信息抽取任务涉及命名实体识别、指代消解、关系分类等复杂技术,极具挑战性。而本文旨在介绍如何利用Bert预训练模型进行关系抽取任务。

 

相关链接

GitHub:https://github.com/yuanxiaosc/Entity-Relation-Extraction

竞赛官网:http://lic2019.ccf.org.cn/

理解难度:★★★★

解决思路

1、先使用bert搭建的关系分类模型,简单来看就是一个多标签分类任务,类别就是下述的那几种关系;

2、接着用预测出来的关系和文本,使用bert搭建一个实体抽取的模型,其简单来看也是一个分类模型,类别是:

["[Padding]", "[category]", "[##WordPiece]", "[CLS]", "[SEP]", "B-SUB", "I-SUB", "B-OBJ", "I-OBJ", "O"]

【 SUB对应的就是subject,B-SUB就是第一个实体开始的位置,后续的是I-SUB,OBJ就是第二个实体 】

关系类型如下:

['丈夫', '上映时间', '专业代码', '主持人', '主演', '主角', '人口数量', '作曲', '作者', '作词', '修业年限', '出品公司', '出版社', '出生地', '出生日期', '创始人', '制片人', '占地面积', '号', '嘉宾', '国籍', '妻子', '字', '官方语言', '导演', '总部地点', '成立日期', '所在城市', '所属专辑', '改编自', '朝代', '歌手', '母亲', '毕业院校', '民族', '气候', 
### 使用 BERT 实现实体关系抽取 #### 构建数据集 为了准备适用于BERT模型的数据,需先构建合适格式的数据集。这通常涉及预处理原始文本并将其转换成适合模型训练的形式。通过运行`loader.py`中的`prepare_data`函数,可以生成名为`train.json`和`dev.json`的文件[^3]。 这些JSON文件包含了标注好的实体及其对应的关系,是后续训练的基础资源之一。 #### 数据标记方案 对于实体识别部分,采用了一种特定的标签体系来进行序列标注。该体系包括但不限于以下几个类别:“B-SUB”,“I-SUB”,“B-OBJ”,“I-OBJ”,以及“O”。其中,“B-”代表开始位置,“I-”表示内部连续的位置;而“SUB”指代主体(Subject),即事件触发词或动作执行者;“OBJ”则指向客体(Object),也就是受动对象。“O”意味着其他非实体成分[^2]。 这种细致入微的标签划分有助于更精准地区分不同类型的命名实体,并为之后的关系分类提供了坚实基础。 #### 模型架构设计 基于上述准备工作,在实现层面可选用预训练过的BERT作为核心组件。此模型由多层Transformer编码器构成,能够捕捉词语间的复杂依赖模式,进而增强对语义的理解能力[^4]。 具体来说,当给定一段含有已知实体提及的句子时,BERT会输出相应token级别的隐含状态向量。随后,利用全连接神经网络或其他适当方法对接收到的信息进一步加工处理——比如将目标实体对映射至预先定义好的关系类型集合上,最终形成二元组形式的结果表达[(entity1, relation_type), (entity2)]。 #### 训练过程概述 在整个流程中,除了初始化阶段加载预训练权重外,还需针对具体的NER&RE任务调整超参数设置、优化算法选择等方面的工作。随着迭代次数增加,损失函数值逐渐减小直至收敛稳定,表明模型已经较好掌握了从输入文本中抽取出有效信息的能力[^1]。 ```python from transformers import BertTokenizer, BertForTokenClassification import torch tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') model = BertForTokenClassification.from_pretrained('bert-base-chinese', num_labels=9) inputs = tokenizer("中国科学院自动化研究所位于北京中关村", return_tensors="pt") labels = torch.tensor([1 if token != '[PAD]' else 0 for token in inputs['input_ids'][0]]).unsqueeze(0) # 假设所有真实标签都为1 outputs = model(**inputs, labels=labels) loss = outputs.loss logits = outputs.logits ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值