Spacy - используйте два обучаемых компонента с двумя разными наборами данных

Мне было интересно, можно ли обучить два обучаемых компонента в Spacy с двумя разными наборами данных? Фактически, я хотел бы использовать NER и текстовый классификатор, но поскольку наборы данных поезда для этих двух компонентов должны быть аннотированы по-разному, поэтому я не знаю, как обучить оба компонента одновременно ...

Должен ли я обучать каждую задачу в отдельном конвейере и собирать оба конвейера в конце? Или мне следует обучить NER, упаковать этот конвейер, а затем использовать этот пакет в качестве входных данных для обучения классификатора текста?

Заранее большое спасибо за вашу помощь


person JulienD    schedule 19.05.2021    source источник


Ответы (1)


Вы не сможете обучать их одновременно, если набор данных не тот.

Если вы работаете с spaCy v3, сравнительно просто объединить два обучающих шага в один финальный конвейер. Например, создайте конфигурацию, которая сначала обучает NER, и сохраните ее на диске. Затем создайте новую конфигурацию, в которой вы source NER из ранее обученного конвейера , а затем определите этот компонент NER как frozen:

[nlp]
pipeline = ["ner", "textcat"]
...

[training]
frozen_components = ["ner"]
...

[components.ner]
source = "your_trained_ner_location"
component = "ner"

[components.textcat]
factory = "textcat"
...

Теперь запустите обучение на своем textcat.

К вашему сведению - этот вид многоэтапных рабочих процессов можно легко настроить с помощью spacy projects

person Sofie VL    schedule 08.06.2021
comment
Спасибо, Софи, за ответ. Тем временем я попробовал это решение, но кажется, что замораживание компонента во время обучения textcat снижает производительность NER. Я узнал на вашем GitHub, что мне следует использовать replace_listeners в файле конфигурации, чтобы решить эту проблему. После обучения я хотел загрузить конвейер, но десериализовать объект не удалось (я использую конвейер на основе трансформатора). Не могли бы вы мне помочь с этим? - person JulienD; 14.06.2021
comment
Производительность NER ухудшится, если вы попытаетесь использовать один и тот же преобразователь для обеих задач, потому что преобразователь будет обновлен для textcat, только если ner заморожен. В настоящее время мы исправляем функциональность replace_listener для трансформаторов, поскольку она была сломана (но это действительно было бы правильным решением здесь): github.com/explosion/spacy-transformers/pull/277 - person Sofie VL; 14.06.2021
comment
В качестве альтернативы, у вас может быть два трансформатора в конвейере, NER и textcat слушают отдельный (с upstream_name чем-то конкретным, а не только "*"), а затем заморозить NER и соответствующий ему преобразователь. Но, боюсь, ваш конвейер будет медленнее. - person Sofie VL; 14.06.2021