проблема nlp.update с Spacy 3.0: ошибка типа: [E978] Метод Language.update принимает список примеров объектов, но получил: {}

#python #nlp #spacy-3

#python #nlp #spacy-3

Вопрос:

С 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 . Но в сообщении об ошибке говорится, что это кортеж. Я также безуспешно пытался преобразовать его в список. Что я делаю не так?

Точная ошибка:


Обратная трассировка ошибки типа (последний последний вызов) в 22 23 для пакета в мини-пакете (примеры, размер = 8): —> 24 nlp.update(пакет, sgd= optimizer, drop= 0.35, потери = потери) 25 26 print(«Потери ({} / {})».формат (эпоха 1, эпохи), потери)

~/nlp_learn/statbot/.statbot/библиотека/python3.8/site-пакеты/spacy/язык.py в обновлении(self, examples, _, drop, sgd, потери, component_cfg, исключить) 1090, если 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()

Ошибка типа: [E978] Метод Language.update принимает список примеров объектов, но получил: {<class ‘tuple’>}

Here the first line of TRAIN_DATA as an example: (‘Auf Bauer Lehmanns Hof wird an beiden Pfingsttagen Brot im Backofen gebacken.’, {‘entities’: [(10, 18, ‘PER’)]})

Ответ №1:

Вам необходимо преобразовать TRAIN_DATA в Example type . Вероятно, самый простой способ — использовать 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)
 

Комментарии:

1. из примера импорта spacy.training

2. Спасибо за решение! Но таким образом он не может быть обучен многопроцессорной обработке. Есть ли у вас какая-либо информация о том, что нужно изменить, чтобы это заработало?