background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Konstrukcja indeksu

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Index construction

How do we construct an index?

What strategies can we use with limited 
main memory?

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Podstawy hardware

Wiele decyzji projektowych w IR bazuje 
charakterystykach hardware

Rozpoczniemy od przeglądu podstaw 
hardware

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Podstawy hardware

Dostęp do danych w pamięci jest znacznie 
szybszy w pamięci niż dostęp do danych na 
dysku.

Szukanie na dysku: nie ma transferu podczas 
pozycjonowania głowicy.

Dlatego: przesyłanie jednego dużego fragmentu 
danych z dysku do pamięci jest szybsze niż 
transfer wielu małych fragmentów.

I/O dla dysku jest oparte na blokach: czytanie i 
pisanie całych bloków(zamiast małych 
fragmentów).

Rozmiary bloków: 8KB do 256 KB.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Podstawy hardware

Serwery używane w systemach IR obecnie 
typowo mają kilka GB pamięci operacyjnej, 
czasami dziesiątki  GB. 

Dostępna przestrzeń dyskowa jest kilka (2–
3) rzędów większa.

Odporność na uszkodzenia jest bardzo 
droga: Znacznie taniej jest użyć wiele 
zwykłych maszyn niż jedną bardzo 
niezawodną.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Typowe parametry hardware 

symbol  statistic  value

s średni czas dostępu 5 ms = 5 x 10

−3

 s

b  czas transferu na bajt    0.02 μs = 2 x 10

−8

 

s

       częstotliwość procesora   10

9

 s

−1

p operacje niskiego poziomu 0.01 μs = 10

−8

 s

          (np.: porównanie i wymiana słów)

       pojemność pam. Głównej 

kilka GB

       pojemność dyskowa   1 TB lub wiecej

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

RCV1: Nasza kolekcja do tego 
wykładu

Zebrane dzieła Shakespeare są zbyt małe aby 
zademonstrować wiele punktów z tego kursu.

Kolekcja która będzie użyta też wystarczająco 
duża, ale jest publicznie dostępna i co 
najmniej bardzo przekonywującym 
przykładem.

Jako przykład dla zastosowania skalowalnego 
algorytmu budowy indeksu, użyjemy kolekcji 
Reuters RCV1.

Jest to jeden rok depesz Reutera(część 1995 
roku i 1996)

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Dokument RCV1

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Statystyki dla Reuters RCV1 
(przybliżone dla przykładu)

symbol statystyka wartość

N  dokumenty   800,000

L  avg. # tokens per doc  200

M termy (= word types)  400,000

                 avg. # bytes per token  6

                    (incl. spaces/punct.)

                 avg. # bytes per token4.5

            

(without spaces/punct.)

                 avg. # bytes per term 7.5

                 nie pozycyjne wystąpienia 
100,000,000

4.5 bajtów na token słowa token ale 7.5 bajtów na word 
type: dlaczego?

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Dokumenty są parsowane aby wybrać 

słowa i te słowa są pamiętane z ID 

dokumentu.

I did enact Julius
Caesar I was killed 
i' the Capitol; 
Brutus killed me.

Doc 1

So let it be with
Caesar. The noble
Brutus hath told you
Caesar was ambitious

Doc 2

Przypomnienie 
konstrukcji indeksu 

Term

Doc #

I

1

did

1

enact 

1

julius

1

caesar

1

I

1

was

1

killed

1

i'

1

the

1

capitol

1

brutus

1

killed

1

me

1

so

2

let

2

it

2

be

2

with

2

caesar

2

the

2

noble 

2

brutus

2

hath 

2

told 

2

you

2

caesar 

2

was

2

ambitious

2

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Term

Doc #

I

1

did

1

enact 

1

julius

1

caesar

1

I

1

was

1

killed

1

i'

1

the

1

capitol

1

brutus

1

killed

1

me

1

so

2

let

2

it

2

be

2

with

2

caesar

2

the

2

noble 

2

brutus

2

hath 

2

told 

2

you

2

caesar 

2

was

2

ambitious

2

Term

Doc #

ambitious

2

be

2

brutus

1

brutus 

2

capitol

1

caesar

1

caesar

2

caesar

2

did

1

enact

1

hath

1

I

1

1

i'

1

it

2

julius

1

killed

1

killed

1

let

2

me

1

noble

2

so

2

the

1

the 

2

told

2

you

2

was

1

was

2

with

2

 Kluczowy krok

Po parsowaniu wszystkich 
dokumentów, indeks 
inversyjny jest sortowany 
wg termów. 

Rozpatrujemy ten krok 
sortowania.
Mamy 100M jednostek do 
sortowania.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Konstrukcja skalowanego 
indeksu

Konstrukcja indeksu w pamięci nie 
zmniejsza go.

Jak mamy budować indeks dla bardzo 
dużych kolekcji?

Biorąc pod uwagę ograniczenia hardware 
myślimy o…

PO, dyskach, prędkości itd.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Konstrukcja indeksu oparta na 
sortowaniu

W trakcie budowy indeksu parsujemy dokumenty po 
jednym.

W trakcie budowy indeksu nie można łatwo 
kompresować  

 (możemy, ale jest to bardzo złożone)

Ostateczny zbiór wystąpień dla jakiegoś termu jest 
nieznany aż do końca.

Dla  12 bajtów na  wejście do niepozycyjnego 
wystąpienia (term, doc, częstość), potrzeba dużo 
pamięci dla dużych kolekcji.

T = 100,000,000 w przypadku RCV1

To mamy w pamięci dla 2009, ale typowe kolekcje są 
znacznie większe.  Np.: New York Times ma indeks dla 
>150 lat depesz

Więc: musimy trzymać wyniki pośrednie na dysku.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Czy używać dla dysku?

Czy możemy użyć ten sam algorytm 
budowy indeksu do większych kolekcji, ale 
przez użycie dysku zamiast pamięci?

Nie: Sortowanie T = 100,000,000  
rekordów na dysku jest zbyt wolne – zbyt 
dużo pobrań z dysku.

Potrzebujemy zewnętrzny algorytm 
sortowania.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Wąskie gardło

Parsuj i twórz wejścia wystąpień dla 
jednego dokumentu za jednym razem

Sortuj wystąpienia wg termów (następnie 
wg dokumentów dla termów)

Wykonywanie tego dla losowego szukania 
na dysku jest zbyt wolne T=100M 
(milionów)rekordów

Jeśli każde porównanie wymaga 2 pobrań z dysku,
 i N elementów ma być sortowane z  N log

2

porównaniami,

 jak długo to będzie trwać?

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

BSBI: Blocked sort-based 
Indexing (Sortowanie z min. 
pobrań z dysku)

12-bajtowe (4+4+4) rekordy (term, doc, freq).

Są one generowane podczas parsowania 
dokumentów.

Musimy teraz sortować 100M takich 12-
bajtowych rekordów na term.

Zdefiniuj Block ~ 10M  takich rekordów

Możemy łatwo umieścić kilka w pamięci.

Będziemy mieli 10 takich bloków na starcie.

Podstawowa idea algorytmu:

Zbieraj wystąpienia dla każdego bloku, sortuj, pisz 
na disk.

Wtedy łącz bloki w jeden długi posortowany ciąg.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Sortowanie 10 bloków po 10M 
rekordów

Najpierw czytaj każdy blok i sortuj 
wewnętrznie: 

Quicksort wymaga 2N ln N spodziewanych 
kroków

W naszym przypadku 2 x (10M ln 10M) kroków

10 razy tyle daje 10  przejść  sortowania  
dla  10M rekordów każde.

Wykonanie bezpośrednie wymaga  2 kopii 
danych na dysku

Ale możemy to optymalizować

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Jak łączyć posortowane ciągi? 

Można łączyć binarnie, za pomocą drzewa z 
log

2

10 = 4 poziomami.

Dla każdej warstwy, czytaj do pamięci ciągi w 
blokach 10M, łącz i pisz na dysk

.

Disk

1

3

4

2

2

1

4

3

Runs being
merged.

Merged run.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Jak łączyć posortowane ciągi?

Ale istnieje bardziej efektywne n-łączenie, gdzie 
czytamy ze wszystkich bloków jednocześnie

Po zastosowaniu czytania odpowiednich 
rozmiarowo części każdego bloku do pamięci i 
wypisywaniu odpowiednich rozmiarowo 
wyjściowych części bloków, dostępy do dysku nie 
zniszczą zalet algorytmu

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Pozostały problem z 
algorytmem opartym na 
sortowaniu

Zakładaliśmy: możemy trzymać słownik w 
pamięci.

Potrzebujemy słownik (który rośnie 
dynamicznie) aby implementować 
odwzorowanie term do termID .

Aktualnie możemy pracować z odwołaniami 
term,docID  zamiast z odwołaniami termID, 
docID  . . .

. . . Ale wtedy zbiory pośredniczące stają się 
bardzo duże. (Wtedy możemy skończyć ze 
skalowalną, ale bardzo wolną metodą budowy 
indeksu.)

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

SPIMI: 
Single-pass in-memory indexing

Ważna zasada 1: generuj oddzielne słowniki 
dla każdego bloku – nie ma potrzeby 
utrzymywania  term-termID odwzorowania 
miedzy blokami.

Ważna zasada 2: Nie sortuj. Gromadź 
wystąpienia w listach wystąpień tak jak się 
pojawiały.

Te zasady pozwolą wygenerować kompletny 
indeks odwrotny dla każdego bloku.

Te oddzielne indeksy mogą być łączone w 
jeden duży indeks.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

SPIMI-Invert

Łączenie bloków jest analogiczne jak dla BSBI.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

SPIMI: Kompresia

Kompresja powoduje, że SPIMI jest jeszcze 
efektywniejszy.

Kompresja termów

Kompresja wystąpień

Będzie na następnym wykładzie

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Indeksowanie rozproszone

Dla indeksowania w skali webowej:

Musimy użyć rozproszony klaster komputerów

Pojedyncze maszyny są zbyt zawodne

Mogą nagle spowolnić przetwarzanie lub ulec 
awarii

Jak możemy eksploatować taki zbiór 
maszyn?

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Centra danych Google

Centra danych Google zawierają głównie 
maszyny profesjonalne.

Centra danych są rozproszone po całym 
świecie.

W przybliżeniu: w całości 1 milion serwerów, 
3 miliony procesorów/rdzeni (Gartner 2007)

W przybliżeniu: Google instaluje 100,000 
serwerów na kwartał.

Wymaga to  200–250 milionów dolarów na rok

To może być 10% mocy obliczeniowej 
świata!?!

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Centra danych Google

Jeśli niezawodna maszyna ma 1000 
węzłów, każdy z niezawodnością 99.9% , 
jaka jest niezawodność całego systemu?

Answer: 63%

Wiele serwerów jest uszkodzonych w 
każdej minucie dla instalacji z 1 miliona 
serwerów.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Indeksowanie rozproszone

Utrzymuj maszynę master  zarządzającą 
indeksowaniem – traktowaną jako 
„bezpieczna”.

Podziel indeksowanie na zbiory 
(równoległych) zadań.

Maszyna master przypisuje każde zadanie 
do wolnej maszyny z systemu.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Równoległe zadania

Używa się dwa zbiory równoległych zadań

Parsery

Inwertery

Dzieli się wejściową kolekcję dokumentów 
na części

Każda część jest podzbiorem dokumentów  
(odpowiadającym blokom w BSBI/SPIMI)

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Parsery

Master przypisuje część do wolnej 
maszyny parsera

Parser czyta po jednym dokumencie i 
tworzy pary (term, doc) 

Parser zapisuje pary do  j partycji

Każda partycja jest dla zakresu pierwszych 
liter termów

(np.: a-f, g-p, q-z) – tutaj = 3.

Następnie wykonuj inwersję indeksu

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Inwertery

Inwerter zbiera wszystkie pary (term,doc) 
pairs (= wystąpienia) do partycji jednego 
termu.

Sortuje i pisze listy wystąpień

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Przepływ danych

splits

Parser

Parser

Parser

Master

a-f g-p q-z

a-f g-p q-z

a-f g-p q-z

Inverter

Inverter

Inverter

Postings

a-f

g-p

q-z

assign

assign

Map
phase

Segment files

Reduce
phase

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Odwzorowanie redukujące 
(MapReduce)

Opisany właśnie algorytm budowy indeksu 
jest instancją MapReduce.

MapReduce (Dean and Ghemawat 2004) jest 
solidnym i koncepcyjnie prostym 
frameworkiem dla przetwarzania 
rozproszonego …

… bez pisania kodu dla części rozproszenia.

Opisują oni system indeksujący Google  (ca. 
2002) jako składający się z pewnej liczby faz 
zaimplementowanych w MapReduce.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

MapReduce

Konstrukcja indeksu była właśnie jedną fazą.

Inna faza: przekształcenie indeksu 
podzielonego na termy w indeks podzielony na 
dokumenty.

Term-partitioned: jedna maszyna obsługuje 
podzakres termów

Document-partitioned: jedna maszyna obsługuje 
podzakres dokumentów

Jak będzie powiedziane w części webowej 
wykładu – większość wyszukiwarek  używa 
indeksu dzielonego na dokumenty … lepsze 
zrównoważenie obciążenia itd.

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Schemat dla konstrukcji 
indeksu w  MapReduce

Schema of map and reduce functions

map: input → list(k, v)     reduce: (k,list(v)) → output

Instantiation of the schema for index 
construction

map: web collection → list(termID, docID)

reduce: (<termID1, list(docID)>, <termID2, 
list(docID)>, …) → (postings list1, postings list2, …)

Example for index construction

map: d2 : C died. d1 : C came, C c’ed. → (<C, d2>, 
<died,d2>, <C,d1>, <came,d1>, <C,d1>, <c’ed, d1>

reduce: (<C,(d2,d1,d1)>, <died,(d2)>, <came,(d1)>, 
<c’ed,(d1)>)  →  (<C,(d1:2,d2:1)>, <died,(d2:1)>, 
<came,(d1:1)>, <c’ed,(d1:1)>)

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Indeksowanie dynamiczne

Do tej pory zakładaliśmy, że kolekcja jest 
statyczna.

Rzadko tak bywa: 

Dokumenty przybywają z czasem i muszą być 
wstawiane.

Dokumenty są skreślane i modyfikowane.

To oznacza, że słownik i listy wystąpień 
muszą być modyfikowane:

Wystąpienia aktualizuje się dla termów 
będących już w słowniku

Nowe termy są dodawane do słownika

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Najprostsze podejście

Utrzymuj  “duży” główny indeks

Nowe dokumenty idą do “małego” 
dodatkowego indeksu

Przeszukuj obydwa i łącz wyniki

Skreślenia

Wektor bitowy błędów dla skreślonych 
dokumentów

Filtruj wyjściowe wyniki wyszukiwania tym 
wektorem bitowym błędów

Okresowo re-indeksuj aby uzyskać dobry 
indeks główny

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Problemy z głównym i 
dodatkowymi indeksami

Problem częstego łączenia – zbyt często przerabiamy

Mała wydajność w czasie łączenia

Aktualnie:

Łączenie dodatkowego indeksu do głównego indeksu jest 
efektywne jeśli utrzymujemy oddzielne pliki dla każdej listy 
odwołań.

Łączenie jest tym samym co proste append.

Ale wtedy musimy użyć wielu zbiorów – nieefektywne dla O/S.

Założenie dla reszty wykładu: indeks jest jednym 
dużym zbiorem.

W rzeczywistości: Używa się pośrednich rozwiązań 
(np.: podział bardzo dużych list odwołań, zbieranie list 
odwołań o długości  1 w jeden zbiór itd.)

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Łączenie logarytmiczne

Utrzymuj ciąg indeksów, każdy dwa razy większy 
od poprzedniego.

Umieść najmniejszy (Z

0

) w pamięci

Większe (I

0

, I

1

, …) na dysku

Jeśli  Z

0

 staje się zbyt duży (> n), pisz na dysk 

jako I

0

Lub łącz z I

0

 (jeśli I

0

 już istnieje) jako Z

1

Lub wypisuj połączenie Z

1

 na dysk jako I

1

 (Jeśli 

nie ma I

1

)

Lub łącz z  I

1

 formując Z

2

Itd..

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Łączenie logarytmiczne

Dodatkowy i główny indeks: czas konstrukcji 
jest  O(T

2

) ponieważ każde wystąpienie jest 

używane w każdym łączeniu.

Łączenie logarytmiczne: Każde wystąpienie jest 
łączone O(log T) razy, więc złożoność jest O(T 
log T)

Więc łączenie logarytmiczne znacznie 
efektywniejsze  dla konstrukcji indeksu

Ale przetwarzanie pytania teraz wymaga 
łączenia O(log T) indeksów

Podczas gdy jest  O(1) jeśli mamy główny i 
dodatkowy indeks

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Dalsze problemy z 
wielokrotnymi indeksami

Statystyki dla całych kolekcji są trudne do 
utrzymywania

Np.: gdy mówimy o korekcie spellingu: którą 
alternatywę mamy zaprezentować 
użytkownikowi?

Mówimy, weź ten z największymi trafieniami

Jak pamiętać ten najlepszy dla wielokrotnych 
indeksów i wektorów bitowych błędów?

Jedyna możliwość: ignoruj wszystko poza głównym 
indeksem przy porządkowaniu

Omówimy więcej takich statystyk używanych 
do rankingu wyników

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Dynamiczne indeksowanie w 
silnikach wyszukiwawczych

Wszystkie duże silniki wyszukiwawcze 
obecnie stosują dynamiczne indeksowanie

Ich indeksy mają częste zmiany ilościowe

Nowe obiekty, blogi, nowe tematyczne strony 
webowe

Sarah Palin, …

Ale (czasami/typowo) one również 
okresowo rekonstruują indeks z kopii

Przetwarzanie pytań jest wtedy przełączane na 
nowy indeks, a stary indeks jest kasowany

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

background image

Introduction to Information 
Retrieval

Introduction to Information 
Retrieval

 

 

 

 

Inne rodzaje indeksów

Indeksy pozycyjne

Pewne problemy z sortowaniem… są większe

Budowa indeksów z n-gramów znaków:

Gdy tekst jest parsowany, utwórz n-gramy.

Dla każdego  n-gramu, potrzebne wskaźniki do 
wszystkich termów słownika zawierających go –  
“wystąpienia”.

Zauważmy, że te same “wejścia wystąpień” będą 
przybywać powtarzalnie w parsowanych dokumentach 
– potrzebny efektywny haszing aby pamiętać ich ślad.

Np.: taki trigram uou występuje termie deciduous będzie 
odkryty w każdym tekstowym wystąpieniu deciduous

Potrzebujemy przetworzyć każdy term raz

dlaczego?


Document Outline