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

如何去除spaCy doc.ents实体的空白解决NER训练E024报错

spaCy NER实体首尾空白去除方案

你遇到的E024报错是spaCy NER训练/推理阶段的常见问题,核心原因是实体跨度包含首尾空白,不符合spaCy的标注规则,可通过以下三种方法解决:

1. 运行时直接修剪Doc实体

如果你是在推理阶段获取到的doc.ents带空白,直接用Span自带的修剪方法处理即可,spaCy 3.x及以上版本可用:

import spacy
from spacy.tokens import Span

# 加载你使用的NER模型
nlp = spacy.load("你的模型路径")
doc = nlp("待处理的原始文本")

cleaned_ents = []
for ent in doc.ents:
    # 自动去除实体首尾空白
    stripped_ent = ent.strip()
    # 过滤修剪后为空的无效实体
    if stripped_ent:
        cleaned_ents.append(stripped_ent)

# 将修剪后的实体替换回Doc对象
doc.set_ents(cleaned_ents)

如果使用的是spaCy 2.x版本,没有内置的Span.strip()方法,可以手动计算偏移量处理:

cleaned_ents = []
for ent in doc.ents:
    raw_text = ent.text
    start_char = ent.start_char
    end_char = ent.end_char
    # 计算首尾需要裁剪的空白长度
    left_strip_len = len(raw_text) - len(raw_text.lstrip())
    right_strip_len = len(raw_text) - len(raw_text.rstrip())
    # 计算新的实体起止偏移
    new_start = start_char + left_strip_len
    new_end = end_char - right_strip_len
    if new_start < new_end:
        # 生成新的实体Span
        new_ent = doc.char_span(new_start, new_end, label=ent.label_)
        if new_ent:
            cleaned_ents.append(new_ent)
doc.set_ents(cleaned_ents)

2. 预处理训练标注数据

如果是训练阶段报这个错,直接在构造训练数据集时就提前修剪实体:

  • 对标注的实体文本执行strip()操作,得到无首尾空白的实体内容
  • 调整实体的起始偏移:原起始偏移 + 原实体文本头部裁剪的空白长度
  • 调整实体的结束偏移:原结束偏移 - 原实体文本尾部裁剪的空白长度
  • 用调整后的起止偏移和实体标签生成训练标注即可

3. 用官方工具批量校验修复

可以直接运行spaCy自带的数据校验命令,自动扫描所有训练数据中的非法标注:
python -m spacy debug data 你的训练配置文件路径.cfg
命令输出会直接列出所有带首尾空白的实体标注位置,按照提示批量修改即可。

注意:修剪实体后一定要确认新的偏移量完全匹配原始文本,不要出现实体跨token、超出文本范围的情况,否则仍会触发同类报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:36:05