Статьи

Улучшение результатов поиска с помощью машинного обучения

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

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

Вступление

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

Естественно классифицировать вещи, классифицировать идеи или концепции, но извлечение ключевых слов — это другая интеллектуальная деятельность. При поиске пользователь должен думать как поисковая система! Пользователь должен подумать: «Хорошо, эта машина выдаст мне документы со словами, которые я собираюсь ввести, так что именно эти слова имеют наилучшие шансы дать мне то, что я хочу»

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

Эта проблема

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

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

Но что я имею в виду с категориями? Намеренно двусмысленный, этот термин относится к широкому кругу проблем. В частности, я пришел к этой идее из проблемы клиента. Этот клиент хотел улучшить результаты, извлекая названия брендов и типы продуктов из строки запроса. Поэтому, если человек вводил «вишневый кокс», он хотел показать результаты «Coca Cola Cherry». Извлекая названия брендов (если они есть) из запроса, они хотели (каким-то образом) улучшить (повысить или отфильтровать) результаты. Таким образом, для «веселого кокса» они будут извлекать «Coca Cola» в качестве бренда, и из всех продуктов Coca Cola они будут искать «вишню» или «кокс» (вероятно, получит Coca Cola Cherry с высоким рейтингом в результатах)

Возможное решение

Журналы веб-сервера являются хорошим источником для обучения наивного алгоритма Байеса. Эта идея похожа на ту, которая встречается в этой статье: Расширение вероятностного запроса с использованием журналов запросов — Hang Cui. Они хранят запрос, введенный пользователем, и документ, который пользователь щелкнул впоследствии.

сеанс: = <текст запроса> [выбранный документ] *

Разница, которую я предлагаю здесь, заключается не в том, чтобы хранить выбранный документ, а в связанных с ним категориях (или «идеях», «концепциях» и т. Д.). Запрос будет состоять из запросов и категорий документов, по которым пользователь щелкнул после поиска. Например, некоторые записи в журналах могут быть:

“world war” => [World War II]
“world war II” => [World War II]
“Normandy landings” => [World War II]
“Germany 1945” => [World War II]
“Germany 1945” => [World War II]
“germany 1945” => [German Cinema]

[Вторая мировая война] это просто имя тега. Это не будет токенизировано, или что-то еще, поскольку это просто представление идеи или концепции. «Нормандские десанты» относится к концепции [Второй мировой войны], а «Германия 1945» также относится к той же концепции.

Обратите внимание на последнюю запись в примере. В этом случае пользователь щелкнул статью о Виме Вендерсе, немецком режиссере, который родился в 1945 году. Это пример непредставительного результата. Если вы скажете «Германия 1945», большинство людей будут думать о войне. Однако тот, кто ищет немецкого режиссера, родившегося в 1945 году, имя которого он не помнит, может войти в «Германию 1945», чтобы попасть на страницу Вима Вендерса. Поиск «фильмов Германии 1945 года» может улучшить его результаты, чтобы найти Вендерса. Наша система должна вернуть две «идеи» из этого текста [Вторая мировая война] и [Немецкое кино], а результаты должны содержать в основном немецкие пропагандистские фильмы того периода, потому что именно этого человек, скорее всего, будет искать с этим текстом. ,

Подводя итог, мы пытаемся получить категории с более высоким шансом.

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

Наивный байесовский

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

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

max P (кошка | Германия 1945)

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

Задача решается лучше, если перевернуть условие с помощью теоремы Байеса.

P (<cat> | Германия 1945) = \ Frac {P (Германия 1945 | <Cat>) P (<Cat>)} {P (Германия 1945)}

Чтобы максимизировать этот параметр, параметр, который нам разрешено изменять, является категорией (текст дан, и мы не можем его изменить). Таким образом, мы можем опустить P («Германия 1945»), чтобы упростить проблему

max P (Германия, 1945 | <cat>) P (<cat>)

Здесь есть две части. Некоторые категории более вероятны, чем другие. Например, подумайте о категориях «Квантовая электродинамика» и «Секс», и вы сразу же заметите тенденцию популярности этих терминов. Эти вероятности также могут быть оценены через журнал.

Для первой части нам нужно рассмотреть отдельные термины. Не «Германия 1945», а «Германия» и «1945». Чтобы вычислить вероятность P (пересечение «Германия» «1945» | <cat>) нам нужно сделать «наивное предположение» наивного Байеса: все члены в строке запроса условно независимы. Это означает, что «Германия» полностью независима от «1945». Мы знаем, что это неправда, но с этим предположением опыт показал очень хорошие результаты. Из этого предположения мы можем изменить формулу на следующую:

P (Германия | <cat>) P (1945 | <cat>) P (<cat>)

Я не буду вдаваться в подробности, но есть некоторые проблемы, если слово никогда не ассоциировалось с категорией. Например, при поиске «Бананы Второй мировой войны» вероятность P («бананы» | [WWII]) будет равна 0, а весь расчет будет равен 0. Но мы знаем, что введенный текст, несмотря на то, что он нечетный, относится к [WWII ]. Решением этого является добавление 1 к каждой вероятности. Окончательный расчет, который мы должны выполнить:

[P (Германия | <cat>) + 1] [P (1945 | <cat>) + 1] [P (<cat>) + 1]

Это называется сглаживанием Лапласа или аддитивным сглаживанием

 Реализация

Мы не собираемся все это реализовывать! Мы собираемся использовать Mahout (снова). Мы можем переработать часть кода из предыдущего поста о классификации почты для этого.

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

То есть получить что-то вроде:

World_War_II normandy landings
World_War_II germany 1945
World_War_II germany 1945
German_Cinema germany 1945

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

Затем, предполагая, что мы используем Solr в качестве поисковой системы, мы можем добавить дополнительные запросы к обычному запросу. Этот процесс будет:

Пользователь вводит «Германия 1945 фильмов». Система запрашивает наш «онлайн-классификатор запросов» и получает две возможные категории: [Вторая мировая война] и [немецкие фильмы]. Теперь мы отправляем запрос в Solr следующим образом:

Http: //? solrserver / Solr / dismax д = Германия + 1945 + фильмы и Ки = Категория: WWII & Ки = категория: german_films

Классификатор категории может дать нам оценку (извлеченную из расчета Наивного Байеса). Это, с некоторой логикой приложения, может быть использовано для повышения категорий. Например, если мы получили [WWII] с высоким рейтингом, мы можем повысить запрос:

д = Германия + 1945 + фильмов и Ки = категория: WWII ^ 3

 Выводы

Здесь мало что можно сказать, поскольку у меня нет набора данных для проверки этого эксперимента на доске. Поэтому я не могу сказать намного больше, чем это очень элегантная идея. Однако, как я уже говорил, это не очень оригинальная идея. Он был изучен ранее, и поиск в Интернете даст вам множество результатов. Интересно, что все, что нам нужно для применения этого в наших домах, уже доступно через программное обеспечение с открытым исходным кодом. И Solr, и Mahout являются проектом с открытым исходным кодом. С ними вы можете создать поисковую систему обучения за пару минут.

Возвращаясь к набору данных, я был бы рад, что кто-то делится некоторыми журналами запросов. Эти вещи лучше работают с большим количеством запросов, и лучший пример, который я смог найти, это http://www.sigkdd.org/kdd2005/kddcup.html, который представляет собой соревнование по интеллектуальному анализу данных, где у них 800 секретных запросов. Этого недостаточно для наших целей.