如何使用大语言模型进行事件抽取与关系抽取

诸神缄默不语-个人CSDN博文目录

文章目录

  • 1. 什么是事件抽取与关系抽取?
  • 2. 示例:使用大语言模型进行事件抽取与关系抽取

1. 什么是事件抽取与关系抽取?

事件抽取是指从文本中识别出与某些“事件”相关的信息。这些事件通常包括动作、参与者、时间、地点等关键信息。

关系抽取则是从文本中识别并提取不同事件之间的关联,常见的关系包括因果关系和时序关系等。

2. 示例:使用大语言模型进行事件抽取与关系抽取

在本博文中,我们将通过一个简单的示例来展示如何使用智谱AI进行事件抽取和关系抽取。
对智谱AI的更多使用方式介绍可参考我撰写的另一篇博文:如何调用GLM-4 API实现智能问答

示例代码:

import logging
from zhipuai import ZhipuAI
import csv
import json# 初始化客户端
client = ZhipuAI(api_key="YOUR_ZHIPU_API_KEY"  # 替换为你的API密钥
)# 初始化日志记录
logging.basicConfig(filename=r"event_extraction_logs\process_log.log",  # 日志文件名level=logging.INFO,  # 设置日志级别format="%(asctime)s - %(levelname)s - %(message)s",  # 日志格式
)# 用户提示模板:事件抽取 + 关系抽取
user_prompt = """Based on the following example, extract events and their related attributes (主体、客体、触发词、时间、地点) as well as relationships (因果关系、时序关系) from the provided text.# EVENT EXTRACTION EXAMPLE:
Input text:
"甲公司在2023年5月成功收购了乙公司,导致了双方在市场上的竞争加剧。"Output:
{"事件抽取": [{"事件1": "甲公司收购乙公司","参与主体": "甲公司","参与客体": "乙公司","触发词": "收购","时间": "2023年5月","地点": "无"},{"事件2": "竞争加剧","参与主体": "甲公司、乙公司","参与客体": "市场","触发词": "加剧","时间": "无","地点": "市场"}],"关系抽取": [{"因果关系": {"因事件": "甲公司收购乙公司","果事件": "竞争加剧"}},{"时序关系": {"事件1": "甲公司收购乙公司","事件2": "竞争加剧"}}]
}Input text:
"2024年4月,华为公司宣布将进入新能源汽车市场,并计划在未来三年内投资100亿人民币。"
Output:
{"事件抽取": [{"事件1": "华为公司进入新能源汽车市场","参与主体": "华为公司","参与客体": "新能源汽车市场","触发词": "进入","时间": "2024年4月","地点": "新能源汽车市场"},{"事件2": "投资100亿人民币","参与主体": "华为公司","参与客体": "100亿人民币","触发词": "投资","时间": "未来三年","地点": "无"}],"关系抽取": [{"因果关系": "无"},{"时序关系": {"事件1": "华为公司进入新能源汽车市场","事件2": "投资100亿人民币"}}]
}Input text:
"2024年6月,张三开始在甲公司工作,接着他于2024年7月参与了一个重要项目,并在项目结束后的2024年9月晋升为经理。"
Output:
{"事件抽取": [{"事件1": "张三开始在甲公司工作","参与主体": "张三","参与客体": "甲公司","触发词": "开始","时间": "2024年6月","地点": "甲公司"},{"事件2": "张三参与了重要项目","参与主体": "张三","参与客体": "重要项目","触发词": "参与","时间": "2024年7月","地点": "无"},{"事件3": "张三晋升为经理","参与主体": "张三","参与客体": "经理","触发词": "晋升","时间": "2024年9月","地点": "无"}],"关系抽取": [{"因果关系": {"因事件": "张三开始在甲公司工作","果事件": "张三参与了重要项目"}},{"因果关系": {"因事件": "张三参与了重要项目","果事件": "张三晋升为经理"}},{"时序关系": {"前事件": "张三开始在甲公司工作","后事件": "张三参与了重要项目"}},{"时序关系": {"前事件": "张三参与了重要项目","后事件": "张三晋升为经理"}}]
}# Input text:
{specification}# Output:
"""# 系统提示
system_prompt = """You are a text information extraction engineer specializing in event extraction and relationship extraction.
Your task is to:
1. Extract events and their attributes: "事件", "参与主体", "参与客体", "触发词", "时间", "地点".
2. Identify relationships between events: "因果关系" and "时序关系".
Return the output as a JSON object with two main sections: "事件抽取" and "关系抽取".
"""# 定义函数:调用 ZhipuAI 接口进行事件抽取
def extract_events_and_relations(text):message = [{"role": "user", "content": user_prompt.replace("{specification}", text)},{"role": "assistant", "content": system_prompt},]try:response = client.chat.completions.create(model="glm-4", messages=message, temperature=0.2  # 替换为你要使用的模型名称)return response.choices[0].message.content.strip()except Exception as e:logging.error(f"Error while calling API: {e}")return None# 主逻辑:读取 CSV 文件并进行事件抽取
def process_csv(input_csv_path, output_json_path):results = []# 读取 CSV 文件with open(input_csv_path, mode="r", encoding="utf-8") as csv_file:csv_reader = csv.reader(csv_file)header = next(csv_reader)  # 跳过表头# 遍历每一行文本进行事件抽取for row in csv_reader:if row:  # 确保该行不为空text = row[0]  # 假设文本位于 CSV 的第一列logging.info(f"Processing text: {text}")extracted_info = extract_events_and_relations(text)if extracted_info:try:# 将结果解析为 JSONparsed_info = json.loads(extracted_info)results.append(parsed_info)except json.JSONDecodeError:logging.error(f"Failed to parse JSON for text: {text}")logging.error(f"Response content: {extracted_info}")results.append({"str": extracted_info})# 保存结果到 JSON 文件with open(output_json_path, mode="w", encoding="utf-8") as json_file:json.dump(results, json_file, ensure_ascii=False, indent=4)logging.info(f"事件抽取完成,结果已保存到 {output_json_path}")# 主程序入口
if __name__ == "__main__":input_csv_path = (r"event_extraction_data\input_data.csv"  # 输入的 CSV 文件路径)output_json_path = r"event_extraction_output\output_events.json"  # 输出的 JSON 文件路径logging.info("Starting process...")process_csv(input_csv_path, output_json_path)logging.info("任务完成!")

在这里插入图片描述

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

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

相关文章

NAT网络技术

NAT(Network Address Translation,网络地址转换)是一种常用的网络技术,主要用于在私有网络和公共网络之间转换IP地址。在家庭和小型企业网络当中用的比较多。它的主要功能有IP地址重用和增强网络的安全性。   NAT允许一个整个网…

SpringBoot框架开发中常用的注解

文章目录 接收HTTP请求。RestController全局异常处理器Component依赖注入LombokDataBuildersneakyThrowsRequiredArgsConstructor 读取yml文件配置类注解 接收HTTP请求。 RequestMapping 接收HTTP请求。具体一点是 GetMapping PostMapping PutMapping DeleteMapping 一共…

TVS二极管选型【EMC】

TVS器件并联在电路中,当电路正常工作时,他处于截止状态(高阻态),不影响线路正常工作,当线路处于异常过压并达到其击穿电压时,他迅速由高阻态变为低阻态,给瞬间电流提供一个低阻抗导通…

Azkaban其二,具体使用以及告警设置

目录 Azkaban的使用 1、使用Flow1.0(比较老旧) 2、Flow2.0的用法 1、小试牛刀 2、YAML格式的数据 3、多任务依赖 4、内嵌流(嵌套流)案例 5、动态传参 3、Azkaban的报警机制 1)邮箱通知 2)电话报警机制 4、关…

文档 | Rstudio下的轻量级单页面markdown阅读器 markdownReader

需求:在写R数据分析项目的时候,代码及结果的关键变化怎么记录下来?最好git能很容易的跟踪版本变化。 markdown 是最理想的选择,本文给出一种Rstuidio下的轻量级md阅读器实现:markdownReader。书写md还是在Rstudio。更…

SonarQube相关的maven配置及使用

一、maven 全局配置 <settings><pluginGroups><pluginGroup>org.sonarsource.scanner.maven</pluginGroup></pluginGroups><profiles><profile><id>sonar</id><activation><activeByDefault>true</acti…

Arduino Uno简介与使用方法

目录 一、Arduino Uno概述 1. 硬件特性 2. 开发环境 二、Arduino Uno的基本使用方法 1. 硬件连接 2. 软件编程 三、Arduino Uno编程基础 1. 基本语法 2. 常用函数 四、Arduino Uno应用举例 1. LED闪烁 2. 温度检测 3. 超声波测距 五、Arduino Uno的扩展与应用 1…

UniApp | 从入门到精通:开启全平台开发的大门

UniApp | 从入门到精通:开启全平台开发的大门 一、前言二、Uniapp 基础入门2.1 什么是 Uniapp2.2 开发环境搭建三、Uniapp 核心语法与组件3.1 模板语法3.2 组件使用四、页面路由与导航4.1 路由配置4.2 导航方法五、数据请求与处理5.1 发起请求5.2 数据缓存六、样式与布局6.1 样…

滑动窗口。

1456 定长子串中元音的最大数目 采用滑动窗口。每次移动一个位置&#xff0c;判断当前窗口内的子串内目标元素的个数&#xff0c;若比之前更大就更新结果。 如何判断是否更新结果&#xff1f;也即&#xff0c;如何判断当前窗口内所含目标元素个数&#xff0c;是否为遍历到这个…

公共数据授权运营系统建设手册(附下载)

在全球范围内&#xff0c;许多国家和地区已经开始探索公共数据授权运营的路径和模式。通过建立公共数据平台&#xff0c;推动数据的开放共享&#xff0c;促进数据的创新应用&#xff0c;不仅能够提高政府决策的科学性和公共服务的效率&#xff0c;还能够激发市场活力&#xff0…

电脑主机后置音频插孔无声?还得Realtek高清晰音频管理器调教

0 缘起 一台联想电脑&#xff0c;使用Windows 10 专业版32位&#xff0c;电脑主机后置音频插孔一直没有声音&#xff0c;所以音箱是接在机箱前面版的前置音频插孔上的。 一天不小心捱到了音箱的音频线&#xff0c;音频线头断在音频插孔里面了&#xff0c;前置音频插孔因此用不…

【微服务】1、引入;注册中心;OpenFeign

微服务技术学习引入 - 微服务自2016年起搜索指数持续增长&#xff0c;已成为企业开发大型项目的必备技术&#xff0c;中高级java工程师招聘多要求熟悉微服务相关技术。微服务架构介绍 概念&#xff1a;微服务是一种软件架构风格&#xff0c;以专注于单一职责的多个响应项目为基…

UDP_TCP

目录 1. 回顾端口号2. UDP协议2.1 理解报头2.2 UDP的特点2.3 UDP的缓冲区及注意事项 3. TCP协议3.1 报头3.2 流量控制2.3 数据发送模式3.4 捎带应答3.5 URG && 紧急指针3.6 PSH3.7 RES 1. 回顾端口号 在 TCP/IP 协议中&#xff0c;用 “源IP”&#xff0c; “源端口号”…

《Spring Framework实战》2:Spring快速入门

欢迎观看《Spring Framework实战》视频教程 Spring快速入门 目录 1. Java™开发套件&#xff08;JDK&#xff09; 2. 集成开发人员环境&#xff08;IDE&#xff09; 3. 安装Maven 4. Spring快速入门 4.1. 开始一个新的Spring Boot项目 4.2. 添加您的代码 4.3. 尝…

利用Deeplearning4j进行 图像识别

目录 图像识别简介 神经网络 感知器 前馈神经网络 自动编码器 受限玻尔兹曼机 深度卷积网络 理解图像内容以及图像含义方面&#xff0c;计算机遇到了很大困难。本章先介绍计算机理解图像教育方面 遇到的难题&#xff0c;接着重点讲解一个基于深度学习的解决方法。我们会…

PTA DS 基础实验3-2.1 一元多项式求导

基础实验3-2.1 一元多项式求导 分数 20 全屏浏览 切换布局 作者 DS课程组 单位 浙江大学 设计函数求一元多项式的导数。 输入格式: 以指数递降方式输入多项式非零项系数和指数&#xff08;绝对值均为不超过1000的整数&#xff09;。数字间以空格分隔。 注意&#xff1a…

vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。

vue elementUI Plus实现拖拽流程图&#xff0c;不引入插件&#xff0c;纯手写实现。 1.设计思路&#xff1a;2.设计细节3.详细代码实现 1.设计思路&#xff1a; 左侧button列表是要拖拽的组件。中间是拖拽后的流程图。右侧是拖拽后的数据列表。 我们拖动左侧组件放入中间的流…

DC系列之DC-8渗透测试

DC-8 靶机渗透测试实战 靶机下载地址&#xff1a; https://download.vulnhub.com/dc/DC-8.zip&#xff08;下载速度慢可以用迅雷下载&#xff09; 一、实验环境 实验环境&#xff1a; kali2024&#xff1a;192.168.234.145&#xff08;nat模式&#xff09; 靶机环境DC-7&#…

matlab中高精度计算函数vpa与非厄米矩阵本征值的求解

clear;clc;close all tic %并行设置% delete(gcp(nocreate));%关闭之前的并行 cparcluster(local); c.NumWorkers50;%手动设置线程数(否则默认最大线程为12) parpool(c, c.NumWorkers); %并行设置%w1; u2.5;N30;valstozeros(2*N2,100); v10linspace(-3,3,100).;parfor jj1:leng…

GraphRAG vs 传统 RAG:如何通过知识图谱提升 AI 检索能力

相比传统 RAG 仅能独立检索文本片段的局限性&#xff0c;GraphRAG通过构建实体关系图谱实现了信息间的连接&#xff0c;让 AI 能更完整地理解和检索复杂的关联信息&#xff0c;从而生成更准确和连贯的回答 问题背景: 想象有一本详细记录某人(X)成就的传记,每个章节都描述了他的…