创建自定义NER用Spacy DocBin时出现Skipping entity问题咨询
问题1:跳过实体提示的含义、span为None的原因
你代码里触发打印的判断条件是doc.char_span()返回None,这个情况本质是标注的实体字符索引无法对齐到spaCy分词后的完整token边界,具体原因有两类:
- 你用了
alignment_mode="contract"参数,该模式要求实体的start、end索引必须刚好落在分词后token的起始/结束位置,如果你的标注切到了某个token的中间(比如英文单词"ChatGPT"你只标注了前4个字符"Chat"),该模式不会自动调整边界,直接返回None - 标注的索引本身存在错误:比如start为负数、end超过了当前文本的总长度、start >= end这类逻辑错误
问题2:是否属于严重错误
不属于致命错误,程序可以正常跑完生成DocBin文件,但属于需要修复的标注/逻辑类问题,放任不管会影响训练效果。
问题3:对训练的影响及解决方法
影响
所有被跳过的实体标注都会完全失效,模型不会学习到这部分标注的特征,如果跳过的实体占比高,会直接导致模型的实体识别召回率大幅下降,漏识别问题严重。
解决方法
- 先定位错误样本:在打印
Skipping entity的同时,额外打印当前的text、start、end、text[start:end],先排查是不是标注索引写错、越界的问题,手动修正错误标注 - 如果是实体跨token边界导致的对齐问题,可以把
alignment_mode参数改为"expand",该模式会自动把span边界扩展到最近的token边界,不会丢弃标注,仅会有极小的边界偏移,对效果影响远小于丢标注 - 后续标注新数据时,可以先基于spaCy的分词结果做标注,保证标注边界和token边界完全对齐,从根源避免该问题
问题4:100条标注数据的划分比例
小样本数据集优先保证训练集的数据量足够,建议用8:2或者9:1的划分比例:
- 8:2的话训练集80条、验证集20条,平衡训练数据量和验证结果的可靠性
- 如果你的实体类别特别多、单类别样本很少,可以用9:1的划分,避免验证集样本太少导致评估结果波动太大
- 划分的时候尽量做分层抽样,保证训练集和验证集里每个实体类别的占比基本一致,避免评估失真
内容的提问来源于stack exchange,提问作者imhans33
相关产品推荐
相关产品推荐

