AttributeError: 'Russian' object has no attribute 'entity'

Пытаюсь в spacy добавить новый ярлык для браузеров.
Пример кода из книги (всё, кроме текста про браузер):

LABEL = 'BROWSER'
# Обучающий набор
TRAIN_DATA = [
    ('Мне нравится Гугл-Браузер.', {
        'entities': [(12, 25, LABEL)]
    }),
    ('Я люблю апельсины', {
        'entities': []
    })
]
# Получение экземпляра компонента ner
ner = nlp.get_pipe('ner')
# Добавляем новую метку
ner.add_label(LABEL)
# Отключаем другие контейнеры, чтобы во время обучения обновлялся
# только контейнер с подписями
nlp.disable_pipes('parser')


optimizer = nlp.entity.create_optimizer()  # <-- здесь ошибка 

import random
for i in range(25):
    random.shuffle(TRAIN_DATA)
    for text, annot in TRAIN_DATA:
        nlp.update([text], [annot], sgd=optimizer)

При запуске получаю:

optimizer = nlp.entity.create_optimizer()
                ^^^^^^^^^^
AttributeError: 'Russian' object has no attribute 'entity'

Почитал на гитхабе. Вариант с заменой на nlp.get_pipe("ner") не сработал. Как решить данную проблему на 3.7.3 версии spacy ?


Ответы (1 шт):

Автор решения: MagicFoxMenFour

Ваша ошибка возникает из-за того, что в новой версии spaCy объект nlp больше не имеет атрибута entity. В spaCy версии 3.x процесс обучения немного изменился, и нужно использовать объект nlp напрямую для обновления модели.

Подключение Example:

from spacy.training.example import Example

Можно отключить не нужные компоненты, что бы они не мешали, а так же пример кода оптимизации с применением Example:

В моем случае я отключил все кроме ner и tok2vec

other_pipes = [pipe for pipe in nlp.pipe_names if pipe not in ['ner', 'tok2vec']]
with nlp.disable_pipes(*other_pipes):
    optimizer = nlp.create_optimizer()
    for i in range(25):
        random.shuffle(TRAIN_DATA)
        for text, annotations in TRAIN_DATA:
            doc = nlp.make_doc(text)
            example = Example.from_dict(doc, annotations)
            nlp.update([example], sgd=optimizer)
→ Ссылка