nlp.update issue with Spacy 3.0: TypeError: [E978] The Language.update method takes a list of Example objects, but got: {<class 'tuple'>}

nlp.update issue with Spacy 3.0: TypeError: [E978] The Language.update method takes a list of Example objects, but got: {<class 'tuple'>}

Spacy 3.0 版 nlp.update 似乎有一些变化。 我对这个简单的代码完全感到困惑:

examples = TRAIN_DATA
random.shuffle(examples)
losses = {}
    
for batch in minibatch(examples, size=8):
    nlp.update(batch, sgd=optimizer, drop=0.35, losses=losses)

当我执行 type(batch) 时,它表明 batch 是 list 类型。但是错误消息说它是一个元组。我也尝试将其转换为列表但没有成功。我做错了什么?

准确的错误是:


TypeError Traceback(最后一次调用) 在 22 小批量中的批次为 23(示例,大小 = 8): ---> 24 nlp.update(batch, sgd=optimizer, drop=0.35, losses=losses) 25 26 print("损失 ({}/{})".format(epoch + 1, epochs), losses)

~/nlp_learn/statbot/.statbot/lib/python3.8/site-packages/spacy/language.py in update(self, examples, _, drop, sgd, losses, component_cfg, exclude ) 1090 如果 len(示例)== 0: 1091 return 损失 -> 1092 validate_examples(示例,“Language.update”) 1093 个示例 = _copy_examples(示例) 1094 如果 sgd 是 None:

~/nlp_learn/statbot/.statbot/lib/python3.8/site-packages/spacy/training/example.pyx 在spacy.training.example.validate_examples()

TypeError: [E978] Language.update 方法获取了一个 Example 对象列表,但得到了:{}

这里以TRAIN_DATA第一行为例: ('Auf Bauer Lehmanns Hof wird an beiden Pfingsttagen Brot im Backofen gebacken.', {'entities': [(10, 18, 'PER')]})

您需要将 TRAIN_DATA 转换为 Example 类型。可能最简单的方法是使用 Example.from_dict() 方法。

TRAIN_DATA = # your data
random.shuffle(TRAIN_DATA)
losses = {}
for batch in minibatch(TRAIN_DATA, size=8):
    for text, annotations in batch:
        doc = nlp.make_doc(text)
        example = Example.from_dict(doc, annotations)
        nlp.update([example], drop=0.35, sgd=optimizer, losses=losses)