尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

PaddleNLP 拼写纠错评估指标详解:DetectionF1 与 CorrectionF1(SIGHAN 评测体系)

PaddleNLP 拼写纠错评估指标详解:DetectionF1 与 CorrectionF1(SIGHAN 评测体系) 人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载导读本文聚焦 PaddleNLP 中面向中文拼写纠错Chinese Spelling Correction, CSC任务的专用评估模块 paddlenlp.metrics.sighan。该模块基于 SIGHAN 系列评测如 SIGHAN 2015 中文拼写纠错任务的评测口径提供了错误检测与纠错结果两套 F1 指标实现。读完本文你将掌握DetectionF1与CorrectionF1的统计逻辑、与 Paddle 训练框架的接入方式以及它们与paddle.metric.Metric基类之间的关系。一、模块定位SIGHAN 评测任务与指标语义paddlenlp.metrics.sighan对应 PaddleNLP 文档中sighan这个 API 页面见 paddlenlp.metrics.sighan.rst是paddlenlp.metrics指标族中面向中文拼写纠错场景的一员。SIGHAN 是什么SIGHANSpecial Interest Group on Chinese Language Processing是 NLP 领域的评测组织其举办的拼写纠错评测任务如 SIGHAN 2013/2014/2015 Bake-off为中文拼写纠错提供了标准数据集与评估口径。PaddleNLP 的该模块即按照“一句文本中是否存在错误、错误位置/纠错结果是否正确”的逐句sequence-level方式统计。与其它指标的区别paddlenlp.metrics下既有 BLEU、Rouge、Perplexity 等生成式指标也有 ChunkEvaluator、SpanEvaluator 等结构化预测指标而sighan模块专门服务于“检测 纠正”两阶段输出的拼写纠错模型。导出方式模块通过__all__ [DetectionF1, CorrectionF1]对外暴露两个类并在 paddlenlp/metrics/init.py 中随包整体导出from .sighan import CorrectionF1, DetectionF1因此用户可以直接from paddlenlp.metrics import DetectionF1, CorrectionF1。两个指标均继承自paddle.metric.Metricsighan.py天然支持update / reset / accumulate / name的标准生命周期可无缝接入 PaddleNLP Trainer 的评估回调。二、DetectionF1错误检测阶段的句子级 F1DetectionF1用于评估模型是否把一句话识别为包含拼写错误即“检测任务”Detection。其核心思想是逐句以 batch 中每条样本为单位判定一次“检出/漏检/误检”再汇总为精确率、召回率与 F1。2.1 初始化class DetectionF1(Metric): def __init__(self, pos_label1, nameDetectionF1, *args, **kwargs): super(DetectionF1, self).__init__(*args, **kwargs) self.pos_label pos_label self._name name self.reset()pos_label表示“该位置存在错误”的标签值默认1对应检测头二分类中的正类正确字符通常为0。name指标实例名称默认DetectionF1可在日志与回调中区分不同指标。构造末尾调用reset()清零内部统计量。2.2 update逐句累计 TP / FP / FNdef update(self, preds, labels, length, *args): # [B, T, 2] pred_labels preds.argmax(axis-1) for i, label_length in enumerate(length): pred_label pred_labels[i][1 : 1 label_length] label labels[i][1 : 1 label_length] # the sequence has errors if (label self.pos_label).any(): if (pred_label label).all(): self.tp 1 else: self.fn 1 else: if (label ! pred_label).any(): self.fp 1输入语义对应 Paddle Metric 协议中的update(output, label, ...)preds形状为[B, T, 2]的检测头 logits/概率分布argmax(axis-1)后得到[B, T]的预测标签labels形状为[B, T]的检测标签0/11 表示该 token 位置为错误length每条样本的真实序列长度不含 padding用于对齐。逐句统计规则关键实现细节忽略[CLS]与 padding切片从位置1开始1 : 1 label_length即跳过[CLS]标记只统计真实 token 区间[SEP]/padding 不参与统计真实含错label 中存在 1若预测标签与真实标签完全一致(pred_label label).all()记为 TP否则记为 FN整句漏检或检错位置不匹配都算漏检真实无错label 全为 0只要预测中出现任意一个 1(label ! pred_label).any()就记为 FP误报。注意这里采用**句子级sequence-level**判定即“这一句有没有被正确检测”而不是按 token 粒度统计这与 SIGHAN 评测中以句子为单位的报告口径一致。2.3 accumulate汇总精确率、召回率与 F1def accumulate(self): precision np.nan if self.tp self.fp 0: precision self.tp / (self.tp self.fp) recall np.nan if self.tp self.fn 0: recall self.tp / (self.tp self.fn) if self.tp 0: f1 0.0 else: f1 2 * precision * recall / (precision recall) return f1, precision, recallPrecisionTP / (TP FP)检出的句子中真实含错的比例RecallTP / (TP FN)真实含错句子中被正确检出的比例F12 * P * R / (P R)当TP 0时 F1 直接取0.0避免除零当分母为 0 时 P/R 返回np.nan。返回值顺序为(f1, precision, recall)在 Trainer 中通常取f1作为监控指标。2.4 reset 与 namereset()将tp / fp / fn全部归零供新一轮 epoch 评估复用name()返回构造时传入的name默认DetectionF1用于日志展示。三、CorrectionF1纠错阶段的联合 F1CorrectionF1继承自DetectionF1sighan.py用于评估纠错模型给出的最终纠错结果是否正确——即不仅要求“检测出错误”还要求“改对了”。它同时消费检测头与纠错头的输出。3.1 初始化class CorrectionF1(DetectionF1): def __init__(self, pos_label1, nameCorrectionF1, *args, **kwargs): super(CorrectionF1, self).__init__(pos_label, name, *args, **kwargs)复用父类的pos_label默认1与reset/accumulate/name逻辑只重写update默认指标名CorrectionF1。3.2 update检测 × 纠错的联合判定def update(self, det_preds, det_labels, corr_preds, corr_labels, length, *args): # [B, T, 2] det_preds_labels det_preds.argmax(axis-1) corr_preds_labels corr_preds.argmax(axis-1) for i, label_length in enumerate(length): # Ignore [CLS] token, so calculate from position 1. det_preds_label det_preds_labels[i][1 : 1 label_length] det_label det_labels[i][1 : 1 label_length] corr_preds_label corr_preds_labels[i][1 : 1 label_length] corr_label corr_labels[i][1 : 1 label_length] # The sequence has any errors. if (det_label self.pos_label).any(): corr_pred_label corr_preds_label * det_preds_label corr_label det_label * corr_label if (corr_pred_label corr_label).all(): self.tp 1 else: self.fn 1 else: if (det_label ! det_preds_label).any(): self.fp 1输入包含四路张量均为[B, T, 2]的 logits/概率分布det_preds/det_labels检测头预测与真实标签corr_preds/corr_labels纠错头预测与真实纠错标签length每条样本真实长度。判定逻辑逐句统一忽略[CLS]从位置1切片到1 label_length真实含错det_label 中存在 1通过逐元素乘法corr_pred_label corr_preds_label * det_preds_label与corr_label det_label * corr_label实现“掩码”——只在检测为错误的位置上比较纠错结果预测与标签都在错误位置置 1 的位置才保留数值。若掩码后的预测与标签完全一致记 TP否则记 FN。这一设计的含义是只有“错误位置找对且该位置改对”才算整句纠错成功真实无错与DetectionF1一致预测中若出现任何错误位置则记 FP。从源码结构看corr_preds_label * det_preds_label这种乘法掩码保证模型在非错误位置即使输出了纠错标签也不参与比较只有检测为错的位置上的纠错结果才被计入实现了“检测 纠正”两阶段联合打分。3.3 指标输出由于accumulate()、reset()、name()均继承自父类CorrectionF1同样返回(f1, precision, recall)且f1在TP 0时为0.0。四、在训练与评估中如何接入4.1 使用 PaddleNLP Metric 标准协议两个类都遵循paddle.metric.Metric的接口约定update / reset / accumulate / name。在 PaddleNLP Trainer 中将指标实例传入compute_metrics回调即可from paddlenlp.metrics import DetectionF1, CorrectionF1 det_metric DetectionF1(pos_label1, nameDetectionF1) corr_metric CorrectionF1(pos_label1, nameCorrectionF1) def compute_metrics(eval_preds): # eval_preds 包含模型输出与标签按 update 的形参顺序组织 # DetectionF1: (preds, labels, length) # CorrectionF1: (det_preds, det_labels, corr_preds, corr_labels, length) det_metric.update(preds, det_labels, length) corr_metric.update(det_preds, det_labels, corr_preds, corr_labels, length) det_f1, det_p, det_r det_metric.accumulate() corr_f1, corr_p, corr_r corr_metric.accumulate() det_metric.reset() corr_metric.reset() return { DetectionF1: det_f1, DetectionPrecision: det_p, DetectionRecall: det_r, CorrectionF1: corr_f1, CorrectionPrecision: corr_p, CorrectionRecall: corr_r, }4.2 输入张量的形状要求参数形状含义preds/det_preds/corr_preds[B, T, 2]对应头的 logits 或概率最后一维做argmax得到标签labels/det_labels/corr_labels[B, T]真实标签0/11表示错误pos_labellength[B]或 list每条样本真实长度用于剔除[CLS]与 padding注意update的形参顺序即调用顺序DetectionF1.update(preds, labels, length)CorrectionF1.update(det_preds, det_labels, corr_preds, corr_labels, length)Batch 内各样本需按length对齐超出1 label_length的位置不参与统计。五、实现要点与边界情况总结句子级统计而非 token 级DetectionF1的 TP/FN/FP 均以整句为单位累计与 SIGHAN 评测的句级口径一致逐 token 的准确率不在此模块覆盖范围内。首位置约定切片从1开始假定序列首位是[CLS]且不参与评测如果模型输入首位不是[CLS]需要自行对齐该约定。除零保护accumulate()对分母为零的情况分别处理——无 TP 时 F1 为0.0P/R 分母为零时返回np.nan不会抛异常。联合掩码设计CorrectionF1用乘法掩码把检测结果与纠错结果绑定天然惩罚“检错位置错”的样本是检测与纠正联合评测的简洁实现。继承与复用CorrectionF1只重写update其余生命周期方法继承自DetectionF1代码结构清晰便于维护与扩展。六、相关资源指标实现源码paddlenlp/metrics/sighan.py指标统一导出paddlenlp/metrics/init.py文档索引页docs/zh/source/paddlenlp.metrics.sighan.rst同目录下其它可复用指标paddlenlp/metrics/含 bleu.py、rouge.py、chunk.py、span.py 等在实现中文拼写纠错模型时将DetectionF1与CorrectionF1同时接入评估流程即可分别报告“检测能力”与“最终纠错能力”两套指标完整对齐 SIGHAN 评测任务的核心评测维度。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐RAG_Techniques评估体系DeepEval与GroUSE评估框架详解RAG_Techniques评估体系DeepEval与GroUSE评估框架详解 引言为什么RAG系统需要专业评估 在构建检索增强生成Retrieval示例工程NLP-progress 语法纠错GEC任务追踪评测基准、评估指标与 SOTA 全景指南NLP progress 语法纠错GEC任务追踪评测基准、评估指标与 SOTA 全景指南 本文是 NLP progress 仓库中 语法纠错任务文档 htNLP知识库文档SubtitleEdit UI 测试项目解析SpellCheckRegex 的 OCR 拼写纠错测试体系SubtitleEdit UI 测试项目解析SpellCheckRegex 的 OCR 拼写纠错测试体系 本篇技术指南以 tests/UI/README.md音视频桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表