1 Kompresja indeksu slajdy studenta Karola Tomaszewskiego (z drobnymi modyfikacjami)
2 Co przed nami? Dwie główne części Jak zmniejszyć rozmiar listy wskaźników, aby nie tracić przy dekodowaniu dużo czasu? Jak zmniejszyć rozmiar słownika, aby znaczna jego część mieściła się w pamięci operacyjnej?
3 Kilka pojęć termy#dokumentówid dokumentów ambitious13 be brutus14 capitol14 caesar13 did enact14 hath23 4 i Słownik (ang. dictionary) Lista wskaźników (ang. postings)
4 Część pierwsza Kompresja listy wskaźników (ang. posting compression)
5 Przykładowy model 1 korpus powyższego modelu będzie zajmował 6 GB 500,000#różnych termów m 6 bajty na term (uwzględniamy wszystkie znaki) 1,000#termów w dokumencie L 1,000,000#dokumentów n wartośćstatystyczniesymbol
6 Długość id dokumentu
7 Spostrzeżenie 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 computer
8 Reprezentacja odstępów unarna binarna binarna jednoznaczna kodowanie kodowanie Golomba
9 Reprezentacja odstępów c.d. 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)=1s(n); kodowanie Golomba rzędu m dla liczby n: q= n / m r = n - q m (reszta z dzielenia n / m) KodGolomba(n) = 1 q 0 bin(r) UWAGA: reprezentacja r jest czasem nieco bardziej oszczędna… UWAGA2: Jak reprezentować 0? Czy to potrzebne?
10 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)p i-1, gdy m = - log(1+p) / log p w przybliżeniu (dla p bliskiego 1): m = - 1 / log p
11 Asymptotyczne własności Tw. [Elias 75] Dla każdego rozkładu pbb P={p 1, p 2, …} takiego, że p i p i+1 dla każdego i > 0, H(P) <, gdzie H(P)= - i=1,2,3,… p i log p i oznacza entropię, zachodzi E( (P)) 2H(P)+1 3H(P) gdzie E( (P))= i=1,2,3,… p i | (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!
12 Zyski Aby oszacować stopień kompresji dla kodowania musimy wiedzieć jak termy są rozproszone w korpusie. Mówi o tym następujące prawo Zipfa: 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:
13 Zyski cd. Ponieważ jest odwrotnie proporcjonalne do to istnieje stała taka, że: Dobieramy stałą tak, aby zachodziła równość jak pamiętamy (ilość różnych termów)
14 Wyliczanie stałej c Stąd gdzie jest -tą liczbą harmoniczną Zatem
15 Wyliczanie stałej c Zatem częstotliwość -tego termu z grubsza wynosi: To oznacza, że średnia ilość wystąpień -tego termu w dokumencie (z termami) wynosi:
16 Zyski cd. 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.
17 Zyski cd. 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, gdy w trzecim bloku, itd.
18 Zyski cd. 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. Kodując odstępy dla termu w j -tym bloku potrzeba bitów.
19 Zyski cd. Żeby zakodować cały blok potrzebujemy bitów. Wszystkich bloków jest m/J. Dlatego plik z listą wskaźników będzie zapisany na następującej ilości bitów:
20 Zyski cd. W naszym modelu będzie to odpowiednio:
21 Kompresja listy wskaźników raz jeszcze Wszystkie metody kompresji (listy wskaźników) korzystają z listy odstępów, a nie pełnej listy adresów dokumentów. Podzielimy te metody na dwie kategorie: globalne i lokalne.
22 Kodowania globalne unarne binarne Golomba γ δ Huffmana i arytmetyczne
23 Kodowania lokalne Golomba skośne Golomba Huffman interpolacja (przykład: [7;3,8,9,11,12,13,17])
24 Zestawienie przedstawionych metod
BibleGNUbibComactTREC Globalne unarna binarna Golomb 9,8611,0610,9012,30 γ 6,515,684,486,63 δ 6,235,084,356,38 Huffman 5,904,824,205,97 Lokalne Golomb 6,096,165,405,84 sk Golomb 5,654,704,205,44 Huffman 5,584,644,025,41 interpolacja 5,243,983,875,18
26 Część druga Kompresja słownika (ang. dictionary compression)
27 Jak duży jest słownik V ? Słownik (w odróżnieniu od listy wskaźników) jest najczęściej trzymany w pamięci operacyjnej. Największy słownik angielski ma ponad 500,000 słów.
28 Jak duży jest słownik V ? W naszym przypadku lepsze przybliżenie m=|V| uzyskamy korzystając z prawa Heapa, które szacuje rozmiar słownika względem rozmiaru korpusu według wzoru: gdzie N to liczba termów w korpusie, k jest stałą z przedziału [30,100], b 0,5.
29 Przykładowy model 2 Teraz korpus będzie miał rozmiar N= 2GB. Z poprzedniego modelu zaczerpniemy sobie średnią długość termu, która wynosi 6 bajtów (pod uwagę bierzemy wszystkie znaki).
30 Szacowanie m Przyjmijmy k=30, wtedy mamy: UWAGA: Termy które zawierają cyfry, bądź literówki będziemy pomijać (ponieważ znacznie zwiększyło by to rozmiar słownika).
31 Co pamiętamy? termy#dokumentówid dokumentów ambitious13 be brutus14 capitol14 caesar13 did enact14 hath23 4 i bajtów 4 bajty
32 Sposób 1 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. W naszym modelu będziemy potrzebować
33 Sposób 1 – wady Ponieważ średnia długość słowa w jęz. ang. wynosi 8, to marnujemy na każdym wyrazie (średnio) 12 bajtów. Wyrazy takie jak: hydrochlorofluorocarbons, supercalifragilisticexpialidocious mają więcej niż 20 liter, przez co nie są one wyszukiwalne w takim podejściu.
34 Sposób 1 – poprawka Słowa będziemy pamiętać jako jeden długi string.
35 Co zyskaliśmy? Teraz dodatkowo musimy pamiętać początek każdego słowa. Potrzebujemy do tego celu 3 bajty. 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%
36 Co zyskaliśmy? Po kompresji słownik zajmuje 500,000( ) 9,5MB (nieskompresowany zajmował 14MB ).
37 Dzielenie na bloki Podzielmy słownik na bloki. Każdy z nich będzie miał k słów. Wystarczy, że będziemy pamiętać gdzie zaczyna się pierwsze słowo z bloku (oszczędzamy dzięki temu (k – 1)3 bajtów). Musimy także pamiętać długość wszystkich słów (czyli po jednym dodatkowym bajcie na każde słowo).
38 Dzielenie na bloki – przykład
39 Rozmiar słownika 8,59 MB16 8,68 MB8 8,87 MB4 9,0 MB2 9,5 MB1 Rozmiar słownikaWielkość bloku k
40 Czy warto? Każde zwiększenie wielkości bloku ( k ) pociąga za sobą zmniejszenie słownika. 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. Zwiększając k możemy dowolnie blisko dojść do minimum, które wynosi 500,000( )=8,5MB
41 Kompresja ekstremalna 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.
42 Przykład
43 Kompresja ekstremalna – cd. 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 nie spowolni nas za bardzo.
44 Inne pomysły na kompresję Poprzez rezygnację z niektórych informacji o słowach bardzo łatwo można zmniejszyć rozmiar indeksu. 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% !
45 Inne pomysły na kompresję 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%.
46 Podsumowanie ReprezentacjaRozmiar korpus 6 GB macierz incydencji termów 62,5 GB kodowanie (listy wskaźników) 1 GB słownik – bez kompresji 14 MB długi string 9,5 MB dzielenie na bloki 9 MB
47 Koniec. Dziękuję za uwagę.