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

15

В настоящее время я создаю небольшую внутреннюю поисковую систему на основе Apache Lucene. Его цель проста - на основе некоторых ключевых слов он предложит несколько статей, написанных внутри нашей компании. Я использую довольно стандартную оценку TF-IDF в качестве базовой метрики и построил на ней собственный механизм оценки. Все это, кажется, работает отлично, за исключением некоторых угловых случаев, когда рейтинг кажется испорченным.

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

Моя идея

  1. Относитесь к этим как к релевантным / не относящимся к делу как к меткам и создавайте обучающие данные.
  2. Используйте эти данные для обучения классификатора (такого как SVM)
  3. Включите эту модель в поисковую систему, т. Е. Каждый новый результат будет проходить через классификатор, и ему будет присвоен ярлык о том, является ли он релевантным или нет.

Этот подход кажется мне интуитивно понятным, но я не уверен, будет ли он работать на практике. У меня есть два конкретных вопроса:

  1. Какие функции я должен извлечь?
  2. Есть ли лучший способ интегрировать компонент машинного обучения в поисковую систему? Моя конечная цель - «изучить» функцию ранжирования на основе как бизнес-логики, так и отзывов пользователей.
легенда
источник
4
Я сделал что-то подобное один раз, и пользователи ненавидели это, поэтому я выключил это. Проблема была в поведении пользователя. Пользователи адаптировались к недостаткам в результатах поиска, изменяя свои термины, и затем они продолжали бы повторно использовать эти термины. Система отреагировала корректировкой рейтинга предметов, и эти привилегированные термины начали давать разные результаты. Это запугало пользователей. Обучение не означает, что оно умнее;)
Reactgular
Вот реализация, использующая эластичный поиск и angularjs - также содержит необходимые пояснения - machinelearningblogs.com/2016/12/12/…
Вивек

Ответы:

15

(1) Какие все функции я должен извлечь?

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

Стандартный подход к обучению ранжированию состоит в том, чтобы выполнить запрос к различным настройкам поисковой системы (например, tf-idf, BM-25 и т. Д.), А затем обучить модель оценкам сходства, но для небольшого, зависящего от домена SE, Вы могли бы иметь такие функции, как

  • Для каждого термина - логическое значение, указывающее, встречается ли этот термин как в запросе, так и в документе. Или, может быть, не логическое значение, а веса tf-idf тех условий запроса, которые фактически встречаются в документе.
  • Различные метрики перекрытия, такие как Jaccard или Tanimoto.

(2) Есть ли лучший способ интегрировать компонент машинного обучения в поисковую систему? Моя конечная цель - «изучить» функцию ранжирования на основе как бизнес-логики, так и отзывов пользователей.

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

Помимо этого, изучите попарно и списочно обучение ранжированию; вы предлагаете так называемый точечный подход. IIRC, попарно работает намного лучше на практике. Причина в том, что при попарном ранжировании вам нужно гораздо меньше кликов: вместо того, чтобы пользователи помечали документы как релевантные / нерелевантные, вы просто даете им «соответствующую» кнопку. Затем вы изучаете двоичный классификатор для троек (document1, document2, query), который сообщает, является ли document1 более релевантным для запроса, чем document2, или наоборот. Когда пользователь помечает, скажем, документ 4 в рейтинге как релевантный, это дает вам шесть примеров для изучения:

  • document4> document3
  • document4> document2
  • document4> document1
  • document1 <document4
  • document2 <document4
  • document3 <document4

так что вы получаете негативы бесплатно.

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

Фред Фу
источник
+1 Спасибо. Это второй раз, когда вы мне помогли! Позвольте мне потратить пару часов, чтобы переварить это. :)
Легенда
4
Это отличный ответ, я просто хотел бы предложить небольшую настройку. С точки зрения ux, вы гораздо чаще заставляете пользователей оценивать результат, используя «нерелевантную» кнопку, чем «релевантную» кнопку. Кто останется, чтобы получить результат, когда они найдут то, что ищут? У них гораздо больше шансов нажать кнопку, которая выглядит как «возможность жаловаться», когда они не нашли того, что хотели, потому что улучшение системы в этот момент фактически соответствует их текущей цели.
Рашит
4
tl; dr Если вы собираетесь использовать только один вход, сделайте его «неактуальным», люди с большей вероятностью нажмут на него, когда будут разочарованы.
Рашит
Каким был бы «списочный» подход? Кроме того, вы имели в виду 3 или 6 примеров бесплатно? (Последние 3 кажутся просто повторением первых 3?)
максимум