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

诸神缄默不语-个人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:
                        # 将结果解析为 JSON
                        parsed_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("任务完成!")

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mysql COUNT() 函数详解

简介 COUNT()函数定义 COUNT()函数是SQL中常用的 聚合函数 ,用于统计满足特定条件的记录数。它可以灵活地应用于各种查询场景,帮助用户快速获取所需的数据统计信息。该函数不仅能够计算所有行的数量,还能针对特定列进行计数,并支…

SD卡恢复数据:快速找回丢失文件!

由于其小尺寸和便携性,SD卡作为外部存储设备在用户中广泛应用。它适用于各种设备,例如数码相机、摄像机、音乐播放器、手机、电视、无人机等。 但是,与其他类型的存储设备一样,SD卡很精致,使用一段时间后可能会出现程…

OpenStack系列第四篇:云平台基础功能与操作(Dashboard)

文章目录 1. 镜像(Image)添加镜像查看镜像删除镜像 2. 卷(Volume)创建卷查看卷删除卷 3. 网络(虚拟网络)创建网络查看网络删除网络 4. 实例类型创建实例类型查看实例类型删除实例类型 4. 密钥对&#xff08…

HTML——43.创建表格

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>表格</title></head><body><!--table标签用来定义表格&#xff0c;border属性表示边框--><!--tr标签表示表格中的一行--><!--th标签表示表…

Sony偏振传感器加持 Blackfly S工业相机突破视觉成像反光难题【51camera】

为什么采用传感器偏振? A: 视觉系统一直都在试图克服玻璃、塑料和金属等反光表面产生的动态或多余光线、反射、朦胧和眩光影响。Teledyne FLIR的Blackfly S 机器视觉工业相机具有 Sony 的传感器偏振和 Spinnaker SDK 内置的防眩光功能&#xff0c;提供便于实施、轻量化且可靠…

Linux上安装配置单节点zookeeper

直接先去官网下载安装包&#xff0c; https://downloads.apache.org/zookeeper/ 选择合适的版本&#xff0c;然后上传至服务器 解压&#xff1a; tar -zxvf apache-zookeeper-3.9.3-bin.tar.gz创建data和logs目录 mkdir data mkdir logs配置环境变量&#xff1a; vim /etc/p…

零基础入门指针的应用

对于我这个非计算机专业的人来说&#xff0c;指针真的很让我头疼&#xff0c;该如何理解指针、如何使用指针是我的痛点&#xff0c;但是在嵌入式中又会经常用的到&#xff0c;所以本文将介绍该如何求使用指针。 一、指针的概念 什么是指针&#xff1f;指针就是编程语言中的一个…

Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(1):Oracle Dataguard 概述

Oracle Dataguard&#xff08;主库为 Oracle 11g 单节点&#xff09;配置详解&#xff08;1&#xff09;&#xff1a;Oracle Dataguard 概述 目录 Oracle Dataguard&#xff08;主库为 Oracle 11g 单节点&#xff09;配置详解&#xff08;1&#xff09;&#xff1a;Oracle Data…

Java开发生态2024年度总结报告

1 关键要点 尽管数据显示 Java 17 是最常用 JDK&#xff0c;但其用户占比并未超过半数。根据 New Relic 2024 Java 生态系统状态报告&#xff0c;Java 17、11 和 8 的用户比例分别为 35%、33% 和 29%。New Relic 数据中所谓“快速采用”指 Java 21 的采用率仅为 1.4%。虽相较 J…

PlasmidFinder:质粒复制子的鉴定和分型

质粒&#xff08;Plasmid&#xff09;是一种细菌染色体外的线性或环状DNA分子&#xff0c;也是一种重要的遗传元素&#xff0c;它们具有自主复制能力&#xff0c;可以在细菌之间传播&#xff0c;并携带多种重要的基因(如耐药基因与毒力基因等)功能。根据质粒传播的特性&#xf…

277-基于八路256Ksps 24bit AD生物电震动检测FMC子卡

一、板卡概述 板卡基于AD7768 AD芯片设计的八路低速采集的FMC 子卡&#xff0c;支持直流耦合&#xff0c;产品应用于生物电、脑电波、声音&#xff0c;震动等信号采集。 二、板卡参数及性能 板卡功能 参数 内容 ADC 芯片型号 AD7768 路数 8路ADC&#xff0c; 采样率 2…

[TOTP]android kotlin实现 totp身份验证器 类似Google身份验证器

背景&#xff1a;自己或者公司用一些谷歌身份验证器或者microsoft身份验证器&#xff0c;下载来源不明&#xff0c;或者有广告&#xff0c;使用不安全。于是自己写一个&#xff0c;安全放心使用。 代码已开源&#xff1a;shixiaotian/sxt-android-totp: android totp authenti…

耳切法简述

耳切法简述 将简单多边形分解成三角形称为多边形的三角剖分。对n个顶点的简单多边形的任何三角剖分都有n-2个三角形。其中最简单的算法&#xff0c;称为耳切法&#xff08;EarClipping&#xff09;。 耳的定义 多边形的一个 “耳” 是由 V i 0 V_{i_{0}} Vi0​​、 V i 1 V_…

国内外大模型以及部署

国内15家AI大模型应用盘点 AI大模型 秘塔AI搜索 秘塔AI搜索免登录&#xff0c;免费的问答大模型。 开源大模型 Ollama Ollama是一个专注于提供 大语言模型&#xff08;LLM&#xff09; 本地化部署和运行的工具和资源的平台。它旨在帮助用户轻松地在自己的设备上运行和定制…

2024年终总结:非常充实的一年

一、业务方面 2024年是业务全面拓展与技术深耕的一年。从日常的开发维护到新产品研发&#xff0c;从降本增效到业务创新&#xff0c;每一步都在不断累积成长。以下是我的年度业务总结&#xff1a; 日常工作&#xff1a;聚焦于软件开发、维护、运营和售后工作&#xff0c;同时…

UE5材质节点VertexNormalWs/PixelNormalWS

VertexNormalWs顶点法线方向&#xff0c;此节点可以做物体上积雪、青苔等效果 PixelNormalWS像素法线方向

MAC环境安装(卸载)软件

MAC环境安装&#xff08;卸载&#xff09;软件 jdknode安装node&#xff0c;并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净&#xff0c;可以再细分删除验证删除结果 jdk 1.下载jdk 先去官网下载自己需要的版…

玩具租赁系统设计与实现(文末附源码)

博主介绍&#xff1a;✌全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLM…

C403 unity打开方法

1 unity hub右键以管理员方式打开。 2 注册登录账户 如果出现 如果还是不行&#xff0c;把地址栏的网址复制&#xff0c;在google浏览器中打开 如果出现安全策略&#xff0c;就不勾选安全防护 尝试方案1 把unityhub在任务管理器中关闭 如果验证码发送成功&#xff0c;还是进不…

log4j2的Strategy、log4j2的DefaultRolloverStrategy、删除过期文件

文章目录 一、DefaultRolloverStrategy1.1、DefaultRolloverStrategy节点1.1.1、filePattern属性1.1.2、DefaultRolloverStrategy删除原理 1.2、Delete节点1.2.1、maxDepth属性 二、知识扩展2.1、DefaultRolloverStrategy与Delete会冲突吗&#xff1f;2.1.1、场景一&#xff1a…