В данной заметке мы продолжим говорить о 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 компоненты - неплохой старт для новых членов коммьюнити.