Как использовать возможности HuggingFace для задач распознавания именованных сущностей (NER) с использованием настраиваемого набора данных финансово значимых сущностей для точной настройки предварительно обученной модели.

Использование NER в RavenPack

Одна из ключевых ценностей RavenPack для наших клиентов - это способность наших продуктов предоставлять актуальную информацию в режиме реального времени для принятия ими решений.

NER играет важную роль в том, как RavenPack определяет эти важные аспекты в новостях. Предварительное знание соответствующего товара, компании или сектора, и это лишь некоторые из них, имеет первостепенное значение для своевременного предоставления высококачественной информации. Для этого мы поддерживаем базу данных, содержащую около 300 000 и постоянно увеличивающихся предопределенных сущностей с 16 различными типами.

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

Различия между стандартным NER и NER в RavenPack

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

Цены на алюминий снизились в последние месяцы из-за опасений по поводу кризиса еврозоны и его последствий для спроса: трехмесячная цена на алюминий на Лондонской бирже металлов (LME) упала до 2100 долларов за тонну с пика в 2800 долларов в мае.

Модели обучаются с использованием английской версии стандартного набора данных CoNLL-2003 Named Entity Recognition. Они способны распознавать четыре типа сущностей:

  • LOC: местонахождение.
  • На человека.
  • ORG: организации.
  • MISC: разное.

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

В RavenPack мы располагаем обширным корпусом данных и используем 16 различных типов сущностей, которые важны для лучшего понимания с финансовой точки зрения. Как вы можете видеть в неполном списке ниже, некоторые из них похожи на те из предварительно обученных моделей, как PEOP и PER, в то время как, с другой стороны, мы различаем COMP для компаний и ORGT для организаций.

  • PEOP: люди.
  • ORGT: такие организации, как колледжи, НПО и т. Д.
  • КОМП: компании.
  • PRDT: продукты.

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

Предварительная обработка наших наборов данных для задачи NER

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

В наших системах есть следующие сущности:

  • Ping An: COMP (любой)
  • Страхование здоровья: SECT (или)

Мы разделим предложение пробелами и аннотируем наши сущности BIO.

O обозначает токены, которые находятся за пределами сущностей, а 'B ' или 'I в начале типа сущности соответствуют BIO-аннотации для обозначения начала или середина / конец объекта в нашем тексте. Это преобразует наши 16 сущностей в 33 различных класса (B / I + тип сущности и O). Это переводит класс NER в проблему классификации токенов мультикласса.

Наша функция предварительной обработки преобразует предложение за предложением из КОЛИЧЕСТВА ИСТОРИЙ, создавая два списка:

  • тексты: список списков, каждый подсписок содержит символы предложения. ['Ping','An','for',...],]
  • теги: список списков, каждый подсписок содержит теги предложения. [['B_COMP','I_COMP','O',...],]

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

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

Цитата с сайта HuggingFace:

Теперь мы подходим к общему препятствию использования предварительно обученных моделей для классификации на уровне токенов: многие токены в корпусе W-NUT не входят в словарь DistilBert. Берт и многие подобные ему модели используют метод под названием WordPiece Tokenization, означающий, что отдельные слова разбиваются на несколько токенов, так что каждый токен, вероятно, будет в словаре. Например, токенизатор DistilBert разделит дескриптор Twitter @huggingface на токены [‘@’, ‘hugging’, ‘## face’]. Для нас это проблема, потому что на каждый токен приходится ровно один тег. Если токенизатор разделит токен на несколько суб-токенов, то мы получим несоответствие между нашими токенами и нашими метками.

Один из способов справиться с этим - обучать метки тегов только первому подтекену разделенного токена. Мы можем сделать это в 🤗 Transformers, установив метки, которые мы хотим игнорировать, на -100. В приведенном выше примере, если метка для @HuggingFace равна 3 (индексирующая B-корпорация), мы бы установили метки ['@', 'hugging', '## face'] на [3, -100, -100 ].

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

Токенизация модели

DistilBERT выполняет разделение знаков препинания и разметку словесных элементов, что, в свою очередь, требует заполнения некоторых пробелов в нашем наборе обучающих данных, чтобы назначить правильный ярлык для задачи NER. Мы полагались на общие и тензорные руководства, предоставленные HuggingFace, чтобы выполнить этот последний шаг предварительной обработки. Кроме того, мы конвертируем наборы данных в Tensorflow, поскольку это библиотека, которую мы используем в RavenPack для наших моделей.

Обучение модели

Теперь, когда у нас есть набор данных, пришло время настроить модель. Для этого мы воспользуемся реализацией DistilBert TensorFlow и настроим ее для трех эпох. Причина, по которой мы выбрали DistilBERT, заключается в том, что задержка является ограничивающим фактором в наших продуктах, поскольку мы стремимся предоставлять результаты в режиме реального времени нашим клиентам, и по сравнению с BERT или RoBERTa, DistilBERT более гибок по размеру и обеспечивает лучший компромисс между скоростью вывода. и точность.

DistilBERT имеет 65 миллионов параметров, и мы могли думать только о его тонкой настройке, изменяя веса классификационной головки. Однако, поэкспериментировав, мы решили оставить все параметры обучаемыми.

Мы почти закончили, теперь пора выбрать гиперпараметры и обучить модель.

  • Скорость обучения: 5e-5
  • Размер пакета: 16
  • Эпохи: 3
  • Оптимизатор: Адам

После запуска цикла обучения для трех эпох, каждая из которых занимает около 3 минут для 20 000 примеров на GeForce RTX3090, модели теперь могут определять наши 13 различных типов объектов. Давайте оценим производительность на некоторых примерах. Важно отметить, что после точной настройки модели и интеграции ее в конвейер NER с токенизатором DistilBERT метки сущностей будут числовыми, и мы должны преобразовать их в наш формат. Мы создали вспомогательную функцию detect_entities, чтобы обернуть конвейер.

В дополнение к этому преобразованию мы можем выбрать, следует ли группировать объекты. Разница между группировкой или нет, возвращаясь к нашему примеру, будет в том, что без группировки мы получим {'Ping':'B-COMP','An':'I-COMP',...}, тогда как группировка всех последовательных меток, принадлежащих к одному и тому же типу, будет объединена {'Ping An':'COMP'}. Мы также можем удалить метки «O» с помощью опции remove_labels = True.

Оценить модель

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

31 октября французская медицинская компания Sanofi-Aventis (SNY) отчитается о прибыли за третий квартал.

Заключение и комментарии

В этой статье мы изучили, как настроить предварительно обученную модель для задачи NER, используя настраиваемые финансовые данные, которые мы создаем в RavenPack. Мы смогли добиться отличной производительности как в отношении задержки, так и точности, используя наши обширные наборы данных и предварительно обученные модели и библиотеки HuggingFace.

Если вам нравится то, что мы делаем в Ravenpack, и вы хотели бы присоединиться к нам, у нас есть вакансии в команде машинного обучения, зайдите на ravenpack.com/careers для получения дополнительной информации.