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