Введение в информационный поиск

Лекция 2

Алгоритмы построения и сжатия индекса

Алгоритмы построения индекса

Обзор

  • Факты об аппаратном обеспечении
  • BSBI
  • SPIMI
  • MapReduce

Важнейшие показатели отклика

Основные факты о "железе"

  • Чтение в RAM значительно быстрее, чем с диска (SSD/HDD) => необходимость кэширования
  • При переносе данных из диска в RAM существенна задержка позиционирования (SSD - 16 мкс, HDD - 4 мс) => считывание/запись поблочно
  • CPU не задействован при переносе данных => эффективное* сжатие снижает время чтения

*с т.зр. декомпрессии

Indexing Revisited

Основная операция - сортировка значений termID-docID.

В реальности имеем карту term -> termID

Типичная тестовая коллекция

  • Новостная коллекция Reuters-RCV1
  • около 800 тыс. документов
  • 100 млн. лексем в коллекции
  • реальные новостные коллекции - больше на несколько порядков

Сколько потребуется памяти для хранения списка termId-docID?

Типичная тестовая коллекция

  • Новостная коллекция Reuters-RCV1
  • около 800 тыс. документов
  • 100 млн. уникальных лексем
  • реальные новостные коллекции - больше на несколько порядков

Если termId-docID храним как int (4Б) => 

10^8*8 \text{ B} = 0.8 \text{ GB}
1088 B=0.8 GB

Блочное индексирование, основанное на сортировке

Сложность алгоритма

BSBI-Invert по числу лексем T?

BSBI-Invert = сортировка

termID-docID + группировка по termID

\Theta(T \log T)
Θ(TlogT)

Блочное индексирование, основанное на сортировке

Посчитать время работы BSBI для Reuters-RCV1

Проблема

Карта term -> termID не помещается в RAM

Проблема

Карта term -> termID не помещается в RAM

Храним свой словарь для каждого блока 

Однопроходное индексирование в ОП

Сложность алгоритма по числу лексем T: 

\Theta (T)
Θ(T)

Распределенное индексирование с MapReduce

Алгоритмы сжатия индекса

Обзор

  • Статистические характеристики словаря
  • Сжатие словаря
  • Сжатие списка словопозиций

Закон Хипса

Оценка размера словаря по размеру коллекции

M=kT^b
M=kTb
  • M - размер словаря (количество уникальных терминов)
  • T - количество лексем в коллекции
  • k,b - параметры:
30 \leq k \leq 100
30k100
b \approx 0.5
b0.5

Зависимость линейна по log-log шкале

Закон Хипса для Reuters RCV-1

\log_{10} M = 0.49*\log_{10} T+1.64
log10M=0.49log10T+1.64

Зависимость, восстановленная по методу наименьших квадратов (пунктир):

k=10^{1.64}=44
k=101.64=44
b=0.49
b=0.49

 Т.о. с ростом коллекции размера словаря растет, и для больших коллекций он весьма велик => необходимость сжатия словаря

Закон Ципфа

Распределение частоты терминов в коллекции

cf_i = c*i^{-1}, \log cf_i = \log c - \log i
cfi=ci1,logcfi=logclogi

- частота термина в коллекции

- ранг термина по частоте термина в коллекции

cf_i
cfi
i
i

Зависимость линейна в log-log пространстве

Закон Ципфа для Reuters RC1

Частота термина в коллекции быстро падает с увеличением ранга => очень много редких терминов

Хранение словаря в виде массива

  • Термины упорядочены лексикографически
  • Бинарный поиск в массиве при поиске термина
  • Элементы фиксированной длины (напр., 20 байт как  длина максимального слова в английском)
  • M * (20 + 4 + 4) = 28 * M, M - число терминов

Словарь как строка

  • Словарь хранится как одна длинная строка
  • Указатели отмечают начало слова
  • Для Reuters RCV1: M=400000
  •                                  бита или 3 байта на указатели
  • 8 байт - средняя длина английского слова
  • M * (4 + 4 + 3 + 8) = 19*M
\log_2 400000*8 \approx 22
log2400000822

Блочное хранение

  • Термины группируются по блокам длины k
  • Указатели отмечают начало блока
  • Дополнительно хранится длина термина (1 байт на термин => k байт для блока)
  • Для k=4 экономим (k-1)*3=9 байт на указателях и дополнительно занимаем 4 байта для длин
  • M*(4 + 4 + 3/4 + 8) = 17.75*M

Term lookup/compression trade-off on k

  • Между блоками - бинарный поиск в массиве
  • Внутри блока - линейный поиск
  • Можно подобрать оптимальный k для сжатия и достаточного быстрого поиска

Фронтальное кодирование

  • Используем блочное кодирование
  • Храним общий префикс для терминов в блоке
  • * - спецсимвол конца префикса
  • ♢ - спецсимвол, заменяющий префикс 

  • Reuters RCV1 сжимается еще на 17%

Хранение словопозиций

  • В Reuters RCV1:
    • 800000 документов
    • в среднем 200 лексем в документе
    • средняя длина лексемы = 6
    • 100 млн. словопозиций
  • Необходимо                              бит на docID
  • Рассматриваем только docID в слопозициях
  • Файл словопозиций занимает 100 000 000*20/8 = 250 MБ
  • Цель сжатия - получить меньше 20 бит на docID
\log_2 800000 \approx 20
log280000020

Пропуски в списке словопозиций

  • Идея - хранить пропуски вместо docID, т.е. число документов до следующего документа, содержащего термин
  • Для высоко и среднечастотных терминов - ОК
  • Для редких - эквивалентно хранению исходных docID
  • => кодирование с переменной длиной

Кодирование переменной длины

  • Variable byte encoding - пример побайтового (byte-level) кодирования
  • Кодируем docID и значения пропусков с помощью байтов следующего свойства: 
    • 7 последних бит в байте значимы
    • 1й бит указывает, заканчивается ли на этом байте код
    • => однозначное префиксное декодирование
  • Сжимает коллекцию Reuters RCV1 на > 50%

Алгоритмы (де)кодирования для кодов переменной длины

Гамма коды

  • Пропуски представляется как пара <длина, отступ>
  • Отступ (offset) - это пропуск в бинарном виде с удаленным старшим битом:
    • например, 13 => 1101 => 101
  • Длина - это длина отступа в виде унарного кода:
    • унарный код числа n: n единиц с заключительным нулем
    • 13 => 3 бита => 1110
  • Гамма код - это конкатенация длины и отступа:
    • 13 => 1110 101

Свойства гамма кодов

  • Однозначное префиксное декодирование:
    • Сначала декодируется унарный код (до первого 0)
    • Затем отступ в бинарном виде после добавления начальной 1
  • Длина кода = 
  • => длина кода - гарантировано в пределах 2x длин оптимального кода (с     равновероятными пропусками), т.е. 
  • => гамма код - универсальный код
  • Reuters RCV1 сжимается на 15% лучше, чем VBE
  • свободен от параметров
  • более медленный при декодировании из-за длины не кратной машинному слову (8,16,32 ...)
2*\lfloor\log_2 G \rfloor + 1
2log2G+1
\log_2 G
log2G
2^n
2n

IR Course - Lecture 2 - Index construction & compression

By Nikita Zhiltsov

IR Course - Lecture 2 - Index construction & compression

  • 3,921