Spacy训练NER模型时遇AssertionError: [E923]错误求助
解决spaCy NER训练时[E923]错误的方案
问题根源
这个错误不是单纯删除配置标签就能解决的——tok2vec是NER模型提取词特征的核心组件,它需要足够的训练样本完成初始化,要么你的数据量太少,要么格式存在问题,要么你删除了配置标签但NER组件依然默认依赖它的输出。
具体解决办法
- 检查训练数据规模:
train.spacy里至少要有10-20个标注完整的样本,样本量太少的话tok2vec根本无法学到有效特征。样本不足的话优先补充标注数据。 - 验证数据格式正确性:执行
spacy validate ./train.spacy命令,检查数据是否存在格式错误,比如实体标注不完整、token拆分异常等,有问题先修复再训练。 - 正确配置tok2vec(不要直接删除标签):
- 有预训练词向量的话,在配置文件中指定向量路径,让tok2vec用预训练向量初始化,无需从少量样本中提取特征:
[components.tok2vec] factory = "tok2vec" [components.tok2vec.model] @architectures = "spacy.Tok2Vec.v2" [components.tok2vec.model.embed] @architectures = "spacy.MultiHashEmbed.v2" width = ${components.tok2vec.model.encode.width} attrs = ["ORTH", "SHAPE"] rows = [5000, 2500] include_static_vectors = true [components.tok2vec.model.encode] @architectures = "spacy.MaxoutWindowEncoder.v2" width = 96 depth = 4 window_size = 1 maxout_pieces = 3 - 没有预训练向量的话,强制tok2vec随机初始化,不依赖训练数据完成初始化:
[components.tok2vec.model.embed] @architectures = "spacy.MultiHashEmbed.v2" width = ${components.tok2vec.model.encode.width} attrs = ["ORTH", "SHAPE"] rows = [5000, 2500] include_static_vectors = false initialize_with_vectors = false
- 有预训练词向量的话,在配置文件中指定向量路径,让tok2vec用预训练向量初始化,无需从少量样本中提取特征:
- 临时测试方案(不推荐长期使用):训练命令添加
--disable tok2vec参数,但会导致NER模型特征提取能力大幅下降,仅适合临时调试:python -m spacy train config.cfg --output ./output --paths.train ./train.spacy --paths.dev ./train.spacy --disable tok2vec
额外提醒
不要用同一个文件同时作为训练集和验证集,这会导致模型评估完全失效,建议拆分出独立的验证数据集。
内容的提问来源于stack exchange,提问作者Sourabh Raj
相关产品推荐
相关产品推荐

