Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałGenowefa Pytko Został zmieniony 10 lat temu
1
1 Kompresja indeksu slajdy studenta Karola Tomaszewskiego (z drobnymi modyfikacjami)
2
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
3 Kilka pojęć termy#dokumentówid dokumentów ambitious13 be41 2 3 5 brutus14 capitol14 caesar13 did41 3 4 5 enact14 hath23 4 i51 2 3 4 5 Słownik (ang. dictionary) Lista wskaźników (ang. postings)
4
4 Część pierwsza Kompresja listy wskaźników (ang. posting compression)
5
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
6 Długość id dokumentu
7
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 computer283033283047283154283159283202 computer28303314107543
8
8 Reprezentacja odstępów unarna binarna binarna jednoznaczna kodowanie kodowanie Golomba 110 2110 31110 61111110 8111111110 11 210 311 6110 81000 101 20010 30011 6000110 800001000 11 2010 3011 600110 80001000 11 2010 3011 600010 8000010
9
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
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
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
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
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
14 Wyliczanie stałej c Stąd gdzie jest -tą liczbą harmoniczną Zatem
15
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
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
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
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
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
20 Zyski cd. W naszym modelu będzie to odpowiednio:
21
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
22 Kodowania globalne unarne binarne Golomba γ δ Huffmana i arytmetyczne
23
23 Kodowania lokalne Golomba skośne Golomba Huffman interpolacja (przykład: [7;3,8,9,11,12,13,17])
24
24 Zestawienie przedstawionych metod
25
BibleGNUbibComactTREC Globalne unarna 2629094871918 binarna 15161820 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
26 Część druga Kompresja słownika (ang. dictionary compression)
27
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
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
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
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
31 Co pamiętamy? termy#dokumentówid dokumentów ambitious13 be41 2 3 5 brutus14 capitol14 caesar13 did41 3 4 5 enact14 hath23 4 i51 2 3 4 5 20 bajtów 4 bajty
32
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
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
34 Sposób 1 – poprawka Słowa będziemy pamiętać jako jeden długi string.
35
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
36 Co zyskaliśmy? Po kompresji słownik zajmuje 500,000(4+4+3+8) 9,5MB (nieskompresowany zajmował 14MB ).
37
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
38 Dzielenie na bloki – przykład
39
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
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(4+4+8+1)=8,5MB
41
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
42 Przykład
43
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
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
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
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
47 Koniec. Dziękuję za uwagę.
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.