Как стать автором
Обновить

Программируемые NER (Named Entity Recognition) компоненты

Время на прочтение6 мин
Количество просмотров3.3K

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

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

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

Рассмотрим несколько примеров имплементаций, это может помочь определиться с необходимостью разработки собственных компонентов. В проекте Apache NlpCraft созданы и поддерживаются следующие встроенные NER компоненты:

  • Quote, Stopword, SuspiciousNouns, Dictionary

  • Date 

  • Numeric

  • Geo

  • Coordinate

  • Limit

  • Sort 

  • Relation

Date NER компонент  

Date NER компонент ищет даты в тексте и назначает каждой найденной сущности численные значения “from“ and “to“ для найденного диапазона. Я бы не стал рекомендовать имплементацию этого модуля в качестве референсной для написания собственного NER компонента, так как он сам нуждается в существенной переработке (неплохой вызов для новых коммитеров ), но подход к разработке данного компонента довольно интересен. В основе его простейший кеш. Его модель - это сгенерированные относительно текущей даты шаблоны вроде 

  • 2002, fourth quarter | 2002y, 4q

  • 2020 11st july | 2020y, 7m, 11d

  • first 19 day of 2000 | 2000y, 1m, 1d:2000y, 19d

  • september 26 2011 | 2011y, 9m, 26d

  • …..

То есть базовая модель - это обычный словарь, где ключи - словосочетания, определяющие всевозможные варианты задания дат в запросе (от обычных до достаточно маловероятных комбинаций), а значения - то, как их следует интерпретировать. Таким образом модель хранит в себе все возможные для модели обозначения всех возможных дат! Сама эта мысль изначально кажется немного странной, но тем не менее данная модель хранит данные в диапазоне 100 лет, занимающие в текстовом, несжатом и неоптимизированном виде менее 200М. Диапазон 100 лет с лихвой перекрывает требования бизнес логики большинства систем, скорость доступа при таком подходе - Q(1), качество распознавания дат впечатляет. Надеюсь скепсис отступает. Кроме того - это же open-source! Сгенерируйте свою модель с нужным временным диапазоном и вариантами задания дат. 

Ниже пример использования (значение закрывающее временной диапазон интерпретируется как бесконечность)

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

Numeric NER компонент 

Numeric NER компонент ищет в тексте числовые значения, периоды и условия по ним, с учетом единиц измерения, если число или диапазон относятся к какой-то измеряемой величине. По сравнению с Date NER компонентом, модель по своим размерам здесь заметно скромнее и содержит в себе лишь числа, представленные словами и словосочетаниями:

  • ….

  • 99993=ninety nine thousand nine hundred ninety three

  • ….

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

Ниже пример получения numeric range из текста

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

Geo NER компоненты

При использовании географических компонентов распознаются континенты, страны, города и области. 

Ключевые особенности: 

  • Компонент воспринимает уточнения. Так, например, для запроса “Saint Petersburg data”  - предпочтение будет отдано более крупному городу из России, а для “Saint Petersburg, USA data” - его американскому тезке.

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

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

Модель основана на данных от GeoNames, википедии и т.д.

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

Ниже пример работы

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

Quote, Stopword, SuspiciousNouns, Dictionary Компоненты

Данные компоненты не создают собственных токенов, а лишь расширяют стандартное NLP представление (раздел “Token ID nlpcraft:nlp”) токенов из запроса.  

  • Quote - проверяет заключено ли слово в кавычки и выставляет соответствующий признак. 

  • Stopword - выставляет признак является ли слово stop word. Это полезно для моделей, ограничивающих возможное количество нераспознанных слов в запросах, так как stop слова в данном ограничении можно не учитывать. Система содержит сконфигурированный список stop слов, который может быть расширен или сужен на уровне конкретной модели.   

  • SuspiciousNouns - помечает слова из списка бранных и оскорбительных слов, ваша модель может игнорировать запросы, содержащие такие слова.   

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

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

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

Limit NER компонент 

Ищет и помечает ссылки на ранее найденные компоненты, определяющие ограничение их выборки. Работают как с конкретными числами (“give me first 25 orders”) так и с определенными неявным образом (“show me top few customers”)  

Ниже приведен пример сформированного ”limit”, ссылающегося на найденную сущность “customer”. 

Sort NER компонент 

Ищет и помечает ссылки на ранее найденные компоненты, определяющие принцип их сортировки.

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

Relation NER компонент 

Выявляет признак сопоставления 2х и более однотипных компонентов, что просто необходимо при составлении большого количества стандартных запросов.   

Заключение 

Надеюсь, что краткое описание встроенных Apache NlpCraft NER компонентов поможет определиться в каких случаях вам может понадобиться программирование своих собственных компонентов. В свободном доступе представлено уже достаточно большое количество хорошо зарекомендовавших себя поисковых модулей с возможностью конфигурирования и обучения их моделей под свои нужды, и задача создания новых NER компонентов никогда не была высокоприоритетной для Apache NlpCraft. Но в рамках проекта всегда есть потребность в специальных, адаптированных компонентах, сокращающих время построения и разработки диалоговых и поисковых систем. В дополнение к вышеперечисленным, в настоящее время еще целый ряд таких компонентов находятся в процессе разработки. Кроме того стоит отметить, что программирование таких изолированных элементов как NER компоненты - неплохой старт для новых членов коммьюнити.       

Теги:
Хабы:
Рейтинг0
Комментарии4

Публикации

Истории

Работа

Scala разработчик
20 вакансий
Java разработчик
321 вакансия

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область