Технологии хранения и обработки больших объёмов...
TRANSCRIPT
Big Data’15Лекция III: информационный поиск
Дмитрий Барашев[email protected]
Computer Science Center
3 марта 2015
Этот материал распространяется под лицензией
Creative Commons ”Attribution - Share Alike” 3.0http://creativecommons.org/licenses/by-sa/3.0/us/deed.ru
сверстано в онлайн LATEX редакторе
P
a
peeriapapeeria.com
Постановка задачи▶ У пользователя есть поисковая потребность(information need)
▶ Потребность более или менее точновыражается запросом
▶ запрос кстати ̸=потребность▶ Документом называется некоторая единицапоиска и результата
▶ например вебстраница, но это может быть иабзац текста или коллекция страниц (напримерпатент)
▶ Документы образуют корпус▶ Задача информационного поиска: найти вкорпусе документы, удовлетворяющиеинф.потребность
▶ или хотя бы документы, релевантные запросу
Основные проблемы
▶ Большой размеры корпуса▶ Слабая структура или отсутствие структуры▶ Плохие пользователи с неточными запросами▶ Нетерпеливые пользователи не хотят ждатьдаже минуту
Запрос и результат
▶ Как выглядит запрос?▶ Каким должен быть результат?▶ Что означает «документ удовлетворяетзапросу» ?
▶ Все ли документы одинаково хорошоудовлетворяют запросу?
▶ Как измерить релевантность документа(соответствие его запросу) ?
▶ Насколько точные запросы формулируютпользователи?
Ответы зависят от используемой модели поиска
Запрос и результат
▶ Как выглядит запрос?▶ Каким должен быть результат?▶ Что означает «документ удовлетворяетзапросу» ?
▶ Все ли документы одинаково хорошоудовлетворяют запросу?
▶ Как измерить релевантность документа(соответствие его запросу) ?
▶ Насколько точные запросы формулируютпользователи?
Ответы зависят от используемой модели поиска
Некоторые модели
▶ Поиск по регулярному выражению▶ Булевская модель▶ Векторная модель▶ Вероятностная модель
Подстрока и регулярные выражения
▶ Запрос – одна строка или одно регулярноевыражение
▶ ”Database query optimization” илиDatabase\s+query\s+optimization
▶ Документ рассматривается как одна большаястрока или как список строк
▶ Документ, в котором нашлось совпадениеподстроки/выражения, считается релевантным
▶ Обычно все документы в результате одинаковорелевантны
▶ Самый простой инструмент – утилита grep
Булевский поиск
▶ Документ рассматривается как(мульти)множество слов
▶ Запросом являются слова, объединённыелогическими операторами
▶ Слово в запросе заменяется на true если оносодержится в документе
▶ Релевантным называется документ, длякоторого полученное логическое выражениевернуло true
ПримерDatabase AND optimization AND NOT query
▶ Булевский поиск тоже можно сделатьконсольными утилитами
Булевский поиск: расширенные модели
▶ Дополнительные операции: «находится рядом»,совпадение по подстроке или регулярномувыражению
▶ Некоторое ранжирование: документ делится на«зоны» и зонам назначаются веса
Булевский поиск: достоинства
▶ Запросы точны: вы получаете ровно то, чтопросили
▶ Запросы могут передавать довольно сложныеинформационные потребности
Булевский поиск: недостатки
▶ Формулировка запросов – непростая задача▶ выпускник технического вуза может исправится, обычный человек нет
▶ Классическая модель бедна, расширенныесложны
▶ «Неустойчивость» результата к операторам▶ AND может сильно сократить множестводокументов в результате
▶ OR наоборот, может его сильно расширить▶ Классическая модель не подразумеваетранжирования документов
Векторный поиск: мотивация
▶ Пользователь может и не знать какие словаприсутствуют в корпусе
▶ сколько нужно SEOшников чтобы вкрутитьлампочку, лампочки, лампы накаливания, бра,светильники, доставка
▶ Если слова в документе нет то это не поводдокумент отвергать
▶ Не все слова одинаково ценны▶ купить синхрофазотрон онлайн
Векторный поиск: мотивация
▶ Пользователь может и не знать какие словаприсутствуют в корпусе
▶ сколько нужно SEOшников чтобы вкрутитьлампочку, лампочки, лампы накаливания, бра,светильники, доставка
▶ Если слова в документе нет то это не поводдокумент отвергать
▶ Не все слова одинаково ценны▶ купить синхрофазотрон онлайн
Векторный поиск: абстрактная модель
▶ Документ d и запрос q – векторы в многомерномпространстве
▶ Измерениями являются слова, значениямикоординат вектора – некоторые числа,соответствующие паре (d,w)
▶ Релевантность документа запросу – какая-томера близости двух векторов sim(d,q)
Наивный пример▶ Три измерения▶ Координата равна 1 если слово есть вдокументе/запросе
▶ Мера близости – модуль разности векторов
Локальная частота слова
▶ Слова в каждом документе неравноправны▶ Если текст про конечные автоматы случайносодержит слово ”Калашников” то для запросаавтомат Калашникова он будет равноправен стекстом, описывающим историю автоматаКалашникова
▶ Давайте посчитаем ft,d – «сырую» частотувхождения каждого слова в документ
теперь текст про автомат Калашникова скореевсего выиграет
Локальная частота слова
▶ Слова в каждом документе неравноправны▶ Если текст про конечные автоматы случайносодержит слово ”Калашников” то для запросаавтомат Калашникова он будет равноправен стекстом, описывающим историю автоматаКалашникова
▶ Давайте посчитаем ft,d – «сырую» частотувхождения каждого слова в документ
теперь текст про автомат Калашникова скореевсего выиграет
Нормализация сырой частоты▶ Если просто считать число вхождений то болеедлинные документы будут выигрывать
▶ Сырую частоту можно нормализовать:▶ длиной документа:
tft,d =ft,d|d|
▶ максимальной сырой частотой:
tft,d =ft,d
max fw,d,w ∈ d
▶ или сделать ее рост нелинейным:
tft,d = 1 + log ft,d
если ft,d > 0
Обратная встречаемость слова▶ Слова вообще неравноправны▶ я, мы, что, где, когда встречаются чуть менеечем везде, а вот синхрофазотрон еще надопоискать
▶ кошмар гуглера: ВИА ”the the”▶ Можно посчитать частоту слова во всем корпусе
▶ Но более разумно:
▶ посчитать сколько документов в корпусесодержат слово:
|d : t ∈ d|▶ и взять логарифм от обратной дроби:
idft = log |D||d : t ∈ d|
Обратная встречаемость слова▶ Слова вообще неравноправны▶ я, мы, что, где, когда встречаются чуть менеечем везде, а вот синхрофазотрон еще надопоискать
▶ кошмар гуглера: ВИА ”the the”▶ Можно посчитать частоту слова во всем корпусе▶ Но более разумно:
▶ посчитать сколько документов в корпусесодержат слово:
|d : t ∈ d|
▶ и взять логарифм от обратной дроби:
idft = log |D||d : t ∈ d|
Обратная встречаемость слова▶ Слова вообще неравноправны▶ я, мы, что, где, когда встречаются чуть менеечем везде, а вот синхрофазотрон еще надопоискать
▶ кошмар гуглера: ВИА ”the the”▶ Можно посчитать частоту слова во всем корпусе▶ Но более разумно:
▶ посчитать сколько документов в корпусесодержат слово:
|d : t ∈ d|▶ и взять логарифм от обратной дроби:
idft = log |D||d : t ∈ d|
TF-IDF
▶ Получили IDF - глобальную характеристикуслова и TF - характеристику слова в конкретномдокументе
tf ∗ idft,d = tft,d ∗ idft
▶ увеличивается когда вообще редкое слово частовстречается в одном документе
▶ уменьшается когда слово встречается реже вдокументе или чаще в коллекции
▶ равен нулю если слово присутствует во всехдокументах
Варианты модели векторного поиска
▶ вектор документа −→d состоит из tf*idf, вектор
запроса −→q из 1 или 0▶
−→d состоит из tf, −→q из idf
▶ скалярное произведение −→d · −→q нормализуется
эвклидовыми длинами:
sim(d,q) =−→d · −→q
|−→d | ∗ |−→q |
▶ или как-то иначе▶ или рассматривается модуль расстояния междувекторами: sim(d,q) = |
−→d −−→q |
Эффективный поиск
▶ Линейно просмотреть все документы! O(N)!▶ При 1млрд документов и 1мс на документуложимся в 1млн секунд :)
▶ Если найдем 10000 процессоров, уложимся в100 секунд
▶ O(результата), а не O(корпуса) было бы лучше
Эффективный поиск
▶ Линейно просмотреть все документы! O(N)!▶ При 1млрд документов и 1мс на документуложимся в 1млн секунд :)
▶ Если найдем 10000 процессоров, уложимся в100 секунд
▶ O(результата), а не O(корпуса) было бы лучше
Матрица инцидентности▶ Построим матрицу с терминами в строках идокументами в столбцах
compscicenter amazon microsoft iStorecomputer 1 1 0 1science 1 0 0 0center 1 0 1 1
research 0 0 1 0book 0 1 0 0sale 0 1 0 1
▶ булевский запрос computer AND center AND NOTscience вычислится как 1101 AND 1011 AND0111 и вернет 0001 – iStore
▶ Битовая маска для 1млрд битов займет порядка100Мб, но таких понадобятся сотни тысяч
Матрица инцидентности▶ Построим матрицу с терминами в строках идокументами в столбцах
compscicenter amazon microsoft iStorecomputer 1 1 0 1science 1 0 0 0center 1 0 1 1
research 0 0 1 0book 0 1 0 0sale 0 1 0 1
▶ булевский запрос computer AND center AND NOTscience вычислится как 1101 AND 1011 AND0111 и вернет 0001 – iStore
▶ Битовая маска для 1млрд битов займет порядка100Мб, но таких понадобятся сотни тысяч
Инвертированный индекс
▶ Отображение терма в список содержащих егодокументов
▶ Документ идентифицируется численнымидентификатором docid
▶ Множество термов называется словарем(vocabulary, dictionary)
▶ Списки называются списками вхождений(posting lists)
▶ Кроме docid элемент списка может содержатьtf*idf и еще какую-нибудь информацию
Булевский поиск с использованиеминдекса
▶ Пусть списки вхождений отсортированы повозрастанию docid
▶ Тогда запрос computer AND center можновычислить алгоритмом похожим на merge sort
Более сложные запросы
▶ В запросе несколько термов: computer ANDcenter AND NOT science
▶ Можно воспользоваться multiway merge sort▶ Можно составить деревянный план выполненияи начать оптимизировать:
▶ сначала пересечь самые короткие списки▶ или положить самый маленький список в памятьи начать вычеркивать лишние документы
А может SQL?
Запрос a AND b:1 SELECT doc_id FROM PL JOIN T WHERE PL.term_id = T.id AND
T.value=’a’2 INTERSECT3 SELECT doc_id FROM PL JOIN T WHERE PL.term_id = T.id AND
T.value=’b’
Векторный поиск с использованиеминдекса
▶ Общая мысль: нужны не все документы, атолько самые релевантные
▶ Два подхода: пословный (term-at-a-time) иподокументный (document-at-a-time)
Пословный поиск
1 scores = {}2 for qt in query:3 for dt in posting_lists[qt]:4 scored[dt.doc] += qt.weight * dt.weight5
6 for d in keys(scores):7 scores[d] = scores[d] / d.length8
9 return top_k(scores)
Подокументный поиск
1 top_k = TopK()2 plists = {}3 for qt in query:4 plists[qt] = posting_lists[qt]5 cur_doc_id = None6 score = 07 while len(plists) > 0:8 qt, dt = pull_min_doc_id(plists)9 if dt.doc_id != cur_doc_id:
10 top_k[cur_doc_id] = score11 score = 012 cur_doc_id = dt.doc_id13 score += qt.weight * dt.weight
Размер результата
▶ Мало кому нужны все 100500 релевантныхдокументов
▶ Нужно обычно K самых релевантных (Top-K)▶ Варианты:
▶ «точный» – это действительно Top-K▶ «приблизительный» – K похожих на самыерелевантные
Стратегии поиска Top-K
▶ Сортировка всех документов :)▶ Отбрасывание тех кто заведомо хуже ужеотобранных
▶ Ограниченное время на поиск – что нашли тонашли
Сделать приблизительный поискпоточнее
▶ Рассматривать только термы с большим IDF▶ Рассматривать только документы, содержащиенесколько слов запроса
▶ Специальная организация списков вхождений
Разбиение списков вхождений
▶ Чемпионский список для терма t: документы свесом tft выше какого-то порогового значенияили просто top-m документов в порядкеубывания веса терма
▶ Слоеный индекс, делящий документы по«важности», «свежести», и т.д.
Упорядочивание списков вхождений
▶ Нужно любое, одинаковое во всех списках▶ Возрастание docid – окей, но можно ли лучше?▶ Например чтобы самые «ценные» документыбыли в начале списка
Ценность документа
▶ Некоторая характеристика, не зависящая отзапроса
▶ Выше ранг – ценнее документ▶ Упорядочивание по статическому рангупозволит закончить поиск быстрее
▶ Примеры статического ранга: количествоцитирований статьи, индекс Хирша автора,индекс цитируемости СМИ, pagerank в вебе
Инструменты веб поиска
▶ Библиотека Apache Lucene▶ Одно из лучших Open-source решений▶ Написана на Java▶ Работает ”из коробки” и позволяет встраивать инастраивать всё, от структур хранения домоделей ранжирования
▶ Надстройки над Lucene: ElasticSearch, Solr▶ Sphinx▶ Реляционные СУБД не сдаются: в PostgreSQLвстроена поисковая система
Поисковик на коленке
▶ Нужно сделать списки вхождений и найти tf/idf▶ И то и другое можно сделать при помощиmap-reduce