programmazione, win, blogosfera May 31, 2007 8:03 am (Save post)
Nel mio piano di conquistare il mondo manipolandone l’informazione sono diventato anche autore sul blog di blogbabel, e fra un po’ dovreste se andate a vedere c’è un post sul fatto che quella che technorati ora definisce autorità è in realtà il mero conteggio dei link in ingresso.
Blogbabel non ha un’etichetta “autorità” ma ha dei valori, in scala logaritmica, per classificare i blog. Ça va sans dire che Questo È Comunque Meglio(TM).
Ma il geek che è in me stava pensando: e se effettuassimo un post-processing su questi dati? E se scopiazzassimo google?
Come funziona il pagerank
(WARNING: l’autore ritiene che i nomi di funzione di una sola lettera siano il più grosso problema delle scienze moderne e li eviterà)
L’algoritmo del PR pubbblicato originariamente dal dinamico duo page & brin funziona, per quel ho capito io, in questo modo.
Sia Imp(p) l’importanza di una pagina.
Sia NumLink(p) il numero di link in una pagina.
Una pagina Pi con un (1) link verso Pj conta come un voto di valore Imp(Pi) per Pj.
Ovvero, se alice.com vale 3 e ha un link per bruno.com questo si becca un 3.
Se alice.com ha due link, di cui uno verso bruno.com e l’altro verso ciccio.com darà metà del suo valore ad entrambi, quindi:
sia Vote(Pi) = Imp(Pi)/NumLink(Pi).
A questo punto, l’importanza di Pj è la sommatoria di tutti i voti in ingresso:
Imp(Pj) = Sum(Vote(Pi))
per i diverso da j.
L’astuto lettore noterà che l’importanza di un sito è definita in termini di se stessa. Ovvero, pensate ad un grafo composto da alice.com bruno.com e ciccio.info e fatto così:
alice ->bruno
alice ->ciccio
bruno -> ciccio
ciccio -> alice
Per calcolare l’importanza di ciccio dobbiamo sapere l’importanza di bruno ed alice. Per sapere l’importanza di bruno dobbiamo sapere quella di alice. Per sapere quella di alice dobbiamo sapere quella di ciccio. Stack overflow.
E risolviamola sta cosa..
A questo punto la magica coppia tira fuori la matrice HyperLinks, che in pratica è una tabella NumPagesInTheWeb * NumPagesInTheWeb in cui le caselle sono tutte 0 a meno che non ci sia un link da una pagina I a una pagina J, nel qual caso HyperLinks[I,J]= 1/NumLink(Pj).
In pratica è il discorso di prima, solo in forma tabellare.
Potete verificare a occhio che se sommate tutti gli elementi di una colonna viene 1, e se sommate quelli in una riga… viene qualcos’altro.
Ora, inventiamo anche il vettore ImpVector, tale che
ImpVector = HyperLinks * ImpVector. Questa non è altro che una ri-definizione della cosa che avevamo scritto prima.
ImpVector è cioè un vettore che contiene i vari valori di importanza di una pagina.
Guarda che è ancora ricorsiva..
Il trucco per risolvere questo affare è di scegliere un vettore sperando di azzeccarci.
Se ImpVector = HyperLinks * ImpVector abbiamo finito, e faremmo bene a correre nel più vicino ippodromo perché avremmo un futuro nel campo delle scommesse.
Altrimenti usiamo il risultato, ImpVector1 come nuovo vettore casuale e verifichiamo se ImpVector1 = HyperLinks * ImpVector1. E così via finché non arriviamo ad un valore azzeccato (o quantomeno abbastanza vicino).
Ma non è che debba convergere per forza, specialmente a valori sensati..
Infatti. A questo punto Sergey e Larry buttano dentro i loro deliranti approcci probabilistici, in cui il Lettore dovrà impersonificarsi in un normale utente di internet che segue link, e non uno che apre solo il suo aggregatore.
L’idea è che la formuletta di cui sopra sia isomorfa ad una che descriva un navigatore di internet che va su una pagina e ci sta per un certo tempo e poi naviga via. Semplicemente sostituite Time a Imp nella formula di cui sopra.
In pratica in quest’ottica i problemi si manifestano quando un utente finisce su un sito che non ha link verso l’esterno (il blog di beppe grillo) o quando finisce in un pozzo in cui vari siti si linkano tra loro ma non linkano il resto di internet.
Se vi capita la prima cosa, essendo geek non uscirete a giocare a pallone, ma andrete su un’altra pagina digitando l’url direttamente.
Nel secondo caso, essendo geek, non resterete in loop su 3 pagine, ma digiterete l’url di un altro sito direttamente.
La prima cosa si modella mettendo un valore 1/NumPagesInTheWeb in tutti gli elementi delle colonne in cui una pagina non ha link (ovvero, da una pagina senza link andrete a caso su un’altra). La matrice viene simpaticamente chiamata S perché è una matrice stocastica, ovvero ha delle proprietà che ignoreremo perché sono noiose. La chiameremo invece HyperLinksWithEscapes
La seconda si ottiene pensando che l’utente non segua sempre un link, Ma che abbia due possibilità: o segue un link concentrandosi sul suo obiettivo o va su un’altra pagina a caso, con probabilità Concentration e Distraction = 1 - Concentration.
Il passo finale è definire
GoogleMatrix = Concentration * HyperlinksWithEscapes + Distraction * JustEscapes
dove JustEscapes è una matrice delle stesse dimensioni in cui tutti i valori sono 1/NumPagesInTheWeb, sarebbe a dire che l’utente può andare da una pagina in qualsiasi altra con la stessa probabilità.
A questo punto, ImpVector = GoogleMatrix * ImpVector è risolvibile sempre per ragioni matematiche prolisse.
E scelto un valore adeguato di Concentration converge abbastanza velocemente.
La scelta è che mi addentri in dettagli noiosi (per me) o mi limiti a dirvi che Concentration = 0.85. Seclgo la seconda, pur restando convinto che 0.84 sarebbe stato un valore più interessante in quanto multiplo di 0.42.
Scusa, e che c’entra questo con BlogBabel?
Beh, sarebbe fico se calcolassimo l’autorità di un blog utilizzando questo metodo, in fondo abbiamo la matrice dei link. Peccato che la matrice sia comunque 7000 x 7000 e che ci vogliano un’ottantina di iterazioni per convergere.
Plausibilmente sarebbe ancora fattibile (se vi va di leggere il paper sul pagerank ci sono spiegazioni su come la cosa sia ottimizzabile), ma si porrebbe un problema: che fine fanno tutti gli altri valori di BB?
I link tra i blog di BB non esprimono interamente il valore di un blog.
Il numero dei lettori, la sua collocazione nella blogosfera mondiale, nell’internet a tutto tondo e nei blog italiani non ancora aggiunti resterebbero fuori da questo calcolo.
Si potrebbe dunque usare questo approccio semplicemente per il calcolo delo valore del tracklink, ovvero dei link raccolti dal crawler di blogbabel. Ma vale la pena perdere tempo computazionale e di sviluppo per ottenere un valore che
- probabilmente sarebbe simile al punteggio tracklink attuale
- avrebbe un incidenza piuttosto ridotta sul punteggio totale
- sarebbe fondamentalmente inutile, in quanto la classifica è in se fondamentalmente un divertissement?
Penso di no. Però mi chiedo se non si possa tirare fuori un algoritmo che esprima la rilevanza di un blog pesandola attraverso la matrice dei tracklink ed usando i valori totali attuali come input. Suggerimenti benvenuti.

