Я пытаюсь реализовать простой пользовательский компонент в своем обучающем конвейере SpaCy. Для обучения я использую интерфейс командной строки spaCy, что означает, что я управляю конфигурацией конвейера через файл config.cfg, хотя у меня есть сценарии для создания и аннотирования данных обучения и оценки. Пользовательский компонент, который я создал, не имеет состояния, что, по общему мнению, означает, что ему не нужна фабрика, и он может просто использовать декоратор @Language.comComponent(). Компонент просто берет объект документа и добавляет к нему классификацию на основе количества вхождений любого из заданного набора именованных объектов. Если существует более одного объекта любого типа, классификационный балл равен 1,0; если нет, то это 0,0.
Вот код функции:
Код: Выделить всё
# custom_classifier.py
from spacy.language import Language
@Language.component("custom_classifier")
def custom_classifier(doc):
entity_types = ["ENTITY1", "ENTITY2", "ENTITY3"]
entity_counts = [sum(1 for ent in doc.ents if ent.label_ == entity_type) for entity_type in entity_types]
if any(count > 1 for count in entity_counts):
doc.cats["MULTIPLE"] = 1.0
else:
doc.cats["MULTIPLE"] = 0.0
return doc
Затем я пытаюсь использовать этот пользовательский компонент в своем конвейере обучения, добавляя его в определение config.cfg, например:
Код: Выделить всё
[nlp]
lang = "en"
pipeline = ["tok2vec","ner","custom_classifier"]
batch_size = 1000
...
[components]
...
[components.taper_classifier]
source = "custom_classifier.custom_classifier"
after = "ner"
Что бы я ни делал, когда я пытаюсь запустить spacy train config.cfg, я получаю некоторую версию этого сообщения об ошибке:
Код: Выделить всё
OSError: [E050] Can't find model 'custom_classifier.custom_classifier'. It doesn't seem to be a Python package or a valid path to a data directory.
До сих пор я пробовал различные решения, ни одно из которых не сработало. К ним относятся:
- Попытка всех мыслимых перестановок пути модуля, которые я только мог придумать.
- Преобразование функции компонента в фабрику и соответственно изменив декоратор и конфигурацию.
- Регистрация функции с помощью декоратора @spacy.registry.
Я просмотрел документацию и Я просто не могу понять, что я делаю неправильно, хотя признаю, что в документации предполагается, что обучение с использованием пользовательских компонентов выполняется в коде, а не с помощью CLI, и не вдается в подробности того, как объявить пользовательские компоненты с помощью файла config.cfg. У меня такое ощущение, что либо я просто упускаю из виду что-то простое, либо я совершенно не понимаю, как должны работать эти пользовательские компоненты.
Подробнее здесь:
https://stackoverflow.com/questions/793 ... ng-the-cli