2

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) 时,它表明批处理是类型列表。但是错误消息说它是一个元组。我也尝试将其转换为列表但没有成功。我究竟做错了什么?

确切的错误是:


TypeError Traceback (last last call last) in 22 23 for batch in minibatch(examples, size=8): ---> 24 nlp.update(batch, sgd=optimizer, drop=0.35, loss=losses) 25 26 print( "损失 ({}/{})".format(epoch + 1, epochs), loss)

~/nlp_learn/statbot/.statbot/lib/python3.8/site-packages/spacy/language.py in update(self, examples, _, drop, sgd, loss, component_cfg, exclude) 1090 if len(examples) = = 0: 1091 返回损失 -> 1092 validate_examples(examples, "Language.update") 1093 examples = _copy_examples(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 方法采用示例对象列表,但得到:{<class 'tuple'>}

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

4

1 回答 1

4

您需要转换TRAIN_DATAExample类型。可能最简单的方法是使用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)
于 2021-02-24T04:58:51.557 回答