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)