You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用spacy评估基于IOB数据训练的命名实体识别器?

spaCy IOB格式NER评估方案

spaCy 内置的Scorer工具不直接接收IOB格式的标签输入,你可以选择两种方案完成评估,无需额外引入第三方工具:

方案1:转换为spaCy标准格式评估(推荐)

这是最稳妥的方案,转换成本很低,还可以直接复用spaCy内置的全量评估逻辑(支持实体级指标、分类型统计等):

  • 用spacy.training.iob_utils模块下的iob_tags_to_spans方法,直接把IOB标签序列转为spaCy可识别的实体Span对象
  • 分别将真值IOB和预测IOB关联到对应文本的Doc对象上,构造Example实例喂给Scorer即可

代码示例:

import spacy
from spacy.training import Example
from spacy.training.iob_utils import iob_tags_to_spans
from spacy.scorer import Scorer

# 初始化对应语言的空pipeline,英文替换为"en"即可
nlp = spacy.blank("zh")
scorer = Scorer()
examples = []

# 示例数据集格式:每条包含原文、真值IOB列表、预测IOB列表
your_iob_dataset = [
    ("我在北京工作", ["O", "B-GPE", "I-GPE", "O", "O"], ["O", "B-GPE", "I-GPE", "O", "O"])
]

for text, true_iob, pred_iob in your_iob_dataset:
    # 构造真值Doc
    true_doc = nlp.make_doc(text)
    true_ents = iob_tags_to_spans(true_doc, true_iob)
    true_doc.set_ents(true_ents)
    # 构造预测结果Doc
    pred_doc = nlp.make_doc(text)
    pred_ents = iob_tags_to_spans(pred_doc, pred_iob)
    pred_doc.set_ents(pred_ents)
    # 加入评估示例集
    examples.append(Example(pred_doc, true_doc))

# 输出评估指标
scores = scorer.score(examples)
print(f"整体精确率: {scores['ents_p']:.2f} 召回率: {scores['ents_r']:.2f} F1: {scores['ents_f']:.2f}")
print("分实体类型指标:", scores["ents_per_type"])

方案2:直接基于IOB序列计算指标

如果不想转换为spaCy的Doc格式,你可以自行实现实体级的指标统计逻辑:

  • 先对齐每条样本的真值IOB和预测IOB序列,确保token顺序完全一致
  • 分别从两个序列中提取所有实体的起始位置、结束位置、实体类型三元组
  • 统计三元组匹配的TP(预测正确的实体数)、FP(预测错误的实体数)、FN(漏检的实体数),再计算P/R/F1即可

注意事项

  • 如果你的标签是BIOES(BILUO)格式,把iob_tags_to_spans替换为biluo_tags_to_spans即可
  • 转换前要确保真值和预测的IOB标签命名规则完全一致,比如实体类型的大小写、拼写完全相同,避免评估结果偏差

内容的提问来源于stack exchange,提问作者Balkhrod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:27:06