В настоящее время я создаю небольшую внутреннюю поисковую систему на основе Apache Lucene. Его цель проста - на основе некоторых ключевых слов он предложит несколько статей, написанных внутри нашей компании. Я использую довольно стандартную оценку TF-IDF в качестве базовой метрики и построил на ней собственный механизм оценки. Все это, кажется, работает отлично, за исключением некоторых угловых случаев, когда рейтинг кажется испорченным.
Поэтому я планирую добавить небольшую ссылку «Релевантно / Нерелевантно» на страницу результатов поиска, чтобы пользователи могли щелкнуть по одной из них в зависимости от их представления о том, должен ли этот результат быть включен в первую очередь.
Моя идея
- Относитесь к этим как к релевантным / не относящимся к делу как к меткам и создавайте обучающие данные.
- Используйте эти данные для обучения классификатора (такого как SVM)
- Включите эту модель в поисковую систему, т. Е. Каждый новый результат будет проходить через классификатор, и ему будет присвоен ярлык о том, является ли он релевантным или нет.
Этот подход кажется мне интуитивно понятным, но я не уверен, будет ли он работать на практике. У меня есть два конкретных вопроса:
- Какие функции я должен извлечь?
- Есть ли лучший способ интегрировать компонент машинного обучения в поисковую систему? Моя конечная цель - «изучить» функцию ранжирования на основе как бизнес-логики, так и отзывов пользователей.
Ответы:
Во-первых, поймите, что вы не классифицируете документы. Вы классифицируете пары (документ, запрос), поэтому вы должны извлечь функции, которые выражают, насколько хорошо они соответствуют.
Стандартный подход к обучению ранжированию состоит в том, чтобы выполнить запрос к различным настройкам поисковой системы (например, tf-idf, BM-25 и т. Д.), А затем обучить модель оценкам сходства, но для небольшого, зависящего от домена SE, Вы могли бы иметь такие функции, как
Это очень широкий вопрос, и ответ зависит от того, сколько усилий вы хотите приложить. Первое, что приходит на ум, заключается в том, что вам следует использовать не бинарные суждения о релевантности классификатора, а его реальную функцию принятия решения, так что вы можете сделать ранжирование вместо того, чтобы просто фильтровать. Для SVM решающая функция - это расстояние до гиперплоскости со знаком. У хороших пакетов машинного обучения есть интерфейс для получения ценности этого.
Помимо этого, изучите попарно и списочно обучение ранжированию; вы предлагаете так называемый точечный подход. IIRC, попарно работает намного лучше на практике. Причина в том, что при попарном ранжировании вам нужно гораздо меньше кликов: вместо того, чтобы пользователи помечали документы как релевантные / нерелевантные, вы просто даете им «соответствующую» кнопку. Затем вы изучаете двоичный классификатор для троек (document1, document2, query), который сообщает, является ли document1 более релевантным для запроса, чем document2, или наоборот. Когда пользователь помечает, скажем, документ 4 в рейтинге как релевантный, это дает вам шесть примеров для изучения:
так что вы получаете негативы бесплатно.
(Это всего лишь предложения, я не пробовал ничего из этого. Я просто работал в исследовательской группе, где люди занимались изучением ранжирования. Однажды я делал презентацию чужой статьи для читающей группы, может быть, слайды могут помочь.)
источник