Поскольку выпуск spaCy v3 был недавним, руководства, написанныедо февраля 2021 года, теперь устарели в отношении того, как обучается модель.

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

ЧТО такое НЭР?

NER — это растущая область обработки естественного языка, целью которой является точное обнаружение и классификация ключевой информации в тексте.

Как вы видите на этом примере, «готовая к работе» встроенная модель NER spaCy уже может предсказывать сущности ЧЕЛОВЕКА, ОРГАНИЗАЦИИ, МЕСТОПОЛОЖЕНИЯ и ВРЕМЕНИ.

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

- «Сэм Блэквелл - менеджер» (менеджеры - люди, Сэм Блэквелл, скорее всего, ЧЕЛОВЕК)

- «…фирма под названием EatApples LLC» (фирмы являются организациями, EatApples LLC, скорее всего, является ОРГ)

ЗАЧЕМ использовать НЭР?

NER имеет широкий спектр реальных приложений. Возьмем, к примеру, новостную статью в Интернете; предварительно обученная модель NER может мгновенно получать данные об упомянутых именах людей, организаций и местоположениях. Собранные данные затем можно использовать для автоматической классификации этой статьи в подходящую категорию новостей. Теперь представьте, что эта операция масштабируется для быстрой классификации тысяч новостных статей.

Пользовательские объекты

Но что, если мы хотим обнаруживать объекты на основе нашей собственной категории слов?

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

Чтобы наша модель NER могла классифицировать новый пользовательский тег, нам сначала нужно предоставить обучающие данные для пустой модели.

Установка SpaCy

Запустите эти три команды последовательно, чтобы запустить spaCy:

pip install -U pip setuptools wheel
pip install -U spacy
python -m spacy download en_core_web_sm

Если вы используете conda, или ищете другие параметры для установки, то перейдите по этой ссылке: https://spacy.io/usage

Кроме того, это необходимые импорты библиотек для этого проекта. Просто используйте pip install, если они отсутствуют.

Аннотирование данных

Существует три основных способа обучения:

  1. Примените существующий набор данных NER (из Kaggle, Metatext или Hugging Face)

2) Используйте программное обеспечение Doccano или spaCy Prodigy.

  • Это инструменты аннотирования, предназначенные для быстрой и удобной маркировки данных. Просто обратите внимание, что некоторые аспекты программного обеспечения имеют свою цену.

3) Ручная аннотация

  • Мы можем аннотировать наши собственные данные обучения. Я покажу вам, как я ускорил этот процесс с помощью regex (регулярных выражений).

Давайте начнем с нашего первого наблюдения за обучением.
Я обозначил только слова, которые описывают услуги, предоставляемые бизнесом. Это формат аннотации, который я использую:

= [‘BigTime Care has a broad array of service offerings for Philadelphia-area clientele. For 50 years, we have specialized in landscaping and lawn mowing. We also provide seasonal snow removal services for local commercial and residential properties. Call any time to schedule a consultation!’,
{‘entities’: [(122, 133, ‘SERVICE’),
(138, 149, ‘SERVICE’),
(176, 188, ‘SERVICE’)]}]

Он состоит из текста, за которым следуют помеченные объекты в формате JSON.

Здесь «озеленение» — это первая сущность; термин начинается с позиции символа 122 и заканчивается на позиции 133, и мы помечаем его как УСЛУГА. Это завершается (122, 133, «СЕРВИС»). «Кошение газона» и «уборка снега» — другие сущности в этом примере.

Давайте посмотрим на код, который автоматически преобразует наши данные в этот формат аннотаций. Закомментированные строки должны дать лучшее представление о том, что происходит.

Теперь мы можем вызвать Structure_training_data(text, kw_list) для автоматического форматирования и позволить регулярному выражению выполнять тяжелую работу по поиску начальной/конечной позиции.

Подготовка данных для обучения

Вот мини-тренировочный набор, который я создал. Тексты и названия компаний были немного изменены, но мы также можем предположить, что текст был взят с реальных веб-сайтов бытовых услуг.

Результирующие обучающие данные (в коллективном_дикте):

Обучение пользовательской модели SpaCy v3

Это основная часть, в которой spaCy v3 отличается от своих более ранних версий. Теперь требуется, чтобы обучение проходило в командной строке. Сначала меня это оттолкнуло… но поверьте, проще не бывает.

Давайте пройдемся по нему шаг за шагом!

1)
Во-первых, нам нужно преобразовать наши обучающие примеры из формата JSON в объекты spaCy Doc. Затем объекты Doc сохраняются в коллективном классе DocBin. Это как раз новый формат, который требует spaCy для обучения.

2)
Перейдите по ссылке ниже. Обратите внимание, что я выбрал ner в разделе Компоненты виджета. Скопируйте/вставьте полное содержимое виджета в файл с именем base_config.cfg в каталоге вашей папки.
https://spacy.io/usage/training#config

3)
Откройте файл base_config.cfg.
Все, что вам нужно изменить, — это переменные train и dev вверху.

Dev зарезервирован для набора данных проверки. Однако, поскольку я просто хочу обучить модель в демонстрационных целях, я добавил один и тот же путь и в train, и в dev. (Примечание: это приведет к 100% точности обучения)

4)
Откройте интерфейс командной строки и перейдите в каталог base_config.cfg
Просто скопируйте/вставьте эту команду:

python -m spacy init fill-config base_config.cfg config.cfg

Файл config.cfg появится в вашем рабочем каталоге.

5)
Затем выполните следующее, чтобы начать обучение:

python -m spacy train config.cfg — output ./output

После завершения обучения результирующая модель появится в новой папке с именем output.

Результаты модели

Давайте проверим модель, которую мы обучили, на совершенно новом фрагменте текста.

Вывод:

Держаться секунду! Обратите внимание, как модель точно предсказала «уход за деревьями», «удаление пней» и «сохранение деревьев» как услуги, хотя эти слова НЕ были частью нашего обучения. В этом сила NER от spaCy!

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

Этот сайт демонстрирует концепцию векторов слов:
https://explosion.ai/demos/sense2vec?word=yard%20maintenance&sense=NOUN&model=2019

Так, например, при поиске по фразе «уход за двором» мы видим следующие результаты:

Уже обученные векторы слов способны точно предлагать синонимы и значения на основе статистических семантических ассоциаций.

Заключение

С помощью этой технологии теперь становится возможным получать точные услуги, предоставляемые с множества различных веб-сайтов домашних услуг.

Однако… наша текущая модель NER еще далеко не готова к этому. Обратите внимание, что модель не учитывала «борьбу с насекомыми» как услугу в нашем тестовом примере. Повышение точности модели с этого момента теперь зависит от добавления дополнительных обучающих данных. В прошлом я видел, что 200–1000 тренировочных наблюдений — отличная отправная точка.

Я надеюсь, что эта статья поможет вам создать собственную модель NER с помощью новейшей версии spaCy.

Спасибо за прочтение!