4. Зачем этот доклад
• Скорости растут => скорости… неважны
• Ну, в жизни, а не синтетических бенчмарках
• Людей-посетителей приучают к “плохому”
• Google, Yandex, итп
• Из коробки получается не очень
• Из коробки imho (imho!) и не может
получаться, надо по-разному тюнить
• Ну и это просто интересная в целом тема!
9. Релевантность, это -
• Такой спец-термин из поиска
• Такое большое человеческое заблуждение
• Щаз будем заменять одно заблуждение
набором других!
• Возникает т.н. «релевантность» ровно в тот
момент…
27. Документ
"The time has come," the Walrus said,
"To talk of many things:
Of shoes, and ships, and sealing-wax,
Of cabbages, and kings,
And why the sea is boiling hot-
And whether pigs have wings."
28. Запрос
"The time has come," the Walrus said,
"To talk of many things:
Of shoes, and ships, and sealing-wax,
Of cabbages, and kings,
And why the sea is boiling hot-
And whether pigs have wings."
34. Целевая функция
• На входе – куча чиселок, факторов
• На выходе – одно число
• Rel = Rel(f1, f2, …, f200, …): RNumFactors R
• Ш.И.: но конкретные числа… неважны!
• Ш.И.: важен… порядок документов
35. Метрики качества
• Все начинается с оценок
• Теплых, ламповых, человеческих
• Оценивается всегда пара запрос+документ
• Бинарные (0/1), “просто” числа, и т.п.
• Для простоты, пусть будут тупо бинарные
• Bсе это вводится, впрочем, чтобы как-то
сравнивать разные отклики
36. Пример отклика 1
1. Sphinx | Open Source Search Server
2. Sphinx - Wikipedia, the free encyclopedia
3. Great Sphinx of Giza - Wikipedia, the free
encyclopedia
4. Overview - Sphinx 1.1.2 documentation
37. Пример отклика 2
1. Great Sphinx of Giza - Wikipedia, the free
encyclopedia
2. Sphinx - Wikipedia, the free encyclopedia
3. Sphinx | Open Source Search Server
4. Overview - Sphinx 1.1.2 documentation
38. Пример отклика 3
1. Sphinx - Wikipedia, the free encyclopedia
2. Sphinx | Open Source Search Server
3. Overview - Sphinx 1.1.2 documentation
4. Great Sphinx of Giza - Wikipedia, the free
encyclopedia
39. Метрики качества
• Без учета порядка – Precision, Recall
• С учетом порядка – Average Precision, AP
• Или DCG, BPREF, pFound, и т.п.
• Усредняем кучу запросов – Mean AP, MAP
• Или средний DCG, BPREF, pFound, и т.п.
• Все, теперь это наша заветная цель
• Чем больше MAP => тем больше Среднее
Счастье Пользователя
40. Извилистый путь релевантности
• Есть мега-функция Rel()
• Есть куча документов
• Есть куча запросов
• Есть куча пользовательских оценок
• Считаем Rel (по функции и факторам)
=> генерируем отклики (сортировка по Rel)
=> считаем MAP, DCG итп (по оценкам)
=> усредняем и сравниваем
49. Итого
• Релевантность в мире веб-поиска?
• Все начинается с оценок
• Все оценки субъективные
• Оценок и факторов на входе УУУ МНОГО
• Рукой уже никак, машинное обучение
• “Умная” “регрессия”, условно
• На выходе – ну, какая-то мега-функция
• Которая – максимизрует Метрику Счастья
54. Текущий разрыв
Все остальные Веб-поиск
1-10… факторов 100-1000+ факторов
0 оценок? 1-10M+ оценок
Ad-hoc функции Специально
(см. левая пятка) обученные функции
(см. маш. обучение)
55. Не все так страшно!!!
• Вы не Google!
• А, скажем, сайт про запчасти для Белазов
• Незначительно поменьше данных
• Чуть пореже запросы
• Отклики потоньше
• Ad-hoc может приемлемо сработать
57. Концепт «ранкера»
• Тупо какая-то функция ранжирования
• Тупо заранее (нами) встроенная в Sphinx
• Можно выбирать на лету, 1 строкой
• $client->SetRankingMode(SPH_RANK_BM25)
• SELECT … OPTION ranker=bm25
• Осторожно, скользкая ступенька!
• Через API только в режиме extended
• $client->SetMatchMode(SPH_MATCH_EXTENDED)
58. Какие встроенные ранкеры брать?
• BM25 – грубо говоря, аналог Lucene
• PROXIMITY_BM25 – бустит (под)фразы
• Но не смотрит на частоты слов в подфразе
• SPH04 – еще бустит начало поля, точное
совпадения поля
• Других встроенных ”про качество” пока нет
• И, возможно, уже не будет…
61. Да, настолько просто!
• Пользоваться – вот так, буквально
• Через API тоже можно
• Дефолтная формула proximity_bm25
– вот такая, буквально
• sum(lcs*user_weight) * 1000 + bm25
• Как я неоднократно повторял,
Целых Два Фактора!!!
62. Просто было в учении
• Кучка новых факторов
• Document Level:
• bm25, max_lcs, query_word_count,
doc_word_count
• Field Level:
• lcs, user_weight, hit_count, word_count, tf_idf,
min_hit_pos, min_best_span_pos, exact_hit
• Планируются (и нетяжело) делать еще
63. Просто было в учении
• Field level обязательно агрегировать
• Функция пока только SUM, но звоните
• Доступны все атрибуты
• Доступны все встроенные функции
• Кажется, доступны UDF (не проверял)
• Работает подозрительно быстро
64. Наш самый сложный ранкер
• SPH_RANK_SPH04 =
sum((4*lcs+2*(min_hit_pos==1)+exact_hit)*
user_weight)*1000+bm25
• Уверен, вы можете лучше :)
• Тем более, что теперь все знаете все :)
67. Качество != ранжирование
• Еще опечатки
• Еще “занудность” поиска
• Еще морфология
• Еще синонимы, расширение запросов
• Еще номера моделей, и т.п. вертикали
• Еще анализ запросов (натягивание на
фильтры)
69. Как бороться “легко”?
• Опечатки? sphinx/misc/suggest/
• Занудность? Оператор кворума
• Анализ запросов? regexps, SHOW
KEYWORDS
70. Как бороться “тяжело”?
• Морфология, синонимы – wordforms
• Местами неудобно, местами не хватает per-
keyword слов, и т.п.
• Номера моделей – препроцессинг, и-или
танцы с blend_chars, stopword_step, и т.п.
• Скорее всего все равно понадобится ряд
ручных правил, не избежать
72. Итого
• Вот как вообще устроена релевантность
• Вот что уже встроено в Сфинкс
• Вот как теперь бороть релевантность
• Вот какие еще есть беды с качеством
• Вот как можно их тоже забарывать
• Почему ваш поиск до сих пор… так себе?!