Argomenti – Lezione 8
•Modulo III --- Calcolo del PageRank
•Modulo IV --- Costruzione del Dizionario Globale
delle Parole
PageRank -- Ripasso
Prima Approssimazione al Calcolo del PageRank
PR(A) = Pr(T1)/C(T1) + PR(T2)/C(T2) + ...... + Pr(Tk)/C(Tk)
T1
T2
Tk
A
PR(A) = Page Rank di A
Pr(Ti) = Page Rank di Ti
C(Ti) = numero di link in uscita di Ti
Cosa Cattura il PageRank ?
PageRank fornisce un modello di comportamento di
un utente che clicca in maniera aleatoria da un
pagina all’altra.
L’idea è che un utente visita una certa pagina con
una probabilità data dal valore di PageRank di
quella pagina.
Quindi la probabilità che un utente clicchi su una
pagina è data unicamente dal numero di pagine con
un link a quella pagina. Ed è per questo che il
pagerank viene diviso per il numero totale di
pagine.
Una seconda approssimazione per Pagerank
Si vuole catturare l’idea che un utente non
continua a cliccare aleatoriamente all’infinito, ma
ad un certo punto salta in maniera aleatoria ad una
pagina qualsiasi. Si introduce nella formula un
fattore d, con 0<d<1 per implementare questa idea
PR(A) = (1-d)+d*(PR(t1)/C(T1) + PR(T2)/C(T2) + ...... + Pr(Tk)/C(Tk))
il termine (1-d) cattura la probabilità che un
utente salti ad un pagina qualunque. Tanto più alto
è d, tanto più alta è la probabilità che un utente
continui a seguire aleatoriamente i link.
Un valore consigliato per d è: d=0.85
Un esempio
A
d=0.5
PR(A)=0.5+0.5*PR(C)
PR(B)=0.5+0.5*(PR(A)/2)
PR(C)=0.5+0.5*(PR(A)/2+Pr(B))
B
C
Risolviamo
PR(A) = 14/13 = 1.07692308
PR(B) = 10/13 = 0.76923077
PR(C) = 15/13 = 1.15384615
Nota: la somma dei PageRank = numero totale di pagine
Cosa fare in generale ?
Due Problemi:
• Quando vi sono moltissime pagine non e’ possibile
trovare una soluzione manualmente
•Casi ricorsivi
A
PR(A) = 0.5+0.5*(PR(A)/3+PR(C))
B
C
Calcolo del PageRank
per approssimazioni successive
Idea:
Si suppongono dati dei valori iniziali per i pagerank di
tutte le pagine
(1,1,......,1)
Partendo da questi valori si continua iterativamente a
calcolare il PageRank di tutte le pagine fin quando la
differenza tra il valore precedente e il successivo di
tutti i PageRank è minore di una certa precisione 
che fissiamo a priori
Approssimazioni successive: Esempio
Iterazione
0
1
2
3
4
5
6
7
8
9
10
11
12
PR(A)
1
1
1.0625
1.07421875
1.07641602
1.07682800
1.07690525
1.07691973
1.07692245
1.07692296
1.07692305
1.07692307
1.07692308
PR(B)
1
0.75
0.765625
0.76855469
0.76910400
0.76920700
0.76922631
0.76922993
0.76923061
0.76923074
0.76923076
0.76923077
0.76923077
1.07692308 - 1.07692307 = 0.00000001 < 
PR(C)
1
1.125
1.1484375
1.15283203
1.15365601
1.15381050
1.15383947
1.15384490
1.15384592
1.15384611
1.15384615
1.15384615
1.15384615
Calcolo del PageRank come un intero
Scaling:  logaritmo in base 6
PageRank Intero
0/10
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10
PageRank Calcolato
0.15-0.9
0.9-5.4
5.4-32.4
32.4-194.4
194.4-1,166.4
1,166.4-6,998.4
6,998.4-41,990.4
41,990.4-251,942.4
251,942.4-1,511,654.4
1,511,654.4-9,069,926.4
9,069,926.4-0.85 × N + 0.15
Nel nostro caso, con poche pagine,scaleremo
linearmente i valori del PageRank. Maggiori
dettagli nelle specifiche.
Cosa fare nel Modulo III
• Costruire un vettore di reali di dimensione pari al
numero di pagine analizzate.
•Inizializzarlo tutto a 1
•Applicare l’algoritmo iterativo per approssimazioni
successive per calcolare i PageRank di tutte la pagine
usando le informazioni sul grafo dei link salvate per
ogni pagina in lista_in e lista_out.
Quando fermare l’iterazione ?
#define EPSILON

double PR[NUMPAGE], aux[NUMPAGE];
double maxdiff(double PR[],double aux[]){
...../* calcola max(PR[i]-aux[i])*/
}
while maxdiff(PR,aux)< EPSILON{
..... /* Aggiorna PR */
}
Modulo IV – Dizionario Globale
Obbiettivo
Costruire un dizionario di tutte le (differenti) parole
che compaiono in tutte gli ipertesti.
Per ognuna di tali parole avremo le seguenti
informazioni:
• tutti gli ipertesti in cui compaiono
• per ognuno di tali ipertesti la hitlist corrispondente
alla parola
Aspetti implementativi
Per implementare il dizionario globale useremo un
tabella hash.
Useremo quindi le dichiarazioni e i metodi di
hashtab.h e hashtab.c. Le collisioni verranno gestite
con il metodo delle liste di collisioni.
Ogni entry del dizionario globale
Il campo key prenderà il valore della parola
Il campo info conterrà le informazioni descritte
prima. (dettagli più avanti)
Il campo info nel dizionario globale
Ad ogni parola nel dizionario globale dobbiamo
associare una lista delle pagine in cui compare
Campo info
PARk
PAGi
PAGj
PAGl
EDL(k,i)
EDL(k,j)
EDL(k,l)
PARk = parola k-esima
PAGi = puntatore all’elemento del dizionario delle pagine
corrispondente lla pagina i-esima.
EDL(k,i) = puntatore all’elemento del dizionario locale della
pagina i-esima corrispondente alla parola PARk. Nota che
accediamo alla HitList di PARk nella pagina i-esima.
Cosa fare nel Modulo IV
Alto livello
• Scorrere il dizionario delle pagine.
•Per ogni pagina, esaminare il suo dizionario locale
•Data la parola PARk della pagina PARi, aggiornare il
dizionario globale
Scorrere il Dizionario delle Pagine
Come per la creazione del grafo dei link possiamo usare
la lista di tutti gli elementi del dizionario delle pagine
contenuto nel campo ls della struct table
Esaminare il Dizionario Locale
Supponiamo di analizzare la pagina PAGi
Per analizzare il dizionario locale scorriamo la lista
formata dalla struct elem_diz_loc
Aggiornare il Dizionario Globale (DG)
Supponiamo di analizzare la pagina PAGi e che la
parola attuale nel dizionario locale di PAGi e PARk.
Per aggiornare il dizionario globale:
• calcoliamo la posizione di PARk nel DG
(usando la funzione hash).
• Aggiungiamo un nuovo elemento
(puntatore a PAGi e puntatore a PARk) alla
lista (al più vuota perché è la prima volta
che vediamo PARk) nel DG che forma il campo info
della parola PARk.
Attenzione alla gestione delle collisioni