Kompresja indeksu slajdy studenta Karola Tomaszewskiego z drobnymi
Kompresja indeksu slajdy studenta Karola Tomaszewskiego (z drobnymi modyfikacjami) 1
Co przed nami? Dwie główne części n Jak zmniejszyć rozmiar listy wskaźników, aby nie tracić przy dekodowaniu dużo czasu? n Jak zmniejszyć rozmiar słownika, aby znaczna jego część mieściła się w pamięci operacyjnej? 2
Kilka pojęć termy Lista wskaźników Słownik (ang. postings) dictionary) #dokumentów id dokumentów ambitious 1 3 be 4 1 brutus 1 4 capitol 1 4 caesar 1 3 did 4 1 enact 1 4 hath 2 3 4 i 5 1 2 2 3 5 3 4 5 3
Część pierwsza Kompresja listy wskaźników (ang. posting compression) 4
Przykładowy model 1 symbol statystycznie wartość n #dokumentów 1, 000 L #termów w dokumencie 1, 000 m #różnych termów 500, 000 bajty na term (uwzględniamy wszystkie znaki) 6 korpus powyższego modelu będzie zajmował 6 GB 5
Długość id dokumentu 6
Spostrzeżenie n n Zamiast pamiętać wszystkie id dokumentów w których wystąpiło dane słowo, wystarczy pamiętać tylko pierwszy z nich, a później już tylko odstępy (ang. gaps) między kolejnymi dokumentami. Przykład computer 283033 283047 283154 283159 283202 computer 283033 14 107 5 43 7
Reprezentacja odstępów n n n unarna binarna jednoznaczna 1 11 10 01 1 2 010 10 0010 3 011 1110 11 0011 n n kodowanie Golomba 6 00010 1111110 000110 8 000010 11110 1000 00001000 8
Reprezentacja odstępów c. d. n n Unarna: liczba n jako 1 n 0 binarna jednoznaczna: n jako 0 m bin(n), gdzie m= log n +1, bin(n) to binarna reprezentacja liczby n; kodowanie: n jako 0 m 1 s(n), gdzie m= log n , a bin(n)=1 s(n); kodowanie Golomba rzędu m dla liczby n: q q= n / m r = n - q m (reszta z dzielenia n / m) Kod. Golomba(n) = 1 q 0 bin(r) UWAGA: reprezentacja r jest czasem nieco bardziej oszczędna… UWAGA 2: Jak reprezentować 0? Czy to potrzebne? 9
Asymptotyczne własności Tw. [Gallager, van Voorhis 75] Kod Golomba rzędu m jest optymalnym kodem prefiksowym dla ciągów losowych liczb naturalnych o rozkładzie P(i)=(1 -p)pi-1, gdy m = - log(1+p) / log p w przybliżeniu (dla p bliskiego 1): m = - 1 / log p 10
Asymptotyczne własności Tw. [Elias 75] Dla każdego rozkładu pbb P={p 1, p 2, …} takiego, że n pi pi+1 dla każdego i > 0, n H(P) < , gdzie H(P)= - i=1, 2, 3, …pi log pi oznacza entropię, zachodzi E( (P)) 2 H(P)+1 3 H(P) gdzie E( (P))= i=1, 2, 3, …pi| (i)| oznacza średnią długość kodu . Wniosek. Kod jest co najwyżej 3 razy „dłuższy” od optymalnego kodu prefiksowego, dla każdego rozkładu prawdopodobieństw! 11
Zyski n n Aby oszacować stopień kompresji dla kodowania musimy wiedzieć jak termy są rozproszone w korpusie. Mówi o tym następujące prawo Zipf’a: Częstotliwość -tego słowa w korpusie ( ) jest proporcjonalna do (przy czym zakładamy, że słowa są poukładane zgodnie z częstotliwością występowania). Wyrażamy to wzorem: 12
Zyski cd. n Ponieważ jest odwrotnie proporcjonalne do istnieje stała taka, że: n Dobieramy stałą jak pamiętamy to tak, aby zachodziła równość (ilość różnych termów) 13
Wyliczanie stałej c n Stąd harmoniczną n Zatem gdzie jest -tą liczbą 14
Wyliczanie stałej c n Zatem częstotliwość -tego termu z grubsza wynosi: n To oznacza, że średnia ilość wystąpień -tego termu w dokumencie (z termami) wynosi: 15
Zyski cd. n Wiemy już z jaką częstotliwością występują termy w korpusie. Dzięki temu możemy określić jak długie będą odstępy poszczególnych termów, oraz ile miejsca zajmie lista wskaźników. 16
Zyski cd. n n Podzielmy sobie teraz termy w słowniku na bloki długości (zakładamy, że odstępy dla danego termu mają taką samą długość). Term wystąpi średnio w dokumencie r razy: • • • r 1 gdy w pierwszym bloku, gdy w drugim bloku, w trzecim bloku, itd. 17
Zyski cd. n Zatem odstępy w pierwszym bloku będą miały długość 1, w drugim 2, w trzecim 3, itd. Ponieważ liczba wszystkich dokumentów wynosi n, to w j-tym bloku jest n/j odstępów długości j. n Kodując odstępy dla termu w j-tym bloku potrzeba n bitów. 18
Zyski cd. n Żeby zakodować cały blok potrzebujemy bitów. n Wszystkich bloków jest m/J. Dlatego plik z listą wskaźników będzie zapisany na następującej ilości bitów: 19
Zyski cd. n W naszym modelu będzie to odpowiednio: 20
Kompresja listy wskaźników raz jeszcze n Wszystkie metody kompresji (listy wskaźników) korzystają z listy odstępów, a nie pełnej listy adresów dokumentów. n Podzielimy te metody na dwie kategorie: „globalne” i „lokalne”. 21
Kodowania globalne n n n unarne binarne Golomba γ δ Huffmana i arytmetyczne 22
Kodowania lokalne n n Golomba skośne Golomba Huffman interpolacja (przykład: [7; 3, 8, 9, 11, 12, 13, 17]) 23
Zestawienie przedstawionych metod 24
Bible GNUbib Comact TREC Globalne unarna binarna Golomb γ δ Huffman Lokalne 262 15 9, 86 6, 51 6, 23 5, 90 909 16 11, 06 5, 68 5, 08 4, 82 487 18 10, 90 4, 48 4, 35 4, 20 1918 20 12, 30 6, 63 6, 38 5, 97 Golomb 6, 09 6, 16 5, 40 5, 84 sk Golomb 5, 65 4, 70 4, 20 5, 44 Huffman 5, 58 4, 64 4, 02 5, 41 interpolacja 5, 24 3, 98 3, 87 5, 18 25
Część druga Kompresja słownika (ang. dictionary compression) 26
Jak duży jest słownik V? n Słownik (w odróżnieniu od listy wskaźników) jest najczęściej trzymany w pamięci operacyjnej. n Największy słownik angielski ma ponad 500, 000 słów. 27
Jak duży jest słownik V? n W naszym przypadku lepsze przybliżenie m=|V| uzyskamy korzystając z prawa Heap’a, które szacuje rozmiar słownika względem rozmiaru korpusu według wzoru: N to liczba termów w korpusie, stałą z przedziału [30, 100], 0, 5. gdzie k jest b≈ 28
Przykładowy model 2 n Teraz korpus będzie miał rozmiar N=2 GB. n Z poprzedniego modelu zaczerpniemy sobie średnią długość termu, która wynosi 6 bajtów (pod uwagę bierzemy wszystkie znaki). 29
Szacowanie m n Przyjmijmy k=30, wtedy mamy: n UWAGA: Termy które zawierają cyfry, bądź literówki będziemy pomijać (ponieważ znacznie zwiększyło by to rozmiar słownika). 30
Co pamiętamy? termy 20 bajtów 4 bajty #dokumentów id dokumentów ambitious 1 → 3 be 4 → 1 brutus 1 → 4 capitol 1 → 4 caesar 1 → 3 did 4 → 1 enact 1 → 4 hath 2 → 3 4 i 5 → 1 2 2 3 5 3 4 5 31
Sposób 1 n Każde słowo będziemy pamiętać w tablicy o rozmiarze 20 bajtów. Na częstotliwość występowania słowa oraz listę wskaźników zarezerwujemy po 4 bajty. n W naszym modelu będziemy potrzebować 32
Sposób 1 – wady n Ponieważ średnia długość słowa w jęz. ang. wynosi 8, to marnujemy na każdym wyrazie (średnio) 12 bajtów. n Wyrazy takie jak: „hydrochlorofluorocarbons”, „supercalifragilisticexpialidocious” mają więcej niż 20 liter, przez co nie są one wyszukiwalne w takim podejściu. 33
Sposób 1 – poprawka n Słowa będziemy pamiętać jako jeden długi string. 34
Co zyskaliśmy? n Teraz dodatkowo musimy pamiętać początek każdego słowa. Potrzebujemy do tego celu 3 bajty. n Zamiast pamiętać 20 bajtów, pamiętamy (średnio) tylko 8 bajtów (na słowo) plus 3 bajty (na początek słowa). Zatem oszczędzamy 45% 35
Co zyskaliśmy? n Po kompresji słownik zajmuje 500, 000(4+4+3+8) ≈ 9, 5 MB (nieskompresowany zajmował 14 MB). 36
Dzielenie na bloki n Podzielmy słownik na bloki. Każdy z nich będzie miał k słów. n Wystarczy, że będziemy pamiętać gdzie zaczyna się pierwsze słowo z bloku (oszczędzamy dzięki temu (k – 1)3 bajtów). n Musimy także pamiętać długość wszystkich słów (czyli po jednym dodatkowym bajcie na każde słowo). 37
Dzielenie na bloki – przykład 38
Rozmiar słownika Wielkość bloku k Rozmiar słownika 1 9, 5 MB 2 9, 0 MB 4 8, 87 MB 8 8, 68 MB 16 8, 59 MB 39
Czy warto? n Każde zwiększenie wielkości bloku (k) pociąga za sobą zmniejszenie słownika. n Im większe k tym bardziej czasochłonne wyszukiwanie. Przykład. Dla m=8 wykonujemy średnio około 2, 6 operacji przy binarnym przeszukiwaniu, 3 operacje gdy k=4. n Zwiększając k możemy dowolnie blisko dojść do minimum, które wynosi 500, 000(4+4+8+1)=8, 5 MB 40
Kompresja ekstremalna n Jeśli ustawimy słowa alfabetycznie to powstaną grupy słów, które będą miały wspólny prefix. Możemy zapisać najpierw owy prefix, a następnie poszczególne końcówki. 41
Przykład 42
Kompresja ekstremalna – cd. n Dla bardzo dużych słowników nawet taki rodzaj kompresji nie zdoła pomieścić wszystkiego w pamięci operacyjnej. Dlatego też większość słowników jest dzielona na strony i zapisywana na dysku w postaci B+ drzewa. Ponieważ i tak musimy czytać z dysku listę wskaźników to jedno dodatkowe czytanie spowolni nas za bardzo. 43
Inne pomysły na kompresję n Poprzez rezygnację z niektórych informacji o słowach bardzo łatwo można zmniejszyć rozmiar indeksu. n Rezygnacja z wielkości liter, oraz tzw. stemming, pozwalają zredukować liczbę termów do 40%, listę wskaźników do 10 -20%, a cały indeks do 30%! 44
Inne pomysły na kompresję n Skorzystanie ze stop words również daje bardzo dobre wyniki. Użycie 30 słów na takiej liście zmniejsza rozmiar indeksu o 30%, użycie 150 słów o dodatkowe 25%. 45
Podsumowanie Reprezentacja korpus macierz incydencji termów kodowanie (listy wskaźników) słownik – bez kompresji długi string dzielenie na bloki Rozmiar 6 GB 62, 5 GB 14 MB 9, 5 MB ≈ 9 MB 46
Koniec. Dziękuję za uwagę. 47
- Slides: 47