【传知代码】实体关系抽取(论文复现)

news2024/9/24 15:17:09

当谈论信息提取领域的最前沿时,实体关系抽取无疑是其中一颗耀眼的明星。从大数据时代的信息海洋中提炼出有意义的关系,不仅是科技进步的体现,更是人类对知识管理和智能决策迫切需求的响应。本文将探索实体关系抽取的核心技术、应用场景及其在现代信息处理中的重要作用。随着技术的发展和应用的深入,实体关系抽取正展现出无限的潜力,不断推动着我们对数据的深入理解和利用。

本文所涉及所有资源均在传知代码平台可获取

目录

概述

核心逻辑 

演示效果

写在最后


概述

        实体关系抽取是自然语言处理领域的一个常见任务,它常常和实体识别任务伴生,他们都属于图谱三元组的提取任务。实体识别任务提取出实体,实体关系抽取任务则是负责判断两个实体之间的关系。例如:在句子"Albert Einstein was born in Ulm"中,实体识别任务会识别出"Albert Einstein"和"Ulm"两个实体,而实体关系抽取任务则会判断这两个实体之间的关系是“出地”(place of birth),如下所示:

        本文对于实体关系抽取任务的实现基于论文 地址,并做出一定的优化,论文中的实体识别模型采用了BERT、BILSTM和注意力机制的结合结构。具体来说,BERT提供了强大的文本表示能力,能够生成丰富的上下文感知词向量。通过预训练的BERT模型,输入的文本可以被转化为高质量的向量表示,捕捉到词语的语义和句法信息。

        在BERT生成的词向量基础上,加入了BILSTM层。BILSTM是LSTM(长短期记忆网络)的双向版本,它能够同时考虑前向和后向的上下文信息,进一步增强了对句子结构的理解能力。BILSTM的引入使得模型能够更好地捕捉到句子中每个词语的前后依赖关系,从而提升对复杂语言现象的建模能力。

        为了进一步提高模型的性能,还加入了注意力机制。注意力机制通过赋予不同词语不同的权重,帮助模型集中关注对实体识别任务至关重要的词语和特征。这种机制能够动态地调整每个词语的权重,使得模型在处理长文本时,仍然能够高效地捕捉到关键的信息。

        对于实体关系抽取任务,一般而言,输入包含需要判断的句子和两个实体,常见的嵌入方式是计算两个实体在句子中的位置向量,来标注实体。然而,仅仅根据两个词来进行关系识别,可能导致模型很难深入理解句意,难以理解隐藏在句子中的实体关系。依存解析器通过Stanford CoreNLP的依存解析算法,对输入句子进行依存关系分析。依存关系解析将句子看作一个图,词语作为节点,词语之间的依存关系则作为节点之间的连接关系。在解析器的基础上,生成依存矩阵。该矩阵表示句子中词语之间的依存关系。矩阵的每个元素对应于句子中两个词语之间的依存连接强度或类型。将生成的依存矩阵结合到输入的句子中,使用图神经网络(Graph Neural Networks, GNNs)对句子进行处理。GNNs能够有效地利用依存关系信息,优化实体向量的嵌入方式。通过将句子建模为一个图,GNNs可以在节点(词语)之间传播信息,从而捕捉到更丰富的语义和上下文特征。

核心逻辑 

        这种方法显著优化了实体向量的嵌入方式,使得模型不仅能够关注两个实体本身,还能够充分理解它们在句子中的上下文和依存关系。这种深层次的语义理解,能够大幅提高实体关系抽取任务的准确性和鲁棒性,下面的代码展示了修改后的嵌入模型:模型先经过BERT编码,然后结合依存矩阵,输入到图神经网络中,得到可用来训练的向量:

def forward(self, sentence,label1,label2):
        # Step 1: BERT Encoding  
        bert_outputs = self.encode_sentence(sentence)
        print(len(bert_outputs[0]))
        bert_outputs_label1,bert_outputs_label2 = self.encode_sentence_and_label(sentence,label1,label2)
        # Step 2: Dependency Parsing
        dependency_matrix = self.word_parse_dependency(sentence,len(bert_outputs[0]))
        # Step 3: GAT Encoding
        bert_outputs = bert_outputs[0]  # .numpy()
        x = self.gat(bert_outputs, adj_matrix_tensor)

        output_ids = torch.cat((bert_outputs_label1[0], x,bert_outputs_label2[0]), dim=1)

        return output_ids 

        在论文的基础上,将注意力层优化成为池化注意力机制层,另外根据两个实体在句子的位置,将句子划分为五个部分,分别进行池化操作,让模型学习实体在句子中的相关特征。例如,池化操作可以采用最大池化或平均池化的方法,聚合注意力权重,从而增强模型对重要特征的识别能力。预处理代码如下:根据两个实体在句子的位置,将句子划分为五个部分,分别进行池化操作,让模型学习实体在句子中的相关特征:

        def forward(self, entity1, entity2, left, middle, right):

        entity1 = self.calc_pool(entity1)
        entity2 = self.calc_pool(entity2)
        left = self.calc_pool(left)
        middle = self.calc_pool(middle)
        right = self.calc_pool(right)

        if left is None:
            T = torch.cat((entity1, middle, entity2, right), dim=1)
        elif middle is None:
            T = torch.cat((left, entity1, entity2, right), dim=1)
        elif right is None:
            T = torch.cat((left, entity1, middle, entity2), dim=1)
        else:
            T = torch.cat((left, entity1, middle, entity2, right), dim=1)

        T = torch.mean(T, dim=0)
        T = T.unsqueeze(0)
        y = self.fc(T)

        使用了Adam优化算法,这是目前深度学习中非常流行的一种优化算法。定义了一个学习率调度器。具体来说,它使用了基于指标变化调整学习率的调度器,通过结合优化器和学习率调度器,能够在训练过程中动态调整学习率,提高模型的训练效率和效果。优化器负责更新模型参数,而调度器根据模型性能自动调整学习率,以便在训练后期进行更精细的优化:

optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, weight_decay=1e-5)
scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=3, verbose=True)

演示效果

        本项目分别在3种关系类别和22种关系类别进行测试,实验结果表明,类别越多模型的性能会有所下降,这可能是受到预训练模型本身的限制,需要前往StandFordCoreNlp的官网下载依存解析器,并将其放在本地目录下或前往huggingface下载BERT预训练模型,放在本地目录下:

Epoch 5/15, Training Loss: 219.9698, Training Accuracy: 0.9237
total time: 816.9306426048279
Epoch 5/15, Validation Loss: 0.0611, Validation Accuracy: 0.8360

训练之后,代码会自动保存最好的模型,调用模型,可以利用模型来预测一句话的种两个实体之间的关系,下面是一个演示结果,输入句子:

text = "据报道,东方航空股临时停牌传将与上航合并"
entity1= "东方航空"
entity2="上航"

输出类别:合并

写在最后

        在信息科技日新月异的今天,实体关系抽取不仅仅是一个技术领域的探索,更是数据驱动决策和智能应用的关键一环。通过识别和理解文本中实体之间的关系,我们能够从海量数据中提取出宝贵的信息,支持从金融预测到医疗诊断的广泛应用。随着算法的进步和数据的丰富,实体关系抽取正日益成为人工智能在现实生活中的重要助手,促使我们更高效地处理信息,做出更明智的决策。未来,随着技术的不断演进和应用场景的扩展,实体关系抽取将继续在各个领域展示其无限潜力,成为推动智能化发展的关键力量。

详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

域控搭建(windows 2012 R2和win10)

域控搭建 环境准备 两台windows虚拟机 主域控为:windows server2012 子域为:win10 虚拟机设置网段 Win10网络设置 Windows server2012网络设置 Windows server2012网络适配器 设置 识别成功 更改计算机名字 等待重启 Win10网络适配器 设置 识别成功 …

opencv-图像透视变换

透射变换是视角变化的结果,是指利用透视中心,像点,目标点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴旋转某一角度,破坏原有的投影光束,仍能保持承影面上投影几何图形不变的变化) 它的本质将图…

QT实现步进电机控制和IMU数据读取显示

实现功能: 1.两步进电机分别使能和循环运动,可以设置循环次数、循环里分别运行的角度、旋转的速度和加减速度等等,在最下方的表格里显示发送和接收的CAN报文 2.读取水平电机当前位置和速度并画图显示,示波器暂停、缩放、滑动等功…

CVPR24《Neural Markov Random Field for Stereo Matching》

论文地址: https://arxiv.org/abs/2403.11193 源码地址: https://github.com/aeolusguan/NMRF 概述 手工设计的MRF模型在传统的立体匹配中占据主导地位,但与端到端的深度学习模型相比,其建模准确性不足。尽管深度学习大大改进了MR…

力扣SQL50 修复表中的名字 字符串函数

Problem: 1667. 修复表中的名字 👨‍🏫 参考题解 select user_id, CONCAT(UPPER(left(name, 1)), LOWER(RIGHT(name, length(name) - 1))) as name from Users order by user_id

SQL注入实例(sqli-labs/less-2)

0、初始网页 1、闭合方式判断 当没有闭合符号进行注释时,网页并没有报错,所以可以确定无闭合符号,为数值型注入 2、确定查询表的列数 可以确定列数小于4 ?id1 order by 4 -- 确定查询表的列数为3列 ?id1 order by 3 -- 3、确定回显位置…

MySQL系列之--关系型数据库以及SQL语句分类之DDL数据库和表的操作

文章目录 前言关系型数据库(RDBMS)关系型数据库的特点 MySQL数据模型SQL介绍基本语法规则SQL语句的分类DDL的介绍DDL的数据库操作DDL的表操作 前言 上一节MySQL系列之–详细安装教程和启动方法中介绍了MySQL如何安装,以及如何启动和客户端连接…

c++| c++11左右值引用,完美转发,可变参数模板,functional包装器,bind函数

c| c11的新特性 左,右值引用什么是左值,右值左值引用和右值引用右值引用解决什么问题呢?移动构造万能引用形式 完美转发格式 lambada表达式格式 可变参数模板可变参数模板实现打印不同类型emplace_push以list的emplace_back的实现举例包装器b…

新160个crackme - 020-cosh.3

运行分析 老规矩,需要破解Name和Serial PE分析 c程序,32位,无壳 静态分析&动态调试 ida查找关键字符串 分析关键函数,得出以下结论:Name、Serial每一位进行亦或计算,若计算结果相等则弹窗成功 算法分析…

吴恩达机器学习作业-ex7(主成分分析)

data1 导入库,读取数据,并进行可视化数据 import numpy as np import scipy.io as sio import matplotlib.pyplot as plt#读取数据 path "./ex7data1.mat" data sio.loadmat(path) # print(data.keys()) X data.get("X") # pri…

Python数据分析案例58——热门游戏数据分析及其可视化

案例背景 有哪个男生不喜欢玩游戏呢?就算上了班儿也要研究一下游戏以及热门的游戏。正好这里有个热门的游戏数据集,全球热门游戏数据集来做一下一些可视化的分析。 数据介绍 该文件包含一个数据集,详细说明了多个平台上的各种流行游戏。每个…

【Golang 面试 - 进阶题】每日 3 题(十五)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…

Cesium 高德地图暗黑化

Cesium 高德地图暗黑化 高德电子地图实现暗黑效果 // 设置图层滤镜new ImageryLayerFilter({viewer: viewer,imageryLayer: imageryLayer,});

YOLOv5轻量化改进 | backbone | 结合MobileNetV4(包含多个结构和使用方式)

YOLOv5轻量化改进 | backbone | 结合MobileNetV4(包含多个结构) 本文介绍论文原理介绍网络代码多种yaml设置网络测试及实验结果<!-- 这里放入论文图片 --> &emsp;;本文介绍 本文给大家带来的改进机制是结合MobileNetV4骨干网络,其中来自2024.5月发布的MobileNetV4…

Pageadmin 漏洞教程

上传文件解压拿webshell 用哥斯拉&#xff0c;生成一个asp木马 这个就是我们生成的asp木马 不能直接上传 压缩为zip文件 上传 上传以后我们点击解压 就成功了 然后我们去访问 然后用哥斯拉访问 然后再点击添加 这样就成功了 成功进入

VSCode在windows系统下的配置简单版

参考链接 从零开始的vscode安装及环境配置教程(C/C)(Windows系统)_vscode搭建编译器环境-CSDN博客 vscode生成tasks.json、launch.json、c_cpp_properties.json文件_vscode生成launch.json-CSDN博客 自动生成配置文件简单方便&#xff01;&#xff01;&#xff01; 运行c代…

点击clean失败的操作Error running ‘demo4 [clean]‘ No valid Maven installation found.

错误情况&#xff1a; 解决方法&#xff1a; 重新调整自己的maven&#xff1a; 点击settings&#xff0c;搜索maven&#xff0c;点击进入&#xff1a; 选择自己的真实路径&#xff1a; 效果: 可以发现&#xff0c;运行clean成功&#xff01;

Useless Fan

灵感来源于老外的一个作品&#xff0c;但是只有风扇功能&#xff0c;除了袖珍感觉没啥用。 在淘宝上十几块买了一堆原件&#xff0c;于是手痒&#xff0c;自己手搓了一个&#xff0c;设计了个简单的3D打印外壳。 包括3大功能&#xff1a;风扇&#xff0c;充电宝&#xff08;2…

Spring MVC 快速入门指南及实战演示

1、SpringMVC简介 1.1 背景 Servlet属于web层开发技术&#xff0c;技术特点&#xff1a; 1. 每个请求都需要创建一个Servlet进行处理 2. 创建Servlet存在重复操作 3. 代码灵活性低&#xff0c;开发效率低 是否有技术方案可以解决以上问题&#xff1f; 1.2 SpringMVC概述 Sp…

C#加班统计次数

C#加班统计次数 运行环境&#xff1a;vs2022 .net 8.0 社区版 1、用C#语言&#xff1b;2、有界面上传Excel文件; 3、对Excel列&#xff08;部门、人员姓名、人员编号、考勤时间 &#xff09;处理&#xff1a;&#xff08;1&#xff09;按人员编号、考勤日期分组且保留原来字段&…