Как обучать совершенно новые сущности вместо предварительно обученных, используя модель Spacy NER?

avatar
GeorgeOfTheRF
20 января 2020 в 16:52
732
2
0

Как выполнить перенос обучения, т. е. взять предварительно обученную модель Spacy NER и заставить ее изучать новые объекты, характерные для моего варианта использования?

Для этого у меня есть 100 новых аннотированных обучающих выборок. Новая переобученная модель должна предсказывать только новые объекты, а не какие-либо из существующих объектов в предварительно обученной пространственной модели. Простое добавление/обновление новых объектов в существующие модели и игнорирование старых объектов во время прогнозирования не имеет смысла.

Этот официальный пример описывает, как добавлять новые объекты к существующим предварительно обученным объектам, но это не то, что мне нужно. У меня также есть очень мало примеров, т. е. 100, чтобы полностью построить новую модель NER с нуля.

Изменить: я хочу идентифицировать все номера счетов в неструктурированном документе.

Пример («Я хотел бы изменить адрес, соответствующий моей учетной записи 12345. Пожалуйста, дайте мне знать, как это сделать». [34, 39, 'номер учетной записи'])

Источник
Adnan S
20 января 2020 в 16:56
0

Нужна дополнительная информация, чтобы ответить на вопрос, с какими типами объектов вы работаете? Названия мест, имена людей и т.д.? Можете ли вы привести пример новых сущностей и обучающих данных для них?

GeorgeOfTheRF
20 января 2020 в 17:06
0

Спасибо. Добавлено в пост

Ответы (2)

avatar
Sofie VL
21 января 2020 в 15:17
2

Вы упомянули, что хотите предсказывать только новые объекты, а не старые. Таким образом, нет причин начинать с предварительно обученной модели NER. Функции, изученные для других типов сущностей (которые вам не нужны), в любом случае не будут использоваться/перенесены в ваш новый тип сущностей. Так что вам придется начать обучение модели с нуля.

Вы упомянули, что у вас есть только несколько обучающих примеров (100), поэтому (как вы упомянули) будет непросто достичь достаточно высокой точности. Возможно, вы могли бы сначала выполнить этап сопоставления на основе правил, а затем вручную объединить совпадения на этом этапе сопоставления, чтобы быстрее увеличить данные обучения.

GeorgeOfTheRF
23 января 2020 в 12:10
0

+1. Вы хотите сказать это, то есть собрать новые примеры и применить шаг «сопоставление на основе правил», чтобы пометить объекты в новых примерах вместо аннотирования вручную? Если это так, я не могу просто применить модель, обученную на 100 примерах, и применить ее к вновь собранным примерам, чтобы создать больше обучающих примеров вместо использования «сопоставления на основе правил»?

GeorgeOfTheRF
23 января 2020 в 12:12
0

Как вы думаете, почему существующая предварительно обученная модель не будет полезна для идентификации номера учетной записи, то есть путем простого переобучения выходного слоя только с номером учетной записи? Разве не в этом вся идея трансферного обучения?

Sofie VL
23 января 2020 в 15:40
0

О, конечно, если у вас есть ресурсы, чтобы делать больше ручных аннотаций, это было бы лучше, чем правила + курирование!

GeorgeOfTheRF
23 января 2020 в 15:44
0

В порядке. Каковы плюсы и минусы использования сопоставления на основе правил по сравнению с автоматическим аннотированием новых образцов с использованием модели, обученной на существующих 100 примерах? Я пытаюсь понять, когда мне следует использовать сопоставитель

Sofie VL
23 января 2020 в 15:46
0

Я бы лично рекомендовал использовать сопоставитель, если вы чувствуете, что в вашем наборе данных мало лексических/синтаксических вариаций. Если бы вы могли зафиксировать 80% ваших «золотых» случаев с помощью нескольких правил, возможно, было бы целесообразно использовать сопоставитель для первой быстрой «проверки», а затем выполнить аннотацию вручную.

avatar
Adnan S
20 января 2020 в 18:27
1

Для вашего варианта использования вы добавляете новый тип объекта, чтобы не было путаницы с существующими типами объектов. Если вы назовете свой новый объект «номер счета», вы сможете использовать сценарий обучения, который вы связали, для обучения модели.

Для этапа извлечения используйте код в документации, но просто отфильтруйте «номер счета» в результатах (т. е. поле ent.label_) и игнорируйте другие существующие сущности.

GeorgeOfTheRF
20 января 2020 в 18:36
0

Модель, построенная таким образом, будет слабее, чем модель, обученная только идентифицировать номер счета. Также вероятность предсказания не будет иметь смысла, и я хочу использовать вероятность дальше.

Adnan S
20 января 2020 в 19:15
0

На каком основании вы говорите, что модель будет слабее? Ваш новый тип объекта не пересекается с существующими объектами. SpaCy использует синтаксический анализ зависимостей и другой лингвистический анализ для поиска сущностей. Пока вы не перекрываете примеры, все должно быть в порядке. Вы пробовали это и обнаружили, что производительности не хватает?

GeorgeOfTheRF
21 января 2020 в 09:46
0

Spacy строит остаточную CNN, чтобы делать более точные прогнозы. Основываясь на том, что вы говорите, последний слой, т.е. цель, содержит, скажем, 1000 объектов, но я хочу только account_type в последнем слое. Так как модель, обученная прогнозировать только account_type, будет более точной, чем модель, обученная прогнозировать aacount_type и 999 других классов.

Adnan S
21 января 2020 в 19:22
0

Единственный способ узнать это — попробовать, но я рассматриваю NER как двухэтапную проблему. Первая часть состоит в том, чтобы отличить интересующую сущность от остального текста (например, глаголов, предлогов и т. д.). Второй шаг – определить, что это за сущность. На первом этапе я вижу ценность предварительно обученной модели. Если бы у вас был набор данных большего размера, обучение модели с нуля сработало бы.