Про качественный поиск (Андрей Аксенов)

Post on 22-May-2015

2.045 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

Андрей Аксенов, http://sphinxsearch.com/#sphinxconf2011

PARENTAL WARNING:ADULT CONTENT

[0/4] Зачем вообще это все?

Зачем этот доклад• Скорости растут => скорости… неважны• Ну, в жизни, а не синтетических бенчмарках

• Людей-посетителей приучают к “плохому”• Google, Yandex, итп

• Из коробки получается не очень• Из коробки imho (imho!) и не может

получаться, надо по-разному тюнить• Ну и это просто интересная в целом тема!

Почему этот доклад• Коротенький блиц-доклад с РИТ ‘2011…

Почему этот доклад• Коротенький блиц-доклад с РИТ ‘2011…

Почему этот доклад• …с апреля по декабрь немного вырос…

[1/4] Что такое релевантность

Релевантность, это -• Такой спец-термин из поиска• Такое большое человеческое заблуждение• Щаз будем заменять одно заблуждение

набором других!• Возникает т.н. «релевантность» ровно в тот

момент…

…когда кто-нибудь…

…где-нибудь…

…что-нибудь…

…ищет и, увы (*), находит

(*) самый быстрый запрос – пустой!

И приходится их ранжировать!!!

Один случайный запрос, например

ОСКАР

Оскар. И ЧО?

Оскар. И ЧО?

Оскар. И ЧО?

…или даже

ОСКАР

…или даже

ОСКАЛ

Внезапно, шокирующая истина!!!

Нет никакой ложки!!!

…и той Релевантности заветной – тоже.

“Красота – в глазах смотрящего.”

Но ранжировать все равно надо!

Как это устроено “сегодня”?

Документ"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) + … ?

• …• См. аналитически невозможно, ага

Вид Идеальной ф-ии неизвестен

Ш.И. Поэтому – вид функции…

…тупо кусочно-линейный!!! (*)

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

SEO bonus chatter

[2/4] Встроенные ранкеры

Или…• Как все (теперь) “хорошо” в веб-поиске, и

(пока еще) “плохо” в менее затейливых движках, особенно опен-сорсных

Или…

Текущий разрыв

Все остальные Веб-поиск

1-10… факторов 100-1000+ факторов

0 оценок? 1-10M+ оценок

Ad-hoc функции(см. левая пятка)

Специально обученные функции(см. маш. обучение)

Не все так страшно!!!• Вы не Google!• А, скажем, сайт про запчасти для Белазов• Незначительно поменьше данных• Чуть пореже запросы• Отклики потоньше• Ad-hoc может приемлемо сработать

Не все так страшно!!!• Lucene @ ROMIP

Концепт «ранкера»• Тупо какая-то функция ранжирования• Тупо заранее (нами) встроенная в Sphinx• Можно выбирать на лету, 1 строкой• $client->SetRankingMode(SPH_RANK_BM25)• SELECT … OPTION ranker=bm25

• Осторожно, скользкая ступенька!• Через API только в режиме extended• $client->SetMatchMode(SPH_MATCH_EXTENDED)

Какие встроенные ранкеры брать?• BM25 – грубо говоря, аналог Lucene• PROXIMITY_BM25 – бустит (под)фразы• Но не смотрит на частоты слов в подфразе

• SPH04 – еще бустит начало поля, точное совпадения поля

• Других встроенных ”про качество” пока нет• И, возможно, уже не будет…

[3/4] Мега-фича: формулы на лету!

Expression ranker, 2.0.2-beta

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• Местами неудобно, местами не хватает per-

keyword слов, и т.п.

• Номера моделей – препроцессинг, и-или танцы с blend_chars, stopword_step, и т.п.• Скорее всего все равно понадобится ряд

ручных правил, не избежать

Итого

Итого• Вот как вообще устроена релевантность• Вот что уже встроено в Сфинкс• Вот как теперь бороть релевантность• Вот какие еще есть беды с качеством• Вот как можно их тоже забарывать

• Почему ваш поиск до сих пор… так себе?!

Вопросы?(Качественные, пожалуйста! ;))

top related