当前位置: 首页 > news >正文

【算法】实体关系抽取


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:传知代码论文复现

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录

概述

核心逻辑

论文工作阐述

本文优化点

实体向量嵌入方式的优化

实体识别层模型的优化

相关学习率调整算法

演示效果

使用方式

环境配置

运行训练

执行测试


本文所有资源均可在该地址处获取。

概述

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

核心逻辑

本文对于实体关系抽取任务的实现基于论文Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification,并做出一定的优化。

论文工作阐述

论文中的实体识别模型采用了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 Parsingdependency_matrix = self.word_parse_dependency(sentence,len(bert_outputs[0]))# Step 3: GAT Encodingbert_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种关系类别进行测试,实验结果表明,类别越多模型的性能会有所下降,这可能是受到预训练模型本身的限制

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="上航"

输出类别

合并

使用方式

环境配置

需要前往StandFordCoreNlp的官网下载依存解析器,并将其放在本地目录下
前往huggingface下载BERT预训练模型,放在本地目录下

运行训练

设置好相关训练参数,运行RE.py

执行测试

修改demo.py中的路径和想要判断的文本,运行demo.py

​​

相关文章:

【算法】实体关系抽取

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...

Codeforces Round 993 (Div. 4)题解

A. Easy Problem 思路&#xff1a;经过看了一眼&#xff0c;我们发现&#xff0c;ab的和一定是n&#xff0c;且两个都是正整数&#xff0c; 所以a的范围就是从1~n-1 所以输出n-1即可 #include<bits/stdc.h> using namespace std; #define int long long int t; int n…...

【计算机网络】期末考试预习复习|中

作业讲解 转发器、网桥、路由器和网关(4-6) 作为中间设备&#xff0c;转发器、网桥、路由器和网关有何区别&#xff1f; (1) 物理层使用的中间设备叫做转发器(repeater)。 (2) 数据链路层使用的中间设备叫做网桥或桥接器(bridge)。 (3) 网络层使用的中间设备叫做路…...

从零用java实现 小红书 springboot vue uniapp (4)个人主页优化

前言 移动端演示 http://8.146.211.120:8081/#/ 前面的文章我们基本完成了详情页开发 今天我们具体的去进行实现个人中心 并且分享我开发时遇到的问题 首先先看效果 我们对布局整体规划一下 个人名片 半透明背景 刚开始我用的是 <view style"background-image: ur…...

为“行车大脑”降温:Simdroid-EC助力汽车ECU设计研发

ECU&#xff08;Electronic Control Unit&#xff0c;电子控制单元&#xff09;被誉为汽车的行车大脑&#xff0c;在工作时会产生大量的热量&#xff0c;而其散热存在以下难题&#xff1a;一是工作环境恶劣&#xff0c;ECU常处于高温环境中&#xff1b;二是ECU所处的空间较为狭…...

视频汇聚平台:Liveweb视频流媒体平台视频监控系统解决方案

数字化技术在安防领域的广泛应用已经成为公安等重要执法部门的重要趋势&#xff0c;主要得益于无线网络通信技术和计算机技术的快速进步。传统的视频监控系统存在诸多局限&#xff0c;例如只能进行现场监视&#xff0c;报警信息传输简单&#xff0c;无法远距离传输视频信号&…...

通过解调使用正则化相位跟踪技术进行相位解包裹

1. 绪论 光学计量学通常使用光学干涉仪来测量各种物理量。1,2 根据应用的不同&#xff0c;可以使用多种类型的干涉仪&#xff0c;但它们的共同目标是产生一个由被测物理量调制的条纹图案。使用这种光束编码程序可以检测到的物理量范围非常广&#xff1a;深度测量、应变分析、温…...

VMware替代 | 双一流大学采用ZStack ZSphere虚拟化平台加速医学应用算法分析

某双一流大学医学部在面对日益增长的医学应用算法分析需求时&#xff0c;选择采用ZStack ZSphere虚拟化平台&#xff0c;以满足其高性能计算和GPU业务应用的迫切需求。该平台凭借其轻量化、卓越性能及易用性&#xff0c;成功解决了医学部在虚拟化及GPU应用场景中的挑战。随着平…...

UNIAPP框架uView初步集成与开发设计

uView UI&#xff0c;是uni-app生态最优秀的UI框架&#xff0c;全面的组件和便捷的工具会让您信手拈来&#xff0c;如鱼得水。本文章分享UNIAPP集成使用uView页面动态开发设计。 一、使用HBuilder X 直接导入插件&#xff0c;下载后重启 uView - DCloud 插件市场 二、配置样…...

C05S08-LVS负载均衡

一、LVS 1. LVS概述 LVS&#xff08;Linux Virtual Server、Linux虚拟服务&#xff09;是一种基于Linux系统集群的负载均衡方案&#xff0c;属于四层的负载均衡。 集群&#xff1a;将相同组件部署在不同的服务器上&#xff0c;提供统一的服务&#xff0c;以及同样的功能&…...

C 语言代码诗韵:数字功能的雅集华章

函数基本操作练习 主要内容&#xff1a; 本任务主要练习函数的申请、定义、调用等&#xff0c;主要包含以下功能&#xff1a; 1&#xff09;编写函数&#xff0c;输入一个整数&#xff0c;求各个数字之和&#xff1b; 2&#xff09;编写函数&#xff0c;计算1&#xff01;2&…...

ps案例制作

宣传海报 暖色调海报商品展示图...

【C++】列表初始化、声明、范围for、array容器

列表初始化、声明、范围for、array容器 一、统一的列表初始化1.1 使用{ }初始化1.2 initializer_list容器 二、声明2.1 auto关键字2.2 decltype关键字2.3 nullptr关键字 三、范围for四、array容器和forward_list容器 一、统一的列表初始化 1.1 使用{ }初始化 在C98中&#xf…...

C++智能指针详解

一、智能指针简介 智能指针是一个类似于指针的类&#xff0c;将指针交给这个类对象进行管理&#xff0c;我们就可以像使用指针一样使用这个类&#xff0c;并且它会自动释放资源。 智能指针运用了 RAII 的思想(资源获得即初始化)。RAII 是指&#xff0c;用对象的生命周期来管理资…...

基础库正则表达式

我们已经可以用requests 库来获取网页的源代码&#xff0c;得到 HTML 代码。但我们真正想要的数据是包含在 HTML代码之中的&#xff0c;要怎样才能从 HTML,代码中获取想要的信息呢?正则表达式就是其中一个有效的方法。 本篇博客我们将了解一下正则表达式的相关用法。正则表达…...

【spring专题】spring如何解析配置类和扫描包路径

文章目录 目标重要的组件加载配置类启动解析组件定位配置类解析配置类 扫描过程总结 目标 这是我们使用注解方式启动spring容器的核心代码 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(MyConfig.class); User user (Us…...

MyBatis框架的入门

目录 MyBatis第一章&#xff1a;框架的概述1. MyBatis框架的概述 第二章&#xff1a;MyBatis的入门程序1. 创建数据库和表结构2. MyBatis的入门步骤 MyBatis 第一章&#xff1a;框架的概述 1. MyBatis框架的概述 MyBatis是一个优秀的基于Java的持久层框架&#xff0c;内部对…...

代码随想录D22-23 回溯算法01-02 Python

理论回顾 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 回溯的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案&#xff0c;如果想让回溯法高效一些&#xff0c;可以加一些剪枝…...

【网络云计算】2024第50周-每日【2024/12/13】小测-理论-写10个Bash Shell脚本-解析

文章目录 1. 计算1到100的和2. 列出当前目录下所有文件和文件夹3. 检查文件是否存在4. 备份文件到指定目录&#xff08;简单示例&#xff09;5. 打印系统当前日期和时间6. 统计文件中的行数7. 批量重命名文件&#xff08;将.txt后缀改为.bak&#xff09;8. 查找进程并杀死&…...

MATLAB转换C语言--问题(一)FFT 和 IFFT 的缩放因子

1. MATLAB 中的 FFT 和 IFFT 在 MATLAB 中&#xff0c;fft 和 ifft 函数具有以下缩放行为&#xff1a; fft&#xff1a;执行快速傅里叶变换&#xff08;FFT&#xff09;&#xff0c;不进行缩放。ifft&#xff1a;执行逆快速傅里叶变换&#xff08;IFFT&#xff09;&#xff0c;…...

Mojo加速Python科学计算:从API绑定到内存零拷贝,5步完成CUDA级性能跃迁

第一章&#xff1a;Mojo加速Python科学计算&#xff1a;从API绑定到内存零拷贝&#xff0c;5步完成CUDA级性能跃迁Mojo 作为兼具 Python 兼容性与系统级性能的新一代编程语言&#xff0c;正重塑科学计算的性能边界。其核心优势在于原生支持异构硬件&#xff08;如 NVIDIA GPU&a…...

物理动力学系统的强化学习:一种替代方法

原文&#xff1a;towardsdatascience.com/rl-for-physical-dynamical-systems-an-alternative-approach-8e2269dc1e79?sourcecollection_archive---------1-----------------------#2024-07-28 重新引入遗传算法并与神经网络进行比较 https://medium.com/retter_42511?sourc…...

上海计算机学会2026年2月月赛C++丙组T1 乘积的秘密

乘积的秘密 题目描述 给定两个整数 A 与 B&#xff0c;保证 A ≤ B。请求出从 A 一直乘到 B 的符号&#xff1a; 如果乘积大于 0&#xff0c;输出 Positive&#xff1b;如果乘积小于 0&#xff0c;输出 Negative&#xff1b;如果乘积等于 0&#xff0c;输出 Zero。 输入格式 两…...

YOLOv8与YOLOv11网络结构对比:从yolov8.yaml到yolo11.yaml的演进与优化

YOLOv8与YOLOv11网络结构深度对比&#xff1a;从架构设计到性能优化 在计算机视觉领域&#xff0c;目标检测技术一直是研究热点&#xff0c;而YOLO(You Only Look Once)系列作为其中的佼佼者&#xff0c;以其高效的实时检测能力广受关注。本文将深入剖析YOLOv8与YOLOv11的网络结…...

保姆级教程:用ArduPilot给无人车/船配置避障(附MR72雷达、TFmini Plus参数)

保姆级教程&#xff1a;用ArduPilot为无人车/船配置毫米波与激光雷达避障系统 当你的无人车在野外自动巡航时突然检测到前方障碍物&#xff0c;是紧急刹车还是智能绕行&#xff1f;水面无人船在夜间航行如何避开漂浮物&#xff1f;本文将手把手带你完成从硬件选型到参数调优的全…...

Visium HD空转实战:Space Ranger v4.0.1从安装到结果解读全流程

1. Visium HD与Space Ranger初探 第一次接触Visium HD技术时&#xff0c;我被它强大的空间转录组分析能力震撼到了。简单来说&#xff0c;这项技术能让我们在组织切片上精确到单个细胞的位置&#xff0c;同时获取它们的基因表达数据。想象一下&#xff0c;这就像给组织样本拍了…...

Java集合判空全攻略:从原生方法到Apache Commons工具类对比

Java集合判空全攻略&#xff1a;从原生方法到Apache Commons工具类对比 在Java开发中&#xff0c;集合判空是最基础却又最容易出错的环节之一。一个看似简单的判空操作&#xff0c;背后可能隐藏着NPE风险、性能损耗甚至逻辑漏洞。本文将深入剖析Java原生判空方法与Apache Commo…...

2.Pandas在电商数据处理中的核心价值

第1章 Pandas在电商数据处理中应用 1.1 为什么Excel不够用&#xff0c;需要Pandas Pandas是Python里的数据分析核心库。它的名字来自“Panel Data”&#xff08;面板数据&#xff09;&#xff0c;专门处理表格型数据。电商数据分析里&#xff0c;Pandas主要解决三类问题&#x…...

2026年4月OpenClaw如何安装?腾讯云2分钟零基础教程及百炼APIKey配置方法

2026年4月OpenClaw如何安装&#xff1f;腾讯云2分钟零基础教程及百炼APIKey配置方法。OpenClaw&#xff08;原Clawdbot&#xff09;作为2026年主流的AI自动化助理平台&#xff0c;可通过阿里云轻量服务器实现724小时稳定运行&#xff0c;并快速接入钉钉&#xff0c;让AI在企业群…...

AI营销SaaS榜单评测:原圈科技如何助力品牌客户破局增长?

本文深度探讨AI营销行业趋势与SaaS产品评选标准。在众多解决方案中&#xff0c;原圈科技的AI营销SaaS平台凭借其领先的技术底层能力、产品成熟度及客户成功案例&#xff0c;在市场适配度与服务落地性等多个维度下表现突出&#xff0c;被普遍视为企业实现精细化营销升级的有力选…...