You are on page 1of 64

ЛЕКЦІЯ 5.

СТИСКАННЯ
ІНДЕКСУ
Глибовець А.М.
СТИСКАННЯ ІНДЕКСУ
 В попередніх лекціях ми поговорили про створення
словника і інвертованого індексу пошукової системи.
 В цій лекції ми розглянемо методи стискання, що
дозволяють підвищити продуктивність роботи
пошукової системи.
СТИСКАННЯ ІНДЕКСУ
 Переваги стискання:
 Необхідно менше дискового простору
 В деяких випадках можна досягнути коефіцієнта 1:4
 Підвищує ефективність кешування
 Ми можемо розміщувати в пам’ять інвертовані списки термінів
по яким частіше проходить пошук
 При використанні стискання ми зможемо покласти більше таких

термінів
 Підвищення швидкості передачі даних з диска в пам’ять:
 [читання стиснутих даних/ декомпресія] швидше ніж [читання
не стиснутих даних]
 Припущення: існують швидкі алгоритми декомпресії
СТИСКАННЯ ІНДЕКСУ
 Якщо основною ціллю стискання є економія дискової
пам’яті, то швидкість стискання не грає великої ролі.
 Але швидкість розпакування має бути дуже
високою!!!
 Алгоритми, що ми розглянемо вважаються
ефективними і тому використовуються в пошукових
системах.
СТИСКАННЯ ІНДЕКСУ
 В цій лекції словопозиція (posting) в інвертованому
списку інтерпретуються як ідентифікатор документу
docID
 Наприклад інвертований список (6:20,45,100), де 6 –
ідентифікатор терміна з списку, містить три словопозиції
(три документи в яких ми знайшли це слово)
 В цій лекції ми не розглядаємо індекси з частотою і
координатні індекси, хоча ефективні алгоритми для цих
індексів також існують.
СТИСКАННЯ ІНДЕКСУ
 Як приклад колекції будемо розглядати Reuters-RCV1
 Пригадаємо статистичні дані.
REUTERS RCV1 СТАТИСТИКА
Символ Показник Значення
N Документи 800000
Lave Середня кількість лексем в тексті 200
M Терміни 400000
Середня кількість байт в лексемі 6
(включаючи проміжки і знаки
пунктуації)
Середня кількість байт в лексемі (без 4,5
проміжків і знаків пунктуації)
Середня кількість байт в терміні 7,5
T лексеми 100000000
Sec. 5.1

ЕФЕКТ ПОПЕРЕДНЬОЇ ОБРОБКИ


Кількість термінів Не координатні Лексеми(=кількість
(terms) словопозиції слововживань в індексі)

Кі-ть ∆% Т% Кі-ть ∆% Т% Кі-ть ∆% Т%

Вхідні дані 484494 109,971179 197,879290

Без чисел 473723 -2 -2 100,680242 -8 -8 179,158204 -9 -9

Без регістру 391523 -17 -19 96,969056 -3 -12 179,158204 0 -9

30 стоп-слів 391493 -0 -19 83,390443 -14 -24 121,857825 -31 -38

150стоп-слів 391373 -0 -19 67,001847 -30 -39 94,516599 -47 -52

Стеммінг 322383 -17 -33 63,812300 -4 -42 94,516599 0 -52

∆% - процент відношення відносно попередньої стрічки, %Т –


загальне стискання 8
СТИСКАННЯ ІНДЕКСУ
 В цілому, стаститичні показники з таблиці свідчать
про те, що попередня обробка сильно впливає на
розмір словника і кількість некоординатних
словопозицій.
 Методи стискання які ми будемо розглядати, є
методами стискання інформації без втрат (lossless
compression)
 Стискання інформації з втратами (lossy compression)
дозволяє досягнути більш високого ступеню
стискання за рахунок відкидання деяких даних.
СТИСКАННЯ ІНДЕКСУ
 Перед тим як описувати методи стискання словника,
оцінимо кількість різних термінів M в колекції.
 Інколи говорять, що мови мають словник
визначеного розміру.
 В другому виданні Oxford English Dictionary
міститься більше 600 тисяч слів.
 Однак словники більшості великих колекцій набагато
більші.
 Вінне містить прізвищ, географічних назв, назв
продуктів і т.д.
ЗАКОН ХІПСА: ОЦІНКА КІЛЬКОСТІ
ТЕРМІНІВ
 Кращій спосіб оцінити число М – використати закон
Хіпса (Heaps’ law), що дозволяє обрахувати розмір
словника як функцію, що залежить від розміру
колекції.
M = kTb
 Де Т – кількість лексем в колекції
 Типові показники k і b такі:
 30 ≤ k ≤ 100 і b ≈ 0.5
 Обгрунтування закону полягає в тому, що самою
простою залежністю між розмірами колекції і
словника є лінійна функція в логрифмічній системі
координат, а припущення про лінійність на практиці
часто є справедливим.
Sec. 5.1

Для RCV1, пунктирна лінія

log10M = 0.49 log10T + 1.64


побудована методом найменших
квадратів.
Звідси, M = 101.64T0.49 а значить k =
101.64 ≈ 44 і b = 0.49.

Гарне емпіричне наближення до


Reuters RCV1 !
Для перших 1,000,020 лексем,
Закон припускає 38,323 термінів;
А насправді, 38,365 термінів

12
ЗАКОН ХІПСА: ОЦІНКА КІЛЬКОСТІ
ТЕРМІНІВ
 Параметр k змінюється в доволі широких діапазонах,
оскільки зростання лексикону в багатьох випадках
залежить від природи колекції і способу її обробки.
 З за описок і технічних лексем значення b в веб-
колекціях значно ближче до 1.0, чим до 0,5.
ЗАКОН ЦІПФА: МОДЕЛЮВАННЯ
РОЗПОДІЛЕННЯ ТЕРМІНІВ
 Визначимо також розподілення термінів серед
документів.
 Це допоможе нам описати властивості алгоритмів
стискання.
ЗАКОН ЦІПФА: МОДЕЛЮВАННЯ
РОЗПОДІЛЕННЯ ТЕРМІНІВ
 Для моделювання розподілу термінів в колекції
використовується закон Ціпфа (Zipfs’ law).
 Якщо до якого-небудь досить великого тексту
скласти список всіх слів, що зустрілися, а потім
відранжувати ці слова в порядку спадання їх частоти
в тексті, то для будь-якого слова добуток його рангу r
і частоти f буде константою.
 Що це нам дає?
ЗАКОН ЦІПФА: МОДЕЛЮВАННЯ
РОЗПОДІЛЕННЯ ТЕРМІНІВ
 Він стверджує, що якщо t1 – найбільш поширений
термін в колекції, t2 – наступний по поширеності, і
т.д.
 Тоді частота і-го по поширеності терміна в колекції
cfi пропорційна 1/і
Sec. 5.1

ZIPF’S LAW FOR REUTERS RCV1

17
СТИСКАННЯ СЛОВНИКА
 Ми розглянемо декілька структур даних, що
забезпечують послідовно збільшуючіся коефіцієнти
стискання.
 Як ми вже розібралися, словник має менший розмір
ніж інвертований список, нащо ж нам його стискати?
СТИСКАННЯ СЛОВНИКА
 Основне призначення стискання словника, це
можливість розміщення його повністю в оперативну
пам’ять, або хоча б більшу його частину.
РОЗМІР СТРІЧКИ В JAVA
 Скільки буде займати порожня стрічка?
 Стрічка це об’єкт з трьома полями int і масивом
char‘ів
 [8 bytes (заголовок об’єкта) + 3*4(int) + 4 (посилання
на масив)]{вирівнювання по 8 байтам} + [8 bytes
(заголовок об’єкта масива) + 4(int довжина массива)
+ 2(char)*довжина стрічки]{вирівнювання по 8
байтам} = 24 + [12 + 2*length]{вирівнювання по 8
байтам} = [36 + 2*length]{вирівнювання по 8
байтам}
 40 байт!!!

 Для х64 – 64 байта


СТИСКАННЯ СЛОВНИКА. СЛОВНИК ЯК
СТРІЧКА
 Надалі ми будемо розглядати структури без
прив’язки до мови програмування.
СТИСКАННЯ СЛОВНИКА. СЛОВНИК ЯК
СТРІЧКА
 Для зберігання словника простіше всього
розташувати його елементи в лексикографічному
порядку і записати в масив записів фіксованої
довжини.
 Ми виділяємо 20 байт для терміна (в анг. мові лише
деякі терміни мають більше 20 символів), 4 байт –
для документної частоти і 4 байт – для вказівника на
інвертований список.
Sec. 5.2

СТИСКАННЯ СЛОВНИКА. СЛОВНИК ЯК


СТРІЧКА
 Масив фіксованих записів
 ~400,000 термінів; 28 bytes/term = 11.2 MB.

23
Термін Частота Вказівник
a 656,265
aachen 65
…. ….
zulu 221

20 bytes 4 bytes кожен


Пошук по словнику
СТИСКАННЯ СЛОВНИКА. СЛОВНИК ЯК
СТРІЧКА
 4 байтні вказівники дозволяють адресувати 4 ГБ
пам’яті.
 Для крупних колекцій для вказівників може
знадобитися більше пам’яті
 Пошук терміна в масиві здійснюється за допомогою
бінарного пошуку.
СТИСКАННЯ СЛОВНИКА. СЛОВНИК ЯК
СТРІЧКА
 Зберігати терміни як елементи фіксованої довжини
недоцільно.
 Середня довжина терміна в англійській мові
приблизно 8 символів, тому ми витрачаємо
приблизно 12 символів
 Крім того ми не можемо зберігати терміни довжини
більше 20 символів
 Тому ми можемо зберігати словник як одну велику
стрічку.
 Як це зробити?
Sec. 5.2

СТИСКАННЯ СЛОВНИКА. СЛОВНИК


ЯК СТРІЧКА
 Зберігаємо словник як довгу стрічку символів:

Вказівник на наступне слово означає кінець поточного слова

Сподіваємося зберегти до 60% місця

26
….systilesyzygeticsyzygialsyzygyszaibelyiteszczecinszomo….

Частота Вказівник Вказівник


на список на термін Загальна довжина стрічки =
33 400K x 8B = 3.2MB
29
44 Вказівники на слова 3.2M
126 розмір: log23.2M =
22bits = 3bytes
СТИСКАННЯ СЛОВНИКА. СЛОВНИК ЯК
СТРІЧКА
 Як і до цього ми шукаємо терміни в таблиці з
використанням бінарного пошуку (але таблиця тепер
займає менше місця).
 Однак тепер нам необхідна пам’ять для зберігання
вказівників на терміни.
 Нам необхідно 3 байти на вказівник.

 В новій схемі для зберігання колекції необхідно:


400000х(4+4+3+8)=7,6 Мбайт (8 байт в середньому
на зберігання терміна).
 Таким чином ми зекономили з 11,2 до 7,6 Мбайт.
СТИСКАННЯ СЛОВНИКА. СЛОВНИК ЯК
СТРІЧКА
 Як можна ще покращити?
СТИСКАННЯ СЛОВНИКА. БЛОЧНЕ
ЗБЕРІГАННЯ.
 Словник можна стиснути ще більше, згрупувавши
терміни в стрічці по блокам розміром k і зберігаючи
вказівник тільки на перший термін кожного блоку
 Довжина терміна зберігається в стрічці у вигляді
додаткового байта на початку терміна.
 Таким чином, ми виключаємо k-1 вказівників на
терміни, але потребуємо додатково k байт для
зберігання довжини кожного терміна.
СТИСКАННЯ СЛОВНИКА. БЛОЧНЕ
ЗБЕРІГАННЯ.
 При k=4 ми економимо (k-1)х3=9 байт на кожному
вказівнику на термін, але потребуємо додатково k=4
байт для зберігання довжин термінів
 Загальні вимоги до пам’яті для зберігання лексикону
колекції зменшуються на 5 байт на кожний з блоків,
що складаються з чотирьох термінів.
 В цілому 400000х(1/4)х5 = 0,5 Мбайт, тобто розмір
пам’яті, що нам необхідний зменшується до 7,1
Мбайт.
Sec. 5.2

СТИСКАННЯ СЛОВНИКА. БЛОЧНЕ


ЗБЕРІГАННЯ.

….7systile9syzygetic8syzygial6syzygy11szaibelyite8szczecin9szomo….

31
Freq. Postings ptr. Term ptr.
33
29
 Зберігаємо 9 bytes
44
 на 3 Втрачаємо 4 bytes на
126  вказівниках. довжині терміна.
7
СТИСКАННЯ СЛОВНИКА. БЛОЧНЕ
ЗБЕРІГАННЯ.
 Збільшуючи розмір блока k, ми можемо досягнути
ще більшого стискання.
 Однак існує протиріччя між стисканням і швидкістю
пошуку терміна.
 Це різниця між пошуком по бінарному дереву і
пошуку по списку
СТИСКАННЯ СЛОВНИКА. БЛОЧНЕ
ЗБЕРІГАННЯ.
А. Бінарний пошук в нестиснутому
словнику

Б. В стиснутому словнику ми спочатку знаходимо блок терміна за


допомогою бінарного пошуку. Після цього визначаємо його
координату в списку шляхом лінійного пошуку по блоку
СТИСКАННЯ СЛОВНИКА. БЛОЧНЕ
ЗБЕРІГАННЯ.
 Пошук в нестиснутому словнику в п. А в середньому
займає (0+1+2+3+2+1+2+2)/8 приблизно 1,6 кроків,
якщо припустити, що кожний термін з однаковою
вірогідністю з’являється в пошуку.
 В п. Б при розмірі блоку, рівному k=4, в середньому
потребує (0+1+2+3+4+1+2+3)/8=2 кроки, тобто
приблизно на 25% більше.
СТИСКАННЯ СЛОВНИКА. БЛОЧНЕ
ЗБЕРІГАННЯ.
 Збільшуючи параметр k, ми можемо зробити розмір
зжатого словника скільки завгодно близьким до
мінімуму, тобто 400000х(4+4+1+8)=6,8 Мбайт, але
пошук терміна при великих значеннях к стає
неприпустимо повільним.
СТИСКАННЯ СЛОВНИКА. БЛОЧНЕ
ЗБЕРІГАННЯ.
 Що ще ми можемо оптимізувати?
СТИСКАННЯ СЛОВНИКА. БЛОЧНЕ
ЗБЕРІГАННЯ.
 Ми не використали ще одне джерело збитковості при
зберіганні словника – той факт, що послідовні
елементи в списку, впорядкованому по алфавіту
мають однакові префікси.
 Це спостереження приводить до фронтальної
упаковки (front coding)
Sec. 5.2

ФРОНТАЛЬНА УПАКОВКА
 Фронтальна упаковка:
 Відсортовані слова зазвичай мають довгі спільні префікси

38
– тоді будемо зберігати лише відмінні частини
 (для k-1 в блоку з k)

8automata8automate9automatic10automation

8automat*a1e2ic3ion

Розмір залишку
Кодує automat після automat.
ФРОНТАЛЬНА УПАКОВКА
 Експеримент показав, що для колекції Reuters
фронтальна упаковка економить ще 1,2 Мбайт
СТИСКАННЯ СЛОВНИКА
 Інші схеми з ще більш високим ступенем стискання
засновані на мінімальному ідеальному хешуванні.
 При цьому функція хешування відображує М
термінів в множину [1,..,M] без колізій.
 Однак ми не можемо застосовувати ідеальне
хешування необмежено, так як кожний новий термін
викликає колізії, і відповідно вимагає створення
нової ідеальної функції хешування.
СТИСКАННЯ СЛОВНИКА
 При роботі з дуже великими текстовими колекціями
на апаратному забезпеченні з обмеженими ресурсами
навіть при найкращій схемі стискання неможливо
записати весь словник в оперативну пам’ять.
 Якщо словник необхідно розбити на частини для
запису на диск, то можна проіндексувати перший
термін кожної сторінки за допомогою В-дерева.
Sec. 5.2

СТИСНЕННЯ СЛОВНИКА RCV1


Структура даних Розмір в
MB

42
Словник з фіксованим розміром 11.2

Словник з вказівниками на терміни в стрічці 7.6

Те ж але з блоками k = 4 7.1

Те ж але з фронтальною упаковкою 5.9


СТИСКАННЯ ІНВЕРТОВАНОГО ФАЙЛУ
 Колекція Reuters містить 800 тисяч документів, 200
лексем в документі, шість символів в лексемі і 100
мільйонів словопозицій, причому для простоти ми
вважаємо, що ця словопозиція складається лише з
ідентифікатора документу (не містить частоти і
координат терміна в документі).
 Ідентифікатори документів займають log 800,000 ≈
2
20 біт.
 Відповідно розмір колекції приблизно дорівнює
800000х200х6 байт = 960 Мбайт.
 А розмір нестиснутого інвертованого файлу
дорівнює 100000000х20/8 = 250 Мбайт.
СТИСКАННЯ ІНВЕРТОВАНОГО ФАЙЛУ
 Для більш раціонального представлення
інвертованого файлу, використовуючих менше 20 біт
на документ, відмітимо, що словопозиції частих
термінів мають близьке значення.
 Пройдемо по документам колекції і пошукаємо часто
зустрічаємий термін computer.
 Ми знайдемо документ, що містить це слово, потім
пропустимо декілька документів і знову знайдемо
документ, що містить.
Sec. 5.3

СТИСКАННЯ ІНВЕРТОВАНОГО ФАЙЛУ

45
СТИСКАННЯ ІНВЕРТОВАНОГО ФАЙЛУ
 Яке припущення ми можемо зробити?
СТИСКАННЯ ІНВЕРТОВАНОГО ФАЙЛУ
 Ми зберігаємо список документів в порядку
зростання їх docID.
 computer: 33,47,154,159,202 …
 Висновок: краще зберігати інтервали.
 33,14,107,5,43 …
 Надія: більшість інтервалів можуть бути збережені з
використанням набагато менше місця ніж 20 біт.
СТИСКАННЯ ІНВЕРТОВАНОГО ФАЙЛУ
 На практиці інтервали між найбільш частими
термінами такими як the і for всього 1.
 Однак проміжки між рідкими словами (наприклад
arachnocentric) по розміру мало відрізняється від
ідентифікаторів документів і потребує для зберігання
20 біт.
 Для економного представлення такого розподілення
інтервалів необхідний метод упаковки з
використанням кодів змінної довжини (variable
encoding method), що для більш коротких інтервалів
використовує менше бітів.
СТИСКАННЯ ІНВЕРТОВАНОГО ФАЙЛУ
 Для того, що б закодувати невеликі числа,
використовується менше пам’яті, чим для кодування
великих чисел, розглянемо два методи: байтове
стискання (bytewise compression) і бітове стискання
(bitwise compression).
БАЙТОВЕ КОДУВАННЯ ЗМІННОЇ
ДОВЖИНИ
 Байтове кодування змінної довжини (variable byte
encoding – VB, або variable byte coding - VBC)
використовує для кодування інтервалів цілу кількість
байтів.
 Останні 7 біт в кожному байті є “корисним
навантаженням” (continuation bit) і кодують частину
інтервала.
 Перший біт байта є бітом продовження (continuation
bit).
 Він дорівнює одиниці у останнього байта
закодованого інтервалу і нулю в інших випадках
Sec. 5.3

ПРИКЛАД
docIDs 824 829 215406
Інтервал 5 214577

51
VB код 00000110 10000101 00001101
10111000 00001100
10110001

Словопозиції зберігаються як конкатенація байт


000001101011100010000101000011010000110010110001

Основна властивість: VB-закодовані словопозиції декодуються


Завдяки префіксам О або 1.

Для маленького інтервалу (5), VB


використовує весь байт.
БАЙТОВЕ КОДУВАННЯ ЗМІННОЇ
ДОВЖИНИ
 Як показали експеременти, при використанні
байтового кодування змінної довжини розмір
стиснутого індексу для колекції Reuters дорівнює 116
Мб.
 Це означає, що економія пам’яті в порівнянні з
нестиснутим індексом перевищує 50%
БАЙТОВЕ КОДУВАННЯ ЗМІННОЇ
ДОВЖИНИ
 Ідею байтового кодування змінної довжини можна
застосувати до одиниць пам’яті, що можуть бути як
більше так і менше байта: 32, 16 і 4-бітові слова, або
напівбайти (nibbles)
 Для більшості систем інформаційного пошуку
байтове кодування змінної довжини забезпечує
найкращий компроміс між швидкістю пошуку і
розміром пам’яті
УНАРНИЙ КОД
 Подаємо n як n 1-ок з 0 в кінці.
 Унарний код для трьох 3 = 1110.

54
 Унарний код для 40:

11111111111111111111111111111111111111110 .
 Унарний код для 80:

111111111111111111111111111111111111111111111111111
111111111111111111111111111110

 Це не виглядає багатообіцяючим, але….


ГАММА КОДИ
 Наскільки ефективним може бути код в принципі?
 Припустимо, що 2n інтервалів G, де 1<=G<= 2n є
рівновірогіднісними.
 Тоді оптимальне кодування для кожного інтервалу G
має використовувати n бітів.
 В такому випадку деякі інтервали неможливо
закодувати за допомогою менше чім log2G біт.
 Наша ціль максимально наблизитися до нижньої
границі
ГАММА КОДИ
 Метод близький до оптимального називається гамма
кодуванням.
 Ця схема використовує кодування з змінною
довжиною за допомогою розбиття інтервалу G на
пару, що складається з довжини і зміщення.
 Зміщення являє собою запис числа G в двійковому
вигляді з видаленою ведучою одиницею
 Ми припускаємо, що інтервал G не має ведучих нулів.
Якщо б вони були, їх треба було б видалити перед
видаленням ведучої 1.
 Наприклад для числа 13 (бінарний код -1101)
зміщення рівне 101.
ГАММА КОДИ
 Параметр довжина кодує довжину зміщення в
унарному коді.
 Для числа 13 довжина зміщення дорівнює 3 біт.

 В унарному коді це число виглядає як 1110.

 Відповідно гамма код числа 13 має вигляд 1110101


Sec. 5.3

ГАММА КОДИ
Число довжина зміщення -код
0

58
1 0 0
2 10 0 10,0
3 10 1 10,1
4 110 00 110,00
9 1110 001 1110,001
13 1110 101 1110,101
24 11110 1000 11110,1000
511 111111110 11111111 111111110,11111111
1025 11111111110 0000000001 11111111110,0000000001
ГАММА КОДИ
 Для того, що б декодувати гама код, спочатку
необхідно прочитати унарний код, поки не буде
виявлений 0, який його завершує
 Тепер нам відома довжина зміщення

 Після чого можна прочитати зміщення, додати 1 і


отримати число
 1110101

 Унарний код 1110, довжина зміщення – 3 біт

 Читаємо 101

 Додаємо 1 -> 1101

 Отримуємо число 13
Sec. 5.3

ВЛАСТИВОСТІ ГАМА КОДУ


 G кодується з використанням 2 log G + 1 бітів
 Довжина зміщення log G бітів

60
 Довжина довжини log G + 1 біт

 Всі гама коди мають непарну кількість біт


 І всього в два рази більше оптимальної довжини, log2

G
 Гамма код гарно декодується завдяки префіксу, як і
VB
 Гамма код може бути використаний для будь-якого
розподілу
 Гамма код безпараметричний
ВЛАСТИВОСТІ ГАМА КОДУ
 Наскільки ж гарне стискання з використанням гамма
коду?
 Запустивши гамма стискання колекції Reuters ми
зжали індекс до 101 Мбайт, що складає трохи більше
1/10 розміру колекції
Sec. 5.3

RCV1 СТИСКАННЯ
Структура даних Розмір в MB
Словник з фіксованим розміром 11.2

62
Словник з вказівниками на терміни в стрічці 7.6
Те ж саме, але з блоками k = 4 7.1
Те ж саме, але з фронтальною упаковкою 5.9
колекція (текст, xml і т.д.) 3,600.0
колекція (текст) 960.0
Матриця інцидентності 40,000.0
Словопозиції, нестиснуті (32-бітні слова) 400.0
Словопозиції, нестиснуті (20 біт) 250.0
Словопозиції, змінне байтове кодування 116.0
Словопозиції, кодування 101.0
СТИСКАННЯ
 Схема гамма кодування дозволяє отримати
найкращий результат стискання
 Але її декодування є затратним
 Велика кількість побітових операцій…
 Дякую за увагу.

You might also like