SpaCy 3更新fr_core_news_lg的NER模型报错无entity属性怎么解决?
报错修复方案
错误根因
你更新到spaCy 3.x版本后,原spaCy 2.x的nlp.entity直接访问实体组件的API被废弃,所有管道组件必须通过nlp.get_pipe(组件名)的方式获取,同时nlp.update的入参格式也有同步调整。
修复步骤
- 第一步:调整优化器创建逻辑,从获取到的ner组件实例调用创建方法
- 第二步:适配spaCy 3.x的
nlp.update入参要求,将原始文本和标注转换为Example对象
修改后的完整代码
首先新增依赖导入:
from spacy.training import Example
调整后的train方法:
def train(self, label, n_iter=10, batch_size=50): # 先获取ner管道组件,再创建优化器 ner = self.nlp.get_pipe('ner') optimizer = ner.create_optimizer() other_pipes = [pipe for pipe in self.nlp.pipe_names if pipe != 'ner'] # 新增实体标签 ner.add_label(label) with self.nlp.disable_pipes(*other_pipes): for itn in range(n_iter): random.shuffle(self.train_data) losses = {} # 分批迭代训练数据 for batch in spacy.util.minibatch(self.train_data, size=batch_size): # 适配3.x入参格式,转换为Example对象 examples = [] for text, annotations in batch: doc = self.nlp.make_doc(text) example = Example.from_dict(doc, annotations) examples.append(example) # 更新模型 self.nlp.update(examples, sgd=optimizer, losses=losses) print(losses) print("Final loss: ", losses)
额外验证点
你提供的训练样本格式符合要求,不需要调整,修改代码后即可正常运行训练逻辑。
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

