Приступить к созданию функции поиска для вашего проекта сегодня проще, чем когда-либо, от первоклассных решений с открытым исходным кодом, таких как Elasticsearch и Solr, до полнофункциональных облачных решений, таких как Algolia, Elastic Cloud, Amazon Cloud Search, Azure Search и других.

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

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

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

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

Самыми популярными алгоритмами в обучении ранжированию являются RankNet, LambdaRank и LambdaMart, но есть и другие методы, такие как варианты потомков с усиленным градиентом. По сути, все эти алгоритмы пытаются оптимизировать наиболее распространенные метрики IR, такие как NDCG, MRR и MAP.

В этой статье мы не будем вдаваться в подробности того, как они работают, если вам интересно (и вам нужно) узнать больше, посмотрите симпатичную обзорную статью К. Берджеса [1].

Допустим, вы хотите поэкспериментировать с этим, для целей этой статьи мы будем использовать Elasticsearch и хороший плагин, разработанный [4] Open Source Connections, что приведет к запуску обучения в Elasticsearch. Если вы используете Solr, аналогичный функционал доступен, подробности смотрите в документации.

Настройка обучения для ранжирования в Elasticsearch

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

Должно получиться так:

Это формат, необходимый для RankLib, библиотеки, используемой для запуска алгоритмов, более подробную информацию о формате можно найти на сайте Lemur Project [5].

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

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

PUT localhost: 9200 / _ltr / _featureset / docs_features

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

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

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

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

Итак, теперь, надеюсь, у нас есть расширенный список суждений, этот список будет выглядеть примерно так:

Как мы видели ранее, это формат, поддерживаемый Ranklib [5], тот же, что используется в наборах данных SVM-Rank и LETOR [6]. Также этот формат может использоваться XGBoost [7] и другими библиотеками, используемыми для ранжирования.

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

Мы зашли очень далеко, последний шаг перед тем, как мы сможем использовать Learning to Rank в Elasticsearch, будет заключаться в создании моделей с использованием RankLib, это можно сделать следующим образом:

где модель будет содержимым файла, созданного библиотекой алгоритмов.

Поиск с обучением ранжированию

Оказавшись здесь, мы почти выполнили всю тяжелую работу, следующий и последний шаг - поиск с использованием модели. Для этого мы снова будем использовать запрос sltr, представленный плагином Elasticsearch Learning to Rank.

Как мы видели ранее, LTR или обучение ранжированию вводятся для повышения точности вашего поиска с помощью машинного обучения. Модель ML будет применяться после первоначального ранжирования, выполненного поисковой системой, однако модели ML могут быть довольно дорогими в использовании, поэтому мы будем повторно оценивать с использованием модели только первые N результатов.

Поиск с помощью LTR можно выполнить с помощью такого запроса:

этот запрос ищет токен триллер, также мы применяем, после того, как исходный запрос выполнен, этап повторной оценки с использованием уже известного запроса sltr. Запрос должен ссылаться на ранее загруженную модель по своему имени. Для более подробной информации, пожалуйста, ознакомьтесь с очень подробной документацией плагина [9].

Резюме

В этом очень длинном посте мы рассказали, как использовать LTR в Elasticsearch с помощью красивого плагина [4], разработанного Open Source Connections. Эта статья не является полностью описательной, для этого вы можете проверить красивую документацию по плагинам [9].

Если вы более склонны учиться на практике, вы можете просмотреть пару демонстраций:

Тем, кто любит читать книги, я рекомендую прочитать

Надеюсь, вам понравилось чтение, и вы хотите узнать больше о том, как повысить релевантность поиска.

использованная литература

[1] От RankNet к LambdaRank к LambdaMART: обзор. Https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/MSR-TR-2010-82.pdf

[2] Средний взаимный рейтинг страницы в Википедии. Https://en.wikipedia.org/wiki/Mean_reciprocal_rank

[3] Дисконтированный совокупный доход Страница на Википедии. Https://en.wikipedia.org/wiki/Discounted_cumulative_gain

[4] Плагин Elasticsearch LTR. Https://github.com/o19s/elasticsearch-learning-to-rank

[5] Формат файла Ranklib. Https://sourceforge.net/p/lemur/wiki/RankLib%20File%20Format/

[6] ЛЕТОР: Обучение ранжированию для поиска информации. Https://www.microsoft.com/en-us/research/project/letor-learning-rank-information-retrieval/?from=http%3A%2F%2Fresearch.microsoft.com%2Fen-us%2Fum% 2Fbeijing% 2Fprojects% 2Fletor% 2F

[7] XGBoost, экстремальное усиление градиента. Https://github.com/dmlc/xgboost

[8] Проект Лемура. Https://sourceforge.net/projects/lemur/

[9] Документация плагина Elasticsearch LTR. Http://elasticsearch-learning-to-rank.readthedocs.io/en/latest/searching-with-your-model.html