新闻详情

新闻详情

首页 / 资讯中心 / 详情

PaddleNLP DuIE 关系抽取基线实战:结构化标注策略与 LIC2021 SPO 抽取完整复现

发布时间:2026/9/25 3:01:23来源:尧图网络
PaddleNLP DuIE 关系抽取基线实战:结构化标注策略与 LIC2021 SPO 抽取完整复现
人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载信息抽取Information Extraction, IE旨在从非结构化自然语言文本中提取实体、关系、事件等结构化知识。本文以 PaddleNLP 仓库中的 DuIE 示例 为主线讲解 LIC2021 DuIE2.0 关系抽取任务的基线方案如何把多条、交叠的 SPO 三元组抽取转化为序列标注任务、如何设计 2N2 标签的结构化标注策略以及从构建模型、加载数据、训练到提交预测结果的完整流程。读完本文你可以复现该基线验证集 F1 约 69.42并理解标签空间、数据预处理、损失计算与结果解码各处的实现细节。一、任务背景DuIE2.0 关系抽取与 SPO 抽取给定一句自然语言文本关系抽取的目标是根据预先定义的 schema 集合抽取出所有满足 schema 约束的 SPOSubject-Predicate-Object三元组schema 定义了关系 P 及其对应主体 S、客体 O 的类别。与常规单标签实体识别不同DuIE2.0 任务的核心难点在于多条 SPO同一句中可能存在多条满足约束的三元组交叠 SPO不同三元组的实体 span 可能交叠甚至同一 token 既属于主体又属于客体如张三创立了张三科技复杂 O 值客体可能是一个带多个槽位的结构化对象如获奖包含获奖奖项、作品、时间等槽位评测时要求所有槽位都精确匹配才算正确。针对这些特点基线系统基于预训练语言模型 ERNIE 设计了结构化的标注策略将任务建模为序列标注问题。二、示例目录结构与文件职责DuIE 示例位于 slm/examples/information_extraction/DuIE主要文件及职责如下DuIE/ ├── data_loader.py # 数据加载与预处理 ├── extract_chinese_and_punct.py # 中文/标点文本切分工具 ├── README.md # 文档说明 ├── re_official_evaluation.py # 比赛官方评价脚本 ├── run_duie.py # 模型训练与预测主脚本 ├── train.sh # 训练启动脚本 ├── predict.sh # 预测启动脚本 └── utils.py # 解码与评测效能函数其中 data/ 目录还包含两个关键的 schema 映射文件data/predicate2id.json 定义标签名到标签 ID 的映射data/id2spo.json 记录每个 ID 对应的 predicate 名称、主体类型与客体类型含value及inWork、onDate等复合槽位两者共同构成解码阶段的 schema 字典。三、结构化标注策略2N2 标签体系比赛对标准的 BIO 标注进行了扩展。对于每个 token根据其在实体 span 中的位置B、I、O 三种打上对应标签并且根据 token 所参与构建的 predicate 种类进一步细分 B 标签。给定 schema 集合对于 N 种 predicate 以及头实体/尾实体两种情况共设计 2N 种 B 标签再合并 I 和 O 标签每个 token 一共有2N2个标签标签 0Otoken 不属于任何实体标签 1Itoken 处于某个实体 span 的内部跨关系共享不区分关系类型标签 2 ~ N1简单关系的主体 B 标签每个 predicate 占一个标签 N2 ~ 2N1对应关系的客体 B 标签与主体标签一一偏移。从 data_loader.py 的parse_label函数可以看到这一偏移量的具体实现客体标签 ID 固定等于主体标签 ID加 55label_object label_subject 55这是因为本数据集共有 55 个 predicate标签 2~56标签 0、1 被 O 和 I 占用。run_duie.py中总标签数由此推导num_classes (len(label_map.keys()) - 2) * 2 2即predicate2id.json中共 57 个 keyO、I 加 55 个 predicate故模型输出层为112 维的多标签 logits。由于是逐 token 的多标签分类同一 token 可同时命中多个 B 标签从源码结构看这正是支持交叠 SPO的关键。parse_label中还有一段值得注意的交叠实体处理逻辑当同一句中主体与客体 span 可能重叠时实现上先标注更长的实体再用禁标区间forbidden_index限制较短实体只匹配在区间之外的位置防止单个 token 被标注进两个冲突的实体 span例如 xyz 创立了 xyz 公司 这类样例。四、评价方法对测试集上系统输出的 SPO 与人工标注的 SPO 进行精准匹配采用 F1 作为评价指标对于复杂 O 值类型的 SPO必须所有槽位都精确匹配才算抽取正确针对文本中实体别名问题可使用百度知识图谱的别名词典alias_file辅助评测。F1 的计算方式F1 (2 * P * R) / (P R) P 测试集所有句子中预测正确的 SPO 个数 / 测试集所有句子中预测出的 SPO 个数 R 测试集所有句子中预测正确的 SPO 个数 / 测试集所有句子中人工标注的 SPO 个数仓库中的 re_official_evaluation.py 即比赛评价脚本的实现。从源码可以看到它在匹配前做了归一化与去重del_bookname会去掉实体名两侧的《》书名号并转小写_parse_structured_ovaluedel_duplicate借助别名词典去掉同义重复三元组_is_equal_o对结构化客体做槽位级双向比对键集合与每个槽位值都需相等值允许走别名等价。这与复杂 O 值必须全部槽位精确匹配的评测口径一致。五、Step 1构建序列标注模型该任务可看作序列标注任务基线采用 ERNIE 序列标注模型。PaddleNLP 通过AutoModelForTokenClassification一键加载预训练模型并指定分类头维度通过AutoTokenizer完成文本 token 化、转 token ID 与长度截断/填充from paddlenlp.transformers import AutoModelForTokenClassification, AutoTokenizer model AutoModelForTokenClassification.from_pretrained(ernie-3.0-medium-zh, num_classes(len(label_map) - 2) * 2 2) tokenizer AutoTokenizer.from_pretrained(ernie-3.0-medium-zh)文本数据直接调用 tokenizer 即可得到模型输入inputs tokenizer(text请输入测试样例, max_seq_len20) # {input_ids: [1, 647, 789, 109, 558, 525, 314, 656, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], # token_type_ids: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], # seq_len: 9}run_duie.py 中的对应实现是label_map_path os.path.join(args.data_path, predicate2id.json) with open(label_map_path, r, encodingutf8) as fp: label_map json.load(fp) num_classes (len(label_map.keys()) - 2) * 2 2 model AutoModelForTokenClassification.from_pretrained(ernie-3.0-medium-zh, num_classesnum_classes) model paddle.DataParallel(model) tokenizer AutoTokenizer.from_pretrained(ernie-3.0-medium-zh)注意num_classes不是硬编码的而是从数据集同目录下的predicate2id.json动态推导——更换 schema 时无需改动模型构建代码。六、Step 2加载并处理数据集训练数据需要从比赛官网下载解压后存放于data/目录并重命名为train_data.json、dev_data.json、test_data.json。每个文件为一行一个 JSON 对象的 JSONL 格式包含text字段预测时还有spo_list字段。基线通过继承paddle.io.Dataset自定义DuIEDataset只需实现__getitem__与__len__见 data_loader.py 第 197~250 行train_dataset DuIEDataset.from_file( os.path.join(args.data_path, train_data.json), tokenizer, args.max_seq_length, True) test_dataset DuIEDataset.from_file( os.path.join(args.data_path, dev_data.json), tokenizer, args.max_seq_length, True)from_file会顺带读取同目录下的predicate2id.json作为 label_map并逐行读取数据集。相比直接用 tokenizer 处理DuIEDataset在convert_example_to_feature中做了两件对关系抽取至关重要的事中文感知的细粒度切分调用 extract_chinese_and_punct.py 中的ChineseAndPunctuationExtractor。该类基于 Unicode 区间构建正则把文本切分为单个汉字/单个标点与连续的英文、数字串两类单元后者整串参与 tokenizer 切分避免英文词被逐字符拆开token 到原文字符的索引映射为每个 sub-token 记录tok_to_orig_start_index/tok_to_orig_end_index指向原文的字符偏移。这是解码阶段把 sub-word 序列还原为完整实体字符串的依据如 tokenizer 把获奖切成多个 sub-token 时仍能用原文切片拼回完整实体。__getitem__返回的字段为input_ids、seq_lens、tok_to_orig_start_index、tok_to_orig_end_index、labelsfloat32 的多标签矩阵。[CLS]、[SEP]、[PAD]位置统一标注为 O 标签第 0 维为 1序列不足max_seq_length时用 O 标签补齐保证 batch 内可直接np.stack由 data_loader.py 中的DataCollator完成堆叠。七、Step 3损失函数、优化器与启动训练README 提到基线选择均方误差作为损失函数而从 run_duie.py 的实际实现看损失函数是带掩码的二元交叉熵class BCELossForDuIE(nn.Layer): def __init__(self): super(BCELossForDuIE, self).__init__() self.criterion nn.BCEWithLogitsLoss(reductionnone) def forward(self, logits, labels, mask): loss self.criterion(logits, labels) mask paddle.cast(mask, float32) loss loss * mask.unsqueeze(-1) loss paddle.sum(loss.mean(axis2), axis1) / paddle.sum(mask, axis1) loss loss.mean() return loss这里mask由(input_ids ! 0) (input_ids ! 1) (input_ids ! 2)生成即剔除[PAD]、[CLS]、[SEP]三个特殊 token先对每个 token 的 112 维 logits 求均值再按句子有效长度加权平均保证不同长度的句子损失权重一致。这种逐位独立的多标签 BCE 恰好适配同一 token 可属于多个实体的场景。优化器使用paddle.optimizer.AdamW配合 PaddleNLP 提供的LinearDecayWithWarmup学习率调度权重衰减只作用于非 bias、非 LayerNorm 的参数lr_scheduler LinearDecayWithWarmup(args.learning_rate, num_training_steps, args.warmup_ratio) decay_params [p.name for n, p in model.named_parameters() if not any(nd in n for nd in [bias, norm])] optimizer paddle.optimizer.AdamW( learning_ratelr_scheduler, parametersmodel.parameters(), weight_decayargs.weight_decay, apply_decay_param_funlambda x: x in decay_params, )训练主循环每 50 步打印一次 loss 与速度每 10000 步save_steps 10000在验证集上跑一次评测并保存 checkpoint 到checkpoints/下的model_{step}.pdparams训练结束后还会对最终模型做一轮评测并落盘。run_duie.py 支持的命令行参数含默认值如下参数默认值说明--do_train/--do_predictFalse选择训练或预测模式--init_checkpointNone预测时加载的参数文件路径--data_path./data数据目录需包含训练/验证 json 与predicate2id.json--predict_data_file./data/test_data.json预测数据文件--output_dir./checkpointscheckpoint 输出目录--max_seq_length128序列最大长度超长截断、不足补齐--batch_size8每张卡的 batch size--learning_rate5e-5初始学习率--weight_decay0.0权重衰减系数--num_train_epochs3训练轮数--warmup_ratio0线性 warmup 占总步数比例--seed42随机种子random/numpy/paddle 统一设置--devicegpu训练设备可选cpu/gpu启动训练sh train.shtrain.sh 的具体配置为BATCH_SIZE8、LR2e-5、EPOCH12、warmup_ratio0.06、max_seq_length128并通过python -m paddle.distributed.launch --gpus 0启动脚本中先unset CUDA_VISIBLE_DEVICES保证 launch 器能指定 GPUexport BATCH_SIZE8 export LR2e-5 export EPOCH12 unset CUDA_VISIBLE_DEVICES python -m paddle.distributed.launch --gpus 0 run_duie.py \ --device gpu \ --seed 42 \ --do_train \ --data_path ./data \ --max_seq_length 128 \ --batch_size $BATCH_SIZE \ --num_train_epochs $EPOCH \ --learning_rate $LR \ --warmup_ratio 0.06 \ --output_dir ./checkpoints训练过程中模型保存在当前目录checkpoints文件夹下同时在训练的同时使用官方评测脚本进行评估输出 P/R/F1 指标。在验证集上该基线 F1 可以达到 69.42。八、Step 4预测与提交结果将训练保存的模型加载后进行预测sh predict.shpredict.sh 的关键配置是加载训练产出的 checkpoint示例中为./checkpoints/model_90000.pdparams对应 90000 步保存点以较大的BATCH_SIZE64对./data/test1.json做预测export CUDA_VISIBLE_DEVICES0 export BATCH_SIZE64 export CKPT./checkpoints/model_90000.pdparams export DATASET_FILE./data/test1.json python run_duie.py \ --do_predict \ --init_checkpoint $CKPT \ --predict_data_file $DATASET_FILE \ --max_seq_length 128 \ --batch_size $BATCH_SIZE预测模式复用了训练阶段的evaluate函数区别在于modepredict时不删除中间结果文件而是把格式化输出写入data/predictions.json并压缩为data/predictions.json.zip格式与原数据集文件一致可直接提交评测网站。解码逻辑集中在 utils.py 的decoding函数中可以概括为三步二值化对 sigmoid 后的 logits 取 0.5 阈值logits[logits 0.5] 1并切掉[CLS]/[SEP]对应的位置实体召回find_entity找到某 predicate 的 B 标签位置后向后连续吸收带 I 标签第 1 维为 1的 token再用tok_to_orig_*_index在原文上切片还原实体字符串同句同一 predicate 的多个实体用list(set(...))去重SPO 组装主体 ID 范围为1 id 56且其对应的客体标签id 55也出现在预测中时才构成合法 SPO普通关系直接输出subject/object.value对复杂关系标签 8/10/26/32/46即上映时间、饰演、获奖、配音、票房还会检查相邻的附属关系标签9、11、27~29、33、47把inWork、onDate、period等附加槽位合并进object字典最终结合id2spo.json中的predicate、subject_type、object_type名称输出与数据集同构的 JSON。之后可以使用官方评估脚本评估模型在dev_data.json上的效果python re_official_evaluation.py --golden_filedev_data.json --predict_filepredictions.json.zip [--alias_file alias_dict]输出指标为 Precision、Recall 和 F1。--alias_file包含合法的实体别名最终评测时会使用脚本默认不提供。utils.py中的get_precision_recall_f1也是以子进程方式调用该脚本并解析其 JSON 输出的说明训练循环中的在线评测与离线评测共用同一套口径。九、进阶更换更强的预训练底座基线采用的预训练模型为 ERNIE而 PaddleNLP 提供了丰富的预训练模型BERT、RoBERTa、Electra、XLNet 等。以 RoBERTa large 中文模型为例只需更换模型和 tokenizer 即可无缝衔接from paddlenlp.transformers import RobertaForTokenClassification, RobertaTokenizer model RobertaForTokenClassification.from_pretrained( roberta-wwm-ext-large, num_classes(len(label_map) - 2) * 2 2) tokenizer RobertaTokenizer.from_pretrained(roberta-wwm-ext-large)由于数据管线中的 token 化、原文索引映射、标签构造都只依赖 tokenizer 接口_tokenize与convert_tokens_to_ids替换底座后DuIEDataset、DataCollator、解码与评测代码均无需改动——这也是把任务抽象成序列标注 自定义解码带来的工程收益。十、小结与延伸阅读本文围绕 PaddleNLP 的 DuIE 示例梳理了关系抽取基线的完整技术链路标注层面2N2 结构化标签55 个 predicate 对应 112 维输出让一个序列标注模型原生支持多条、交叠 SPO数据层面DuIEDataset通过中文感知切分与 token→原文字符索引解决 sub-word 对齐和实体字符串还原问题训练层面掩码 BCE 损失 AdamW LinearDecayWithWarmup每 10000 步在线评测并保存 checkpoint解码与评测层面0.5 阈值二值化、I 标签连读还原实体、复杂关系槽位合并配合官方评测脚本的槽位级精确匹配含别名等价完成 P/R/F1 计算。相关文件路径供进一步深入训练与预测主脚本slm/examples/information_extraction/DuIE/run_duie.py数据集与标签构造slm/examples/information_extraction/DuIE/data_loader.py解码与评测工具slm/examples/information_extraction/DuIE/utils.py官方评价脚本slm/examples/information_extraction/DuIE/re_official_evaluation.py中文切分工具slm/examples/information_extraction/DuIE/extract_chinese_and_punct.pyschema 映射data/predicate2id.json、data/id2spo.json学术上可参考的原始资料为 DuIE: A Large-scale Chinese Dataset for Information ExtractionCCF EV 论文它定义了该数据集的任务形式与 schema 设计。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐X-AnyLabeling 关键信息抽取KIE标注实战SER 实体识别与 RE 关系抽取完整工作流X AnyLabeling 关键信息抽取KIE标注实战SER 实体识别与 RE 关系抽取完整工作流 关键信息抽取Key Information Extr人工智能AI 应用数据标注计算机视觉桌面应用多模态PaddleNLP 信息抽取 Taskflow 实战基于 UIE 的零样本实体、关系、事件与观点抽取PaddleNLP 信息抽取 Taskflow 实战基于 UIE 的零样本实体、关系、事件与观点抽取 开放域信息抽取是信息抽取的一种全新范式其核心思想是减少人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP DuEE 事件抽取实战基于 ERNIE 的触发词-论元 Pipeline 基线复现与优化PaddleNLP DuEE 事件抽取实战基于 ERNIE 的触发词 论元 Pipeline 基线复现与优化 本文以 PaddleNLP 仓库中的 LIC20人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP上一篇wger后端性能监控使用Sentry监控健身平台性能下一篇Cat-Catch终极指南5分钟快速掌握浏览器资源嗅探技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

基于 MongoDB Atlas 搭建 Mage AI 数据源测试环境的实践指南 2026/9/25 3:43:42

基于 MongoDB Atlas 搭建 Mage AI 数据源测试环境的实践指南

数据工程数据编排ETL任务调度批处理流处理数据集成后端 【免费下载链接】mage-ai 🧙 Build, run, and manage data pipelines for integrating and transforming data. 项目地址: https://gitcode.com/gh_mirrors/ma/mage-ai 点击查看 免费下载 MongoDB…

阅读更多 →
OptiScaler 完整指南:5 种方法在 DLSS、FSR、XeSS 之间自由切换并给游戏补帧 2026/9/25 3:43:42

OptiScaler 完整指南:5 种方法在 DLSS、FSR、XeSS 之间自由切换并给游戏补帧

OptiScaler 完整指南:5 种方法在 DLSS、FSR、XeSS 之间自由切换并给游戏补帧 【免费下载链接】OptiScaler OptiScaler bridges upscaling/frame gen across GPUs. Supports DLSS2/XeSS/FSR2 inputs, replaces native upscalers, enables FSR-FG/XeFG on non-FG titl…

阅读更多 →
cuDF Java JAR 构建与发布流水线:基于 ci-wheel 容器的一站式打包实践 2026/9/25 3:43:42

cuDF Java JAR 构建与发布流水线:基于 ci-wheel 容器的一站式打包实践

数据分析数据工程机器学习 【免费下载链接】cudf cuDF - GPU DataFrame Library 项目地址: https://gitcode.com/gh_mirrors/cu/cudf 点击查看 免费下载 cuDF 的 Java API 依赖一个内嵌静态 libcudf 的 JNI 层,其打包过程涉及静态库编译、Maven classi…

阅读更多 →
深入解析 Basic Computer Games 之 Poker:规则、AI 下注策略与移植注意事项 2026/9/25 3:43:35

深入解析 Basic Computer Games 之 Poker:规则、AI 下注策略与移植注意事项

示例工程 【免费下载链接】basic-computer-games An updated version of the classic "Basic Computer Games" book, with well-written examples in a variety of common MEMORY SAFE, SCRIPTING programming languages. See https://coding-horror.github.io/basic…

阅读更多 →
Tekton Pipeline 控制器启动参数(Controller Flags)完全指南:从注册原理到生产配置 2026/9/25 3:43:35

Tekton Pipeline 控制器启动参数(Controller Flags)完全指南:从注册原理到生产配置

云原生CI/CDDevOps后端 【免费下载链接】pipeline A cloud-native Pipeline resource. 项目地址: https://gitcode.com/gh_mirrors/pipelin/pipeline 点击查看 免费下载 tektoncd/pipeline(本项目 pipeline)随发行版内置了多个控制器二进制&…

阅读更多 →
SendGrid Go SDK 使用指南:基于 sendgrid-go 全面调用 Twilio SendGrid v3 API 2026/9/25 3:43:35

SendGrid Go SDK 使用指南:基于 sendgrid-go 全面调用 Twilio SendGrid v3 API

网络安全 【免费下载链接】sliver Adversary Emulation Framework 项目地址: https://gitcode.com/gh_mirrors/sl/sliver 点击查看 免费下载 本指南以本仓库 vendor/github.com/sendgrid/sendgrid-go/USAGE.md 为骨架,完整讲解用 Go 语言通过 sendgrid-…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉