Metoda list inwersyjnych
Wykład III
Plan wykładu
• Cele metody
• Tworzenie kartoteki wyszukiwawczej
• Redundancja i zajętość pamięci
• Wyszukiwanie informacji
• Czasy wyszukiwania
• Ocena metody: wady i zalety
• Modyfikacje
• aktualizacja
Cel metody
• Skrócenie czasu wyszukiwania na pytania
szczegółowe – pamiętając o tym jak długi był
czas wyszukiwania odpowiedzi na tego typu
pytania w metodzie list prostych !
Lista inwersyjna
• To lista adresów obiektów, które w swoim opisie zawierają deskryptor d i (d i t x ), gdzie d i =(a j ,v ij ).
• Oznaczamy je jako L(d i )={n 1 ,n 2 ,…,n z } pod warunkiem, że elementy: n 1 ,n 2 ,…,n z będą adresami obiektów x 1 ,x 2 ,…,x z .
• Tworzymy tyle list inwersyjnych ile jest w
systemie deskryptorów d i .
Tworzenie kartoteki wyszukiwawczej
Przykładowy system informacyjny
• Wszystkie obiekty mają unikalne opisy a więc
funkcja adresująca przydzieli każdemu obiektowi inny adres
C B A
X1 C1 B1 A1
X2 C1 B2 A1
X3 C2 B1 A1
X4 C2 B2 A1
X5 C3 B2 A2
X6 C3 B2 A1
X7 C4 B1 A2
x8 C4 B2 a2
C B A
1 X1 C1 B1 A1
2 X2 C1 B2 A1
3 X3 C2 B1 A1
4 X4 C2 B2 A1
5 X5 C3 B2 A2
6 X6 C3 B2 A1
7 X7 C4 B1 A2
8 x8 C4 B2 a2
Kartoteka wyszukiwawcza
Kartoteka wtórna z funkcją adresową
C B A
1 X1 C1 B1 A1 2 X2 C1 B2 A1 3 X3 C2 B1 A1 4 X4 C2 B2 A1 5 X5 C3 B2 A2 6 X6 C3 B2 A1 7 X7 C4 B1 A2 8 x8 C4 B2 a2
(a,a1) = {1,2,3,4,6}
(a,a2) = {5,7,8}
(b,b1) = {1,3,7}
(b,b2) = {2,4,5,6,8}
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
D = {(a,a1),(a,a2), (b,b1), (b,b2), (c,c1), (c,c2), (c,c3), (c,c4) }
Cechy kartoteki wyszukiwawczej
• Kolejność list inwersyjnych jest dowolna ale dla szybkości wyszukiwania stosuje się:
porządek leksykograficzny dla nazw (kodów)
deskryptorów.
Redundancja
• Informacja o każdym obiekcie pamiętana jest w wielu
miejscach – dokładnie tylu ile jest atrybutów opisujących każdy obiekt.
3 razy pamiętamy informację o adresie {1}
3 atrybuty w systemie: {a,b,c}
(a,a1) = {1,2,3,4,6}
(a,a2) = {5,7,8}
(b,b1) = {1,3,7}
(b,b2) = {2,4,5,6,8}
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
Wzór na redundancję
(a,a1) = {1,2,3,4,6}
(a,a2) = {5,7,8}
(b,b1) = {1,3,7}
(b,b2) = {2,4,5,6,8}
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
Dla r=8
2 )
, (
2 )
, (
2 )
, (
2 )
, (
5 ) , (
3 ) , (
3 ) , (
5 ) , (
4 3 2 1 2 1 2 1
c c
c c
c c
c c
b b
b b
a a
a a
8 2
8 ) 2 2 2 2 5 3 3 5
(
R
Zajętość pamięci
• Zajętość pamięci zależy od liczby deskryptorów opisujących obiekty w systemie bo to dla nich budowane są listy inwersyjne.
Zajętość pamięci potrzebna na zapamiętanie jednej listy inwersyjnej.
R – liczba deskryptorów
Wyszukiwanie
• Mając zadane pytanie odnajdujemy listy inwersyjne a następnie adresy tych obiektów, które mają w swoim opisie deskryptory zawarte w pytaniu.
• Dla niezaprzeczonych deskryptorów pytania
obliczamy część wspólną (iloczyn
mnogościowy) odpowiadających im list
inwersyjnych.
Wyszukiwanie – pytanie ogólne
przykład
(a,a1) = {1,2,3,4,6}
(a,a2) = {5,7,8}
(b,b1) = {1,3,7}
(b,b2) = {2,4,5,6,8}
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
Wyszukiwanie odpowiedzi:
1. Szukamy wśród list inwersyjnych tej właściwej a więc zawierającej deskryptor z pytania t:
Czy t (a,a1) ? NIE Czy t (a,a2) ? NIE Czy t (b,b1) ? NIE Czy t (b,b2) ? NIE Czy t (c,c1) ? NIE Czy t (c,c2) ? NIE Czy t (c,c3) ? TAK
2. Wygenerowanie listy inwersyjnej (c,c3) = {5,6}={x5,x6}
3. Znaczenie termu t: (t) = (c,c3) = {5,6}={x5,x6}
Wyszukiwanie: pytanie szczegółowe
Przykład
Wyszukiwanie odpowiedzi na pytanie t=(a,a1)(b,b1) + (c,c3) 1. T =t1 + t2
T1 = (a,a1)(b,b1) T2=(c,c3)
2. Szukamy odpowiednich list inwersyjnych osobno dla każdego termu składowego (najpierw dla t1):
a) Szukamy deskryptora (a,a1)
Czy t (a,a1) ? Tak -> (a,a1) = {1,2,3,4,6}
b) Szukamy deskryptora (b,b1) Czy t (a,a1) ? NIE
Czy t (a,a2) ? Nie
Czy t (b,b1) ? Tak -> (b,b1) = {1,3,7}
c) Wyznaczamy znaczenie termu t1, który jest iloczynem deskryptorów (a,a1) i (b,b1):
(t1) = {1,2,3,4,6} {1,3,7}={1,3} = {x1,x3}
3. Szukamy teraz znaczenia termu t2:
a) Szukamy list inwersyjnych dla wszystkich deskryptorów tego pytania, a wiec tylko (c,c3):
Czy t (a,a1) ? NIE Czy t (a,a2) ? NIE Czy t (b,b1) ? NIE Czy t (b,b2) ? NIE Czy t (c,c1) ? NIE Czy t (c,c2) ? NIE
Czy t (c,c3) ? TAK -> (c,c3) = {5,6}
b) Wyznaczamy znaczenie termu t2: (t2) = {5,6} = {x5,x6}
4. Wyznaczamy znaczenie termu t:
(t) = {x1,x3} {x5,x6}={x1,x3,x5,x6}
W porównaniu z metodą list prostych…
• Nie jest tu konieczne przeglądanie wszystkich list inwersyjnych na dane pytanie. Należy wybrać tylko tyle list inwersyjnych, ile jest deskryptorów w
pytaniu i wykonać na tych listach operacje mnogościowe.
• Jest to więc szybsza metoda, ale ma również swoje wady:
1. Metoda operuje na adresach (numerach), a nie na opisach obiektów. Nie możemy więc bezpośrednio przy wyszukiwaniu uwzględnić m.in. związków między deskryptorami w opisach dokumentów.
2. Deskryptory ogólne (powtarzające się w dużej liczbie opisów
dokumentów) zwiększają redundancję i czas wyszukiwania.
Czas wyszukiwania
• Dla każdego deskryptora szukamy listy
inwersyjnej i potem dokonujemy przecięcia (operacji mnogościowej).
• gi – czas generowania listy inwersyjnej dla deskryptora d i
• p – czas przecięcia
Aktualizacja
• Dodanie nowego obiektu wymaga wstawienia adresu obiektu wszędzie tam (gdzie występują deskryptory opisujące ten obiekt).
• Usunięcie obiektu wiąże się z koniecznością usunięcia adresu obiektu z każdej listy inwersyjnej w której on występuje.
• Modyfikacja opisu obiektu wymaga usunięcia adresu obiektu z listy, która mu już nie odpowiada i
dopisania do tej, która jest właściwa.
Wady i zalety
• Podstawowymi wadami metody list inwersyjnych są:
• nadmierna redundancja
• zajętość pamięci.
Aby zmniejszyć te dwa parametry, nie tracąc zbytnio na szybkości można zastosować
wybrane modyfikacje.
MODYFIKACJE:
PORZĄDKOWANIE ADRESÓW OBIEKTÓW NA LISTACH
PORZĄDKOWANIE LIST 1.WG DŁUGOŚCI
2.LEKSYKOGRAFICZNIE
3.WG WYBRANEGO KRYTERIUM Z TABLICA ADRESOWĄ (INDEKSOWANIE) 4.WG CZĘSTOŚCI WYSTĘPOWANIA DANYCH DESKRYPTORÓW W PYTANIU
TWORZENIE LIST ZREDUKOWANYCH
•ZAZNACZANIE PRZEDZIAŁÓW ADRESÓW
•LISTY DLA PAR DESKRYPTORÓWZ ZAZNACZENIE CZĘSCI WSPÓLNEJ
•LISTY WIELODESKRYPTOROWE
•USUWANIE LIST DŁUGICH – LISTY ZANEGOWANE
•TWORZENIE LIST DLA PEWNEGO POZBIORU DESKRYPTORÓW
DEKOMPOZYCJE
•ATRYBUTOWA
•OBIEKTOWA
•OBIEKTOWO – ATRYBUTOWA
MODYFIKACJE:
PORZĄDKOWANIE ADRESÓW OBIEKTÓW NA LISTACH
PORZĄDKOWANIE LIST 1.WG DŁUGOŚCI
2.LEKSYKOGRAFICZNIE
3.WG WYBRANEGO KRYTERIUM Z TABLICA ADRESOWĄ (INDEKSOWANIE) 4.WG CZĘSTOŚCI WYSTĘPOWANIA DANYCH DESKRYPTORÓW W PYTANIU
TWORZENIE LIST ZREDUKOWANYCH
•ZAZNACZANIE PRZEDZIAŁÓW ADRESÓW
•LISTY DLA PAR DESKRYPTORÓWZ ZAZNACZENIE CZĘSCI WSPÓLNEJ
•LISTY WIELODESKRYPTOROWE
•USUWANIE LIST DŁUGICH – LISTY ZANEGOWANE
•TWORZENIE LIST DLA PEWNEGO POZBIORU DESKRYPTORÓW
DEKOMPOZYCJE
•ATRYBUTOWA
•OBIEKTOWA
•OBIEKTOWO – ATRYBUTOWA
Tworzymy listy inwersyjne tylko dla wybranego podzbioru D’ deskryptorów, gdzie D’ D. Wybrany zbiór może być zbiorem deskryptorów najczęściej występujących w pytaniach do systemu S lub zbiorem deskryptorów pewnego atrybutu (pewnych atrybutów). Tworzymy listy inwersyjne
(di) = {n1,n2,…,nk}
gdzie:
di D’
' D di
i
TWORZENIE LIST DLA PEWNEGO
POZBIORU DESKRYPTORÓW
•Poprawa czasu wyszukiwania odpowiedzi
•zmniejszenie zajętości pamięci
Cel modyfikacji:
Jeśli t = t
1+ t
2+ . . . + t
mi ti=d1 * d2 * …* dk to należy rozpatrzyć 3 przypadki:
1. Wszystkie deskryptory termów składowych zawierają się w D’. Jest to najlepszy możliwy przypadek. W tej sytuacji szybkość systemy jest maksymalna. Postępuje się jak w klasycznej metodzie list inwersyjnych.
(ti) = α(d1) α(d2) … α(dk) , dj D’, 1≤ j ≤ k ,
gdzie k to liczba deskryptorów pytania ti
2. Jeśli nie wszystkie deskryptory pytania ti należą do zbioru D’ to budujemy odpowiedź przybliżoną jako zbiór Xp, taki, że Xp = α(dj) dla każdego djD’. Wtedy Xti Xp . Taki zbiór Xp przeglądamy moetodą list prostych by znaleźć adresy tych obiektów, które w swoim opisie zawierają też pozostałe deskryptory pytania:
(ti) = X ti = {x Xp: (x,ai) = vi, (ai,vi)=di. di ti i di D’}
3. Jeśli żaden z deskryptorów nie zawiera się w D’ to należy dokonać przeglądu zupełnego (czyli potraktować kartotekę wtórną jako wyszukiwawczą i wykorzystać klasyczną metodę list prostych).
Wyszukiwanie
D = {(a,a1),(a,a2), (b,b1), (b,b2), (c,c1), (c,c2), (c,c3), (c,c4) }
(a,a1) = {1,2,3,4,6}
(a,a2) = {5,7,8}
(b,b1) = {1,3,7}
(b,b2) = {2,4,5,6,8}
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
przykład
Czyli D=5 zamiast 8, mamy więc r=5 a nie 8, przez co na pewno mamy mniejszą redundancję oraz zajętość pamięci….ale i …skraca się czas wyszukiwania każdej listy inwersyjnej w zbiorze list.
=(5+3+5+2+2 – 8)/8 = 9/8 = 1.1
= 5 * …
=tg jest mniejsze bo szukamy na
liscie 5 list inwersyjnych a nie 8
MODYFIKACJE poprawiające
czas wyszukiwania odpowiedzi
Porządkowanie adresów obiektów ww list inwersyjnych
• Skraca to czas przecięcia dwóch list inwersyjnych
L(a,a1) = {3,1,7,6}
L(b,b4)={2,1,5,6}
L((a,a1) (b,b4)) = {3,1,7,6} ∩{2,1,5,6}={1,6}
Ale by taką operację mnogościową wykonać potrzebujemy następujących porównań:
3 z 2, 3 z 1, 3 z 5, 3 z 6 – brak wspólnego elementu „3”
1 z 2, 1 z 1 – „1” jest wspólnym elementem 7 z 2, 7 z 1, 7 z 5, 7 z 6 – „7” nie jest wspólnym elementem
6 z 2, 6 z 1, 6 z 5, 6 z 6 – „6” jest wspólnym elementem
A wiec porównań jest 14 !!!
L(a,a1) = {1,3,6,7}
L(b,b4)={1, 2,5,6}
L((a,a1) (b,b4)) = {1,3,6,7} ∩{1, 2,5,6}}={1,6}
Ale by taką operację mnogościową wykonać potrzebujemy następujących porównań:
1 z 1 – „1” jest wspólnym elementem
3 z 1, 3 z 2, 3 z 5 - brak wspólnego elementu
„3”
6 z 5, 6 z 6 – „6” jest wspólnym elementem 7 z 6, koniec listy – „7” nie jest wspólnym elementem
A wiec porównań jest 7 !!!
Bez uporządkowania z uporządkowaniem
Porządkujemy listy w ten sposób, ze na początku są listy najkrótsze a na końcu najdłuższe !!!
q = d
1q* d
2q* ...* d
skgdzie d
1q– pierwszy deskryptor pytania.
Zalety:
- wpływa to na czas przecięcia list inwersyjnych (bierze się pierwszy deskryptor z listy i pyta się czy znajduje się w pytaniu, jeśli tak to zapamiętujemy daną listę)
Aktualizacja: jest skomplikowana, zmienia się bowiem długość list i należy jest od początku uporządkować !!!
PORZĄDKOWANIE LIST WG
DŁUGOŚCI
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
(a,a2) = {5,7,8}
(b,b1) = {1,3,7}
(a,a1) = {1,2,3,4,6}
(b,b2) = {2,4,5,6,8}
T= (c,c1)(b,b2) = {1,2}^{2,4,5,6,8} = {2}={x2}
(a,a1) = {1,2,3,4,6}
(a,a2) = {5,7,8}
(b,b1) = {1,3,7}
(b,b2) = {2,4,5,6,8}
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
(a,a1) = {1,2,3,4,6}
(a,a2) = {5,7,8}
(b,b1) = {1,3,7}
(b,b2) = {2,4,5,6,8}
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
Umożliwia zastosowanie
a). podziału połówkowego do wyszukiwania odpowiedniej listy inwersyjnej.
Wówczas ilość porównań = log 2 k gdzie k – ilość list inwersyjnych
b). Przeszukiwania blokowego. Wówczas średnia liczba porównań =
k
Zalety:
Czas szukania odpowiedniej listy znacznie się wtedy zmniejsza, natomiast czas przecięcia dwóch list nie !!!
Aktualizacja: nie wpływa, pod warunkiem pamiętania list pustych
PORZĄDKOWANIE LIST LEKSYKOGRAFICZNIE
T=(c,c2) (c,c2) > (c,c1)
(a,a1) = {1,2,3,4,6}
(a,a2) = {5,7,8}
(b,b1) = {1,3,7}
(b,b2) = {2,4,5,6,8}
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
Zalety:
Czas szukania odpowiedniej listy znacznie się wtedy zmniejsza, natomiast czas przecięcia dwóch list nie !!!
Wady:
Metoda nie zdaje egzaminu w przypadku zadania pytania spoza zbioru standardowych pytań !!! (tak samo jak przy odcedzaniu)
PORZĄDKOWANIE LIST WG CZĘSTOŚCI
WYSTĘPOWANIA DANYCH DESKRYPTORÓW W
PYTANIACH
MODYFIKACJE zmniejszające
zajętość pamięci
Jeżeli w jakiejś liście występuje ciąg kolejnych adresów można wtedy zaznaczyć przedział – poprzez znacznik i wtedy nie wpisujemy adresów wszystkich obiektów, a tylko pierwszy i ostatni adres danego ciągu.
Np.:
L(d1)={1, 2, 3, 4, 5, 8, 12, 13, 14, 15, 16, 20}
L’(d1)={1 5, 8, 12 16, 20}
Zalety:
-Czas wyszukiwania jest krótszy -zmniejszona zajętość pamięci
Aktualizacja: skomplikowana ze względu na konieczną zmianę przedziałów
ZAZNACZANIE PRZEDZIAŁÓW ADRESÓW
(a,a1) = {14,6}
(a,a2) = {5,7,8}
(b,b1) = {1,3,7}
(b,b2) = {2,4 6,8}
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
Jeżeli mamy 2 listy L(di) i L(dj) i listy te mają pewne wspólne dla siebie adresy obiektów to:
Lw(di,dj)= L(di) L(dj) Lr(di)= L(di) \ Lw(di,dj) Lr(dj)= L(dj) \ Lw(di,dj)
L(di,dj)= { Lr(di) Lw(di,dj) Lr(dj) }
LISTY DLA PAR DESKRYPTORÓWZ ZAZNACZENIE CZĘSCI WSPÓLNEJ
(a,a1) = {14,6}
(a,a2) = {5,7,8}
(b,b1) = {1,3,7}
(b,b2) = {2,4 6,8}
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
Zalety:
-Czas wyszukiwania jest krótszy -zmniejszona zajętość pamięci Aktualizacja: raczej prosta
(a,a1) = {14,6}
(b,b1) = {1,3,7}
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
w(a,a2)(b,b2) = {7#5,8#2,4,6}
LISTY DLA PAR DESKRYPTORÓWZ ZAZNACZENIE CZĘSCI WSPÓLNEJ
(a,a1) = {14,6}
(b,b1) = {1,3,7}
(c,c1) = {1,2}
(c,c2) = {3,4}
(c,c3) = {5,6}
(c,c4) = {7,8}
w(a,a2)(b,b2) = {7#5,8#2,4,6}
Wówczas gdy:
1) T = (a,a2)(b,b2) odpowiedź na pytanie mamy od razu jako…
2) T = (a,a2) odpowiedź na pytanie uzyskujemy poprzez złączenie elementów listy: 7 oraz 5,8 = {5,7,8}
3) T = (b,b2) odpowiedź uzyskujemy jako połączenie elementów: {5,8} oraz {2,4,6} = {2,4,5,6,8}
Jeżeli mamy 2 listy L(di) i L(dj) i listy te mają pewne wspólne dla siebie adresy obiektów to:
Np.:
L(d1)={1, 2, 5, 7, 8, 12, 17}
L(d2)={1, 4, 5, 9, 10, 17, 20}
L(d1*d2) = {1, 5, 17}
Zalety:
-Czas wyszukiwania jest krótszy -zmniejszona zajętość pamięci
Aktualizacja: bardziej skomplikowana
W przypadku list łączonych należy określić współczynnik Q, który wskazuje minimalną liczbę adresów wspólną dla dwóch list, dla których efektywne jest stosowanie tej modyfikacji, a
zdeterminowane jest minimalizacją kosztów , zlikwidowanie redundancji oraz wszelkich działań niezbędnych do
wyselekcjonowania z listy wspólnej adresów dotyczących danego deskryptora.
L(d1 * d2 * d3 * d4)={1, 8, 12}
LISTY WIELODESKRYPTOROWE – szczególne
przypadek list dla par deskryptorów
Listy muszą pochodzić z jednego atrybutu wzajemnie dwudeskryptorowego o wartościach wzajemnie się negujących – któraś z wartości musi występować w opisie obiektów.
Zalety:
-Czas wyszukiwania – 2 sposoby: np. = a1 * a2
szukamy a1 i przecinamy z listą dla a2
szukamy obiekty z a2 – odjąć obiekty z a1 -zmniejszona zajętość pamięci
Aktualizacja: skomplikowana
Listy zanegowane
T = t1 * t2 L(A1,1) = {x2}
L(A1,2) = {x1,x3,x4,x5,x6,x7,x8}
L(A2,a) = {x1,x2,x4,x5,x6,x8}
L(A2,b) = {x3,x7}
T=(A1,1)*(A2,b) T=d1*d2
d1 = (A1,1) = (A1, 2)
(d1)={x2}
d2 = (A2,b)
(d1)={x3,x7}
L(A1,1) = {x2}
L(A1,2) = {x1,x3,x4,x5,x6,x7,x8}
A więc:
L(A1,2) = {x1,x3,x4,x5,x6,x7,x8}={x2}