Как найти сущность в поисковом запросе в Elasticsearch? - PullRequest
1 голос
/ 05 мая 2019

Я использую Elasticsearch для построения поиска по сайту ecommerece.

В одном индексе будут храниться товары, в индексе товаров я буду хранить категории в других его атрибутах.Категории могут быть несколько, но атрибут будет иметь одно значение поля.(Например, цвет)

Допустим, пользовательские типы в черном (цвет) ботинки Nike (бренд) (Категории)

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

Я подумал о следующей опции:

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

  2. Использование расширения OpenNLP (но это работает только во время индексации, в приведенном выше сценарии мы хотим, чтобы оно было на стороне запроса)

  3. Использование NER любого хорошего NLP-фреймворка.(Это не экономит время и затраты, потому что у меня в движке будут миллионы продуктов, и они будут регулярно обновляться / добавляться)

Какой лучший способ решить вышеуказанную проблему?


Редактировать:

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

  2. Все еще не уверены насчет OpenNLP

  3. NER выиграл 'в этом случае не работает, потому что существует фиксированное количество объектов, поэтому прогноз не верен, когда в запросе нет объектов.

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

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

  1. Создание аннотированного набора данных запросов, каждое слово которого будет помечено одним из тегов, скажем, {color, brand, Categories}
  2. Обучение модели NER (CRF / LSTMS).

Это не экономично по времени и затратам, потому что у меня в движке будут миллионы продуктов, также они будут обновляться / добавлятьсячастая основа

Чтобы справиться с этой ситуацией, я предлагаю не использовать слова в запросе как функции, а использовать атрибуты слов как функции.Например, создайте индикаторную функцию f(x',y) для слова x с контекстом x' (то есть словом вместе с окружающими словами и их атрибутами) и тегом y, который будет возвращать 1 или 0.Пример функции индикатора будет выглядеть следующим образом:

f('blue', 'y') = if 'blue' in `color attribute` column of DB and words previous to 'blue' is in `product attribute` column of DB and 'y' is `colors` then return 1 else 0.

Создать множество этих функций индикатора, также известных как карты функций.

Эти функции индикатора затем используются для обучения моделей с использованием CRFS или LSTMS.Наконец, мы используем алгоритм Витерби, чтобы найти наилучшую последовательность тегов для вашего запроса.Для CRF вы можете использовать такие пакеты, как CRFSuite или CRF ++.Используя эти пакеты, все, что вам нужно сделать, это создать индикаторные функции, и пакет обучит вас модели.После обучения вы можете использовать эту модель, чтобы предсказать лучшую последовательность для ваших запросов.CRFs очень быстрые.

Этот способ обучения без использования векторного представления слов обобщает вашу модель без необходимости переподготовки.[Посмотрите на NER, используя CRF].

0 голосов
/ 07 мая 2019

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

  1. Токенизация запроса в свободной форме. Regex можно использовать для разбиения лексем, однако очень часто для этого лучше написать собственный токенизатор.
  2. Выполнить распознавание именованных объектов, чтобы определить возможные поля для каждого ключевого слова. На этом этапе вы получите ассоциации, такие как (черный -> цвет), (черный -> название продукта) и т. Д. Фактически вам не нужен OpenNLP для этого, так как это должен быть просто индекс (ключевое слово -> поле (я)) и вы можете попробовать использовать ElasticSearch 'предложить' API для этой цели.
  3. (необязательно). Распознавать специальные фразы или комбинации, такие как «выпущен вчера», «цена ниже $ 20»
  4. Генерирует возможные комбинации совпадений и с помощью специальной функции подсчета определяет «лучший» результат распознавания. Функция оценки может быть жестко закодирована (отражать эвристику «здравого смысла») или это может быть результатом алгоритма машинного обучения.
  5. По результату распознавания (соответствует метаданным) создать формальный запрос для получения результатов поиска - это может быть запрос ElasticSearch с подсказками полей или даже запрос SQL.

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

...