Про качественный поиск

     Андрей Аксенов,
   Sphinx Technologies Inc
PARENTAL WARNING
  ADULT CONTENT
[0/4] Зачем это все?
Зачем этот доклад?
• Скорости растут => скорости… неважны
  • Ну, в жизни, а не синтетических бенчмарках
• Людей-посетителей приучают к “плохому”
  • Google, Yandex, итп
• Из коробки получается не очень
• Из коробки не может получаться, надо по-разному тюнить
• Ну и это просто интересная в целом тема!
Почему этот доклад?
• Коротенький блиц-доклад с РИТ ‘2011…
Почему этот доклад?
• Коротенький блиц-доклад с РИТ ‘2011…
Почему этот доклад?
• Коротенький блиц-доклад с РИТ ‘2011…
• …за год успел вырасти!
[1/4] Что такое
релевантность
Релевантность, это –
• Такой спец-термин из поиска
• Такое большое человеческое заблуждение
• Щаз будем заменять одно заблуждение набором
  других!
• Возникает т.н. «релевантность» ровно в тот
  момент…
…когда кто-нибудь…
…где-нибудь…
…что-нибудь…
…ищет и, увы (*),
   находит
…ищет и, увы (*),
     находит
*) – самый быстрый запрос – пустой!!!
…и приходится
ранжировать
Один Случайный Запрос
[battleship]
Правила игры
“Морской бой”?
[battle sheep]?
Внезапно, шокирующая
      истина!!!
“Нет никакой ложки”
И никакой “релевантности” –
         тоже нет
“Красота – в глазах
  смотрящего.”
Но ранжировать таки надо!!!
Как же это таки устроено?
Документ
"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."
Запрос
"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."
1 (один) фактор, BM25
Факторов больше
PageRank                DomainAge   DocLength

IsSpam    IsPorn               HITSAuthority
NumIncomingLinks                 NumOutgoingLinks
 WhateverOtherFactor1     WhateverOtherFactor2
И даже еще больше
(btw, фактор == сигнал)
Что и зачем, таки, считаем?
Целевая функция
• На входе – куча чиселок, факторов
• На выходе – одно число
• Rel = Rel(f1, f2, …, f200, …): RNumFactors  R

• Ш.И.: но конкретные числа… неважны!
• Ш.И.: важен… порядок документов
Метрики качества
• Все начинается с оценок
    • Теплых, ламповых, человеческих
•   Оценивается всегда пара запрос+документ
•   Бинарные (0/1), “просто” числа, и т.п.
•   Для простоты, пусть будут тупо бинарные
•   Bсе это вводится, впрочем, чтобы как-то сравнивать
    разные отклики
Пример отклика 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
Пример отклика 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
Пример отклика 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
Метрики качества
• Без учета порядка – Precision, Recall
• С учетом порядка – Average Precision, AP
   • Или DCG, BPREF, pFound, и т.п.
• Усредняем кучу запросов – Mean AP, MAP
   • Или средний DCG, BPREF, pFound, и т.п.
• Все, теперь это наша заветная цель
• Чем больше, например MAP
       => тем больше Среднее Счастье Пользователя 
Извилистый путь релевантности
• Есть мега-функция Rel()
• Есть куча документов
• Есть куча запросов
• Есть куча пользовательских оценок
• Считаем Rel (по функции и факторам)
      => генерируем отклики (сортировка по Rel)
              => считаем MAP, DCG итп (по оценкам)
                     => усредняем и сравниваем
Rel(D,Q) = Rel(f1, f2, …, f200, …)
Ш.И.: аналитически –
   невозможно
Поэтому – машинное
    обучение…
…считай – регрессия,
на вагоне стероидов.
Что подвергается “регрессии”?
• Оптимизируем – MAP, например
• Известны – факторы, оценки
• Найти – вид (!), коэффициенты Rel()
     • Rel = a1f1 + a2f2 + … ?
     • Rel = a1exp(f1) + 1/(a2-f2) + … ?
     • …
• См. аналитически невозможно, ага
Засада!!! Вид идеальной
 функции – неизвестен
Ш.И. – поэтому, вид функции
      типично берем...
Тупо кусочно-линейный!!!
Я ненавижу
математику!
Зачем мне этот
  хардкор?!
Метрикам – да, ML – тоже да!!!
• Если хочется качества, знать таки нужно
• Проверять качество вручную нереально
  • Быстрая, но болезненная смерть
• Подгонять формулы вручную таки можно!
  • Мелкие уж точно, да и Google врет
• Но почему не опробовать готовый мат/статпакет?
“Итоги подведем” (с) Гамлет
• Релевантность в мире веб-поиска?
• Все начинается с оценок, и все оценки субъективные
• Оценок и факторов на входе УУУ МНОГО

• Рукой уже никак, обязательно машинное обучение
• Обучение == “умная” “регрессия”, условно

• На выходе – ну, какая-то мега-функция
• Которая – максимизирует Метрику Счастья
“Итоги подведем” (с) Гамлет
• Релевантность в мире веб-поиска для простых людей?
• Все начинается с оценок, и все оценки субъективные
• Оценок и факторов на входе УУУ МНОГО МАЛО

• Формулу рукой еще можно, но можно и машинное обучение
• А вот проверять метрики сразу автоматом, но это просто!

• На выходе – ну, какая-то мега-функция
• Которая – максимизирует Метрику Счастья
[2/4] Sphinx,
  ранкеры
Или…
• Как все (теперь) “хорошо” в веб-поиске
• Как все (пока еще) “плохо” в менее
  затейливых движках
  • особенно опен-сорсных 
“Не было ни единого разрыва!”
Все остальные       Веб-поиск
1-10… факторов      100-1000+ факторов
0 оценок?           1-10M+ оценок
Ad-hoc функции      Специально
(см. левая пятка)   обученные функции
                    (см. маш. обучение)
Не все так плохо!
•   Вы не Google!
•   А, скажем, сайт про запчасти для Белазов
•   Незначительно поменьше данных
•   Чуть пореже запросы
•   Отклики потоньше
•   Ad-hoc может приемлемо сработать
Vanilla (!) Lucene @ ROMIP
Как это делает Sphinx
• Ранкер: какая-то функция ранжирования
• Только харкод: заранее встроенная в Sphinx
• Можно выбирать на лету, 1 строкой
  • $client->SetRankingMode(SPH_RANK_BM25)
  • SELECT … OPTION ranker=bm25
Осторожно, скользкая ступенька!
• $client->SetRankingMode(SPH_RANK_BM25)
  • Через API только в режиме extended
  • $client->SetMatchMode(SPH_MATCH_EXTENDED)
Кого хотеть?
• BM25 – грубо говоря, аналог Lucene
• PROXIMITY_BM25 – бустит (под)фразы
  • Но однако не смотрит на частоты слов в подфразе
• SPH04 – еще бустит начало поля, точное совпадения поля

• Других встроенных ”про качество” пока нет
• И, возможно, уже (почти) не будет…
[3/4] Sphinx,
expression ranker
Expression ranker, 2.0.2+

SELECT *, WEIGHT() FROM myindex
WHERE MATCH('hello world')
OPTION ranker=expr('sum(lcs*user_weight) *
  1000+bm25')
Expression ranker, 2.0.2+

SELECT *, WEIGHT() FROM myindex
WHERE MATCH('hello world')
OPTION ranker=expr('sum(lcs*user_weight) *
  1000+bm25')
Да, настолько просто!
• Пользоваться – вот так, буквально
  • Через API тоже можно
• Дефолтная формула proximity_bm25
  – вот такая, буквально
  • sum(lcs*user_weight) * 1000 + bm25
• Как я раньше и говорил, Целых Два Фактора!!!
Просто было в учении
• Кучка новых факторов
• 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
• Планируются (и нетяжело) делать еще – звоните
Просто было в учении
• Field level обязательно агрегировать
    • Функция пока только SUM, но звоните
•   Доступны все атрибуты документа
•   Доступны все встроенные математические функции
•   Кажется, доступны UDF (не проверял)
•   Работает подозрительно быстро
Наш самый сложный ранкер
• SPH_RANK_SPH04 =
  sum((4*lcs+2*(min_hit_pos==1)+exact_hit)*
  user_weight)*1000+bm25

• Уверен, вы можете лучше :)
• Тем более, что теперь все знаете всё :)
[4/4] “Низколетящие
      фрукты”...
[4/4] …или, что еще
  можно сделать
Качество != ранжирование
•   Еще опечатки
•   Еще “занудность” поиска
•   Еще морфология
•   Еще синонимы, расширение запросов
•   Еще номера моделей, и т.п. вертикали
•   Еще анализ запросов (натягивание на фильтры)
Ш.И.: уже (давно) МОЖНО
Как бороться “легко”?
• Опечатки? sphinx/misc/suggest/
• Занудность? Оператор кворума
• Анализ запросов? regexps, SHOW KEYWORDS
Как бороться “тяжело”?
• Морфология, синонимы – wordforms, stemmer,
  expansions, index_exact_words
  • Местами неудобно, но таки можно
• Номера моделей – препроцессинг, и-или танцы с
  blend_chars, stopword_step, и т.п.
  • Нужен ряд ручных правил под предметку, не избежать
Качество != ранжирование
•   Еще опечатки
•   Еще “занудность” поиска
•   Еще морфология
•   Еще синонимы, расширение запросов
•   Еще номера моделей, и т.п. вертикали
•   Еще анализ запросов (натягивание на фильтры)
Итого
Итого
•   Вот как устроена релевантность – вообще
•   Вот что уже встроено – конкретно в Сфинкс
•   Вот как теперь бороть релевантность – у нас
•   Вот какие еще есть беды с качеством – вообще
•   Вот как можно их тоже забарывать – в целом
•   Почему ваш поиск до сих пор… так себе?!
Вопросы?
shodan@sphinxsearch.com

Про качественный поиск

  • 1.
    Про качественный поиск Андрей Аксенов, Sphinx Technologies Inc
  • 2.
    PARENTAL WARNING ADULT CONTENT
  • 3.
  • 4.
    Зачем этот доклад? •Скорости растут => скорости… неважны • Ну, в жизни, а не синтетических бенчмарках • Людей-посетителей приучают к “плохому” • Google, Yandex, итп • Из коробки получается не очень • Из коробки не может получаться, надо по-разному тюнить • Ну и это просто интересная в целом тема!
  • 5.
    Почему этот доклад? •Коротенький блиц-доклад с РИТ ‘2011…
  • 6.
    Почему этот доклад? •Коротенький блиц-доклад с РИТ ‘2011…
  • 7.
    Почему этот доклад? •Коротенький блиц-доклад с РИТ ‘2011… • …за год успел вырасти!
  • 8.
  • 9.
    Релевантность, это – •Такой спец-термин из поиска • Такое большое человеческое заблуждение • Щаз будем заменять одно заблуждение набором других! • Возникает т.н. «релевантность» ровно в тот момент…
  • 10.
  • 11.
  • 12.
  • 13.
    …ищет и, увы(*), находит
  • 15.
    …ищет и, увы(*), находит *) – самый быстрый запрос – пустой!!!
  • 16.
  • 18.
  • 19.
  • 22.
  • 24.
  • 26.
  • 28.
  • 30.
  • 31.
    “Красота – вглазах смотрящего.”
  • 32.
  • 33.
    Как же этотаки устроено?
  • 34.
    Документ "The time hascome," 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."
  • 35.
    Запрос "The time hascome," 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."
  • 36.
  • 37.
    Факторов больше PageRank DomainAge DocLength IsSpam IsPorn HITSAuthority NumIncomingLinks NumOutgoingLinks WhateverOtherFactor1 WhateverOtherFactor2
  • 38.
    И даже ещебольше
  • 39.
    (btw, фактор ==сигнал)
  • 40.
    Что и зачем,таки, считаем?
  • 41.
    Целевая функция • Навходе – куча чиселок, факторов • На выходе – одно число • Rel = Rel(f1, f2, …, f200, …): RNumFactors  R • Ш.И.: но конкретные числа… неважны! • Ш.И.: важен… порядок документов
  • 42.
    Метрики качества • Всеначинается с оценок • Теплых, ламповых, человеческих • Оценивается всегда пара запрос+документ • Бинарные (0/1), “просто” числа, и т.п. • Для простоты, пусть будут тупо бинарные • Bсе это вводится, впрочем, чтобы как-то сравнивать разные отклики
  • 43.
    Пример отклика 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
  • 44.
    Пример отклика 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
  • 45.
    Пример отклика 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
  • 46.
    Метрики качества • Безучета порядка – Precision, Recall • С учетом порядка – Average Precision, AP • Или DCG, BPREF, pFound, и т.п. • Усредняем кучу запросов – Mean AP, MAP • Или средний DCG, BPREF, pFound, и т.п. • Все, теперь это наша заветная цель • Чем больше, например MAP => тем больше Среднее Счастье Пользователя 
  • 47.
    Извилистый путь релевантности •Есть мега-функция Rel() • Есть куча документов • Есть куча запросов • Есть куча пользовательских оценок • Считаем Rel (по функции и факторам) => генерируем отклики (сортировка по Rel) => считаем MAP, DCG итп (по оценкам) => усредняем и сравниваем
  • 48.
    Rel(D,Q) = Rel(f1,f2, …, f200, …)
  • 49.
  • 51.
  • 53.
    …считай – регрессия, навагоне стероидов.
  • 55.
    Что подвергается “регрессии”? •Оптимизируем – MAP, например • Известны – факторы, оценки • Найти – вид (!), коэффициенты Rel() • Rel = a1f1 + a2f2 + … ? • Rel = a1exp(f1) + 1/(a2-f2) + … ? • … • См. аналитически невозможно, ага
  • 56.
    Засада!!! Вид идеальной функции – неизвестен
  • 58.
    Ш.И. – поэтому,вид функции типично берем...
  • 59.
  • 60.
  • 62.
  • 63.
    Метрикам – да,ML – тоже да!!! • Если хочется качества, знать таки нужно • Проверять качество вручную нереально • Быстрая, но болезненная смерть • Подгонять формулы вручную таки можно! • Мелкие уж точно, да и Google врет • Но почему не опробовать готовый мат/статпакет?
  • 64.
    “Итоги подведем” (с)Гамлет • Релевантность в мире веб-поиска? • Все начинается с оценок, и все оценки субъективные • Оценок и факторов на входе УУУ МНОГО • Рукой уже никак, обязательно машинное обучение • Обучение == “умная” “регрессия”, условно • На выходе – ну, какая-то мега-функция • Которая – максимизирует Метрику Счастья
  • 65.
    “Итоги подведем” (с)Гамлет • Релевантность в мире веб-поиска для простых людей? • Все начинается с оценок, и все оценки субъективные • Оценок и факторов на входе УУУ МНОГО МАЛО • Формулу рукой еще можно, но можно и машинное обучение • А вот проверять метрики сразу автоматом, но это просто! • На выходе – ну, какая-то мега-функция • Которая – максимизирует Метрику Счастья
  • 66.
    [2/4] Sphinx, ранкеры
  • 67.
    Или… • Как все(теперь) “хорошо” в веб-поиске • Как все (пока еще) “плохо” в менее затейливых движках • особенно опен-сорсных 
  • 69.
    “Не было ниединого разрыва!” Все остальные Веб-поиск 1-10… факторов 100-1000+ факторов 0 оценок? 1-10M+ оценок Ad-hoc функции Специально (см. левая пятка) обученные функции (см. маш. обучение)
  • 70.
    Не все такплохо! • Вы не Google! • А, скажем, сайт про запчасти для Белазов • Незначительно поменьше данных • Чуть пореже запросы • Отклики потоньше • Ad-hoc может приемлемо сработать
  • 72.
  • 73.
    Как это делаетSphinx • Ранкер: какая-то функция ранжирования • Только харкод: заранее встроенная в Sphinx • Можно выбирать на лету, 1 строкой • $client->SetRankingMode(SPH_RANK_BM25) • SELECT … OPTION ranker=bm25
  • 74.
    Осторожно, скользкая ступенька! •$client->SetRankingMode(SPH_RANK_BM25) • Через API только в режиме extended • $client->SetMatchMode(SPH_MATCH_EXTENDED)
  • 75.
    Кого хотеть? • BM25– грубо говоря, аналог Lucene • PROXIMITY_BM25 – бустит (под)фразы • Но однако не смотрит на частоты слов в подфразе • SPH04 – еще бустит начало поля, точное совпадения поля • Других встроенных ”про качество” пока нет • И, возможно, уже (почти) не будет…
  • 76.
  • 77.
    Expression ranker, 2.0.2+ SELECT*, WEIGHT() FROM myindex WHERE MATCH('hello world') OPTION ranker=expr('sum(lcs*user_weight) * 1000+bm25')
  • 78.
    Expression ranker, 2.0.2+ SELECT*, WEIGHT() FROM myindex WHERE MATCH('hello world') OPTION ranker=expr('sum(lcs*user_weight) * 1000+bm25')
  • 79.
    Да, настолько просто! •Пользоваться – вот так, буквально • Через API тоже можно • Дефолтная формула proximity_bm25 – вот такая, буквально • sum(lcs*user_weight) * 1000 + bm25 • Как я раньше и говорил, Целых Два Фактора!!!
  • 80.
    Просто было вучении • Кучка новых факторов • 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 • Планируются (и нетяжело) делать еще – звоните
  • 81.
    Просто было вучении • Field level обязательно агрегировать • Функция пока только SUM, но звоните • Доступны все атрибуты документа • Доступны все встроенные математические функции • Кажется, доступны UDF (не проверял) • Работает подозрительно быстро
  • 82.
    Наш самый сложныйранкер • SPH_RANK_SPH04 = sum((4*lcs+2*(min_hit_pos==1)+exact_hit)* user_weight)*1000+bm25 • Уверен, вы можете лучше :) • Тем более, что теперь все знаете всё :)
  • 83.
  • 84.
    [4/4] …или, чтоеще можно сделать
  • 85.
    Качество != ранжирование • Еще опечатки • Еще “занудность” поиска • Еще морфология • Еще синонимы, расширение запросов • Еще номера моделей, и т.п. вертикали • Еще анализ запросов (натягивание на фильтры)
  • 86.
  • 87.
    Как бороться “легко”? •Опечатки? sphinx/misc/suggest/ • Занудность? Оператор кворума • Анализ запросов? regexps, SHOW KEYWORDS
  • 88.
    Как бороться “тяжело”? •Морфология, синонимы – wordforms, stemmer, expansions, index_exact_words • Местами неудобно, но таки можно • Номера моделей – препроцессинг, и-или танцы с blend_chars, stopword_step, и т.п. • Нужен ряд ручных правил под предметку, не избежать
  • 89.
    Качество != ранжирование • Еще опечатки • Еще “занудность” поиска • Еще морфология • Еще синонимы, расширение запросов • Еще номера моделей, и т.п. вертикали • Еще анализ запросов (натягивание на фильтры)
  • 90.
  • 91.
    Итого • Вот как устроена релевантность – вообще • Вот что уже встроено – конкретно в Сфинкс • Вот как теперь бороть релевантность – у нас • Вот какие еще есть беды с качеством – вообще • Вот как можно их тоже забарывать – в целом • Почему ваш поиск до сих пор… так себе?!
  • 92.