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

诸神缄默不语-个人优快云博文目录

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("任务完成!")

在这里插入图片描述

### 使用大语言模型实现文本关系抽取的最佳实践 #### 3.1 基于大语言模型关系抽取 为了有效利用大语言模型进行关系抽取,通常采用以下几种策略: - **预训练微调**:预训练大语言模型已经在海量文本数据上进行了充分的学习,具备了广泛的语言知识。对于特定的任务如关系抽取,可以通过在目标领域的小规模标注数据集上进一步微调来提升性能[^2]。 ```python from transformers import BertTokenizer, BertForSequenceClassification import torch tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertForSequenceClassification.from_pretrained('bert-base-uncased') def prepare_data(texts, labels): encodings = tokenizer(texts, truncation=True, padding=True, max_length=512) dataset = DatasetDict({ 'input_ids': encodings['input_ids'], 'attention_mask': encodings['attention_mask'], 'labels': labels}) return dataset train_dataset = prepare_data(training_texts, training_labels) training_args = TrainingArguments( output_dir='./results', num_train_epochs=3, per_device_train_batch_size=8, warmup_steps=500, weight_decay=0.01, logging_dir='./logs' ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset ) trainer.train() ``` - **提示工程技术(Prompt Engineering)**:通过精心设计的模板或提示词引导模型识别实体间的关系。这种方法不需要额外的数据标签,仅需少量样例即可让模型学会模式匹配[^1]。 ```plaintext Template Example: Sentence: "The company [SUBJECT] is located in the city of [OBJECT]." Relation Type: Located_In ``` - **零样本/少样本学习**:借助大语言模型的强大泛化能力,在几乎没有任何专门针对某一类别的训练实例的情况下完成新类别下的关系预测工作。这特别适用于那些难以获得充足标记样本的情况[^3]。 ```python from transformers import pipeline nlp = pipeline("text-classification", model="distilbert-base-cased-finetuned-conll03-english") result = nlp([ {"sentence": "Apple was founded by Steve Jobs.", "relation_type": "Founded_By"}, {"sentence": "Paris is the capital of France.", "relation_type": "Capital_Of"} ]) print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸神缄默不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值