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

Post on 25-Jun-2015

552 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Доклад "Про качественный поиск", версия с РИТ 2012 в Москве. Немного отцензурированная версия слайдов. ;)

TRANSCRIPT

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

Андрей Аксенов,Sphinx Technologies Inc

PARENTAL WARNINGADULT 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се это вводится, впрочем, чтобы как-то сравнивать

разные отклики

Пример отклика 11. Sphinx | Open Source Search Server2. Sphinx - Wikipedia, the free encyclopedia3. Great Sphinx of Giza - Wikipedia, the free encyclopedia4. Overview - Sphinx 1.1.2 documentation

Пример отклика 21. Great Sphinx of Giza - Wikipedia, the free encyclopedia 2. Sphinx - Wikipedia, the free encyclopedia3. Sphinx | Open Source Search Server4. Overview - Sphinx 1.1.2 documentation

Пример отклика 31. Sphinx - Wikipedia, the free encyclopedia2. Sphinx | Open Source Search Server3. Overview - Sphinx 1.1.2 documentation4. 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 myindexWHERE MATCH('hello world')OPTION ranker=expr('sum(lcs*user_weight) *

1000+bm25')

Expression ranker, 2.0.2+

SELECT *, WEIGHT() FROM myindexWHERE 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

top related