Sie sind auf Seite 1von 111

Indice

1 Introduzione 2 Stato dellArte 2.1 Recommendation . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Il concetto del The Long Tail . . . . . . . . . . . . . 2.1.2 Classicazione degli algoritmi di Recommendation . . 2.1.3 User and Item Based Recommenders . . . . . . . . . . 2.1.4 Slope-one Recommender . . . . . . . . . . . . . . . . . 2.1.5 Recommender distribuito con Matrice di co-occorrenza 3 Realizzazione 3.1 Frameworks . . . . . . . . . . . . . . . 3.1.1 Cluster . . . . . . . . . . . . . 3.1.2 Hadoop . . . . . . . . . . . . . 3.1.3 Mahout . . . . . . . . . . . . . 3.1.4 WikipediaMiner . . . . . . . . 3.1.5 Codeigniter . . . . . . . . . . . 3.2 Architettura . . . . . . . . . . . . . . . 3.3 Mock-up . . . . . . . . . . . . . . . . . 3.3.1 Home Page . . . . . . . . . . . 3.3.2 Header . . . . . . . . . . . . . . 3.3.3 Pagina dei suggerimenti video . 3.3.4 Pagina video . . . . . . . . . . 3.3.5 Pagina del Prolo . . . . . . . 3.3.6 Pagina della Risorsa . . . . . . 3.3.7 Pagina della Categoria . . . . . 3.4 Database . . . . . . . . . . . . . . . . 3.4.1 MySql . . . . . . . . . . . . . . 3.4.2 Database di Intime . . . . . . . 3.5 Strumenti per limplementazione . . . 3.5.1 Jquery/AJAX . . . . . . . . . 3.5.2 FFmpeg . . . . . . . . . . . . . 3.5.3 Facebook integration . . . . . . 3.5.4 Media Wiki . . . . . . . . . . . 3.6 Recommendation . . . . . . . . . . . . 3.6.1 Cold Start . . . . . . . . . . . . 3.6.2 Mantenimento . . . . . . . . . 3.6.3 Raccomandazioni in Real Time 3 5 5 6 7 9 15 17 20 21 21 23 24 25 28 28 29 29 30 31 31 33 34 34 35 35 35 41 41 54 57 63 66 66 67 68

. . . . . .

. . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

3.7

3.6.4 Raccomandazioni sul Cluster Categorizzazione . . . . . . . . . . . 3.7.1 Tassonomia delle Categorie . 3.7.2 Clustering . . . . . . . . . . . 3.7.3 Categorizzazione provvisoria 3.7.4 Cold Start . . . . . . . . . . . 3.7.5 Prolazione degli utenti . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

71 77 78 79 86 87 87 90 90 91 91 94

4 Esperimenti 4.1 Evaluate di un Recommender . . . . . . 4.2 Evaluate di un Recommender di Mahout 4.3 Risultati sperimentali . . . . . . . . . . 4.4 Selezione del Recommender . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

5 Conclusioni 95 5.1 Sviluppi futuri: . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 A Screenshot delle Pagine Web Bibliograa Ringraziamenti 98 110 111

Capitolo 1

Introduzione
Intime ` un social network per lannotazione ed il browsing video, basato sulla e prolazione semantica. Il sistema, sviluppato come web application, permette agli utenti di commentare frame specici dei video e di porre delle annotazioni che arricchiscano un commento con riferimenti a pagine di Wikipedia e utenti di Facebook [1]. Queste annotazioni vengono usate allinterno del network per modellare semanticamente gli interessi e pi` in generale il prolo di ciascun utente. Inoltre, il u sistema suggerisce agli utenti nuovi video, risorse, amici o altri utenti in base ai loro interessi. Queste pratiche di tagging rispondono alle esigenze nate con lemergere del Web 2.0, ovvero la ricerca e la navigazione in ampie raccolte di dati. Oltre a permettere la prolazione degli utenti, le annotazioni sui video facilitano la navigazione allinterno del network. Cos` come in molti social network, quali Facebook e Flickr, ` possibile appor e re un tag soltanto su di una parte di unimmagine, in Intime ` possibile porre e unannotazione su un singolo frame, piuttosto che sul video intero. Non tutte le annotazioni sono uguali, si distingue tra annotazioni a pagine di Wikipedia e annotazioni a proli Facebook. Il sistema ` anche una piccola enciclopedia, in quanto contiene dati informae tivi sulle risorse contenute nel network: ogni risorsa inserita dagli utenti in unannotazione arricchisce il sistema, ampliando il numero di voci consultabili. Queste risorse vengono raggruppate in categorie che hanno la funzione sia di raggruppare il sapere che di aggiungere semantica nel network. Il meccanismo di annotazione non ` lunico metodo utilizzato da Intime per e proporre contenuto di interesse; viene utilizzato un indice di gradimento che pu` essere specicato manualmente da un utente su di un video. Come in alo tri network basati su video, in Intime ogni utente ha la possibilit` di esprimere a

una valutazione per un video, selezionando un voto su una scala da uno a cinque. Per estrarre parte del contenuto semantico da un video, ci sono due approcci.
una forma di annotazione automatica generata da algoritmi di Computer Vision la possibilit` di apporre sul video annotazioni poste manualmente dagli a utenti o estratte in automatico dai commenti

Intime utilizza il secondo approccio, in quanto, da un lato permette la scoperta di nuovi video in base agli interessi degli utenti, dallaltro genera nuove forme di interazione sociale che incentivano gli utenti a porre sempre pi` annotazioni. u La scoperta di nuovi contenuti di interesse per ogni utente ` presente sotto due e diverse forme:
vengono raggruppate in categorie le risorse presenti nel network mediante un sistema di clustering. Le categorie di Intime potranno essere di interesse per gli utenti e nuove risorse saranno suggerite in base alle categorie di appartenenza vengono suggeriti nuovi video agli utenti tramite un elaborato sistema di recommendation che tiene conto sia dei voti assegnati dagli utenti stessi ai video gi` visti, sia delle informazioni estratte dalla prolazione degli a utenti

Capitolo 2

Stato dellArte
2.1 Recommendation

Un sistema di information ltering ` un sistema che elimina informazioni rie dondanti o indesiderate da un usso di informazioni utilizzando metodi semiautomatizzati o computerizzati prima della presentazione ad un utente umano. Il suo obiettivo principale ` la gestione del sovraccarico di informazioni e line cremento del rapporto segnale-rumore semantico. I sistemi di raccomandazione sono una sottoclasse di sistema informativo di ltraggio che cercano di prevedere il rating o preferenza che un utente darebbe ad un item (ad esempio musica, libri o lmati) o ad un elemento sociale (ad esempio persone o gruppi) che non ha ancora preso in considerazione, tramite un modello costituito dalle caratteristiche degli elementi (content-based approaches) o dallambiente sociale dellutente (collaborative ltering approaches). Un sistema di raccomandazione mette insieme varie tecniche computazionali per selezionare item personalizzati in base agli interessi degli utenti e secondo il contesto in cui sono inseriti. Tali elementi possono assumere varie forme, come ad esempio libri, lm, notizie, musica, video, annunci, link sponsorizzati, pagine web, prodotti di un negozio, ecc. I sistemi di raccomandazione sono diventati estremamente comuni negli ultimi anni. Aziende come Amazon, Netix e Google utilizzano intensivamente sistemi di raccomandazione con la quale riescono a ricavare grandi vantaggi ed introiti. Le raccomandazioni nei sistemi di calcolo di queste grandi aziende sono nate in risposta alle dicolt` che lutente trova nello scegliere in una vasta variet` di a a prodotti e servizi tra le molte alternative che gli vengono presentate. Grande risonanza fu data ai sistemi di raccomandazione durante il Netix Prize. Netix ` una societ` degli Stati Uniti, nata nel 1997, che ore un servizio di e a noleggio di DVD e videogiochi via Internet. Nel 2006 Netix ha lanciato un premio di un milione di dollari per chi fosse stato in grado di migliorare di almeno il 10% le performance dellalgoritmo di

suggerimento dei lm. Tale algoritmo suggerisce agli utenti nuovi lm da vedere sulla base del gradimento espresso dagli utenti per i contenuti gi` visti. Il 26 a luglio 2009 ` stata annunciata la chiusura dellinvio di nuovi risultati: due sono e stati i team che hanno superato la soglia del 10% richiesta dal regolamento. Il 21 settembre di quello stesso anno i giudici di Netix hanno assegnato il premio ad uno dei due team( [2], [3], [4]).

2.1.1

Il concetto del The Long Tail

Per capire il vero valore delle recommendations ` importante spiegare il signie cato del concetto del The Long Tail. Lespressione coda lunga, in inglese The Long Tail, ` stata coniata da Chris e Anderson in un articolo dellottobre 2004 su Wired Magazine [5] per descrivere alcuni modelli economici e commerciali, come ad esempio Amazon.com o Netix. In pratica secondo Anderson nelleconomia dellabbondanza non ` pi` consie u gliabile limitarsi a produrre alcuni pochi beni di massa, tali da poter essere considerati un comune denominatore per tutti gli utenti, ma diviene sempre pi` u interessante concentrarsi sulla coda, la long tail, capace di orire un mercato di pi` vaste dimensioni, composto da innite piccole richieste di altrettante diu verse comunit` di utenti. a Il termine ` anche utilizzato comunemente nelle scienze statistiche, ad esempio e per denire modelli di distribuzione della ricchezza e di usi lessicali. In queste distribuzioni una popolazione ad alta frequenza ` seguita da una popolazione a e bassa frequenza, che diminuisce gradatamente (tail o). Ad esempio, applicando il concetto di coda lunga alleditoria, in una rivista con un milione di lettori, la parte editoriale sta solo nella porzione verde della curva (vedi Fig. 2.1); tutto il resto (porzione gialla) rappresenta la coda lunga in cui ci sono un milione di scrittori con un lettore ciascuno. Questa strategia ` molto e pi` procua poich, grazie ai media digitali, circola maggior denaro nella coda u e rispetto alla testa e quindi i prodotti di nicchia avranno molte pi` possibilit` di u a protto. Il concetto del Long Tail spiega il vantaggio dei negozi on-line rispetto a quelli tradizionali sicamente esistenti (brick-and-mortar vendors). Prima di discutere le principali applicazioni dei sistemi di raccomandazione, ` bene capire il fenoe meno del Long Tail, che rende i sistemi di recommendation necessari [6]. I sistemi di trasporto sici sono caratterizzati dalla scarsit` di risorse. I negozi a tradizionali hanno uno spazio limitato e possono mostrare al consumatore solo una piccola frazione di tutte le scelte che sarebbero possibili. Daltra parte i negozi online potenzialmente potrebbero mostrare al consumatore ogni prodotto disponibile nel negozio.

Figura 2.1: Fenomeno del Long Tail

Cos` un libraio sicamente esistente potrebbe avere diverse migliaia di libri sui suoi scaali ma Amazon, ad esempio, ne ore milioni. Un giornale sico pu` o stampare diverse dozzine di articoli al giorno, mentre i servizi online di informazione ne orono migliaia. Le raccomandazioni nel mondo sico sono abbastanza semplici. In primo luogo non ` possibile personalizzare il negozio per ogni singolo cliente; quindi la scelta e di ci` che viene messo a disposizione ` regolata principalmente sui grandi numeri. o e In un bookstore verranno visualizzati solo i libri che sono pi` popolari e in un u giornale verranno stampati solo gli articoli per cui si ritiene che la maggior parte delle persone saranno interessate. Nel primo caso, i dati di vendita governano la scelta dei prodotti da mettere sugli scaali; nel secondo, ` una scelta editoriale e a farlo. La distinzione tra il mondo sico e il mondo on-line ` stato chiamato il fenomeno e del Long Tail, il cui nome deriva dalla Fig. 2.1. I negozi sici forniscono solo i prodotti pi` popolari a sinistra dellasse verticau le, mentre i corrispondenti negozi on-line forniscono lintera gamma di articoli: sia la coda che i prodotti pi` popolari. Il fenomeno del Long Tail costringe i u negozi on-line a personalizzare per ogni cliente la raccomandazione degli articoli. Non ` possibile presentare allutente tutti i possibili elementi a disposizione; i e negozi sici possono, ma non ` ragionevole aspettarsi che gli utenti conoscano e tutti i prodotti che potrebbero interessare loro.

2.1.2

Classicazione degli algoritmi di Recommendation

I sistemi di raccomandazione in genere possono essere suddivisi in due categorie:

Figura 2.2: Fenomeno del Long Tail in termini di un recommender video

1. Collaborative ltering: lapproccio collaborativo costruisce un modello a partire dal comportamento passato dellutente (per esempio item precedentemente acquistati e/o voti numerici assegnati a tali item) come pure per decisioni simili prese da altri utenti. Dopodich tale modello viene utie lizzato per predirre degli item verso i quali lutente potrebbe essere interessato. Il termine collaborative ltering venne usato per la prima volta da David Golbert nel 1992 in un saggio (vedi [7]) intitolato Using collaborative ltering to weave an information tapestry. Golbert aveva progettato un sistema chiamato Tapestry che permetteva alle persone di annotare i documente come interessanti o meno e utilizzava questinformazione per ltrare i documenti da proporre ad altre persone [8]. 2. Content-based ltering: tale approccio utilizza una serie di caratteristiche discrete di un item in modo tale da raccomandare items con propriet` a simili. Inne, esiste una terza categoria di sistemi di raccomandazione detti Hybrid Recommender Systems, in cui i due approcci descritti precedentemente sono combinati. Le due pi` ampie categorie di algoritmi per motori di recommendation con u approccio collaborative ltering sono:
User based: si individuano gli item che potrebbero piacere ad un utente a partire dagli utenti i cui gusti sembrano somigliare ai suoi. Item based: si individuano gli item che potrebbero piacere ad un utente cercando di individuare altri items simili a quelli per cui lutente ha gi` a espresso una preferenza.

Queste categorie sono di tipo collaborative ltering perch le raccomandazioni, e in questo modo, sono basate soltanto sulla conoscenza del legame esistente tra gli utenti e gli item.

Queste tecniche non richiedono conoscenza sugli items di per s`. In un certo e senso pu` essere un vantaggio; infatti in tal modo non ci si deve preoccupare se o gli item sono libri, ori, lm, video, ori, o anche persone, poich niente delle e loro propriet` ` dato come input a questi algoritmi. ae Nel caso di algoritmi basati sullapproccio content-based, si devono utilizzare approcci molto pi` legati al dominio specico del problema. u Capire le dierenze, i punti di forza, e le debolezze dei due algoritmi user ed item based ` di importanza fondamentale nella scelta di un recommender. e

2.1.3

User and Item Based Recommenders

Prima di descrivere gli algoritmi di questi recommenders ` necessario descrivere e due concetti fondamentali: la similarity su cui entrambi si basano, e la neighbourhoood necessaria solo per i recommenders user-based. Questi concetti sono importanti per individuare e misurare quali entit`, utenti a o item, sono pi` simili tra loro e quindi raggrupparli insieme secondo un qualche u grado di similarit`. a

Similarity Gran parte di un recommender si basa sullimplementazione della similarity. Non ` possibile implementare un recommender user o item based veramente efe cace, senza una nozione adabile ed appropriata di quanto item o utenti siano simili tra loro. Le preferenze sono triple (user, item, rate); ogni utente, come ogni item, pu` o essere descritto da un unico grande vettore di rates. Per esempio, facendo riferimento alla Tabella 2.1, lutente 1 pu` essere completamente descritto tramite o il vettore (5.0, 3.0, 2.5), lutente 4 dal vettore (2.5, , ), litem 1 pu` essere o completamente descritto dal vettore (5.0, 2.0, 2.5, 5.0, 2.5), litem 3 dal vettore (2.5, 5.0, , 3.0, ). Come si pu` notare la cardinalit` dei vettori utente ` pari o a e al numero di item presenti nel sistema, viceversa la cardinalit` dei vettori item a ` pari al numero di utenti presenti nel sistema. e User User User User User 1 2 3 4 5 Item 1 5.0 2.0 2.5 5.0 2.5 Item 2 3.0 2.5 Item 3 2.5 5.0 3.0 -

Tabella 2.1: Tabella delle preferenze: un esempio Una volta che siamo riusciti a descrivere un utente o un item tramite una notazione vettoriale, denire una nozione di similarit` ` un puro esercizio matemaae tico.

Normalmente con valori pi` alti si intende un alto grado di similarit`, con valori u a pi` bassi una dissimilarit`. u a Le nozioni di similarit` sono molteplici; di seguito ne saranno descritte brevea mente alcune delle pi` comuni: u
Pearson Correlation-Based Similarity: lindice di correlazione di Pearson, anche detto coeciente di correlazione di Pearson (o di Bravais-Pearson) tra due variabili aleatorie ` un coeciente che esprime la linearit` tra la e a loro covarianza e il prodotto delle rispettive deviazioni standard, ovvero:

xy = .

xy x y

Questa similarit` misura quanto verosimilmente un numero in una serie a dovrebbe essere relativamente grande quando il corrispondente numero nellaltra serie ` alto e viceversa. In altre parole misura la tendenza che e i numeri di due serie hanno nello spostarsi insieme proporzionalmente. Quando questa tendenza a muoversi proporzionalmente ` molto alta, il e coeciente di correlazione vale 1, ` vicino a 0 se non c` una stretta relae e zione, ` prossimo a -1 se quando i numeri in una serie sono alti nellaltra e serie risultano piccoli o viceversa. Se indichiamo con x il primo vettore, con y il secondo vettore e con N la cardinalit` dei due vettori, possiamo calcolare la Pearson Similarity tra i a due elementi rappresentati dai vettori nel seguente modo:
N k=1

r= (
N i=1

xk yk
N i=1

N k=1

xk N N j=1

N k=1

yk (
N j=1

x2 i

xi )2

)(

2 yj

yj )2

Tale misura ha alcuni punti di debolezza: non tiene conto del numero di valori che coincidono nelle due serie per come ` denita la similarit` non ` possibile calcolare la correlae a e zione se le due serie coincidono su un solo valore. la correlazione ` indenita se le due serie coincidono esattamente e Fortunatamente per risolvere tali punti di debolezza ` possibile applicae re delle forme di weighting al computo della similarit` che tenderanno a a spingere il valore di similarit` verso +1 se il numero di valori delle serie a su cui tale valore ` computato ` alto, mentre verso -1 se questo numero e e ` basso. Il weighting ` unoperazione utile poich altrimenti le serie con e e e pochi valori simili tra loro avrebbero una similarit` alta non giusticata a da numero suciente di valori.
Cosine Measure Similarity: se si pensa ai vettori che descrivono gli utenti o gli items, come vettori in uno spazio euclideo di dimensione pari alla cardinalit` dei vettori, il computo della Cosine Measure Similarity ` molto a e semplice. Per ottere il valore di tale similarit` tra due vettori x e y ` sua e ciente calcolare il coseno dellangolo compreso tra la prima retta passante

10

Figura 2.3: Cosine similarity and Pearson correlation for centered data

per lorigine e parallela al vettore x e la seconda retta passante per lorigine e parallela al vettore y (vedi Fig. 2.3). Tale valore ` compreso tra -1 e +1 e per come ` denito loperatore coseno. Comunque sia si pu` dimostrare e o che questa similarit` ` identica alla Pearson Correlation-Based Similarity ae se le due serie dei valori di input sono entrambe a media 0 (normalizzate).
Euclidean Distance Similarity: anche in questo caso ` necessario pensare ai e vettori nello spazio euclideo. Questa volta per` ` necessario pensarli come oe punti nello spazio euclideo di dimensione pari alla cardinalit` dei vettori, a le cui coordinate saranno date dai rate indicati nei vettori. Il computo della distanza euclidea ` dato semplicemente dalla distanza euclidea in e uno spazio euclideo con cardinalit` pari alla cardinalit` dei vettori. a a

Anche intuitivamente ` facile capire che due vettori saranno simili tra loro e se i due punti posizionati nello spazio sono molto vicini tra loro. Pi` i u punti sono vicini tra loro pi` la distanza euclidea tende a 0. u poich per` vogliamo che vettori molto simili tra loro abbiano un valore e o di similitudine alto (possibilmente prossimo ad 1), una volta computata la distanza euclidea ` necessario operare una trasformazione. Il valore di e similitudine sar` dato quindi da: a s0,1 = 1 1+d

dove d rappresenta il valore della distanza euclidea. Come ` facile cae pire, tale similitudine restituisce valori compresi tra 0 e 1, che possono comunque essere facilmente rinormalizzati tra -1 e +1 con: s1,+1 = 2s0,1 1 ` Spearman Correlation Similarity: E una variante della Pearson Correlation dove per` la correlazione ` computata sulla base del rango relativo o e ` dei rate. E come se per ogni user il suo rate pi` alto fosse modicato con 1 u il suo secondo voto pi` alto con un 2 e cos` via. Una volta sovrascritti tali u 11

Figura 2.4: Tanimoto similarity

valori, si riapplica la Pearson Correlation Similarity. Certamente, nel fare ci`, si perde parte dellinformazione contenuta nelle preferenze; in particoo lare si perde informazione circa quanto un item sia stato votato in pi` del u successivo. Ma non ` possibile a priori stabilire quale tra le similarit` sia e a la pi` adatta ad un problema; a volte rimuovere informazione pu` voler u o dire aumentare il rapporto segnale-rumore: ` possibile stabilirlo solo dopo e una prova empirica. Tale calcolo ` piuttosto costoso, in quanto devono e essere mantenute in memoria informazioni circa i nuovi valori assegnati che non possono sicamente sovrascrivere i precedenti.
Tanimoto Coecient Similarity: La Tanimoto Coecient Similarity ignora completamente durante tutto il suo computo quelli che sono i valori dei rate allinterno delle preferenze. Noto anche con il nome di coeciente di Jaccard, viene calcolato come lintersezione degli elementi per cui si ` e espressa una preferenza (gli elementi in comune tra due vettori) fratto lunione degli elementi per cui si ` espressa una preferenza (vedi Fig. 2.4). e Ad esempio facendo riferimento alla Tabella 2.2, lutente 1 e 2 risultano avere una Tanimoto Coecient Similarity pari ad 1 poich i due vettori e sono praticamente uguali:

U ser1 : (X, X, X) U ser2 : (X, X, X) Mentre lutente 3 e 4 risultano avere un Tanimoto Coecient Similarity pari ad 1/2, perch: e U ser3 : (X, , ) U ser4 : (X, , X) Per quanto riguarda il Tanimoto Coecient nel caso di similarit` tra a items il discorso ` simmetrico, litem 2 e 3 risultano avere un Tanimoto e Coecient Similarity pari ad 2/3, perch: e Item2 : (X, X, , , ) Item3 : (X, X, , X, )

12

User User User User User

1 2 3 4 5

Item 1 X X X X X

Item 2 X X -

Item 3 X X X -

Tabella 2.2: Tanimoto e Log-Likelihood Similarity: un esempio Normalmente ` utile utilizzare questa nozione di similarity quando si hane no preferenze di tipo booleano, ovvero nel caso in cui le preferenze non abbiano un rate associato. Anche questa similarit`, come pure quella a Euclidea, restituisce un valore compreso tra 0 e 1; ` possibile per` nore o malizzarlo tra -1 e +1 con la seguente trasformazione gi` descritta in a precedenza: s1,+1 = 2s0,1 1
Log-Likelihood Similarity: ` molto simile alla Tanimoto Similarity; anche e la Log-Likelihood Similarity infatti non tiene conto dei valori assegnati ai rates delle preferenze. Come per il coeciente di Tanimoto, la LogLikelihood Similarity si basa sul numero di elementi in comune tra due vettori, ma il suo valore ` pi` unespressione di quanto inverosimile sia per e u due vettori che questi abbiano dei valori coincidenti. Generalmente questa Similarity ` migliore della Tanimoto, in quanto ` un po pi` intelligente. e e u

Si pu` spiegare meglio il funzionamento della Log-Likelihood Similarity o introducendo un esempio:

Neighbourhood La nozione di Neighbourhood ` un altro importante tassello che va a comporre e un recommender user-based. poich prendere in considerazione tutti gli utenti e nel computo della raccomandazione sarebbe unoperazione troppo costosa, in quanto si dovrebbero esaminare praticamente tutti gli item presenti, allora per velocizzare lalgoritmo si sceglie tra tutti gli utenti un insieme ridotto di questi, privilegiando, in ordine gli utenti che, rispetto allutente per cui desideriamo una raccomandazione, hanno una similarit` pi` alta rispetto agli altri interessati. a u In questo modo non saranno presi in considerazione tutti gli items, ma solo quelli per cui questa stretta cerchia di utenti ha dato una preferenza. Esistono pi` modi per stabilire quali utenti appartengano a questa cerchia riu stretta di utenti pi` simili allutente interessato. Principalmente i pi` utilizzati u u sono due:
Fixed-size neighbourhood: ogni utente viene confrontato con lutente per cui ` richiesta una raccomandazione attraverso una delle nozioni di similae rit`, stabilendo tramite questa un valore di similarit` s. Tra tutti gli utenti a a si selezionano i primi N utenti che hanno s maggiore o uguale rispetto a tutti gli altri utenti (vedi Fig. 2.5)

13

Threshold-based neighbourhood: ogni utente viene confrontato con lutente per cui ` richiesta una raccomandazione attraverso una delle nozioni di e similarit`, stabilendo tramite questa un valore di similarit` s. Tra tutti a a gli utenti si selezionano tutti gli utenti che hanno s maggiore di una certa soglia stabilita a priori (vedi Fig. 2.6). La soglia dovrebbe essere un valore tra -1 e +1, perch tutte le similarit` restituiscono un valore in questo e a range.

Algoritmi Ora che sono state denite le nozioni di similarit` e di neighbourhood ` possibile a e comprendere appieno gli algoritmi di raccomandazione. I recommenders user based si basano sul principio di trovare utenti simili allutente in questione. Per meglio dire, viene stimata la similitudine tra lutente interessato e ogni singolo altro utente con un valore numerico generalmente compreso tra -1 e +1 (oppure tra 0 e 1). Una volta individuati gli utenti pi` simili u allutente interessato trovare item di interesse per questultimo ` unoperazione e piuttosto semplice. I recommender di tipo user-based sono veloci nel caso in cui il numero di utenti ` relativamente piccolo rispetto al numero di item. Di seguito viene indicato e lalgoritmo di un recommender User-Based (Algorithm 1).

Figura 2.5: Fixed-size neighbourhood

14

Figura 2.6: Threshold-based neighbourhood

Data: Users preferences Result: Some predictions about user preferences foreach other user w do compute a similarity s between u and w retain the top users, ranked by similarity, as a neighboorhood n end foreach item i that some user in n has a preference for, but that u has no preference for yet do foreach other user v in n that has a preference for i do compute a similarity s between u and v incorporate vs preference for i, weighted by s, into a running avarage end end return the top items, ranked by weighted average Algorithm 1: User based recommender Per i recommenders item based pu` essere fatto un discorso del tutto analogo. o Questi recommenders si basano sul principio di individuare gli item che potrebbero piacere ad un utente cercando di individuare altri items simili a quelli per cui lutente ha gi` espresso una preferenza. I recommender di tipo item-based a sono veloci nel caso in cui il numero di item ` relativamente piccolo rispetto al e numero di utenti. Lo pseudocodice 2 ne descrive il funzionamento. Data: Users preferences Result: Some predictions about user preferences foreach item i that u has no preference for yet do foreach item j that u has a preference for do compute a similarity s between i and j, add us preference for j, weighted by s, to a running avarage end end return the top items, ranked by weighted average Algorithm 2: Item based recommender

2.1.4

Slope-one Recommender

I recommender Slope si basano sulla tesi che c` una qualche relazione lineare e tra il valore assunto da una preferenza e quello di unaltra. 15

Formalizzando si assume che ` possibile stimare il valore di una preferenza per e un item Y a partire dal valore di una preferenza per litem X tramite una funzione lineare come: Y = mX + b. Lo Slope-One fa inoltre unulteriore assunzione, ovvero che m = 1 da cui il nome Slope-One. Lo Slope-One fu per la prima volta introdotto in un articolo del 2005 da Daniel Lemire e Anna Maclachlan [9]. In pratica quindi sar` suciente a per ogni coppia di item calcolare le dierenze medie (dis) tra gli item a partire da b = Y X. Lalgoritmo ha infatti bisogno di una parte di preprocessing computazionalmente costosa e un impegno in termini di spazio non indierente. In pratica deve essere precomputata la dierenza media tra i valori dei voti su un item e su di un altro per tutti gli utenti che li hanno votati entrambi. La precomputazione pu` essere eettuata come segue: o Data: Users preferences Result: average dis for each couple of items foreach item i do foreach other item j do foreach user u expressing preference for both i and j do add the dierence in us preference for i and j to an average end end end return item item dis Algorithm 3: Slope-One: precomputation Una volta calcolate le dierenze eettuare la raccomandazione ` molto semplice: e Data: item item dis Result: Some predictions about user preferences foreach item i the user u expressed no preference for do foreach item j that user u expressed a preference for do nd the average preference dierence beetween j and i add this di to us preference value for j add this to a running average end end return the top items, ranked by this average Algorithm 4: Slope-One: recommender algorithm Questo algoritmo sore di una vulnerabilit`; le dierenze item-item hanno lo a stesso peso indipendentemente da quanto siano credibili. Se una dierenza ` e calcolata solo su un utente (se ad esempio ` lunico ad aver votato una coppia e di item) allora probabilmente tale dierenza dovrebbe avere un peso minore rispetto a dierenze calcolate sul giudizio di molti utenti. La soluzione ` applicare una forma di weighting, per migliorare il recommender e in modo tale che ogni dierenza abbia pesi diversi a seconda di quante coppie di item sono state necessarie per generarla.

16

2.1.5

Recommender distribuito con Matrice di co-occorrenza

Gli algoritmi precedentemente descritti permettono di gestire una quantit` di a dati anche molto grande, ma se il dataset inizia a crescere sostanzialmente ` e necessario distribuire il calcolo della raccomandazione su pi` macchine. u Distribuire il calcolo su pi` macchine, non rende lalgoritmo pi` eciente; al u u contrario molto spesso richiede un dispendio di molte pi` risorse. u Inoltre distribuendo il calcolo bisogna tener presente che le raccomandazioni non sono fornite allutente in real-time, ma si procede a calcolarle a scadenze periodiche. Per distribuire il calcolo di una raccomandazione ` necessario ripensare al modo e di fare raccomandazioni. Matrice di Co-occorrenza Ripensiamo alla raccomandazione come un banale prodotto matriciale, riconducendoci in qualche modo ad una sorta di algoritmo item-based descritto a pag. 15. Infatti gli algoritmi di raccomandazione Item-Based sono fondati su di una qualche ItemSimilarity, che fornisce un modo per valutare un grado di similarit` tra a due item interessati. La matrice di co-occorrenza ` quadrata e simmetrica(in quanto loperazione di e similarit` ` simmetrica), con il numero di righe e di colonne pari al numero di ae item del sistema. Viene costituita contando quante volte ogni coppia di item occorre simultanemente nelle preferenze di ogni utente ed inserendo tale valore (che se vogliamo ` una sorta di valore di similarity) dentro questa grande matrice. e Per esempio se ci sono 7 utenti che hanno espresso una propria preferenza sia per litem X che per litem Y , allora la matrice avr` un 7, sia nella posizione a (X, Y ) che nella posizione (Y, X) (poich, come abbiamo detto, la matrice ` e e simmetrica). La co-occorrenza ` come una sorta di similarity, in quanto pi` due item sono e u presenti in coppia allinterno delle preferenze, pi` ` probabile che siano simili ue tra loro.

Raccomandazione con matrice di Co-occorrenza Per raccomandare un video ad un utente tramite una matrice di co-occorrenza ` necessario unaltra volta ripensare agli utenti come dei vettori di dimensione e pari alla cardinalit` degli item prensenti. a

17

Figura 2.7: Raccomandazione tramite matrice di co-occorrenza

Una volta descritto un utente come un vettore di rates per i diversi item, calcolare una raccomandazione ` unoperazione molto semplice. e Infatti la raccomandazione consiste semplicemente in una semplice moltiplicazione tra la matrice di co-occorrenza ed il vettore colonna che descrive lutente per cui si richiede una raccomandazione. Ad esempio, facendo riferimento alla Figura 2.7, avendo la matrice di co-occorrenza rappresentata ed un utente, User3 che ha come preferenze, (U 3, I101, 2.0) (U 3, I104, 4.0) (U 3, I105, 4.5) (U 3, I107, 5.0) ` possibile ottenere una raccomandazione tramite il prodotto matriciale tra la e matrice e il vettore colonna dello User3, come viene rappresentato nella Figura 2.7. In celeste sono rappresentate le possibili recommendation per lutente in questione, quelle in giallo sono da escludere in quanto per gli item 102, 103 e 106 lutente ha gi` espresso una preferenza. a Quindi la migliore raccomandazione sar` data dallitem 103 in quanto ` quello a e che ha ricevuto un voto pi` alto, 24.5, tra gli item per cui lutente non ha ancora u espresso una preferenza. Limportanza di questo algoritmo ` che, a dierenza di quelli visti precedentee mente, pu` essere distribuito su pi` macchine. o u Implementare lalgoritmo in modo distribuito Per dare unimplementazione distribuita di questo algoritmo ` necessario sude dividere il dataset in tanti piccoli pezzi e tener di conto di alcune osservazioni importanti:
Creare i vettori utenti ` semplicemente un problema di raggruppamento e di tutte le preferenze di un utente da cui poi ricostruire un unico vettore utente

18

In secondo luogo per calcolare le co-occorrenze della matrice ` suciente e esaminare un vettore utente alla volta una volta ottenuta la matrice di co-occorrenza e i vettori utente, ` possibile e anche distribuire il computo del prodotto matriciale. Infatti ` possibile e ottenere il prodotto di una matrice per un vettore colonna in due modi:

facendo il prodotto vettoriale tra la matrice e il vettore, ovvero per ogni riga, si calcola li-esimo valore del vettore risultato R come il prodotto vettoriale tra li-esima riga e il vettore utente inizializzare il vettore risultato R a 0, per ogni colonna della matrice calcolare il vettore ri dato dal prodotto tra la i-esima colonna e liesimo valore del vettore utente. Il vettore nale R sar` dato dalla a somma di tutti i vettori ri : R = R + r1 + r2 + . . . + ri + . . . + rN Il secondo modo si presta molto bene ad essere utilizzato allinterno di un algoritmo distribuito in quanto, poich molto spesso i vettori utenti sono e vettori sparsi, gran parte dei valori saranno pari a 0. In tal modo lalgoritmo dovr` calcolare il vettore ri solo nel caso in cui il vettore utente a allindice i non presenti uno 0; questo non solo evita molte computazioni, ma permette anche di distribuire meglio i calcoli tra pi` macchine. Inu fatti ` possibile passare come input ad una macchina semplicemente un e vettore colonna della matrice i co-occorrenza e i rispettivi valori per cui ` e necessario moltiplicarla per distribuire il calcolo Una volta messi in evidenza questi fatti ` possibile comprendere il funzionamento e dellalgoritmo che segue il paradigma MapReduce implementato allinterno del Framework Mahout, come descritto successivamente a Pag. 71.

19

Capitolo 3

Realizzazione
Si ` scelto di sviluppare una web application in modo tale che fosse completae mente portabile su tutte le piattaforme, quindi fruibile da tutti; inoltre lutente non avr` bisogno di installare software aggiuntivi o di terze parti. La scelta degli a strumenti di sviluppo ` ricaduta su software open source, in quanto facilmente e reperibili e adattabili al proprio scopo. Lapplicazione ` composta da tre componenti principali: e 1. Un server PHP 2. Un server Tomcat 3. Un cluster composto da una macchina master e 4 macchine slave Ognuna di queste parti ha un contributo essenziale allinterno di Intime. Come linguaggio web ` stato scelto PHP, per la sua semplicit` e versatilit`. e a a Per facilitare il lavoro a livello di programmazione e per avere un codice ben strutturato, ` stato utilizzato il framework PHP Codeigniter, scelto fra molte ale ternative (Symfony, CakePHP, Zend Framework, ecc.), per la sua semplicit` ed a ampia documentazione. Per il lato client ` stato utilizzato javascript per aumene tare il livello di interattivit` con lutente in combinazione con la libreria jQuery, a per la sua straordinaria semplicit` e per lalta compatibilit` cross-browser. Per a a la gestione del database relazione ` stato usato MySql. e Intime ` stato pensato come un sistema capace di supportare un ampio traco e di dati che non sarebbe altrimenti gestibile su una singola macchina, ma soltanto distribuendo la computazione tra pi` macchine. Infatti nel computo della u recommendation e della categorization sono stati utilizzati algoritmi distribuiti della libreria Apache Mahout che possono essere eseguiti tramite il framework Apache Hadoop su un cluster, ovvero un sistema distribuito composto da pi` u macchine.

20

3.1
3.1.1

Frameworks
Cluster

Un computer cluster, o pi` semplicemente un cluster, ` un insieme di computer u e connessi tra loro tramite una rete telematica. Lo scopo di un cluster ` quello e di distribuire unelaborazione molto complessa tra i vari computer componenti il cluster. In sostanza un problema che richiede molte elaborazioni per essere risolto viene scomposto in sottoproblemi separati, i quali vengono risolti in parallelo. Questo ovviamente aumenta la potenza di calcolo del sistema. Il cluster utilizzato rispetta larchitetture Master-Slave: ` composto da quattro e computer node Slave (4 Core di cui 2 reali e 4 logici, 8GB di RAM, 320Gb di HDD 7.2k rpm) e un singolo node Master (4 Core di cui 2 reali e 4 logici, 8GB di RAM, 320Gb di HDD 10k rpm), un dispositivo SAS (4 TB di HDD in RAID0, connessione in bra ottica). Il sistema operativo installato ` Linux con distribuzione Rocks Cluster. Rocks e Cluster ` un derivato da CentOS 5, update 5 che a sua volta ` derivato da Red e e Hat Enterprise Linux 5. Lunico punto di accesso al cluster ` il nodo master, il frontend dellintera e ` struttura. E suciente utilizzare questa macchina per tutte le esigenze. Il cluster possiede una coda di lavori da eseguire e gestisce automaticamente lallocazione dei jobs sulla base delle esigenze espresse e delle disponibilit` di a risorse. I jobs vengono gestiti dal software Sun Grid Engine. Il software di management permette di allocare risorse come processori, memoria, spazio su disco, a programmi funzionanti in modalit` batch. a Ogni utente pu` sottomettere un job specicando uno script bash/sh/csh. Opo zionalmente pu` richiedere anche una quantit` di memoria e di tempo di cpu. o a ` E utile indicare sempre una quantit` di tempo di cpu, per evitare che in caso di a problemi il job occupi un tempo indenito in esecuzione. ` Ogni programma lanciato da console viene eseguito soltanto sul nodo master. E necessario sottomettere un lavoro per poter sfruttare le potenzialit` del cluster. a Il comando per inviare un job in coda ` qsub. e

qsub [ - cwd ] [ -o path ] [ -e path ] [ -l res ] [ -p priority ] script

Le opzioni pi` comuni sono: u


[-cwd] esegue il job dalla cartella in cui ` presente lo script e [-o path] redirige lo standard output del programma sul path specicato ` E possibile usare /dev/null per non salvare loutput. Se non specicato invia loutput in un le nella propria home, denominato nomejob.oJobId

` [-e path] redirige lo standard error del programma sul path specicato E possibile usare /dev/null per non salvare loutput. Se non specicato invia loutputin in un le nella propria home, denominato nomejob.eJobId

21

[-l res] specica le risorse richieste dal job per essere eseguito. h data=1024M imposta 1GB di RAM h rt=24:00:00 imposta massimo 1gg di esecuzione per core (hard runtime) [-p priority] imposta la priorit` del lavoro. Accetta valori interi tra a 1023 a 1024.La priorit` predenita ` 0. Come utenti ` possibile soltanto a e e diminuire la priorit` a

Per vericare i jobs in esecuzione si usa il comando qstat:

qstat [ -f ] [ -j job_number ]

lopzione [-f] mostra un riassunto sulle risorse disponibili al momento

` lopzione [-j job number] mostra i dettagli di un job. E utile in caso per conoscere lo stato esaustivo del job e i motivi di un eventuale blocco o errore Il comando qdel job number elimina un job dalla coda. Map-Reduce Per essere eseguito su un cluster, un algoritmo pu` essere scritto secondo il pao radigma di programmazione detto Map-Reduce. Il paradigma di programmazione Map-Reduce esprime un grande calcolo distribuito come una sequenza di operazioni eettuate su macchine distinte eseguite su dati in forma sequenziale. Il formato sequenziale dei dati comporta che ogni dato sia espresso tramite una coppia chiave-valore, dove ` sempre specicato che e signicato hanno i dati chiave e i dati valore: ad esempio il valore pu` essere il o contenuto testuale di un le e la chiave il titolo di tale le. Lingresso per il calcolo Map-Reduce ` dunque una sequenza di elementi nel e formato chiave-valore. Come suggerisce il nome, la computazione Map-Reduce ha due fasi: la fase di Map e di Reduce. Durante la fase di Map, i dati vengono divisi in frammenti: ogni frammento viene destinato ad un nodo del cluster sul quale verr` verr` eseguito un Map task, a a denito dal programmatore del job Map-Reduce in base al problema specico. In questo modo i dati vengono divisi ed elaborati separatamente su macchine diverse. Ogni Map task produce sempre dati in formato chiave-valore, ma la chiave e valore di uscita avranno signicati diversi da quelle in ingresso. Successivamente avviene una fase intermedia detta Combiner, nella quale le coppie chiave-valore vengono ordinate in modo che quelle con chiave uguale compariranno insieme; dopodich i dati verranno distribuiti sui nodi addetti e alloperazione Reducer. Questa, anchessa denita dal programmatore, riceve coppie chiave valore con la stessa chiave e produce unuscita sempre in forma sequenziale. Dopo le operazione di Reduce, i dati nali vengono raccolti nel

22

Master Node e costituiranno loutput dellintero job. Le operazioni di Map e di Reduce sono svolte in modalit` fault-tolerance: se in a un singolo nodo si ha un fallimento del task assegnato i dati vengono ridistribuiti sugli altri nodi e la procedura continua con un nodo in meno, nch` questo non e verr` sostituito. a Map-Reduce ` molto eciente soltanto per grandi quantit` di dati; se questi sono e a in piccolo numero ` pi` veloce lesecuzione su una singola macchina, in quanto e u evita numerose operazioni di frammentazione e distribuzione dei dati. Non tutti i problemi, inoltre, sono modellabili secondo il paradigma Map-Reduce. DFS Un lesystem distribuito ` un particolare lesystem che permette la memorizzae zione di molteplici le e risorse in dispositivi di archiviazione distribuiti in una rete informatica. Viene utilizzato per gestire grandi quantit` di dati A dierenza a di un comune lesystem, i dati non vengono letti o archiviati su di un dispositivo locale ma, attraverso un meccanismo client-server, su dispositivi remoti; collegati in maniera trasparente alla propria gerarchia di le. Un lesystem distribuito deve poter gestire i le in maniera trasparente e concorrente e, di solito, ` dotato di sistemi di autenticazione, di cifratura e di recupero delle perdite. e Il paradigma Map-Reduce prevede che i dati vengano divisi in un lesystem distribuito, in modo che questi possano essere trasferiti tra i nodi del cluster.

3.1.2

Hadoop

Apache Hadoop ` un framework e open-source. Il progetto ` inie ziato nel 2002 con il nome di Nutch, mentre limplementazione del Nutch distributed Filesystem risale al Figura 3.1: Logo di Apache Hadoop 2004 [10]. Supporta lesecuzione di applicazioni su grandi cluster, consentendo alle applicazioni di lavorare con migliaia di computer indipendenti e petabyte di dati. Hadoop implementa il paradigma Map-Reduce, in cui lapplicazione ` divisa in e piccoli frammenti di lavoro, ciascuno dei quali pu` essere eseguito o rieseguito o su ogni nodo del cluster. Inoltre, Hadoop fornisce un lesystem distribuito che distribuisce i dati sui nodi di calcolo.

Architettura Hadoop si basa sullarchitettura Master-Slave, dove il server Master ` chiamato e jobtracker, in quanto gli utenti sottomettono i job su questa macchina, che ` e lunico punto di comunicazione tra il cluster e lesterno. Questi job, una volta sottomessi, vengono posti in una coda di attesa dove aspettano di venire eseguiti sul cluster. I server Slave vengono chiamati tasktracker e vengono coordinati

23

dal jobtracker, che distribuisce i compiti di map e reduce e gestisce le fasi dei job eseguiti. Hadoop DFS Il lesystem distribuito di Hadoop viene detto HDFS, ovvero Hadoop Distributed File System. Ogni le viene organizzato nellHDFS come una sequenza di blocchi, ognuno (eccetto lultimo) della stessa dimensione e replicato per il principio della fault tolerance. Non ` possibile modicare i le gi` inseriti alline a terno del lesystem distribuito. Anche larchitettura dellHDFS segue il modello Master-Slave: il lesystem viene gestito da un nodo master chiamato Namenode, che distribuisce i blocchi nei nodi Slave detti Datanode, che eseguono operazioni come creazione, cancellazione e copia dei blocchi, guidati dalle istruzioni del Namenode.

3.1.3

Mahout

Apache Mahout ` un progetto Apae che scritto in Java che comprende algoritmi di machine learning che possono essere eseguiti su un cluster Hadoop, rendendo tali algoritmi scalabili.

Figura 3.2: Logo di Apache Mahout

Mahout nasce in risposta al diondersi degli algoritmi di machine learning, in particolare nel mondo del Web, dove ` presente il bisogno di navigare tra enormi e quantit` di dati. Lo scopo proposto da Mahout ` quello di permettere di utia e lizzare nelle proprie applicazioni questi algoritmi in modo facile e veloce. Molte applicazioni Web come Facebook, Google, Amazon e Yahoo utilizzano algoritmi di machine learning per apprendere informazioni dallattivit` degli utenti. a Gli algoritmi di machine learning pi` utilizzati sono di tre famiglie: Recommenu dation, Clustering e Classication; Mahout ore numerosi algoritmi per ognuno di questi scopi. Sebbene le librerie principali sono altamente ottimizzate per permettere alte performace anche per esecuzioni sequenziali su una singola macchina, Mahout dispone della libreria di Apache Hadoop, che permette di usufruire di implementazioni scalabili, eseguendo gli algoritmi scritti secondo il paradigma Map-Reduce su un cluster Hadoop. Mahout, infatti, ` nato nel 2008 come sottoprogetto di Lucene, dedicato ad orie re implementazioni distribuite che fossero scalabili, poi ha assorbito il progetto Apache Taste per il Collaborative Filtering e soltanto successivamente ` stato e reso un progetto indipendente e si ` evoluto in modo da copirire approcci diversi e agli algoritmi di machine learning [11].

24

Figura 3.3: Relazione di Mahout con altri progetti Apache

Gli obiettivi di Mahout sono:


dare vita ad una vasta comunit` di utenti e collaboratori, in modo da a permettere a tutti di contribuire a migliorare il framework, rilasciando delle patch o fornendo supporto sulla mail list orire soluzioni robuste a problemi ricorrenti, in modo che le applicazioni non debbano utilizzare approcci nuovi e non collaudati fornire una ricca documentazione e un grande numero di esempi

3.1.4

WikipediaMiner

WikipediaMiner ` un toolkit java sviluppato dallUniversit` di Waikato utilize a zato per usufruire appieno della ricchezza semantica codicata allinterno di Wikipedia. WikipediaMiner permette di integrare facilmente le informazioni contenute in Wikipedia allinterno di un applicativo, consentendo di misurare quanto termini e concetti di Wikipedia siano connessi tra loro, individuando e disambiguando i topic di Wikipedia quando menzionati allinterno di documenti. ` E possibile usufruire di alcuni servizi oerti dalla Web Service di WikipediaMiner: in una richiesta HTTP viene indicato il servizio e i parametri; la risposta potr` essere restituita in diversi formati: HTML, XML, JSON. a La Web Service uciale di WikipediaMiner pone per` delle limitazioni alle o richieste, in quanto non ` in grado di sostenere un grande numero di queste: ogni e Web Application che necessita dei servizi richiesti per risolvere questo problema pu` ospitare sul proprio server una propria versione di WikipediaMiner, in modo o da poter eettuare tutte le richieste HTTP necessarie senza limitazioni. Ogni installazione di WikipediaMiner ` costituita da due componenti: e
Wikipedia XML dumps: Ogni settimana MediaWiki rilascia grandi le XML, chiamati dumps, contenenti grandissime quantit` di dati. Il le a utilizzato da WikipediaMiner ` quello contenente i dati relativi agli articoli e attuali CSV summaries: I le csv svolgono la funzione di sommario per gli articoli contenuti nei dumps XML e permettono una rapida estrazione dei dati da questi.

25

Servizi Tra i servizi usufruibili tramite richieste HTTP alla Web Service compaiono: Explore Article, Explore Category, Compare, Search, Wikify e Suggest.

Explore Article Explore Article permette di richedere informazioni o dati caratteristici di una pagina di Wikipedia, come un estratto testuale, immagini, categorie di appartenenza e link correlati. Alcuni parametri che ` possibile specicare: e
id : lid della pagina della quale si richiedono i dati title: il titolo della pagina della quale si richiedono i dati. Pu` essere specicato lid oppure il titolo o denition: indica se deve essere restituito un breve estratto testuale images: se ` true vengono restituite le immagini correlate e parentCategories: specica se devono essere restituite le categorie di appartenenza della pagina richiesta outLinks: se true vengono restituite le pagine alle quali si riferiscono i link della pagina richiesta. linkRelatedness: se selezionata i link restituiti vengono pesati da un valore tra 0 e 1

Compare Questo servizio misura la distanza semantica tra due o pi` articoli. u Questa misura viene calcolata in base ai link che compaiono nelle pagine confrontate: pi` sono i link in comune, maggiore sar` la vicinanza semantica. u a Alcuni parametri che ` possibile specicare: e
id1 e id2 : gli id delle due pagine da confrontare term1 e term2 : i titoli delle pagine da confrontare. ids1 e ids2 : gli id dei gruppi di pagine da confrontare connections: se true verranno restituite le pagine correlate ad entrambi gli articoli specicati snippets: se impostato vengono mostrati dei frammenti di testo che si riferiscono a entrambe le pagine disambiguationDetails: se le pagine sono state indicate con titoli e non con id, nel caso di multiple interpretazioni questo parametro indica se considerarle tutte invece che una sola

26

Wikify Il servizio Wikify estrae automaticamente i topic contenuti in un documento testuale e fornisce i riferimenti alle pagine di Wikipedia. I risultati restituiti vengono ottenuti mediante una classicazione: per ottenere dei buoni risultati i testi devono rispettare il modello con il quale il classicatore ` stato e addestrato, non devono essere troppo brevi e devono essere riferiti ad un singolo topic. Alcuni parametri che ` possibile specicare: e
source: il documento testuale da analizzare pu` essere anche un indirizzo o URL ad una pagina Web minProbability: ogni topic estratto ha una probabilit`: topic con un valore a minore di minProbability non saranno restituiti references: se true vengono mostrati dettagli su dove i topic sono stati individuati nel testo disambiguationPolicy: indica che politica adottare nel caso di disambiguazioni: se utilizzare un approccio loose oppure strict

Correct Correct ` un servizio di correzione: analizza una frase e cerca di e individuare parole che potrebbero riferirsi a una qualche pagina di Wikipedia, ma che sono scritte erroneamente. Per ogni termine errato che individua viene restituita una lista di suggerimenti. Alcuni parametri che ` possibile specicare: e
term: il termine o la frase che deve essere corretta max : il massimo numero di suggerimenti che devono essere restituiti

WikipediaMiner in Intime Intime ospita uninstallazione locale di WikipediaMiner, ottenuta scaricando lultimo le XML dei dumps di Wikipedia fornito dal toolkit. Intime utilizza i servizi forniti da WikipediaMiner per diverse importanti fasi nellindividuazione e la collocazione semantica delle annotazioni presenti in un video. In particolare i servizi descritti vengono utilizzati da Intime per:
calcolare la distanza semantica tra due o pi` risorse. Per categorizzare u le risorse viene utilizzata spesso la funzione Compare come metrica di distanza tra pagine Wikipedia estrarre in automatico le risorse da un commento testuale. Ogni commento inserito viene analizzato manualmente dalla funzione Wikify che estrae in automatico risorse dal testo ottenere dati di ogni risorsa (titolo, immagine, descrizione). Gran parte dei dati relativi alle risorse, ad eccezione dellestratto testuale della pagina della risorsa, viene richiesto a WikipediaMiner attraverso il servizio Explore Article

27

migliorare la ricerca nel network, correggendo parole errate. La funzione Correct viene utilizzata per correggere termini inseriti erroneamente nel form di ricerca

3.1.5

Codeigniter

CodeIgniter ` un potente Application Framework open source per lo sviluppo e di applicazioni web in PHP, cio` una piattaforma grazie alla quale ` possibie e le realizzare applicazioni in linguaggio PHP in modo semplice e veloce grazie a classi e metodi gi` disponibili. CodeIgniter ` basato sul paradigma MVC a e (Model-View-Controller) che consente un ampio livello di separazione tra la logica dellapplicazione e la presentazione della stessa. Infatti MVC consta di tre tipologie di oggetti: Model, View e Control. Il Model ` loggetto dellapplicazione, il View ` la sua rappresentazione a video, e e e il Controller denisce le reazioni dellinterfaccia graca allinput dellutente. Per aumentarne la essibilit` e il riuso, MVC disaccoppia View e Model instaurando a un protocollo di sottoscrizione/notica fra loro [12]. Lutilizzo dellMVC si rietter` positivamente soprattutto nei progetti in cui a sar` necessario che il lavoro dei webdesigner non condizioni quello degli svilupa patori e viceversa. Il principale vantaggio di utilizzare Codeigniter piuttosto che altri prodotti pi` noti (CakePHP, Zend Framework..) risiede nella estreu ma facilit` di utilizzo e nella ampia documentazione completa e semplice da a consultare. Non costringe lo sviluppatore a lavorare con librerie monolitiche ed eccessive quantit` di le; garantisce prestazioni molto elevate; ` compatibile con a e numerose versioni di PHP e, a dierenza di altri framework, pu` essere utilizo zato anche in ambienti di hosting che non supportano ancora la versione 5 di PHP.

3.2

Architettura

Figura 3.4: Intime: architettura web

28

Come si pu` vedere dalla Fig. 3.4 il sistema ` composto da diversi componenti: o e
la macchina ona che ospita al suo interno un server Apache PHP e un server Tomcat Java un database MySql contenente i dati del sistema un cluster Hadoop

Il server PHP si occupa di rispondere alle richieste HTTP degli utenti, restituendo le pagine costituenti linterfaccia del sistema. Per restituire agli utenti alcuni dati, a volte questi devono essere prima richiesti al server Tomcat dal server PHP. Ad esempio quando viene interrogato WikipediaMiner il server PHP tramite una richiesta curl ottiene una risposta dal server Tomcat circa le informazioni richieste. Il server Tomcat ospita WikipediaMiner e le servlet di Recommendation. Queste ultime, sono accessibili tramite HTTP. In tal modo il recommender ` implemene tato come un servizio accessibile tramite web. Questo in un certo senso aggiunge complessit` al progetto, ma permette ad altre applicazioni, anche scritte in altri a linguaggi, di accedere al servizio di recommendation; ad esempio per ottenere quali video suggerire agli utenti il server PHP le richiede tramite curl a una di queste servlet. Il cluster Hadoop periodicamente copia alcuni dati dal server PHP, carica i servizi di Hadoop sulle macchine, formatta il lesystem distribuito e copia i nuovi dati di input. Successivamente sottomette un job che provveder` a eseguire gli a algoritmi distribuiti di recommendation e clustering. Al termine dellesecuzione i le di output vengono copiati dal lesystem di hadoop nel lesystem locale, vengono elaborati e vengono prodotti alcuni le sql. Questi le vengono copiati tramite scp sulla macchina ona dove vengono eseguiti, aggiornando il database MySql con i nuovi dati di recommendation e clustering.

3.3
3.3.1

Mock-up
Home Page

La Home Page (vedi Fig. A.1) ` strutturata nel seguente modo: in primo luoe go lutente vedr` una tabella interattiva coordinata dinfograca attraverso la a quale vengono illustrate subito quelle che sono le attivit` che si possono svola gere allinterno del network. Questa prima pagina mostra inoltre anche i video con pi` frame commentati dellintera piattaforma (most shared videos). Nella u barra dellapplicazione in alto a destra ` presente il bottone di login di Facebook. e Nella zona in cui vengono mostrati i video lutente pu` interagire con unarea o interattiva costituita dalla preview del video: limmagine mostrata corrisponde a quella del frame selezionato. Posizionandosi con il mouse su tale area apparir` a lultimo commento eettuato allinterno del relativo frame. Tramite le freccie verticali presenti nel riquadro ` possibile scorrere tra i molteplici commenti pree senti in quello specico frame.

29

Il secondo livello di interazione ` costituito dalle frecce poste ai margini della e timeline (la spirale): cliccando su una di esse ` possibile scorrere i frame con e commenti e annotazioni allinterno del video. Per facilitare il caricamento dei frame allinterno del video ` stato stabilito un e intervallo di un secondo tra un frame e laltro (in quanto ` possibile commene tare un frame ogni millisecondo); cliccando sulla freccia a destra selezioniamo direttamente il frame successivo. Il frame selezionato viene sempre mostrato in posizione centrale ed in rilievo rispetto a quelli vicini. Cliccando su una qualunque di queste immagini si giunge alla pagina in cui viene mostrato il video in questione al millisecondo esatto in cui ` stata inserito e il commento.

3.3.2

Header

Nellheader troviamo in ordine il logo di Intime che funge da Home button, la ricerca ed il login/logout button. Data la complessit` della piattafora ma sia a livello semantico che interattivo, ` stato necessario creae re un sistema di ricerca che indirizzi lutente verso le tre entit` fondamentali che compongoa no la piattaforma: video, categorie e risorse. Tale processo ` e mostrato in Figura 3.5 prendendo come input di ricerca la stringa Mo. In particolare si ricercano video, categorie e risorse che contengono nel proprio testo le parole digitate o parole con edit distance piccola; in tal modo la ricerca ` ecace anche in caso di e piccoli errori (vedi Fig. 3.6), che possono essere ricavati tramite il servizio correct di WikipediaMiner. Nellheader delle pagine ` presente un e Facebook login/logout button. Lapplicazione infatti utilizza come sistema di login quello messo a disposizione da Facebook tramite i social pluFigura 3.5: Ricerca gins, cos` che lutente non debba com pilare una noiosa e complicata procedura di registrazione, in quanto sar` sufa ciente eettuare laccesso tramite il proprio account di Facebook. Una vol-

30

ta entrato nel sistema lutente si trover` in una nuova pagina, la pagina dei a suggerimenti video.

Figura 3.6: Correzione

3.3.3

Pagina dei suggerimenti video

La pagina dei suggerimenti video (vedi Fig. A.2) ` caratterizzata dai seguenti e elementi:
i video personali caricati dallutente stesso insieme ai video aggiunti alla propria galleria ed il pulsante per pubblicarne uno nuovo le notiche relative allattivit` nel network dellutente. Esse si distinguono a in tre tipologie:

1. qualcuno ha commentato un tuo video 2. qualcuno ti ha taggato in un video 3. qualcuno ha aggiunto il tuo video ai suoi preferiti
attraverso un sistema di recommendation, oltre ai video preferiti dallutente, verranno proposti anche video che potrebbero suscitare il suo interesse nella prima tab, ed i video con pi` frame commentati dellintera u piattaforma (come nella vista iniziale) nella seconda tab

Cliccando sul pulsante di upload video, viene data allutente la possibilit` di a caricare un nuovo video, scegliendone il titolo. Una volta avviato lupload ` possibile vericarne il progresso in quanto ` pree e sente una progress bar che ci indica la percentuale di dati gi` caricati, la teorica a terminazione in termini di ore, minuti, secondi e la velocit` istantanea di upload. a

3.3.4

Pagina video

Come specicato precedentemente, cliccando nelle preview dei video o su un qualsiasi frame al suo interno, lutente ha la possibilit` di vedere il video coma pleto. 31

Questa pagina (vedi Fig. A.3) ` caratterizzata da una molteplice natura intee rattiva; ` infatti possibile guardare il video ed i suoi frame con commenti ed e annotazioni, e generare un commento su un nuovo frame. Inne vengono mostrate in questa pagina le categorie con le relative risorse che appartengono al video: esse rappresentano tutte le annotazioni eettuate dagli utenti.

Player video Il primo aspetto che andremo ad analizzare sar` appunto la parte relativa alla a visualizzazione del video con tutti gli elementi che lo caratterizzano:
Il video ed il relativo layout: ` possibile interagire con il video cliccando e sullapposito pulsante di play ed inoltre ` possibile, una volta che il focus e sul player ` attivo, gestire linterazione play/stop tramite la barra spaziae trice.

Nella parte inferiore del video scorrendo la progress bar ` possibile settae re il secondo da cui far partire il player individuandolo tramite una delle preview disponibili sopra la progress bar al momento del set. Lutente ha la possibilit` di settare il volume del video dal browser ata ` traverso unapposita barra. E possibile ottenere una visualizzazione a schermo intero del video cliccando sul tasto di full-screen. Una volta che il video non ` in esecuzione ` possibile, solo se lutente ` e e e connesso al sistema, aggiungere un commento sul frame del video sul quale questo ` stato interrotto. e
Lo scorrere dei frame ed i commenti del frame: durante lesecuzione del video, allo scorrere dei frame vengono mostrati di lato al player le annotazioni presenti nei vari commenti Linserimento di commento: fermando lesecuzione del video ` possibile, e se si ` eseguito laccesso, inserire un commento sul frame specico su cui si e ` interrotta lesecuzione. In particolare ` possibile scrivere testo e taggare e e i propri amici di Facebook o risorse presenti su Wikipedia. Laggiunta di commenti e annotazioni viene eettuata selezionando direttamente linput di testo situato sotto gli ultimi commenti eettuati. In questo spazio interattivo ` possibile selezionare, attraverso gli appositi bottoni, il nete work dal quale eettuare annotazioni semantiche: Facebook o Wikipedia. Qualora il focus sia gi` posto sulla textbox del commento, ` possibile efa e fettuare annotazioni semantiche anche tramite i tasti di shortcut # (hash) e @ (chiocciola), rispettivamente per i tag a risorse di Wikipedia e per i tag ad amici di Facebook Le annotazioni : una volta che si ` aperta la textbox per linserimento dele lannotazione, ` possibile digitare le lettere iniziali della risorsa o dellamico e Facebook richiesto, in modo tale che vengano mostrate allutente, in una tabella, i suggerimenti e la foto della persona o della risorsa desiderata

32

Risorse associate al video: Nella parte inferiore della pagina compaiono le risorse presenti nei commenti del video. In questo spazio sono presenti due categorie, ognuna di queste dispone di un elenco composto dalle risorse annotate nei commenti soprastanti. Le categorie del video vengono derivate dalle risorse annotate. Questa sezione della pagina permette di derivare a colpo docchio i contenuti presenti nel video.

Ogni volta che una risorsa relativa a una pagina di Wikipedia viene annotata oppure quando viene rilevata in automatico da un commento, questa viene subito categorizzata: se la categoria assegnata appartiene alle due categorie associate al video, comparir` subito in una delle due liste in a basso. Le risorse elencate in questo spazio hanno un apposito tooltip, nel quale compaiono i frame del video contenenti lannotazione: cliccando sar` a possibile muovere il video alla posizione contenente il commento

3.3.5

Pagina del Prolo

La pagina del prolo (vedi Fig. A.4) degli utenti di Intime permette a questi di curare il loro prolo nel network. In gran parte tale pagina viene automaticamente modicata dal sistema; lutente che accede alla propria pagina del prolo avr` la possibilit` di eettuare a a alcune modiche manuali, che avranno peso maggiore delle scelte automatiche del sistema. La parte superiore della pagina ` composta da una immagine del prolo sulla e parte sinistra, come tipico dei social network; sulla destra invece compare una sezione che documenta lattivit` dellutente sui video di Intime. Tale sezione a comprende:
Last Comments: vengono riportati i commenti eettuati sui video, per ognuno dei quali compare unimmagine corrispondente al frame al quale ` stato posto il commento e una preview del testo di questultimo. e Annotations: compaiono le annotazioni inserite dallutente, ovvero tag a risorse e a persone. Per ogni annotazione ` visibile il frame del commento e che la contiene, il secondo al quale ` stato posto e unimmagine rappresene tativa: limmagine del prolo nel caso di un utente Facebook; limmagine della risorsa nel caso di una pagina di Wikipedia. In questultimo caso compare anche linizio della descrizione, in modo che lutente interessato possa accedere con un click alla pagina della risorsa.

Segue una seconda sezione comprendente quelli che sono deniti gli interessi dellutente, che corrispondono a categorie del sistema. Per ognuna di queste categorie di interesse ` presente una lista di risorse di interesse appartenenti alla e categoria. Ognuna di queste risorse ` rappresentata da un titolo e da unimmae gine; un tooltip mostra informazioni aggiuntive, quali descrizione e informazioni relative alle annotazioni della risorsa nei video del network. La pagina del prolo appare diversamente nel caso di un utente che acceda alla propria pagina; in tal caso saranno presenti funzionalit` per personalizzare i a 33

contenuti. Pi` precisamente comparir` per ogni categoria di interesse, oltre alla u a lista di risorse, unulteriore lista di suggestions, posizionata al di sotto di queste ultime e contenente alcune risorse suggerite per quella specica categoria. Lutente pu` eettuare le seguenti azioni sulle risorse di interesse, attraverso un o meccanismo di drag-and-drop:
aggiungere una risorsa dalle suggestions a quelle di interesse, semplicemente trascinandola nella lista superiore rimuovere una risorsa di interesse, trascinandola nellelenco delle suggestions sottostante ordinare le risorse di interesse, in modo da visualizzare per prime quelle preferite rimuovere una risorsa tra quelle suggerite, in modo che non compaia pi` u il suggerimento

In una sidebar laterale a destra compaiono alcuni box riservati a mostrare informazioni aggiuntive dellutente, come gli amici e i video inseriti. Nella box degli amici compaiono le immagini prolo degli utenti amici su Facebook; in particolare quelli che tra questi sono anche utenti di Intime sono contrassegnati da un logo in basso a destra.

3.3.6

Pagina della Risorsa

Intime dispone di una pagina della risorsa (vedi Fig. A.5), che oltre ad orire dati come descrizione e immagine presenta anche informazioni sul ruolo che questa gioca nel network. Una sezione superiore comprende unimmagine rappresentativa della risorsa sulla sinistra e una descrizione testuale a scorrimento. Segue una parte che mostra come gli utenti sono legati con la risorsa:
People Interested In: sono mostrate le immagini prolo degli utenti di Intime che hanno aggiunto la risorsa da quelle suggerite nei propri interessi Last Comments: i commenti dove ` stata annotata la risorsa, con testo e e immagine del frame del video corrispondente al commento

Nella parte inferiore della pagina compare unultima sezione: Related Categories, riservata a mostrare le categorie alle quali appartiene la risorsa, per ogni categoria compare immagine e titolo.

3.3.7

Pagina della Categoria

Le categorie di Intime dispongono di una propria pagina (vedi Fig. A.6), nella quale lutente ha modo di accedere rapidamente alle risorse categorizzate. In alto a sinistra compare unimmagine rappresentativa della categoria; il resto della pagina ` costituito da una griglia di immagini che corrispondono alle e risorse. Ogni risorsa dispone dellapposito tooltip che d` modo di ottenere vea locemente informazioni aggiuntive sulla risorsa oltre allimmagine, come titolo, descrizione e annotazioni nei vari video.

34

3.4

Database

Il database relazionale ` stato realizzato con MySql. e

3.4.1

MySql

MySQL, denito Oracle MySQL, ` un Relational database management system e (RDBMS), composto da un client con interfaccia a riga di comando e un server, entrambi disponibili sia per sistemi Unix o Unix-like come GNU/Linux che per Windows, anche se prevale un suo utilizzo in ambito Unix. Dal 1996 supporta la maggior parte della sintassi SQL e si prevede in futuro il pieno rispetto dello standard ANSI. Possiede delle interfacce per diversi linguaggi, compreso un driver ODBC, due driver Java, un driver per Mono e .NET ed una libreria per Python. Il codice di MySQL venne sviluppato n dal 1979 dalla ditta TcX ataconsult, poi rinominata MySQL AB, ma ` solo dal 1996 che viene distrie buita una versione che supporta SQL, prendendo spunto da un altro prodotto: mSQL. MySQL AB ` stata rilevata da Sun Microsystems nel 2008, mentre nel e 2010 questultima ` stata acquisita da Oracle Corporation. e

3.4.2

Database di Intime

Il database relazionale, che serve da appoggio allapplicazione, si compone di 22 tabelle collegate fra loro. Di seguito lo schema E-R: Analizziamo le tabelle ed i campi inerenti: 1. users: contiene le informazioni degli utenti che si connettono allapplicazione
id : identicativo univoco, serve a riconoscere univocamente gli utenti, ` chiave primaria della tabella e facebook id : identicatore univoco che Facebook assegna ad ogni utente name: il nome dellutente surname: il cognome dellutente email : email dellutente

Tutte le informazioni della tabella users vengono recuperate dalle informazioni di Facebook attraverso la Facebook SDK alla connessione dellutente al network, ad eccezione dellid che viene assegnato dal database in modo incrementale. 2. videos: contiene le informazioni dei video caricati dagli utenti
id : identicativo univoco, assegnato in modo incrementale dal database, ` chiave primaria della tabella e user id : id dellutente che ha caricato il video, ` chiave esterna che e fa riferimento alla tabella users lename: nome del le video, assegnato al momento della conversione

35

titolo: titolo del video, che sar` visualizzato nellapplicazione, scelto a dallutente al momento dellupload data inserimento: data registrata al momento del caricamento del video count visto: indica quante volte ` stato visto un video, campo incree mentato automaticamente ogni volta che viene visitato il video len: lunghezza in secondi del video, viene assegnata al momento dellupload estraendo linformazione dal le caricato tramite FFmpeg

3. comments: contiene le informazioni inerenti ai commenti di un video


id : identicativo univoco, assegnato in modo incrementale dal database, ` chiave primaria della tabella e

e video id : id video al quale il commento appartiene, ` chiave esterna che fa riferimento alla tabella videos
user id : id dellutente che ` autore del commento, ` chiave esterna e e che fa riferimento alla tabella users text: il testo del commento inserito dallutente links: un json contenente le informazioni inerenti alle annotazioni contenute nel commento time: istante in cui ` stato inserito il commento allinterno del video e date: data di inserimento del commento

4. fb tags: contiene le annotazioni Facebook del network


id : id che identica univocamente il tag Facebook allinterno del network comment id : id del commento in cui ` presente lannotazione, ` chiave e e esterna che fa riferimento alla tabella comments facebook id : rappresenta lid facebook della persona taggata name: nome e cognome della persona taggata, ` necessario in quanto e qualora si tagghi un amico di facebook non iscritto al network non sarebbe possibile risalire al suo nome facilmente

5. wiki tags: contiene tutte le annotazioni Wikipedia del network


id : id che identica univocamente il tag a Wikipedia allinterno del network comment id : id del commento in cui ` presente il tag, ` chiave esterna e e che fa riferimento alla tabella comments resource id : id di media wiki che identica univocamente una risorsa allinterno di Wikipedia

6. preferences: contiene le informazioni inerenti al voto assegnato da un utente ad un video


user id : id che identica lutente interno al network che ha espresso una preferenza, ` chiave esterna che fa riferimento alla tabella users e

36

video id : id video del video votato, ` chiave esterna che fa riferimento e alla tabella videos rate: voto espresso su una scala da 1 a 5

7. preferences last: questa tabella ha la stessa struttura di preferences ma contiene solo le ultime 100.000 righe inserite in preferences, serve per ottimizzare i tempi di recommendation sulla servlet java
user id : id che identica lutente interno al network che ha espresso una preferenza, ` chiave esterna che fa riferimento alla tabella users e video id : id video del video votato, ` chiave esterna che fa riferimento e alla tabella videos rate: voto espresso su una scala da 1 a 5

8. gallery: contiene le informazioni inerenti ai video aggiunti alla gallery di un utente


user id : id che identica lutente interno al network che ha inserito il video nella gallery, ` chiave esterna che fa riferimento alla tabella e users video id : id video del video inserito nella gallery, ` chiave esterna che e fa riferimento alla tabella videos time: data di inserimento del video nella gallery

9. gallery union: vista contenente tutte le informazioni inerenti ai propri video uploadati e ai video aggiunti alla propria gallery
video id : id video del video inserito nella gallery o caricato, ` chiave e esterna che fa riferimento alla tabella videos user id : id che identica lutente interno al network che ha inserito il video nella gallery oppure ha caricato il video sul network, ` chiave e esterna che fa riferimento alla tabella users data inserimento: data registrata al momento dellupload del video o dellinserimento nella gallery lename: nome del le video, assegnato al momento della conversione titolo: titolo del video, che sar` visualizzato nellapplicazione, scelto a dallutente al momento del caricamento del video type: identica se lutente user id ha caricato il video in questione oppure lo ha inserito nella propria gallery,

(a) 0 = uploaded (b) 1 = added to my gallery 10. noties: contiene le notiche di utenti del network verso altri utenti (interni ma anche esterni al network, ad esempio amici di facebook non iscritti ad Intime)
id : identicativo univoco, assegnato in modo incrementale dal database, ` chiave primaria della tabella e

37

autore: id che identica lutente interno al network che ha generato la notica, ` chiave esterna che fa riferimento alla tabella users e noticato: identica univocamente lutente noticato che pu` essere o o meno un utente del network

e comment id : id che identica il commento in cui ` stata generata la notica, ` chiave esterna che fa riferimento alla tabella comments e e video id : id che identica il video in cui ` stata generata la notica, ` chiave esterna che fa riferimento alla tabella videos e
cosa: valore che identica il tipo di notica

(a) 1 = hanno commentato un tuo video (b) 2 = ti hanno taggato in un video (c) 3 = added one of your videos to his/her favourite
vista: indica se la notica ` gi` stata letta o meno e a

(a) 0 = non ` ancora stata letta e (b) 1 = ` gi` stata letta e a e data inserimento: data in cui ` stata generata la notica 11. categories fb: contiene un elenco delle categorie di Facebook, con il suo rispettivo id alla risorsa di Wikipedia
category fb wiki id : identicativo di una risorsa di Wikipedia che corrisponde alla categoria Facebook presa in considerazione name: nome della categoria Facebook ag: poich alcune categorie di Facebook non sono abbastanza see mantiche, alcune di queste vengono escluse dalle computazioni del network

(a) 0 = escludi categoria Facebook (b) 1 = categoria presa in considerazione 12. likes: contiene le prime sei categorie di preferenza Facebook di un utente (sono computate considerando tutti i suoi likes). Per ogni categoria si tiene inoltre traccia di quanto abbia peso negli interessi di un utente.
user id : id che identica lutente interno al network, ` chiave esterna e che fa riferimento alla tabella users category fb wiki id : la categoria Facebook viene memorizzata come un identicativo alle risorse di Wikipedia, in modo da semplicare linterazione con WikipediaMiner, ` chiave esterna che fa riferimento e alla tabella categories fb quantity: computo del numero di likes per la categoria in questione percentage: peso percentuale totale della categoria in questione nelle prime sei categorie di facebook prese in considerazione

13. recommendations: contiene i risultati dellelaborazione della recommendation eseguita sul cluster, viene aggiornata a scadenze regolari

38

user id : id che identica lutente interno al network per cui si ha una recommendation, ` chiave esterna che fa riferimento alla tabella e users

e video id : id video del video per cui si ha una recommendation, ` chiave esterna che fa riferimento alla tabella videos
estimated rate: voto previsto espresso su una scala da 1 a 5

14. recommendations swap: questa tabella ha la stessa struttura di recommendations, serve ad evitare inconsistenze durante laggiornamento della tabella recommendations. Alla ne dellesecuzione dellalgoritmo sul cluster i dati vengono riposti in questa tabella; una volta conclusi gli insert si provvede a scambiare i nomi delle due tabelle recommendations e recommendations swap
user id : id che identica lutente interno al network per cui si ha una recommendation, ` chiave esterna che fa riferimento alla tabella e users

e video id : id video del video per cui si ha una recommendation, ` chiave esterna che fa riferimento alla tabella videos
estimated rate: voto previsto espresso su una scala da 1 a 5

15. categories: in questa tabella sono memorizzate le categorie del sistema


id : incrementale, identica in modo univoco la categoria, ` chiave e primaria category: titolo della categoria image url : immagine rappresentativa level : discrimina le categorie in base al livello gerarchico: level 1 sta per le categorie pi` generiche, level 2 per quelle pi` speciche u u

16. category specication:in questa tabella ` memorizzato a quali macrocatee gorie corrispondono le categorie di livello 2
parent category: id della macrocategoria padre child category: id della sottocategoria

17. resources: tutte le risorse di Intime presenti in un dato istante sono presenti in questa tabella
wiki id : identica in modo univoco la risorsa, ` chiave primaria. e Il nome suggerisce che tale campo corrisponde allid dellarticolo di Wikipedia title: titolo della risorsa, deriva da Wikipedia, che eettua prima un redirect image url : immagine rappresentativa description: una brevissima descrizione da WikipediaMiner

18. interests: sono salvate le risorse di interesse di ogni utente, corrispondenti a diverse categorie e ordinate per grado di interesse.

39

user id : identica un utente, ` chiave esterna che fa riferimento alla e tabella users resource id : identicativo della risorsa di interesse, ` chiave esterna e che fa riferimento alla tabella resources category id : identicativo della categoria di interesse, ` chiave esterna e che fa riferimento alla tabella categories grade: permette lordinamento, deriva dalla relatedness di WikipediaMiner e viene modicata quando lutente riordina le proprie risorse di interesse

19. suggestions: sono salvati i suggerimenti per le categorie di interesse di ogni utente, ordinati per grado e user id : identica un utente, ` chiave esterna che fa riferimento alla tabella users e resource id : identicativo della risorsa suggerita, ` chiave esterna che fa riferimento alla tabella resources
category id : identicativo della categoria di interesse, ` chiave esterna e che fa riferimento alla tabella categories grade: permette lordinamento, deriva dalla relatedness di WikipediaMiner e viene modicata in base allattivit` dellutente nel neta work

20. categorization: tiene traccia dei cluster di risorse; ovvero indica, per ogni risorsa, a quali categorie appartiene.
resource id : identicativo della risorsa di interesse, ` chiave esterna e che fa riferimento alla tabella resources category id : identica una categoria, ` chiave esterna che fa riferie mento alla tabella categories grade: ` indicativo di quanto la risorsa appartenga a un certo cluster e level : indica se la risorsa appartiene a un cluster o a un sottocluster

21. user categories: memorizza le categorie di interesse di ogni utente, ` ime portante mantenere questa informazione poich si possono avere categorie e di interesse nella pagina del prolo senza che a questa siano associate alcune risorse
user id : identicativo dellutente, ` chiave esterna che fa riferimento e alla tabella users category id : identica una categoria, ` chiave esterna che fa riferie mento alla tabella categories

22. friends: tiene traccia degli amici di Facebook di ogni utente di Intime. e user id : identicativo dellutente, ` chiave esterna che fa riferimento alla tabella users
friends: contiene un json dove sono indicati gli identicativi di Facebook degli amici name: il nome dellutente di Intime

40

3.5
3.5.1

Strumenti per limplementazione


Jquery/AJAX

Drag-and-Drop (Jquery UI) Limplementazione del drag-and-drop ` stata realizzata con lutility sortable di e JQuery User Interface. JQuery User Interface JQuery UI ` una libreria Javascript contentente un e vasto set di eetti, temi, widget e interazioni user interface. JQuery UI ore la possibilit` di dichiarare che alcuni elementi di una pagina a Web siano di tipo draggable o droppable; i primi possono essere aerrati e trascinati con il mouse, i secondi invece sono contenitori dove possono essere gettati gli oggetti trascinati. Inoltre ` possibile aggiungere funzionalit` a un grande e a numero di eventi, in modo che sia possibile, per esempio, eettuare modiche sul database quando un oggetto viene depositato in un contenitore droppable.

$( " # draggable " ) . draggable () ; $( " # droppable " ) . droppable ({ accept : " # draggable " }) ;

Listing 3.1: Droppable

Drag-and-Drop:

Dichiarazione elementi Draggable e

Unaltra possibilit` oerta dal plug-in ` quella di dichiarare un contenitore come a e sortable. Gli elementi di un contenitore sortable possono essere aerrati, trascinati e depositati in una qualsiasi posizione del contenitore, in modo da poter eettuare un ordinamento. Una lista sortable, inoltre, pu` essere connessa con o unaltra, in modo da poter trascinare gli elementi anche in altre liste.

$( " # sortable1 , # sortable2 " ) . sortable ({ connectWith : " . connectedSortable " }) ;

Listing 3.2: Drag-and-Drop: Dichiarazione liste sortable connesse

Quando un elemento di una lista sortable viene trascinato nella lista stessa o nella lista connessa, gli altri elementi si spostano dinamicamente, facendo posto al nuovo elemento, in modo che sia chiaro dove andr` a nire loggetto trascinato a una volta che questo verr` rilasciato. a

41

Figura 3.7: drag-and-drop di una risorsa Liste di Risorse Ogni elenco di risorse ` una lista sortable ed ` connessa con e e la lista delle suggestions se si tratta di una lista di risorse di interesse e viceversa. Per evidenziare la posizione dove verr` rilasciato un elemento comparir`, a a mentre la risorsa viene trascinata, un placeholder, in modo che lutente sar` a certo di inserire la risorsa al posto giusto. Una volta che questa viene rilasciata nella lista connessa viene eettuata una chiamata ajax ad unapposita funzione del controller prole, che si occuper` di rendere lo spostamento persistente con a il datatabase.

$ ( " . interest_content " ) . each ( function () { $( this ) . find ( " . drop_thumbs " ) . sortable ({ connectWith : " . drop_thumbs ,. suggestions_drop_thumbs " , sort : function () { $( . resource_of_interest a img ) . btOff () ; $( . suggestion_thumb ) . btOff () ; }, containment : $( this ) . find ( " . drop_thumbs " ) . parent () . parent () . parent () , placeholder : " sortable_placeholder " , start : function (e , ui ) { ui . placeholder . height ( ui . item . height () ) ; }, beforeStop : function (e , ui ) { /* richiesta ajax che salva i dati nel database */ }, revert :4 ,

}) . disableSelection () ; })

Listing 3.3: Drag-and-Drop: Dichiarazione lista interest content come Sortable

Le opzioni specicate sono:


connectWith: specica le liste connesse con interest content sort: disattiva i tooltip sulle risorse quando avviene il sorting

42

containment: specica in che limiti ` possibile trascinare gli oggetti della e lista sortable placeholder : specica il placeholder che comparir` prima di rilasciare un a oggetto in una qualsiasi posizione in una delle liste connesse start: setta le dimensioni del placeholder quando inizia il sorting beforeStop: eettua diverse procedure quando il sorting termina, ovvero quando un oggetto viene rilasciato, come ad esempio gli aggiornamenti del database revert: la velocit` con cui un oggetto trascinato ritorna alla posizione a iniziale se rilasciato in un punto che non appartiene a una lista sortable

Le liste delle risorse di interesse e quelle delle suggestions contengono elementi diversi, con classi css diverse e thumbnail di dimensioni diverse; inoltre per le risorse di interesse compare anche il titolo oltre allimmagine. Si ` dovuto e quindi fare in modo che al rilascio di un elemento nellaltra lista questa venga convertita nel nuovo formato: vengono modicate le dimensioni delle immagini, la classe e aggiunto o tolto il titolo.

Ordinamento liste suggestions Quando una risorsa di una lista suggestions viene rilasciata nella lista superiore, e quindi aggiunta ai propri interessi avviene unulteriore operazione: lordinamento della lista suggestions dal quale questa ` stata rimossa. e Autocomplete (Jquery UI) Lo widget Autocomplete fornisce suggerimenti mentre vengono inseriti dei caratteri in un campo di inserimento. I suggerimenti possono appartenere a una lista gi` denita oppure possono esa sere scaricati da un datasource esterno. Il seguente esempio fornisce la funzione di autocomplete al campo di input con id tags. La lista di suggerimenti ` specicata esplicitamente, tramite lopzione e source, dove viene indicato di utilizzare gli elementi dellarray availableTags.

$( function () { var availableTags = [ " ActionScript " , " AppleScript " , " Asp " , "C", " C ++ " , " Clojure " , " COBOL " , " Fortran " , " Java " , " JavaScript " , " Lisp " , " Perl " , " PHP " ,

43

}) ;

" Python " , ]; $( " # tags " ) . autocomplete ({ source : availableTags }) ;

Listing 3.4: Autocomplete: Dichiarazione form autocomplete

In Intime lautocompletamente viene utilizzato nella pagina del prolo, relativamente al campo di inserimento di una nuova categoria di interesse: non appena lutente clicca sul pulsante Add new compare un campo di inserimento dove verranno suggerite, via via che lutente inizia a scrivere nel campo, le categorie che possono essere selezionate. Autocomplete ` stato utilizzato nel seguente modo: e

$ . post ( system . fiona_host_path + / intime / index . php / profiles / get_categories_ajax , function ( data ) { var a = $. parseJSON ( data ) ; var categories = new Array () ; for ( var i = ; i < a . length ; i ++) categories [ i ]= a [ i ]. category ; $( " # add_category " ) . autocomplete ({ source : categories , select : function (e , ui ) { $. post ( system . fiona_host_path + / intime / index . php / profiles / add_new_interest_ajax , { category : ui . item . label , user_id : $( # second_section ) . attr ( user ) } , function () { $( # add_category ) . replaceWith ( < span id =" add_new " > Add new </ span > ) ; var last_page = $( # title_bar ) . attr ( num_pages ) ; $( . pages ) . children ( . + last_page ) . trigger ( click ) }) ; } }) ; }) ;

Listing 3.5: Autocomplete: Campo di inserimento nuova categoria

Una prima chiamata ajax chiede al database le categorie, queste vengono salvate in categories, una seconda chiamata asincrona che aggiorna il database viene azionata dallevento select, ovvero quando lutente seleziona una delle opzioni suggerite. Slider delle Liste di Risorse Le liste di risorse nella pagina del prolo sono dierenti da tutte le altre di Intime, poich ` prevista la possibilit` di ordinare e di trascinare in unaltra e e a

44

lista gli elementi. Poich gli oggetti di queste liste sono oggetti di maggiore interattivit`, gli slider e a laterali scorrono un elemento alla volta. Per realizzare questa caratteristica si ` pensato di includere nelle liste due elee menti addizionali alle due estremit` e di tenerle nascoste nella pagina con una a propriet` css. In questo modo uno scorrimento laterale avviene istantaneamente: a si tratta semplicemente di oscurare una risorsa e di rendere visibile unaltra, successivamente una chiamata ajax provveder` a scaricare la successiva che verr` a a posta non visibile nella pagina. Upload (Blueimp/Fancybox) Blueimp ` un plugin per lupload con capacit` di selezione multipla di le, un e a supporto drag-and-drop ed una progressbar per jQuery. Funziona con qualunque piattaforma server (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) che supporti i form HTML per luploading di le. Blueimp pu` essere trovato su o GitHub, dove ` possibile trovare anche una demo del plugin. Il plugin permette e anche un controllo sia server che client sulla dimensione minima e massima dei le, sul tipo di les, sul numero di upload concorrenti, sul numero di upload totali e molte altre opzioni utili. Utilizzo di Blueimp sul lato Client: Nel momento in cui lutente, una volta loggato, clicca sul pulsante di upload, il le uploader viene inizializzato tramite la funzione:

$ ( # fileupload ) . fileupload ({ submit : function (e , data ) { /* Some way getting variable fb_id */ data . formData = { " upload_title " : title , " fb_id " : fb_id }; }, maxNumberOfFiles : 1 , maxFileSize : 5 , // 5 Mb acceptFileTypes : /.*\.( mp4 | flv | mpg | avi | wmv | webm | mov )$/ i } );

Listing 3.6: Blueimp: inizializzazione delluploader

Tale funzione, oltre ad inizializzare luploader, prende in ingresso dei parametri fondamentali per migliorare linterazione dellutente con luploader:
acceptFileTypes: se lutente seleziona un le che non ` tra i formati che e rispettano lespressione regolare indicata, questo viene subito noticato. ` E fondamentale in quanto, qualora lutente carichi per sbaglio un le di un qualunque formato che non rispetta tale espressione regolare, anch` e questo venga noticato sar` costretto ad attendere che lupload sia conclua so. Il plugin mette a disposizione questopzione in modo tale che lutente venga avvertito non appena questo seleziona il le di un formato errato; cosicch lutente possa subito rendersi conto dellerrore e caricare un nuovo e le

45

maxFileSize: permette di controllare, dal lato client, la grandezza massima dei video e di avvisare lutente qualora i le selezionati non rispettino tale requisito di dimensione sul disco In Intime ` stata posta come dimensione e massima dei les 50Mb. maxNumberOfFiles: setta il numero massimo di le uploadabili per volta. Qualora si voglia eettuare un altro caricamento sar` necessario riapria re la nestra di upload; automaticamente si provveder` a inizializzare a nuovamente luploader submit: permette di passare un parametro alluploader sul lato server; in particolare gli verr` passato il Facebook ID dellutente che ha caricato il a le in modo da poter individuare univocamente lutente del network e cos` creare unistanza nel database che associa il le in questione con lutente specico

Utilizzo di Blueimp sul lato Server: La congurazione di Blueimp lato server ` molto semplice; in generale saranno richieste alcune delle opzioni che e sono state gi` descritte nel javascript plugin, quali la specica circa i tipi di le a supportati e la dimensione massima di upload. Inoltre si dovranno specicare i parametri che determinano la destinazione del le caricato e il link assegnato a questo (upload dir e upload url). In particolare, per quanto riguarda queste due opzioni, ` stato sovrascritto il e costruttore della classe UploadHandler in modo tale che potesse prendere come parametri due stringhe che serviranno per specicare queste due opzioni. In tal modo ` possibile disaccoppiare la zona dei les di sistema, dalla zona dei les e caricati, che potranno essere gestiti a parte.

Listing 3.7: Blueimp: costruttore uploader php


function __construct ( $upload_dir , $upload_url , $options = null ) { $this -> options = array ( script_url => $this -> get_full_url () . / , upload_dir => $upload_dir , upload_url => $upload_url , param_name => files , max_file_size => 5 , // 5 Mb min_file_size => 1, accept_file_types => /.*\.( mp4 | flv | mpg | avi | wmv | webm | mov )$ /i , /* Other Options */ ); }

46

Nel momento in cui lutente clicca su upload, dopo aver selezionato dei le che rispettano le condizioni elencate precedentemente sul lato Client, partir` a lesecuzione del codice PHP che si occupa delluploading del le.

Listing 3.8: Blueimp: uploader php


switch ( $_SERVER [ REQUEST_METHOD ]) { case OPTIONS : break ; case HEAD : case GET : $upload_handler -> get () ; break ; case POST : if ( isset ( $_REQUEST [ _method ]) && $_REQUEST [ _method ] === DELETE ) { $upload_handler -> delete () ; } else { $upload_handler -> post () ; if ( file_exists ( $full_path ) && isset ( $_REQUEST [ fb_id ]) && isset ( $_REQUEST [ upload_title ]) ){ /* Some operations on the database */ /* Some variables init */ $upload_thread = new Thread () ; $upload_thread -> setFunc (" upload_thread " , array ( $file_ext , $file_path , $full_path , $file_name , $file_tot , $visibilita , $titolo , $fb_id , $id , $video_id )); $upload_thread -> start () ;} } break ; case DELETE : $upload_handler -> delete () ; break ; default : header ( HTTP /1.1 4 5 Method Not Allowed ); }

In particolare nello switch nel caso di upload si andr` ad eseguire la POST. Doa podich partir` lupload chiamando la funzione $upload handlerpost(). Tale e a funzione si occupa di mantenere la connessione tra client e server per tutta la durata dellupload e di mandare periodicamente informazione al client circa lo stato dellupload, in modo tale che sia possibile mostrare a video landamento dellupload tramite una progressbar e una serie di parametri, quali velocit` di a upload, tempo residuo al temine dellupload e percentuale totale di upload. Una volta terminato lupload, il le si trova completamente sul server e sar` possibile a utilizzarlo. La condizione successiva a $upload handlerpost(), ovvero: le exists($full path) 47

&& isset($ REQUEST[fb id]) && isset($ REQUEST[upload title]) ` necessae ria qualora lupload venga interrotto o non vada a buon ne, in modo da bloccare lesecuzione successiva delle operazioni che non avrebbero successo in quanto il le non ` presente sul server. e

Chiamata asincrona ad una funzione php Qualora tale guardia sia superata, ovvero se lupload ` andato a buon ne, allora ` possibile eseguire le e e operazioni per rendere il video visibile su tutte le piattaforme. Si procede quindi in primo luogo a creare unistanza sul database che connetta il le con lutente che lo ha caricato, utilizzando il parametro fb id passato dal lato client. In secondo luogo si fa partire una richiesta asincrona a una pagina web. In tal modo ` possibile ottenere una sorta di thread php, nel senso che luploading e risulter` concluso; dopodich verr` fatta partire questa chiamata asincrona ad a e a uno script php e lutente sar` subito noticato della conclusione dellupload, a anche se nel mentre lesecuzione dello script ` ancora in atto. Questo evita ale lutente di dover attendere on-line per tutta la durata del transcoding video. Questa libreria per eettuare una chiamata asincrona ` stata scritta originariae mente da Alex Lau anche se il codice utilizzato ` stato modicato per essere e riadattato alle esigenze di Intime che opera allinterno del framework CodeIgniter. Il seguente codice inizializza la libreria, passa dei parametri che saranno poi passati alla pagina web ed inne fa partire la chiamata asincrona.

Listing 3.9: Chiamata asincrona


$upload_thread = new Thread () ; $upload_thread -> setFunc (" upload_thread " , array ( $file_ext , $file_path , $full_path , $file_name , $file_tot , $visibilita , $titolo , $fb_id , $id , $video_id )); $upload_thread -> start () ;

In particolare il costruttore di Thread() setta le variabili $host, $port e $thisFileName della libreria, secondo il codice:

Listing 3.10: Chiamata asincrona: inizializzazione


function Thread ( $host =" localhost " , $port ="" , $thisFileName ="" ){ $this -> host = $host ; if ( $port != ""){

48

$this -> port = $port ; } else { $this -> port = 8 ; } if ( $thisFileName != ""){ $this -> thisFileName = $thisFileName ; } else { $this -> thisFileName = "/ intime / upload_thread . php "; }

In secondo luogo i parametri da passare alla pagina web vengono ssati chiamando la funzione setFunc() che setta la stringa $arg:

Listing 3.11: Chiamata asincrona: passaggio parametri


function setFunc ( $func , $arg = false ){ $i = ; $this -> arg = ""; if ( $arg ){ foreach ( $arg as $argument ){ $this -> arg .= "&a []= ". urlencode ( serialize ( $argument )) ; } } $this -> func = $func ; }

Inne la chiamata asincrona viene fatta partire chiamando la funzione start(). Tale funzione non fa altro che eettuare una GET con Connection Close a una pagina php passandogli gli argomenti specicati precedentemete tramite la funzione setFunc() nella variabile $arg.

Listing 3.12: Chiamata asincrona: esecuzione


function start () { $this -> fp = fsockopen ( $this -> host , $this -> port ); $header = " GET ". $this -> thisFileName ."? threadrun =1& f=". urlencode ( $this -> func ). $this -> arg . " HTTP /1.1\ r\n"; $header .= " Host : ". $this -> host ."\r\n"; $header .= " Connection : Close \r\n\r\n"; fputs ( $this ->fp , $header ); }

49

Transcoding video della chiamata asincrona Di seguito si mostra lo pseudocodice utilizzato allinterno della pagina /intime/upload thread.php:

Listing 3.13: Upload transcoding


function upload_thread ( $file_ext , $file_path , $full_path , $file_name , $file_tot , $visibilita , $titolo , $fb_id , $id , $video_id ){ set_time_limit (12 ) ; /* Control video title */ /* Generating single video screen capture */ /* Conventing video to . mp4 , . webm , . ogg video */ /* Mesure video lenght */ /* Generating video screenshots , one per second */ /* Delete initial uploaded file */ }

Tooltip delle risorse (Beauty Tips) Limplementazione ` stata svolta grazie al plug-in JQuery Beauty Tips, che ore e molte possibilit` di personalizzazione sia grache che tecniche. a Beauty Tips BeautyTips ` un plugin jQuery che utilizza lelemento di disee gno canvas come da speciche HTML5 per disegnare dinamicamente tooltips associati a un elemento HTML della pagina. Per default ogni tooltip sar` poa sizionato sul lato dellelemento bersaglio che ha pi` spazio libero. Questo pau rametro ` inuenzato dalla posizione e dalla dimensione della nestra corrente, e in modo che ogni Tip ` ridisegnato ogni volta che viene visualizzato. Esso pu` e o apparire sopra un elemento in fondo alla pagina, ma quando la pagina scorre verso il basso apparir` sotto. Inoltre, le posizioni possono essere forzate oppure a pu` essere denito un ordine preferito. o

$ ( selector ) . bt ( Content text ) ;

Listing 3.14: Tooltips: semplice dichiarazione tooltip BeautyTips

Tooltip in Intime I tip vengono azionati dallhover sopra una thumbnail di una qualsiasi risorsa. Si ` dovuto gestire linterazione con la procedura di drage and-drop, ovvero sono stati aggiunti dei controlli che bloccano i tooltip non appena un oggetto viene draggato.

50

Si ` dovuto, inoltre, sovrascrivere il e plug-in per gestire la possibilit` di aca cedere con il mouse dentro larea del tooltip senza che questo scompaia. A tal ne ` stato aggiunto il metodo e .toolTip(), che assegna il tip agli elementi restituiti da un dato selettore; tale metodo fa uso del plug-in hoverIntent, che permette di gestire con Figura 3.8: Tooltip della risorsa Nirvana facilit` gli eventi di hover. a

$( . suggestion_thumb ) . each ( function (i , el ) { $ ( this ) . toolTip ({ width : 347 , padding : 2 , spikeLength : 2 , closeWhenOthersOpen : true , spikeGirth : 4 , fill : # e1e1e1 , ajaxPath : system . fiona_host_path + / intime / index . php / profiles / resource_tip_ajax ? resource_id = + $( this ) . parent () . attr ( res_id ) , shadow : true , shadowOffsetX : 3 , shadowOffsetY : 3 , shadowBlur : 8 , shadowColor : rgba ( , , ,.9) , shadowOverlap : false , noShadowOpts : { strokeStyle : #999 , strokeWidth : 2} , positions : top , }) }) ;

Listing 3.15: Tooltips: Dichiarazione tooltip immagini delle suggestions

La funzione JavaScript riportata inizializza il tooltip sulle thumbnail delle suggestions nella pagina del prolo.
width: la larghezza del tooltip spikeLength: la lunghezza della punta spikeGirth: la larghezza della punta ll : il colore sullo sfondo ajaxPath: il percorso della chiamata ajax che restituisce il contenuto da inserire nel tooltip. Nel caso di sopra la chiamata ritorna una vista di CodeIgniter shadow : lombreggiatura ai bordi del tip positions: in quale posizione compare il tooltip

51

Scrollbar (Tiny Scrollbar) Limplementazione della scrollbar ` stata realizzata con il plug-in Tiny Scrollbar. e Tiny Scrollbar Tiny Scrollbar, scritto con la libreria JQuery, ` e uno strumento leggero e dinamico per migliorare linterfaccia dei siti Web. Dispone di numerosi vantaggi:
permette sia scroll verticale che orizzontale dispone di una funzione di aggiornamento, in modo da aggiornarsi dinamicamente con laggiunta di nuovo contenuto la dimensione della scrollbar pu` essere settata automaticao mente o manualmente supporta scrolling normale e scrolling mobile

Figura 3.9: Scrollbar

Scrollbar di Intime occasioni:

Tiny Scrollbar ` stata utilizzata in tre e

scorrimento del testo delle risorse nella relativa pagina scorrimento dei commenti relativi ad una risorsa scorrimento dei commenti relativi a un video

$ ( # comments_content ) . find ( div # scrollbar_div ) . tinyscrollbar ({ sizethumb : 17 , }) ;

Listing 3.16: Scrollbar: Inizializzazione

Con tale script viene assegnata una Tiny Scrollbar al contenitore scrollbar div. Video player (MediaElements.js) MediaElement.js ` un player audio e video HTML5 con un fallforward a Flash e per browsers non HTML5 senza JavaScript. MediaElements.js invece di orire una fallback a ash nel caso in cui ci si trovi davanti ad un browser HTML senza Javascript si opta per una fallforward. In pratica, invece di orire un player HTML5 a browser moderni e un player completamente diverso basato su Flash per browser vecchi, MediaElements.js li aggiorna con un plugin personalizzato Flash e Silverlight che imitano la API HTML5 di MediaElement.

52

Una volta che i browsers sono stati aggiornati in modo che supportino tutti lHTML5, MediaElement costruisce un player completamente personalizzabile con caratteristiche come il supporto per lelemento < track > e per il fullscreen. Nella pagina HTML sar` quindi in primo luogo necessario importare nella head a lo script: <script src=js/mediaelement-and-player.min.js></script>. In secondo luogo, allinterno della pagina ` necessario specicare, tramite un e tag video, che viene racchiuso allinterno di una struttura di div dal plugin mediaelement al momento della sua creazione. Tale plugin ` quindi cos` in grado di gestire la visualizzazione del video sia in e presenza del supporto HTML5, sia, qualora non fosse possibile mantenendo la stessa interfaccia graca, con i player Silverlight e Flash, e viene referenziato in video.php.

Listing 3.17: MediaElements.js: HTML5


< video id = " vp " width = " 46 " height = " 34 " > <! -- MP4 for Safari , IE9 , iPhone , iPad , Android , and Windows Phone 7 -- > < source src = " <?= $videoUrl ? >. mp4 " type = " video / mp4 " / > <! -- WebM / VP8 for Firefox4 , Opera , and Chrome -- > < source src = " <?= $videoUrl ? >. webm " type = " video / webm " / > <! -- Ogg / Vorbis for older Firefox and Opera versions -- > < source src = " <?= $videoUrl ? >. ogg " type = " video / ogg " / > <! -- Flash fallback for non - HTML5 browsers without JavaScript -- > < object width = " 46 " height = " 34 " type = " application /x - shockwave - flash " data = " <?= $system_path ? > js / video - player / flashmediaelement . swf " > < param name = " movie " value = " <?= $system_path ? > js / video - player / flashmediaelement . swf " / > < param name = " flashvars " value = " controls = true & file = <?= $videoUrl ? >. mp4 "/> </ object > </ video >

Per linizializzazione del player ` stato utilizzato il seguente codice: e

player = MediaElementPlayer ( # vp ,{ alwaysShowControls : true , videoVolume : horizontal , features : [ progress , volume , fullscreen ] , pluginWidth : 46 , pluginHeight : 34 , success : function ( mediaElement , domObject ) { mediaElement . addEventListener ( seeked , player_seeked , false ) ; mediaElement . addEventListener ( timeupdate , player_timeupdate , false ) ; mediaElement . addEventListener ( loadeddata , function () { mediaElement . setCurrentTime ( parseFloat ( info . time ) ) ; } , false ) ;} ,}) ;

Listing 3.18: MediaElements.js: inizializzazione del player

53

In particolare sono state specicate le features: [progress,volume,fullscreen], necessarie per la visualizzazione, rispettivamente della progress bar, della barra del volume e del fullscreen gi` implementati allinterno di MediaElements.js. a La versione presente allinterno del progetto ` stata personalizzata nella graca e e nel punto che riguarda la gestione della nuvoletta danteprima che appare al ` momento in cui il mouse si muove sulla progressbar del video. E stata inserita una chiamata ad una funzione specica esterna ai sorgenti di mediaelement che permette di modicare le immagini contenute allinterno della nuvoletta.

3.5.2

FFmpeg

FFmpeg ` una suite software completa per registrare, convertire e riprodurre e audio e video. Si basa su libavcodec, libreria per la codica audio/video. FFmpeg ` sviluppato su Linux, ma pu` essere compilato ed eseguito su qualunque e o dei principali sistemi operativi, incluso Microsoft Windows. FFmpeg ` uno strumento da riga di comando per convertire un le video in e un altro formato. Inoltre supporta la cattura e la codica in tempo reale dalla scheda TV. Per installare lultima versione di mpeg ` stato necessario eseguire i seguenti e comandi da terminale:

Listing 3.19: FFmpeg: installazione su Ubuntu


# Note : Double quotes are represented as # Remove any existing packages : sudo apt - get remove ffmpeg x264 libav - tools libvpx - dev libx264 - dev # Get the dependencies , # ( Ubuntu Server or headless users ) : sudo apt - get update sudo apt - get -y install autoconf build - essential checkinstall git libfaac - dev libgpac - dev libmp3lame - dev libopencore - amrnb - dev libopencore - amrwb - dev librtmp - dev libtheora - dev libtool libvorbis - dev pkg - config texi2html yasm zlib1g - dev # x264 : H .264 video encoder . # The following commands will get the current . source files , compile , and install x264 . cd git clone -- depth 1 git :// git . videolan . org / x264 cd x264 ./ configure -- enable - static make sudo checkinstall -- pkgname = x264 -- pkgversion = 3: $( ./ version . sh | awk -F [ ] / POINT / { print $4 + git $5 } ) -- backup = no -deldoc = yes -- fstrans = no -- default # fdk - aac :

54

# AAC audio encoder . cd git clone -- depth 1 git :// github . com / mstorsjo / fdk - aac . git cd fdk - aac autoreconf - fiv ./ configure -- disable - shared make sudo checkinstall -- pkgname = fdk - aac -- pkgversion = $( date + % Y % m % d % H % M ) -git -- backup = no -- deldoc = yes -- fstrans = no -- default # libvpx : # VP8 video encoder and decoder . cd git clone -- depth 1 http :// git . chromium . org / webm / libvpx . git cd libvpx ./ configure make sudo checkinstall -- pkgname = libvpx -- pkgversion = 1: $ ( date + % Y % m % d % H % M ) -git -- backup = no -- deldoc = yes -- fstrans = no -- default # FFmpeg : note , Ubuntu Server users # should omit -- enable - x11grab . so : cd git clone -- depth 1 git :// source . ffmpeg . org / ffmpeg cd ffmpeg ./ configure -- enable - gpl -- enable - libfaac -- enable - libfdk - aac -enable - libmp3lame -- enable - libopencore - amrnb -- enable libopencore - amrwb -- enable - librtmp -- enable - libtheora -- enable libvorbis -- enable - libvpx -- enable - x11grab -- enable - libx264 -enable - nonfree -- enable - version3 make sudo checkinstall -- pkgname = ffmpeg -- pkgversion = 5: $ ( date + % Y % m % d % H % M ) -git -- backup = no -- deldoc = yes -- fstrans = no -- default hash x264 ffmpeg ffplay ffprobe

Allinterno di Intime vengono utilizzati i seguenti comandi: 1. Nel momento in cui viene aggiunta unannotazione su un frame di un video che ancora non ` stato mai annotato ` necessario generare una screenshot e e del video in quel dato frame. Di seguito il signicato delle opzioni:
-itsoset -[time]: specica il millisecondo ([time]) a cui ` posizionato e il frame di cui si vuole generare uno screenshot allinterno del video

e -i [video path]: specica il percorso in cui ` memorizzato il video di input


-vcodec mjpeg: forza il video ad utilizzare il codec mjpeg -vframes: specica il numero di video frames da salvare -s: specica la dimensione in pixels del video di output [thumbnail path]: specica il percorso e il nome del video di output

55

Generazione di una sreenshot mpeg -itsoset -[time] -i [video path] -vcodec mjpeg -vframes 1 -an -f rawvideo -s vga [thumbnail path]

2. Nel momento in cui viene caricato un nuovo video ` necessario, per garane tire nella pagina video lo show delle mini-preview sulla barra del progresso, generare una piccola sreenshot del video per ogni secondo. Di seguito il signicato delle opzioni:
-i [video path]: specica il percorso in cui ` memorizzato il video di e input -r 1: setta il frame rate del video ad un frame al secondo (se ci volessero 2 thumbnail per secondo andrebbe settato a 2) -t [how much time]: specica il numero di secondi per cui vogliamo creare una snapshot per secondo.

Creazione di una thumbnail image per ogni secondo mpeg -i [video path] -r 1 -vf scale=50:50 -t [how much time] [destination path]/[le name] %d.jpg

3. Nel momento in cui viene caricato un nuovo video ` necessario convertirlo e in pi` formati poich ` stato utilizzato un player HTML5. I formati in u e e questione sono .mp4, .webm, .ogg.
-i [video path]: specica il percorso in cui ` memorizzato il video di e input [destination video path]: specica il percorso e il nome del video di output.

(a) Per Safari, IE9, iPhone, iPad, Android e Windows Phone 7 ` necese sario il formato .mp4 (MP4).

Conversione di un qualsiasi le video ad un .mp4 mpeg -y -i [video path] -vcodec libx264 -pix fmt yuv420p vprole high -preset fast -b:v 500k -maxrate 500k -bufsize 1000k -s vga [destination video path].mp4

(b) Per Firefox4, Opera e Chrome ` necessario il formato .webm (Webe M/VP8).

56

Conversione di un qualsiasi le video ad un .webm mpeg -y -i [video path] -vcodec libvpx -b:v 500k -maxrate 500k -bufsize 1000k -s vga [destination video path].webm

(c) Per le vecchie versioni di Firefox e Opera ` necessario il formato .ogg e (Ogg/Vorbis).

Conversione di un qualsiasi le video ad un .ogg mpeg -i [video path] -acodec libvorbis -ac 2 -ab 96k -ar 44100 -b 345k -s vga [destination video path].ogg

3.5.3

Facebook integration

Lapplicazione utilizza come sistema di login quello messo a disposizione da Facebook, tramite i social plugins, cos` che lutente non debba compilare una noiosa e complicata procedura di registrazione, in quanto gli ` suciente eettuare e laccesso tramite il suo account di Facebook. Per fare ci` ` stato necessario creare unapplicazione Facebook, nella pagina o e della Facebook Developers. Facebook Developers fornisce la possibilit` di creare a applicazioni, tramite le quali si possono gestire i social plugin sul proprio sito web. Per poter creare applicazioni, bisogna essere utenti vericati. Una volta vericata la propria identit`, ` possibile creare applicazioni al seguente indirizzo: a e https://developers.facebook.com/apps. Una volta completata la procedura di creazione dellapplicazione Facebook saranno forniti unid e una chiave segreta dellapplicazione, che verranno associate al plugin del login. Facebook connect La API della Facebook PHP SDK mette a disposizione diversi metodi per la connessione a Facebook. In generale lutente eettua il login tramite Facebook; viene salvato il cookie generato, che contiene lid dellutente e laccess token. Questultimo ` un sie stema di permessi per preservare la privacy degli utenti; infatti solo tramite un access token, generato appositamente per un utente, ` possibile recuperare le e informazioni di tale utente. ` E possibile eettuare una Facebook connect tramite PHP o tramite Javascript.

Facebook PHP SDK Compaiono in seguito le funzionalit` della Facebook a PHP SDK utilizzate allinterno di Intime. In primo luogo ` necessario inizialize zare la libreria Facebook PHP nel seguente modo:

57

Listing 3.20: Facebook PHP SDK: inizializzazione della libreria Facebook


<? php $this -> config = array ( appId => $appId , secret => $secretId ) $this -> load -> library ( facebook / Facebook , $this -> config ); ?>

Dopodich la Facebook PHP SDK mette a disposizione diverse funzioni. Alline terno di Intime vengono utilizzate le seguenti: 1. $thisfacebookgetUser(); Questa funzione serve per venire a conoscenza dello stato di connessione dellutente tramite server. Viene utilizzata fondamentalmente allinizio di ogni pagina web, in modo da capire il tipo di contenuto da proporre allutente, che ` dierente a seconda che lutente e sia connesso o meno.

Listing 3.21: connessione

Facebook PHP SDK: ottenere informazioni sulla

<? php $user = $this -> facebook -> getUser () ; $profile = null ; if ( $user ){ try { /* connected */ } catch ( FacebookApiException $e ) { /* Connection failed */ error_log ( $e ); $user = null ; } } ?>

2. $thisfacebookapi(/me?elds=id,name,link,email); Questa funzione ` e utilizzata per venire a conoscenza dellidentit` dellutente che ha eettuaa ` to una connessione al sito. E fondamentale nella procedura del login ad Intime in quanto permette di identicare univocamente un utente allinterno del network e di estrarre le informazioni base su di esso quali nome, cognome, indirizzo e-mail, indirizzo web.

Listing 3.22: Facebook PHP SDK: ottenere le informazioni base sullutente


<? php if ( $user ){

58

} ?>

try { $profile = $this -> facebook -> api ( / me ? fields =id , name , link , email ); } catch ( FacebookApiException $e ) { error_log ( $e ); $user = null ; }

3. $thisfacebookgetLoginUrl(array(scope read stream, publish stream, user birthday, user location, user work history, user hometown, user photos, user groups, user likes)); Con questa funzione ` possibile generare un link per la connessione Fae cebook. In particolare quando lutente acceder` da tale link allarea di a richiesta connessione, gli sar` chiesto di dare il suo consenso al trattamena to dei suoi dati e a operazioni che lapplicazione Intime pu` fare nella sua o bacheca di Facebook. I dati e le operazioni in questione sono in ordine secondo come sono specicati nella funzione php in questione:
la possibilit` di leggere la sua bacheca Facebook a la possibilit` di scrivere sulla sua bacheca Facebook a la possibilit` di accedere alla sua data di nascita a la possibilit` di accedere alla sua posizione geograca a la possibilit` di conoscere la sua attivit` lavorativa indicata su Facea a book la possibilit` di conoscere la sua citt` indicata su Facebook a a la possibilit` di accedere alle sue foto di Facebook a la possibilit` di accedere ai suoi gruppi di Facebook a la possibilit` di accedere ai suoi amici di Facebook a

Listing 3.23: Facebook PHP SDK: ottenere il link per la connessione a Facebook
<? php $loginUrl = $this -> facebook -> getLoginUrl ( array (

59

scope => read_stream , publish_stream , user_birthday , user_location , user_work_history , user_hometown , user_photos , user_groups , user_likes )); ?>

4. $thisfacebookgetLogoutUrl(); Con questa funzione ` possibile generae re un link per la disconnessione da Facebook. Al momento della creazione dellapplicazione viene richiesto di specicare una redirect url. Nel momento in cui lutente clicca sul link su cui ` specicata la url di disconnese sione, questo viene disconnesso e reindirizzato verso la pagina specicata al momento della creazione dellapplicazione. Nel caso di Intime questa url `: e http://ona.micc.uni.it/intime/, in modo che se lutente si disconnette viene reindirizzato nella pagina home del sito.

Listing 3.24: Facebook PHP SDK: ottenere il link per la disconnessione da Facebook
<? php $fb_data = array ( me => $profile , uid => $user , loginUrl => $loginUrl , logoutUrl => $this -> facebook -> getLogoutUrl () , ); ?>

5. $thisfacebookapi(/me/likes); Questa funzione ` fondamentale per e ottenere informazioni circa gli interessi di un utente. In particolare i likes vengono utilizzati da Intime per individuare le categorie di interesse di un utente al primo accesso, in modo da risolvere il problema del cold start. Vengono utilizzati in un senso per individuare utenti simili nel network e da questi riuscire a proporre video di interesse allutente nale; in un altro per riuscire a dare un prolo iniziale degli utenti anche se questi non hanno operato nel sistema.

Listing 3.25: Facebook PHP SDK: ottenere i likes di Facebook dellutente


<? php $likes = null ; if ( $user ){ try {

60

} ?>

} catch ( FacebookApiException $e ) { error_log ( $e ); $user = null ; /* Connection error */ }

$likes = $this -> facebook -> api ( / me / likes ); /* Do something with likes */

Facebook JavaScript SDK Per quanto riguarda invece la connessione tramite Javascript SDK sono state utilizzate le seguenti funzioni, utili in particolar modo nella pagina del video: 1. FB.init({}); Questa funzione serve per inizializzare la libreria Facebook:

FB . init ({

}) ;

appId : app_id , // The app ID status : true , cookie : true , xfbml : true

Listing 3.26: Facebook JavaScript SDK: inizializzare la libreria

2. FB.getLoginStatus(); Questa funzione serve per ottenere informazioni circa lo stato di connessione:

FB . getLoginStatus ( function ( response ) { if ( response . authResponse ) { /* User logged in */ } else { /* User cancelled login or did not fully authorize */ } }) ;

Listing 3.27: connessione

Facebook JavaScript SDK: ottenere lo stato di

3. FB.api(/me, function(user) {}); Questa funzione, gemella della funzione api(/me) presente anche nella PHP SDK ottiene le informazioni circa lutente, quali user name, user id, e altre, a seconda del tipo di permessi ottenuti al momento del login. 61

FB . getLoginStatus ( function ( response ) { if ( response . authResponse ) { FB . api ( / me , function ( user ) { myFBuserName = user . name ; myFBuserID = user . id ; /* User connected */ /* Do something */ }) ; } else { /* User cancelled login or did not fully authorize */ } }) ;

Listing 3.28: Facebook JavaScript SDK: ottenere informazioni circa lutente

4. FB.api(/ + userid + /likes, function(response) {}); Questa funzione ricava i likes di Facebook di un utente. se al posto di userid poniamo la stringa me otteniamo i likes dell utente che si ` loggato, altrimenti i e likes dello user con id userid. Tali dati sono disponibili solo se lutente ha il permesso di vederli (o sono pubblici o ` un amico con prolo pubblico e verso tale utente).

FB . api ( / + userid + / likes , function ( response ) { if ( response . data ) { /* Do something with likes */ } else { /* problems recovering data of the user from Facebook */ } }) ;

Listing 3.29: Facebook JavaScript SDK: ottenere i likes Facebook di un utente

5. FB.api(/+ uniqueNames[j]+/feed, post,{}, function(){});} Tale funzione serve per mettere un post in bacheca di un amico, in particolare ` e possibile specicare lutente a cui inviare il post (uniqueNames[j]), lutente che invia il post (userID), il messaggio da scrivere nel post con inerente descrizione, nome, estratto, immagine e link.

FB . api ( / + uniqueNames [ j ]+ / feed , post , { from : userID , message : You have been tagged in a video post on intime : , link : url , name : a_name ,

62

description : a_description , caption : a_text , picture : img_url } , function () {}) ;

Listing 3.30: Facebook JavaScript SDK: mettere un post in bacheca di un amico

6. FB.api(/me/friends, {}, function(response) {}); Questa funzione permette di trovare tutti gli amici il cui nome o cognome inizia con name initials. Come al solito per poter eettuare questa operazione ` necessario che lue tente abbia concesso il permesso allapplicazione Intime di accedere alla sua lista di amici.

FB . api ( / me / friends , { name : name_initials + " * " } , function ( response ) { if ( response . data ) { /* Do something with this list of friends */ } else { /* Error */ } }) ;

Listing 3.31: Facebook JavaScript SDK: ottenere gli amici di un utente

3.5.4

Media Wiki

MediaWiki ` un software oper-source e sotto licenza GNU General Public License (GPL). Pensato per lavorare su una vasta rete di server, riceve milioni di richieste al giorno. Punti di forza di MediaWiki sono la potenza, la scalaFigura 3.10: Logo MediaWiki bilit` e una gestione delle pagine Wiki a ricca di servizi. Il contenuto viene restituito in formato wikitext, in modo da essere accessibile anche ad utenti che non conoscono HTML o CSS. Ogni volta che un utente modica una pagina, MediaWiki amplica il proprio database senza eliminare la versione precedente. Con MediaWiki ` possibile gestire immagini e altro e contenuto multimediale. Media Wiki API Le API di MediaWiki possono essere utilizzate per interagire con uninstallazione gi` esistente di MediaWiki. Esse forniscono accesso diretto e veloce ai dati a nei database, che possono essere scaricati tramite richieste HTTP.

63

Le richieste HTTP a MediaWiki sono contraddistinte da un endpoint, che rappresenta lHome Page del Web Service:

http://en.wikipedia.org/w/api.php

Diversi endpoint corrispondono a diverse installazioni di MediaWiki; per esempio linstallazione italiana ha un endpoint diverso da quella inglese. Riportiamo un semplice esempio:

http://en.wikipedia.org/w/api.php? format=xml&action=query&titles = Main%20Page&prop=revisions&rvprop=content

Tale richiesta presenta alcuni parametri:


format=xml : specica che il formato che deve essere restituito sar` XML. a Altri formati che ` possibile specicare sono JSON, WDDX, XML, YAML e e il formato nativo di serializzazione di PHP action=query: ` lazione. Il Web Service di MediaWiki supporta pi` di e u cinquanta azioni. Lazione query specica il bisogno di ottenere dei dati. Ogni azione ha dei parametri specici per essi; lazione query ad esempio ha i parametri prop, list e meta titles=Main Page: indica che i dati che devono essere restituiti riguardano ` la pagina Wiki chiamata Main Page. E possibile richiedere pi` pagine alla u volta prop=revisions: tale parametro indica che interessa una particolare revisione della pagina. Se non ` specicato viene restituita lultima revisione e eettuata, ovvero la pagina principale di Wikipedia come compare adesso rvprop=content: indica che deve essere scaricato il contenuto della pagina. Se viene invece specicato rvprop=user vengono scaricate le informazioni dellutente che ha eettuato le ultime modiche

Richiesta estratto per pagina risorsa Le pagine della risorsa dispongono di una lunga sezione testuale, che ` la stese sa che viene usata per lalgoritmo di clustering. Tale estratto viene ottenuto tramite una richiesta HTTP al Web Service di MediaWiki. Tale richiesta ha la seguente struttura:

http://en.wikipedia.org/w/api.php?action=query&format=json& pageids = Bob%20Dylan&prop=extracts &indexpageids=true&redirectstrue

64

Tale query restituisce un json e il parametro properties ` settato a extract, e per indicare che il contentuto restituito pu` essere plain-text oppure HTML. o Redirectstrue comunica la necessit` di gestire in maniera automatica i redirect, a in modo che invece della pagina richiesta pu` venire restituita una pi` completa. o u Il formato del testo di default viene scaricato in HTML, in modo da mantenere intatto il formato dei titoli e paragra. Richestra suggerimenti delle risorse nei commenti Quando un utente che sta scrivendo un commento vuole aggiungere un tag ad una risorsa compare una lista di suggerimenti che possono essere selezionati. Tale lista viene ottenuta con una query a MediaWiki:

http://en.wikipedia.org/w/api.php?action=query&generator=allpages &gaplimit=10&gapFrom=searchKey&format=json

generator=allpages: il parametro generator comporta che come input degli oggetti prop, list, meta verranno usati gli oggetti di una lista. In questo caso la lista sar` costituita da tutte le pagine Wiki a gaplimit=10 : indica quante pagine devono essere restituite nella lista. Un valore pari a 10 far` comparire 10 suggerimenti alla volta a gapFrom=searchKey: il titolo dellarticolo dal quale deve iniziare la lista. SearchKey ` una variabile contenente la stringa inserita manualmente nel e form di input

Tootlip dei tag di Wikipedia nei commenti Nella pagina del video compaiono i commenti eettuati. Quando questi contengono qualche tag a una pagina di Wikipedia, questo compare colorato in arancione. Avvicinandoci con il mouse, compare un tooltip con uno snippet della descrizione e questa viene scaricata con la seguente richiesta a MediaWiki:

http://en.wikipedia.org/w/ api.php ? action = opensearch & search= Bob Dylan&format=xml&limit=1

Lazione opensearch ricerca tra le pagine Wiki utilizzando il protocollo OpenSearch, ovvero vengono restituite le pagine i cui titoli corrisondono alle stringhe specicate con il parametro search. Quando ` stato raggiunto il limite di pagine, e queste vengono restituite ordinate in base al numero di collegamenti in arrivo. In questo caso il limite ` stato settato a 1. e

65

3.6
3.6.1

Recommendation
Cold Start

Il social network Intime sore del cos` detto problema del Cold Start (in ita liano, della partenza a freddo). In generale il Cold Start ` un problema che si e presenta in sistemi informativi basati su un qualche grado di automazione nella modellazione dei dati. In particolare coinvolge il problema che il sistema non sia in grado di indurre alcuna inferenza per utenti o item per i quali non si siano state raccolte ancora sucienti informazioni. Per risolvere tale mancanza in Intime sono stati sfruttati i dati provenienti dal login tramite la Facebook SDK. La Facebook SDK ha permesso di raccogliere informazioni anche per utenti appena iscritti al network, in modo tale che, dato che lutente medio di Facebook ha aggiunto almeno una decina di likes al suo prolo, si riesca ad avere informazioni sucienti per poter suggerire risorse e video del network, nonostante questo non abbia ancora fatto alcuna azione dentro Intime. Al primo accesso di un utente, dopo il suo consenso, si provvede ad estrarre tutti i suoi likes di Facebook. Ogni like di Facebook ha associata una categoria Facebook che pu` essere o meno semantica; in Intime sono state prese in cono siderazione solo le categorie che risultano sucientemente semantiche in modo tale che fosse possibile individuare con maggior precisione quali siano i campi di interesse dellutente appena iscritto. In tal modo se un utente ha molti pi` likes per una specica categoria Facebook u presa in considerazione dal sistema, possiamo in qualche modo dedurre che lutente ` interessato a tale categoria. Inoltre, a seconda del numero di likes che e quella categoria ha, possiamo individuare le preferenze dellutente e, in un certo senso, il numero di likes riscalato in valore percentuale pu` essere inteso come o il voto che lutente implicitamente assegna a quella specica categoria Facebook. Tali informazioni sono salvate nella tabella likes del sistema che ha una strute tura: user id, category id, percentage. Tale struttura ` fondamentale per la soluzione del problema della Cold Start. Ogni utente quindi ` descritto inizialmente allinterno del network tramite un e insieme di triple: user id, category id, percentage. Utilizzando Mahout e reimplementando una User Similarity allinterno di questo ` possibile stabilire e e trovare utenti simili tra loro allinterno del Network. Tramite una User Similarity tra i vettori generati a partire dalle triple che possiamo trovare salvate nella tabella likes ` possibile stabilire quanto un utente nel network sia simile ad un e altro sulla base delle categorie dei Facebook likes del suo prolo. Attraverso una Neighborhood ` possibile quindi individuare gli utenti del nete work che, sulla base della Similarity, risultino pi` simili allutente interessato. u Una volta individuati tali utenti, risulter` semplice ed intuitivo riuscire a raca comandare video. Infatti sar` suciente selezionare i video votati dagli utenti a

66

pi` vicini allutente interessato ma non ancora da lui visionati. Tali video sau ranno, per cos` dire, possibili recommendation per lutente interessato. Come si pu` notare, lo schema seguito ` esattamente quello dellalgoritmo di un recomo e mender User-Based dove per` si ` eettuata una suddivisione tra la parte che o e individua gli utenti pi` simili allutente interessato con una Neighborhood e la u parte che individua i video di interesse a partire da questo insieme. Pesando i voti assegnati ai video in questione tramite la similitudine tra gli utenti ` possibile inferire il voto che lutente interessato darebbe al video e quindi e ordinare le recommendation secondo una specica di possibile gradevolezza del video da parte dellutente interessato.

3.6.2

Mantenimento

Una volta che lutente ha aggiunto delle preferenze a dei video non si ha pi` il u problema della cold start e si passa ad una fase di mantenimento. Quando un utente si posiziona nella pagina di un video caricato da un altro utente ha la possibilit` di assegnare a tale video un voto compreso tra 1 e 5, a indicandolo tramite delle stelline di gradimento, presenti sopra il player video. Nel momento in cui lutente assegna un voto a tale video, questo viene salvato sottoforma di una tripletta (user id, video id, rate). Una copia di questa tripletta viene salvata nella tabella preferences che conterr` una copia di tutte le a preferenze del network. Unaltra copia di tale tripletta ` ricopiata in una tabella e ridotta, preferences last, tramite i due trigger:

CREATE TRIGGER recommender_last_insert AFTER INSERT ON preferences FOR EACH ROW BEGIN INSERT INTO preferences_last ( user_id , video_id , rate ) values ( NEW . user_id , NEW . video_id , NEW . rate ) ; END ; $$

Listing 3.32: Trigger: ricopia unistanza dalla tabella preferences alla preferences last

CREATE TRIGGER recommender_delete_last BEFORE INSERT ON preferences FOR EACH ROW

67

BEGIN DECLARE min_update_time TIMESTAMP ; select min ( preferences_last . date ) INTO min_update_time FROM preferences_last ; IF ( SELECT COUNT (*) FROM preferences_last ) > 1 THEN DELETE FROM preferences_last WHERE preferences_last . date = min_update_time ; END IF ; END ; $$

Listing 3.33: Trigger: elimina listanza pi` vecchia se la dimensione della u tabella supera le 100000 istanze

In sostanza la tabella preferences last risulta essere una copia delle ultime 100000 istanze della tabella preferences. Mantenere una tabella ridotta delle preferenze allinterno del sistema ` necessario per ottimizzare i tempi di risposta in real e time dellalgoritmo in memory utilizzato da Mahout. In tal modo ` possibile operare sulle raccomandazioni di video in due fasi: e
La prima fase lavora su un database ridotto di preferenze contenute in e preferences last; ` meno ecace come raccomandazioni prodotte, ma permette di garantire in real time raccomandazioni agli utenti, qualora questi abbiano gi` usufruito delle raccomandazioni della seconda fase garantite a solo periodicamente dal sistema. La seconda fase opera sul cluster Hadoop e lavora sullinsieme completo delle preferenze, che possiamo trovare allinterno della tabella preferences. Questa fase permette al sistema di generare periodicamente raccomandazioni che, essendo basate su tutte le preferenze del sistema, sono pi` u ecaci di quelle della fase precedente. Tali raccomandazioni possono essere generate solo periodicamete in quanto, computazionalmente parlando, fare raccomandazioni su tutte le preferenze del sistema ` unoperazione e onerosa, sia in termini di tempo che di memoria.

Di seguito si spiegher` meglio il funzionamento delle raccomandazioni nelle a suddette due fasi.

3.6.3

Raccomandazioni in Real Time

Per garantire continuamente raccomandazioni di nuovi video agli utenti in real time ` stato necessario creare una servlet Java su un server Tomcat. Tale sere vlet ` accessibile semplicemente tramite HTTP. In tal modo il recommender ` e e implementato come un servizio accessibile tramite web. Questo in un certo senso aggiunge complessit` al progetto, ma permette ad altre a applicazioni, anche scritte in altri linguaggi, di accedere al servizio di recommendation. Allinterno di Intime si ` utilizzata una servlet sia per la cold start che per la e prima fase del mantenimento. Tali servlet sono utilizzate accedendovi da php 68

attraverso delle chiamate HTTP tramite curl. Dato che i dati di Intime si trovano nel database MySql e invece la servlet lavora su un Server Tomcat ` stato necessario congurare una connessione JDBC ad e ogni tabella necessaria del database come segue.

Listing 3.34: Connessione JDBC: Mahout API


MysqlDataSource data_source = new MysqlDataSource () ; data_source . setServerName ( " localhost " ) ; data_source . setUser ( " user " ) ; data_source . setPassword ( " password " ) ; data_source . setDatabaseName ( " db_name " ) ; this . model = new MySQLJDBCDataModel ( data_source , " table_name " , " user_id_column " , " video_id_column " , " rate_column " , null ) ;

Una volta inizializzata tale connessione ` possibile utilizzare il model generato e per eseguire gli algoritmi di Mahout. Ad esempio nel caso del cold start avremo:

Listing 3.35: Recommender: Cold Start


UserSimilarity mahout_similarity = new EuclideanDistanceSimilarity ( like_model ) ; UserNeighborhood neighborhood = new NearestNUserNeighborhood (1 , mahout_similarity , like_model ) ; Recommender recommender = new IntimeGenericUserBasedRecommender ( preferences_model , neighborhood , mahout_similarity ) ; recommendations = recommender . recommend ( user_id ,36) ;

In cui viene inizializzata una EuclideanDistanceSimilarity passandole come input linsieme delle triple ricavate dai likes di Facebook (user, categoria, voto implicito). Tramite questa Similarity ` possibile istanziare una NearestNUe serNeighborhood che ` una forma di Fixed-Size Neighbourhood in cui la size, in e ` questo caso, ` stata ssata a 10. E possibile ottenere i vicini di un dato utente e facilmente tramite la funzione getUserNeighborhood(user id). Tramite la Similarity e la Neighbourhood ` possibile poi creare un recommene der. In particolare ` stato creato un IntimeGenericUserBasedRecommender che e estende GenericUserBasedRecommender. Questo ` dovuto al fatto che essene doci una discrepanza tra gli utenti presenti in like model e gli utenti che hanno espresso una preferenza bisogna far attenzione che, qualora quale vicino venga individuato un utente che non ha mai espresso una preferenza, non venga lanciato un errore, ma venga gestita leccezione. Come mostrato qui sotto:

69

Listing 3.36: Recommender: la classe IntimeGenericUserBasedRecommender


public class IntimeGenericUserBasedRecommender extends GenericUserBasedRecommender { public IntimeGenericUserBasedRecommender ( DataModel dataModel , UserNeighborhood neighborhood , UserSimilarity similarity ) { super ( dataModel , neighborhood , similarity ) ; } @Override protected FastIDSet getAllOtherItems ( long [] theNeighborhood , long theUserID ) throws TasteException { DataModel dataModel = getDataModel () ; FastIDSet possibleItemIDs = new FastIDSet () ; for ( long userID : theNeighborhood ) { try { possibleItemIDs . addAll ( dataModel . getItemIDsFromUser ( userID ) ) ; } catch ( NoSuchUserException u ) { // don t block the execution } } try { possibleItemIDs . removeAll ( dataModel . getItemIDsFromUser ( theUserID ) ) ; } catch ( NoSuchUserException u ) { // don t block the execution } return possibleItemIDs ; } }

Inne, essendo tutto ci` in una Servlet Java, il risultato della raccomandazione o viene restituita sotto forma di un json, un formato adatto per lo scambio dei dati in applicazioni client-server:

Listing 3.37: Recommender: un piccolo esempio di output json


{ " my_user " : 5 , " recommendation " : [ { " item " : 41 , " value " : 4.545653 }, { " item " : 428 , " value " : 4 } ], " similar_users " : [ " 52 " , " 75 " ]

70

Difatto il recommender per le raccomandazioni successive alla cold start utilizza la stessa struttura di quello appena descritto, fatta eccezione per il fatto che la Similarity e la Neighbourhood utilizzano non il modello dei likes, ma il modello delle preferenze. Una volta superata la fase del cold start, infatti, ` possibile e ricavare la neighbourhood dalle nuove preferenze immesse dallutente.

Listing 3.38: Recommender: fase successiva alla cold start


UserSimilarity mahout_similarity = new EuclideanDistanceSimilarity ( preferences_model ) ; UserNeighborhood neighborhood = new ThresholdUserNeighborhood ( .7 , mahout_similarity , preferences_model ) ; neighbors = neighborhood . getUserNeighborhood ( user_id ) ; Recommender recommender = new GenericUserBasedRecommender ( preferences_model , neighborhood , mahout_similarity ) ;

3.6.4

Raccomandazioni sul Cluster

La fase successiva di raccomandazioni viene generata su un cluster di macchine(vedi par. 3.1.1 ). In particolare sono stati utilizzati gli algoritmi distribuiti basati sul paradigma MapReduce per Hadoop forniti da Mahout. Implementazione algoritmo con matrice di co-occorrenza in Mahout Come gi` spiegato precedentemente a Pag. 18 , lalgoritmo di raccomandazione a che utilizza la matrice di co-occorrenza si presta molto bene alla distribuzione della sua computazione. In tal senso allinterno di Intime ` stato utilizzato lalgoritmo distribuito fornito e dal framework Mahout che si avvale del paradigma MapReduce e di Hadoop. Il paradigma MapReduce ` stato gi` precedentemente discusso a Pag. 22 , ma e a pu` essere brevemente riassunto in pochi punti: o
una serie di coppie chiave-valore fanno da input (V1, K2) una funzione detta di map prende queste coppie in ingresso e restituisce 0 o pi` coppie del formato (K2,V2) u tutte le coppie con uguali K2 vengono raggruppate insieme una funzione detta di reduce riceve in ingresso queste coppie e restituisce delle coppie (K3,V3)

Una forma semplicata di quello che succede allinterno del MapReduce di Mahout pu` essere sintetizzata in una sequenza di cinque MapReduce: o 1. Primo Mapper (costruzione user vector)
il primo mapper prende in ingresso:

71

K1: la posizione allinterno del le(ignorata dalla funzione) V1: una riga di testo (contenente user id,item id,rate)
e restituisce, per ogni riga, loutput:

K2: come user id V2: come (item id,rate) 2. Primo Reducer (costruzione user vector)
il primo reducer, dopo aver raccolto le coppie con ugual user id, prende in ingresso:

K2: un unico utente V2,. . . : tutte le coppie V2 del passo precedente che hanno uguale user
e restituisce come output:

K3: come user id V3: come vettore colonna rappresentante un utente (vettore sparso) Qui si sono costituiti tutti i vettori utente; adesso costruire la matrice di co-occorrenza ` un banale problema di conteggio. e 3. Secondo Mapper (costruzione matrice di co-occorrenza)
il secondo mapper prende in ingresso:

K1: uno user id V1: un vettore utente


e restituisce, per ogni coppia di item:

K2: item id V2: un altro item id 4. Secondo Reducer (costruzione matrice di co-occorrenza)
il secondo reducer, dopo aver raccolto le coppie con ugual item id, prende in ingresso:

K2: item id V2,. . . : altri item id


a questo punto, dopo aver conteggiato gli altri item id e costruito un vettore:

K3: come item id V3: una colonna della matrice di co-occorrenza sotto forma di vettore A questo punto la matrice di co-occorrenza ` completamente costituita; in e tal modo ` possibile procedere ad eettuare in modo distribuito il prodote to matriciale tra la matrice di co-occorrenza ed i vettori utente di interesse. Per farlo ` necessario avvalersi del modo per fare moltiplicazioni matrie ciali descritto a Pag. 18 . In tale tecnica di moltiplicazione matriciale 72

per` ` necessario mappare le preferenze in modo che siano nella forma o e e item id/(user id,rate), poich le colonne (e anche le righe) di una matrice di co-occorrenza sono ordinate secondo gli item id. In tal modo sar` suciente distribuire soltanto il vettore colonna corria spondente della matrice di co-occorrenza e tutte le coppie chiave valore item id/(user id,rate) corrispondenti ad uno specico item id. La dicolt` qui ` che, come detto, ci sono due dierenti tipi di dati ina e sieme in ununica computazione. Questa operazione normalmente non ` e supportata da Hadoop, perch i valori in un reducer possono essere solo e di un tipo. 5. Terzo Mapper a) (moltiplicazione parziale)
il terzo mapper a) prende in ingresso:

K1: uno user id V1: uno user vector


e restituisce, per ogni item:

K2: item id V2: (user id,rate) 6. Terzo Mapper b) (moltiplicazione parziale)


il terzo mapper prende in ingresso:

K1: uno item id V1: una colonna della matrice di co-occorrenza


e restituisce una sorta di echo dellinput:

K2: litem id V2: la colonna della matrice di co-occorrenza 7. Terzo Reducer (moltiplicazione parziale)
il terzo reducer prende in ingresso due diversi formati di input:

K2: item id V2,. . . : (user id,rate),. . . e una colonna della matrice di co-occorrenza
e restituisce come output, per ogni item id:

K3: item id V3: un vettore colonna e le varie coppie (user id,rate) 8. Quarto Mapper (aggregazione)
il quarto mapper prende in ingresso:

K1: item id V1: un vettore colonna e le varie coppie (user id,rate)


e restituisce, per ogni user id:

K2: user id V2: il prodotto tra il vettore colonna e la rate 73

9. Quarto Reducer (aggregazione)


il quarto reducer, dopo aver raccolto le coppie con ugual user id, prende in ingresso:

K2: user id V2,. . . : vettori di raccomandazione parziale


e restituisce come output:

K3: user id V3: (item id,rate) Da cui ` possibile fornire una raccomandazione. e

Figura 3.11: Algoritmo con matrice di co-occorrenza in Mahout

Ci` che accade allinterno dellalgoritmo implementato nel framework Mahout o (vedi Fig. 3.11) ` molto pi` complesso della sequenza di MapReduce appena e u descritta, che ha preso in considerazione solo gli aspetti cruciali dellalgoritmo Script eseguito sul cluster Per eseguire lalgoritmo ` stato necessario in primo luogo congurare il cluster e di macchine in modo tale che potesse accogliere lambiente Hadoop. Dopodich si ` dovuto scrivere uno script che potesse essere invocato tramite il e e comando qsub. 74

Lo script ` lanciato periodicamente in automatico da un cron. Lo script che e esegue sul cluster ` il seguente: e

# !/ bin / bash # $ -j y # $ -o debug_output / output . $JOB_ID # $ - pe hadoop 17 # $ - cwd # $ -l h_rt = :2 : # $ -q hadoop . q # scarico da fiona i dati di input wget -O input . csv http :// fiona . micc . unifi . it / intime / index . php / api / recommendation / preferences / format / csv wget -O users . csv http :// fiona . micc . unifi . it / intime / index . php / api / recommendation / users / format / csv # importiamo lo script di sistema per hadoop . $HADOOP_HOME / conf / hadoop - sge . sh # carichiamo i servizi hadoop sulle macchine hadoop_start # passo i hadoop fs hadoop fs hadoop fs dati di input all HDFS - mkdir input - put input . csv input / input . txt - put users . csv input / users . txt

# eseguo l algoritmo di recommendation hadoop jar mahout - core - .7 - job . jar org . apache . mahout . cf . taste . hadoop . item . RecommenderJob - Dmapred . input . dir = input / input . txt Dmapred . output . dir = output -- usersFile input / users . txt -booleanData -s SIMILARITY_COOCCURRENCE # copio l output dall HDFS al filesystem della macchina hadoop fs - get output / part -r / home / dmaddaluno / # Chiudo i servizi hadoop hadoop_end # creo un file sql con i dati di output dell algoritmo php sql . php > sql_rec . sql # copio il file sql su fiona scp sql_rec . sql intime@fiona . micc . unifi . it :/ home / intime / scp / sql_rec . sql # eseguo i comandi sql sul database mysql ssh intime@fiona . micc . unifi . it " mysql - uuser_name - ppassword database_name < scp / sql_rec . sql " # rimuovo i file alla fine della raccomandazione rm - rf * $JOB_ID * rm input . csv rm users . csv rm sql_rec . sql rm part -r -

75

Questo script esegue tutte le operazioni necessarie per produrre una raccomandazione sul cluster ed esportarla su un database. I dati di input vengono scaricati dal server ona tramite una wget. Una volta ottenuti gli input, si caricano i servizi hadoop sulle macchine e si procede a passare i dati di input nellHadoop File System, il lesystem condiviso fornito da Hadoop. Quando i dati di input sono stati caricati nel lesystem condiviso ` possibile far e partire lalgoritmo distribuito item based, basato sulla matrice di co-occorrenza di Mahout. Una volta generati gli output nellHDFS, ` necessario, per poterli leggere, ricoe piarli nel lesystem della macchina da cui ` possibile generare un le .sql che e permette di inviare gli output al database, per rendere quindi tali dati disponibili allapplicazione web Intime. Di seguito i le sql.php che genera il le.sql:

Listing 3.39: File sql.php per generare lsql a partire da un singolo le di output
<? php open_recommendation_file (" part -r ");

// INSERT INTO intime_db_1 . recommendation ( user_id , video_id , estimated_rate ) VALUES ( 58 , 378 , 3 ) ; \r function open_recommendation_file ( $file ){ $first = true ; $ptr = fopen ( $file , "r"); echo " SET foreign_key_checks = ; "; echo " INSERT INTO recommendations_swap ( user_id , video_id , estimated_rate ) VALUES "; while (! feof ( $ptr )) { $buffer = fgets ( $ptr , 4 96) ; $recommendation = read_recommendation ( $buffer ); if ( $recommendation != false ){ $user_id = $recommendation [ user_id ]; for ( $i = ; $i < sizeof ( $recommendation [ recommendation ][ video_id ]) ; $i ++) { $video_id = $recommendation [ recommendation ][ video_id ][ $i ]; $rate = $recommendation [ recommendation ][ rate ][ $i ]; if ( $first == true ){ echo "(". $user_id . " ,". $video_id .

76

} else {

" ,". $rate ." )" ; $first = false ; echo " , (". $user_id ." ,". $video_id ." ,". $rate ." )";

} } }

} function read_recommendation ( $line ){ if ( $line == false ){ return false ; } $user_recommendation = explode ("\t" , $line ); $recommendation [ user_id ] = $user_recommendation [ ]; $couple = explode (" ," , substr ( $user_recommendation [1] , 1, -2) ); for ( $i = ; $i < sizeof ( $couple ); $i ++) { $single = explode (":" , $couple [ $i ]) ; $recommendation [ recommendation ][ video_id ][] = $single [ ]; $recommendation [ recommendation ][ rate ][] = $single [1]; } return $recommendation ; }? >

} echo "; SET foreign_key_checks = 1; "; echo " DELETE FROM recommendations_swap WHERE video_id NOT IN ( SELECT videos . id FROM videos );"; echo " TRUNCATE TABLE recommendations ; RENAME TABLE recommendations TO recommendations2 ; RENAME TABLE recommendations_swap TO recommendations ; RENAME TABLE recommendations2 TO recommendations_swap ; "; fclose ( $ptr );

3.7

Categorizzazione

Intime dispone di diverse procedure di categorizzazione delle risorse. La categorizzazione gioca un ruolo importante sia per lespansione della conoscenza che per la prolazione degli utenti. Per come sono strutturate le pagine di Intime, le risorse compaiono soltanto sotto una qualche categoria; ` fondamentale quindi che ogni risorsa presente e

77

sia sempre categorizzata, altrimenti questa sar` presente nel network, ma non a visibile.

3.7.1

Tassonomia delle Categorie

Per Intime ` stata realizzata una tassonomia specica per quanto riguarda le cae tegorie, in modo da riettere il pi` possibile gli interessi degli utenti del network. u Si ` dovuto scegliere tra disporre di una tassonomia propria oppure promuovere e unestrazione automatica delle categorie in una moltitudine come quelle utilizzate da Wikipedia. Questultimo approccio ` risultato svantaggioso in quanto le e categorie di Wikipedia sono state pensate per unenciclopiedia: il loro scopo ` e quello di indicare, per ogni articolo, quelle caratteristiche che oggettivamente lo rendono classicabile con la categoria, mentre in Intime queste devono riettere gli interessi degli utenti di un social network. Ad esempio: Wikipedia categorizza la risorsa Ludwig van Beethoven come Compositori tedeschi del XIX secolo oppure come Musicisti legati a Vienna o Pianisti classici, ma queste categorie mal rispecchiano gli interessi di una persona: ` pi` opportuno utilizzare catee u gorie pi` generiche come Musica e Musica Classica. u Le categorie di Intime, quindi, cercano di coprire il pi` possibile gli interessi sou ciali e sono distribuite su due livelli: un primo livello di categorie molto generali, macrocategorie, che raccolgono le categorie di secondo livello. Il motivo di questa gerarchia ` proporre inizialmente agli utenti interessi generici e e soltanto dopo specicare. Le categorie di livello 2 corrispondono a pagine di Wikipedia: come Musica Rock, Musica Classica, Politica e Serie TV; in questo modo ` possibile calcolae re le distanze semantiche tra queste e le risorse di Intime. Le macrocategorie, invece, non corrispondono a pagine di Wikipedia e semplicemente contengono alcune sottocategorie, raggruppando interessi relativamente specici sotto nomi molto generici, come ad esempio Everyday Life che raccoglie categorie come Gossip e Food, o Politics & Actuality che contiene Politics e Journalism. Lapproccio di categorie a due livelli ` utilizzato anche in altri network come e Vimeo per la categorizzazione di video.

Esempi di categorie di Intime Tourism & Places Cities


Monuments Travel Countries Technology & Science Computers

78

Internet Science Chemistry

Visual Arts
Painting Sculpture Architecture Photography

3.7.2

Clustering

Il motore di clustering di Intime ha lo scopo di categorizzare le risorse del sistema. Date le risorse che sono presenti nel network ad un certo istante, unesecuzione dellalgoritmo le raggrupper` in cluster di risorse simili. Ogni cluster a conterr` risorse che hanno gi` una categoria su Intime, altre che non ce lhanno a a ancora perch inserite nel network dopo lesecuzione precedente. Le categorie e di queste ultime verranno selezionate in base alle categorie delle risorse nello stesso cluster. Periodicamente un cron sul server comanda al cluster hadoop di eseguire un particolare job. Questo viene inserito nella coda dei job in attesa di eseguire; quando ` il suo turno inizia la procedura di categorizzazione delle risorse. e La strategia usata prevede tre fasi: 1. vettorizzazione delle risorse 2. esecuzione algoritmo di clustering 3. assegnazione categoria alle nuove risorse Vettorizzazione delle risorse La risorse di Intime vengono vettorizzate mediante lalgoritmo TF-IDF. Ogni volta che una risorsa entra a far parte del network, viene salvato un estratto testuale da Wikipedia e memorizzato in un le. La prima parte del job categorization eettua una copia dei le di testo delle risorse che sono entrate nel network dallultima esecuzione eettuata, che avvengono con i comandi:

scp intime@ona.micc.uni.it: /home/intime/public html/media/ clustering/input/* input/

79

ssh intime@ona.micc.uni.it mv public html/media/clustering/input/* public html/media/clustering/stored input/

Il primo eettua, tramite il protocollo scp, una copia dei le testuali dal server sul cluster; il secondo sposta alcuni le nel lesystem del server, in modo da marcare che sono gi` stati copiati. a Seguono gli script relativi alliniziazione di hadoop per lesecuzione dellalgoritmo Map Reduce. . $HADOOP HOME/conf/hadoop-sge.sh

hadoop start

hadoop fs -put /home/fgelli/input/* input/

Il primo comando sopra importa lo script di sistema per hadoop, il secondo carica i servizi di hadoop sulle macchine e il terzo copia i le input nel le system distribuito. Poich la procedura di vettorizzazione ` scritta come algoritmo map-reduce, e e ` necessario convertire i le testuali in oggetti di classe Sequence File, ovvero e rappresentazioni per hadoop di le sequenziali. La chiave di tale le sequenziale ` il titolo dei documenti, il valore ` il contee e nuto testuale. Mahout ore lutility Sequence Files From Directory, che, data una directory in ingresso, produce il le sequenziale. Viene eseguito un dump delloutput di tale procedura, che produce un output leggibile; questo avviene con la classe di Mahout Sequence File Dumper.

bin/mahout seqdirectory -i input/ -o seqles/ -ow

-i : specica la directory di input -o specica la directory di output -ow permette di sovrascrivere loutput nel caso esista gi` a

80

bin/mahout seqdumper -i seqles/ -o seqles analyzer

-i : specica la directory di input -o specica la directory di output

Dopo aver ottenuto i le sequenziali, viene eseguita la procedura di conversione in vettori TF-IDF. Viene utilizzata la classe Sequence Files to Sparse Vector fornita da Mahout. La rappresentazione sparsa ` senza dubbio pi` eciente, e u dato il numero gigantesco di dimensioni dello spazio vettoriale e data la scarsit` a delle componenti diverse da zero. La procedura, scritta per essere eseguita parallelamente su un cluster hadoop, prevede pi` fasi: u 1. parsing del contenuto testuale, utilizzando le funzionalit` di Apache Lua cene 2. creazione del dizionario, ovvero un le sequenziale le cui chiavi sono numeri interi e i cui valori sono le parole 3. vengono creati i vettori Term Frequency 4. vengono creati i vettori TF-IDF Anche in questo caso viene eseguit` un utility che produce un output leggibile: a Vector Dumper. I comandi utilizzati sono i seguenti:

bin/mahout seq2sparse -i seqles/ -o vectors/ -nv -ow -seq -n 2

-i : specica la directory di input -o: specica la directory di output -nv : specica che i vettori prodotti appartengono alla classe NamedVector, ovvero che ad ogni vettore corrisponde un nome, che nel nostro caso ` la e chiave dei le sequenziali in ingresso ovvero il titolo dei documenti -ow permette di sovrascrivere loutput nel caso esista gi` a -seq se true, vengono creati dei vettori di classe Sequential Access Vector -n indica di eettuare una normalizzazione con la norma 2

81

bin/mahout vectordump -i vectors/tdf-vectors/ -o tdf-vectors-analyzer

-i : specica la directory di input -o specica la directory di output

Algorimo Fuzzy-KMeans Si ` scelto di usare Fuzzy KMeans, in quanto lassegnazione delle risorse alle e categorie non ` unoperazione rigida ed ` previsto che una risorsa possa ape e partenere a pi` categorie. Infatti, se un cluster prodotto dallalgoritmo non u corrisponde a nessuna tra le categorie di Intime, le nuove risorse in questo non vengono categorizzate per questo cluster, ma potranno comparire anche in altri gruppi pi` conformi alle categorie di Intime. u Lalgoritmo accetta in input un le contentente dei vettori. Un utente pu` o fornire i centri dei cluster come input, oppure pu` selezionarli randomicamente. o I le di input non vengono modicati dal programma. AllN-esima iterazione di Fuzzy-KMeans i le di output vengono salvati nella directory cluster-N. Il programma usa un egual numero di mapper e reducer, ed ` composto da: e
FuzzyKMeansDriver : Itera sui vettori e sui cluster di input per un numero di iterazioni oppure no alla convergenza dellalgoritmo. Durante literazione i-esima viene creata una directory chiamata cluster-i, contenente i nuovi centri dei clusters. Tale directory costituir` linput delliterazioa ne successiva. Dopo il termine dellultima iterazione, viene eseguita una procedura map che produce come output, in una cartella chiamata clusteredPoints, un le sequenziale che associa ad ogni vettore il cluster a cui appartiene FuzzyKMeansMapper : Legge i cluster di input durante il metodo congure(); dopodich per ogni punto calcola un indice di appartenenza ai diversi e cluster: ovvero una probabilit` di appartenere a questi. Tale indice ` ina e versamente proporzionale alla distanza dei punti dai centroidi, calcolata in case alla metrica selezionata. Loutput ` un le sequenziale le cui chiae vi sono gli identicativi dei clusters e i cui valori sono oggetti del tipo ClusterObservations, contententi dati statistici FuzzyKMeansCombiner : riceve le coppie chiave-valore dal mapper e produce le somme parziali per ogni cluster. Loutput che produce ` sempre e un le sequenziale dello stesso tipo di quello in ingresso. FuzzyKMeansReducer : pi` reducer ricevono alcune chiavi e tutti i valori u associati ad esse, dopodich sommano tutti i valori e producono un nuovo e centro per il cluster in uscita.

Alla ne dellalgoritmo la directory di output conterr` N cartelle nominate a cluster-N contententi il risultato di ogni iterazione, ovvero un le sequenziale del tipo (Text,SoftCluster ), dove la chiave ` una stringa identicativa di un e cluster e una cartella chiamata clusteredPoints, contentente un le sequenziale 82

di tipo(IntWritable, WeightedVectorWritable), dove la chiave ` lidenticativo e di un cluster e il valore ` una coppia (double,VectorWritable), dove il valore e double indica la probabili` del vettore VectorWritable di appartenere al cluster a indicato. Il comando che invoca lalgoritmo Fuzzy-KMeans ` il seguente: e

bin/mahout fkmeans -i vectors/tdf-vectors/ -o fkmeans-clusters/ -ow -c fkmeans-initial-clusters/ -k 30 -cl -cd 0.001 -dm org.apache.mahout.common. distance.CosineDistanceMeasure -x 20 -m 4 -e

-i : specica la directory di input -o: specica la directory di output -c: specica la directory di input dei centroidi iniziali -ow : permette di sovrascrivere loutput nel caso esista gi` a -k : indica il numero di cluster che devono essere restituiti dallalgoritmo. Se settato viene eseguita lutility Random Seed Generator, che genera i centroidi nella directory indicata in -c selezionando randomicamente tra i vettori di input -cl : se selezionato, dopo che sono stati restituiti i cluster vengono assegnati a questi i vettori iniziali -cd : double che indica quando lalgoritmo pu` smettere di iterare o -dm: la metrica di distanza utilizzata di default ` org.apache.mahout.common.distance. e EuclideanDistanceMeasure -x : il massimo numero di iterazioni da eseguire, indipendentemente dalla soglia di convergenza -m: parametro di fuzzyness: ` un valore double maggiore di 1. Pi` ` e u e vicino ad 1, pi` lalgoritmo ` simile a K-Means u e -e: se settato a true indica che il clustering deve emettere soltanto il cluster migliore per ogni vettore -t: se -e ` settato a false; tale double rappresenta la soglia probabilistica e usata per emettere cluster multipli per ogni vettore. Un valore pari a 0 produce per ogni cluster la probabilit` che ogni vettore appartenga ad esso a -xm: modalit` di esecuzione: sequenziale o map-reduce. Di default ` a e map-reduce

Dopo che i cluster sono stati determinati e le risorse sono state assegnate a questi, deve essere estratta, per ogni nuova risorsa, la categoria corrispondente. Il le ottenuto ispezionando loutput di Mahout ha il seguente formato:

83

Key: Key: Key: Key:

290: 314: 314: 295:

Value: Value: Value: Value:

1.0: 1.0: 1.0: 1.0:

113746 Sean Penn.txt = (27:0.031, 45:0.011,. . . ) 11388236 Seattle.txt = (0:0.028, 6:0.035,. . . ) 11525 Florence.txt = (21:0.019, 45:0.006,. . . ) 11625 Fyodor Dostoyevsky.txt = (0:0.034,. . . )

Per ogni riga il campo Key costituisce lidenticativo di un cluster, Value ` e una coppia (Peso,Vettore), dove il peso ` sempre pari a 1 per lalto numero e di dimensioni e il vettore, appartenente alla classe di Hadoop NamedVector, ` e costituito da un nome e dalle sue componenti. Il nome di un vettore ` il nome del le di testo in ingresso: la prima parte ` e e lidenticativo di Wikipedia di una risorsa, segue il titolo. Per elaborare questo risultato viene utilizzato lo script php categorization clustering.php. In primo luogo il le viene letto e viene generata una struttura del tipo:

Array ( [ 3 1 9 ] => Array ( [ 0 ] => [ 1 ] => [ 2 ] => [ 3 ] => [ 4 ] => [ 5 ] => [ 6 ] => [ 7 ] => [ 8 ] => ) . . .

10002116 102346 1055577 1099092 1229122 13736167 15135713 151854 154247

Ovvero il cluster con id 303 contiene le risorse elencate. Tra di queste si distingue tra risorse gi` categorizzate in esecuzioni precedenti e risorse inserite a recentemente. Lo scopo ` assegnare a queste ultime una nuova categoria. e Si traduce quindi il risultato nella forma:

Array ( [ 3 1 9 ] => Array

84

( [ c a t e g o r i z e d ] => Array ( [ 0 ] => 10002116 [ 1 ] => 102346 [ 2 ] => 1055577 [ 3 ] => 1099092 [ 4 ] => 1229122 [ 5 ] => 13736167 [ 6 ] => 15135713 ) [ u n c a t e g o r i z e d ] => Array ( [ 7 ] => 151854 [ 8 ] => 154247 ) ) . . .

Se per ogni cluster le risorse elencate in categorized fossero sempre assegnate alla stessa categoria si tratterebbe semplicemente di assegnare questa categoria alle risorse in uncategorized, ma siccome non ` detto che i cluster riettano e perfettamente le categorie di Intime, spesso non si ha questa situazione: scopo del clustering, infatti, ` di raggruppare oggetti simili tra di loro, non ` detto che e e i criteri con cui questo avvenga riettano le categorie di Intime. Qualora le risorse gi` categorizzate di un singolo cluster appartengono a una a molteplicit` di categorie di secondo livello di Intime e nessuna di queste risulti a predominante, nessuna di queste ` adatta a contenere le nuove risorse: il clue ster non riette nessuna categoria di livello 2, ma potrebbe capitare che in un caso del genere le risorse gi` categorizzate appartengano comunque alla stessa a macrocategoria, ad esempio tra le risorse in categorized alcune appartengono a Rock Music, altre a Disco Music e altre ancora a Jazz, nessuna di queste tre categorie potr` quindi essere assegnata a quelle in uncategorized, ma a queste a potr` essere assegnata in questo caso la macrocategoria Music. a Se neppure la maggior parte delle marcrocategorie ` predominante, la risorse e nuove non vengono categorizzate, in quanto il cluster preso in questione non riette lontologia di Intime; poich ` stato adoperato un algoritmo di clustering ee che permette sovrapposizioni, pu` darsi che quelle risorse che in un cluster non o sono state categorizzate appartengono anche ad un altro gruppo, per il quale verr` applicata la stessa procedura. a Pu` darsi, comunque, che alla ne dellalgoritmo intero alcune risorse non vero ranno categorizzate: la categoria sotto la quale compariranno in Intime sar` a quella associata da Intime nel momento in cui sono state inserite nel network attraverso la categorizzazione provvisoria. Anch` venga aggiornato il database, viene generato un le sql con la query e di inserimento; per ogni risorsa categorizzata con successo vengono inserite due

85

tuple del tipo: < resource, category, grade, level > Una assegna la risorsa alla categoria di livello 2, laltra invece alla macrocategoria padre.

Es. CSI,TV series,0.3423111,2 CSI,TV & Films,0.3423111,1

Poich liperspazio dei vettori clusterizzati ha un numero enorme di dimensioni, e per ottendere i gradi di relatedness viene utilizzata la distanza semantica di WikipediaMiner.

3.7.3

Categorizzazione provvisoria

Lalgoritmo di clustering categorizza tutte le risorse presenti nel network nellistante in cui questo viene eseguito. poich le risorse nel network sono in continua e espansione e lalgoritmo di clustering viene eseguito a scadenze periodiche, molte risorse resterebbero senza categoria per molto tempo e quindi non comparirebbero nel network no al momento dellesecuzione successiva dellalgoritmo. Per attenuare il problema ` stata realizzata una nuova procedura di categorize zazione indipendente dal clustering, che viene eseguita non appena una risorsa entra nel network. In questo modo ogni nuova risorsa avr` associata una categoria provvisoria che a la render` visibile da subito nel network. a Lidea alla base di questa categorizzazione provvisoria ` quella di confrontare la e nuova risorsa con alcune risorse presenti nel network, trovare quelle pi` simili u e associarle la categoria di queste. Il criterio di vicinanza usato ` la distanza e semantica di WikipediaMiner. Pi` precisamente le fasi della procedura sono le seguenti: u 1. viene aggiunta al network una risorsa 2. per ogni categoria di livello 2 si calcola la distanza semantica con la risorsa aggiunta, dal risultato vengono scartate le categorie che hanno prodotto una distanza pari a zero. 3. per ogni categoria rimasta si scelgono randomicamente 5 risorse rappresentati, dopodich si calcola la distanza semantica tra la nuova risorsa e e queste ultime, la media delle 5 distanze restituite verr` salvata in un a vettore

86

4. una volta che sono state calcolate tutte le distanze semantiche viene selezionata la categoria corrispondente al valore pi` alto nel vettore calcolato u e la nuova risorsa viene assegnata alla macrocategoria padre di questa Un vantaggio di questa procedura ` che casi isolati di risorse nite per errore e in un cluster non alterano il risultato, in quanto questo deriva da una media tra 5 elementi. Pi` le risorse nei cluster sono coese, pi` i risultati della u u categorizzazione provvisoria sono migliori.

3.7.4

Cold Start

Il motore di Clustering di Intime ` in grado di categorizzare le risorse del sistema e e di creare una pagina del prolo per gli utenti del network. Questo avviene in base allattivit` dellutente sulla propria pagina. In una prima fase, per`, in cui a o un utente ` registrato da poco su Intime, il sistema non ha ancora abbastanza e dati per personalizzare la pagina del prolo; ` stato quindi pensato un meccae nismo che preveda una prolazione iniziale per gli utenti appena registrati su Intime. La prolazione iniziale avviene in base ai dati di Facebook al momento delliscrizione: dai likes posti sulle pagine di Facebook vengono estratte alcune categorie, che vengono memorizzate nel database, escludendo quelle non adatte al network (vedi 3.6.1). Dopodich queste categorie vengono confrontate una ad e una con le macrocategorie di Intime, trovando per ognuna la categoria di Intime corrispondente (per esempio la categoria di facebook Musician corrisponder` alla categoria di Intime Music). Per trovare la categoria a corrispondente viene prima cercato se ne esiste una con lo stesso titolo; se non esiste vengono calcolate le distanze semantiche con tutte le categorie generali di Intime e scelto quella pi` vicina. u Gi` dal primo accesso, ogni utente avr` alcune categorie di interesse che coma a pariranno gi` nella pagina del prolo, con relative suggestions. Sar` subito a a possibile selezionare da queste quelle che diventeranno le risorse di interesse.

3.7.5

Prolazione degli utenti

La categorizzazione delle risorse ` legata strettamente al prolo di un utene te. La funzione principale della pagina del prolo (3.3.5) ` quella di mettere e in evidenza gli interessi degli utenti. Nella pagina compaiono sia le categorie di interesse che le risorse di interesse, ma queste ultime compaiono soltanto se ` lutente ` interessato nella loro categoria. E evidente quindi come le categorie e sono in primo piano rispetto alle risorse nella prolazione degli utenti di Intime: prima vengono determinate le categorie di interesse, in secondo luogo vengono selezionate le risorse tra quelle suggerite.

Estrazione automatica categorie speciche da macrocategorie Dopo la registrazione di un utente, la pagina del prolo contiene soltanto macrocategorie, ricavate dai dati di facebook. Oltre alla possibilit` di aggiungere a

87

manualmente nuove categorie nella propria pagina, Intime suggerisce in automatico quando da una macrocategoria di interesse sar` possibile derivarne una a pi` specica. u La procedura che verica la necessit` di eettuare questa operazione avviene a ogni volta che viene trascinata una risorsa da una lista di suggerimenti alla lista delle risorse di interesse: se per quella categorie e per quellutente compare un numero di risorse di interesse abbastanza elevato e se la maggior parte di queste appartiene a una sottocategoria compare un tooltip (3.12) che suggerisce la possibilit` di aggiungere al proprio prolo la categoria indicata. Se lutente a conferma loperazione, la nuova categoria viene aggiunta alla pagina e le risorse che comparivano negli interessi della macrocategoria vengono divise tra questa e il nuovo interesse.

Figura 3.12: Suggerimento di una nuova categoria di interesse

Lutente che non conferma pu` oscurare il pulsante indicato dal tooltip, in modo o che sar` possibile, riattivandolo, aggiungere la categoria in seguito. a Annotazione risorse su video e Wikication Le categorie di interesse possono essere ampliate in automatico dal sistema ogni volta che un utente eettua un commento su qualche video. Ogni volta che viene eettuato un commento vengono salvate le annotazioni presenti in esso, sia che queste siano tag di Wikipedia, sia che siano state estratte automaticamente dal testo. Questultima operazione avviene con la funzione di wikication oerta da WikipediaMiner: dopo linserimento di ogni commento il testo viene passato alla Web Service di WikipediaMiner che, dopo averlo analizzato, estrae alcuni topics e indica per ognuno di questi un grado, scartando in modo automatico le soluzioni con grado minore di una certa soglia. Le risorse trovate vengono salvate nel database come annotazioni relative al commento; quindi saranno visibili sotto al video nella parte della pagina dedicata alle risorse contenuto nel video. Dopo aver memorizzato il commento vengono controllate le ultime cinque annotazioni dellutente e per ognuna di queste viene selezionata la categoria principale di appartenenza. Una volta ottenuto un vettore le cui componenti sono le categorie delle annotazioni viene selezionata quella che occorre pi` volte, se u 88

il 40% delle annotazioni appartiene a questa categoria questultima diventa, se non lo ` gi`, di interesse per lutente. e a Questa soluzione ` utile in una fase iniziale, quando la pagina del prolo cone tiene soltanto le categorie estratte dai likes di Facebook. Oltre allaggiunta di nuove categorie di interesse, le annotazioni fatte sui commenti modicano, per lutente che ha posto lannotazione, lordinamento delle liste di risorse suggerite dove compare la risorsa taggata. Se un utente pone unannotazione relativa a una risorsa, con buona probabilit` sar` interessato a a a questa, che comparir` al primo posto nei suggerimenti nella pagina del proa lo, in modo che potr` essere facilmente selezionata e spostata nelle risorse di a interesse. Ordinamento suggerimenti risorse Ogni categoria di interesse che compare nella pagina del prolo ha associata una lista di risorse suggerite, che mostra le risorse appartenenti alla categoria indicata. Per rendere personalizzate queste liste ` stata prevista una procedura e automatica di ordinamento, in modo che le risorse che compariranno sulla pagina saranno quelle che con maggior probabilit` saranno di interesse per lutente. a La procedura automatica viene eseguita ogni volta che un utente seleziona una risorsa da una lista di suggerimenti e la trascina nella lista delle risorse di interesse: vengono calcolate tra le risorse suggerite le due pi` simili semanticamente, u secondo le metriche di WikipediaMiner, alla risorsa selezionata e vengono poste in testa alla lista. Questa soluzione incentiva gli utenti a selezionare sempre pi` risorse al proprio u prolo, rendendo la pagina del prolo pi` completa. u

89

Capitolo 4

Esperimenti
Nel capitolo dedicato alla realizzazione sono stati descritti i recommender utilizzati allinterno di Intime. La scelta di questi recommender ` stata fatta solo e dopo unaccurata fase di evaluation dei vari recommender.

4.1

Evaluate di un Recommender

Per valutare un recommender ` stato necessario separare il dataset a disposizioe ne in un training-set ed un testing-set. Una volta separato il dataset, si procede ad addestrare il recommender con il training-set e si prova a stimare una preferenza per quelli che sono i dati del testing-set. A questo punto una stima di quanto il recommender sia ecace pu` essere fato ta calcolando o la dierenza media assoluta o lo scarto quadratico medio tra i valori eettivi ed i valori suggeriti dal recommender. Nel caso di Intime si ` scelto di utilizzare come misura della ecienza di un e recommender la deviazione standard, in modo che fossero maggiormente penalizzati errori di valutazione pi` grande rispetto ad errori di valutazione pi` u u piccoli. In Tab. 4.1 ` possibile vedere un semplice esempio del calcolo eettuato per e valutare un recommender. Item 1 3.0 3.5 0.5
2

Eettivo Stimato Dierenza Dierenza media assoluta Scarto quadratico medio

Item 2 5.0 2.0 3.0


0.5+3.0+1.0 3 3

Item 3 4.0 5.0 1.0 = 1.5 = 1.8484

(0.5)2 +(3.0)2 +(1.0)2

Tabella 4.1: Evaluate di un recommender 90

4.2

Evaluate di un Recommender di Mahout

Mahout fornisce dei metodi per eettuare una evaluation del recommender che si occupano di separare in modo randomico il dataset e di calcolare lo score del recommender. Nel seguente listing ` possibile vedere come creare un recommender-evaluator e per un generico recommender di Mahout. In particolare nel codice viene specicato che questa evaluate viene fatta prendendo in considerazione tutto il dataset (vedi 1.0), e di questo il 90% (vedi 0.9) viene utilizzato come training-set ed il rimanente 10% come testing-set. Come indice di dispersione delle misure sperimentali in questo codice si ` scelto di utilizzare la deviazione standard, per la e sua capacit` di penalizzare di pi` errori grossolani sui dati rispetto ad errori di a u piccola natura.

Listing 4.1: Mahout: evaluate di un recommender


RecommenderEvaluator evaluator = new RMSRecommenderEvaluator () ; RecommenderBuilder recommenderBuilder = new RecommenderBuilder () { @Override public Recommender buildRecommender ( DataModel model ) throws TasteException { /* Some User or Item Similarity ( if needed : see slope_one ) */ /* Some UserNeighbourhood ( only if UserBased Recommender ) */ return new SomeRecommender ( /* data to pass */ ) ; } }; double score = evaluator . evaluate ( recommenderBuilder , null , preferences_model , .9 , 1. ) ;

Tramite questo codice ` stato possibile vericare lecacia della raccomandae zione allinterno del network.

4.3

Risultati sperimentali

Una prima cernita di recommender da utilizzare nel network ` stata fatta immee diatamente. Infatti poich Intime ` un social-network, principalmente basato e e sul browsing di video, avr`, molto probabilmente, un numero di video molto a maggiore del numero di utenti che si iscrivono, in quanto in media ogni utente carica almeno un video e inoltre alcuni utenti ne caricheranno molti di pi`. u ` E noto che nel caso in cui il numero di utenti sia minore del numero di item, che in questo caso sono video, i recommender di tipo UserBased hanno performace migliori; quindi la scelta ` ricaduta in un primo momento su recommender e UserBased o su di uno SlopeOne. Per decidere quale tra questi due recommender fosse quello pi` adatto al sisteu ma ci si ` avvalsi dei dati sperimentali ottenuti tramite una media tra diecimila e 91

evaluate per ogni recommender. Il recommender slope-one ` stato escluso quasi immediatamente in quanto ha e restituito subito risultati di valutazione che si sono aggirati intorno ai 1.67, un valore piuttosto negativo, considerando il fatto che lindice di gradevolezza ` e compreso tra 1 e 5. Quindi come si pu` presto capire lattenzione si ` rivolta verso i recommender o e di tipo UserBased. Tuning dei parametri per un recommender UserBased Come ` stato detto precedentemente, in Intime sono stati utilizzati due recome mender in real-time, uno per la fase di cold start ed uno per la fase successiva. Essendo la scelta ricaduta su dei recommender UserBased, i recommender di questo tipo hanno bisogno sia di una Similarity che di una Neighbourhood. poich non ` possibile a priori stabilire quale Similarity sia migliore delle altre e e e quale dimensione o threshold della Neighbourhood sia da prendere in considerazione, per avere un recommender pi` ecace, sono state necessarie diverse u misure sperimentali descritte in breve nelle seguenti tabelle. Similarity Pearson Euclidean Log-Likelihood Tanimoto n=2 2.0 1.04 1.37 0.94 n=5 1.58 1.66 1.27 1.16 n=10 1.60 1.54 1.57 1.47 n=15 1.61 1.57 1.59 1.53

Tabella 4.2: Scarto quadratico medio per recommender che utilizza solo le preferenze con una Fixed-Neighbourhood Similarity Pearson Euclidean Log-Likelihood Tanimoto n=2 1.97 0.51 0.59 1.14 n=5 1.56 0.96 1.10 1.05 n=10 1.46 1.50 1.43 1.23 n=15 1.52 1.42 1.34 1.21

Tabella 4.3: Scarto quadratico medio per recommender che utilizza le categorie di interesse con una Fixed-Neighbourhood Similarity Pearson Euclidean Log-Likelihood Tanimoto t=0.95 1.35 0.60 NaN NaN t=0.9 1.35 0.61 NaN NaN t=0.85 1.47 0.61 NaN NaN t=0.8 1.46 0.61 1.22 NaN t=0.75 1.46 0.61 1.23 NaN t=0.7 1.47 0.61 1.23 NaN

Tabella 4.4: Scarto quadratico medio per recommender che utilizza solo le preferenze con una Threshold-Neighbourhood 92

Similarity Pearson Euclidean Log-Likelihood Tanimoto

t=0.95 1.36 0.71 NaN NaN

t=0.9 1.36 1.41 NaN NaN

t=0.85 1.28 1.38 NaN NaN

t=0.8 1.26 1.32 0.67 NaN

t=0.75 1.26 1.30 0.64 NaN

t=0.7 1.25 1.37 0.69 NaN

Tabella 4.5: Scarto quadratico medio per recommender che utilizza le categorie di interesse con una Threshold-Neighbourhood ` E da mettere in evidenza il fatto che, osservando le prime due tabelle (Tab. 4.2 e Tab. 4.3 ), il metodo che tiene conto delle categorie di interesse di un utente per trovare linsieme di Neighbourhood ` sempre migliore di quello che utilizza e semplicemente i dati delle preferenze fornito da Mahout e lo ` ancora di pi` se e u si prendono solo gli utenti pi` simili. u Nelle tabelle successive(Tab. 4.4 e Tab. 4.5 ) invece non abbiamo una divisione cos` netta dei risultati sperimentali. ` E possibile mettere meglio in luce questa dierenza osservando la Fig. 4.1 che rappresenta i risultati ottenuti con degli istogrammi.

Preferences Fixed-Neighbourhood
2 1.8

Categories Fixed-Neighbourhood
2

Score

1.4 1.2 1 2 4 6 8 10 12 14 16

Score

1.6

1.5 1 0.5 2 4 6 8 10 12 14 16

Nighbourhood Size Preferences Threshold-Neighbourhood


1.4

Nighbourhood Size Categories Threshold-Neighbourhood


1.4

Score

Score
0.7 0.75 0.8 0.85 0.9 0.95

1.2 1 0.8 0.6

1.2 1 0.8 0.6 0.7 0.75 0.8 0.85 0.9 0.95

Threshold
Pearson; Euclidean;

Threshold
Log-Likelihood; Tanimoto

Figura 4.1: Graci che rappresentano landamento degli score nei dierenti recommender

93

4.4

Selezione del Recommender

Una volta eettuate tali prove empiriche, per ottimizzare le prestazioni dei recommender ` suciente congurarli secondo quelli che sono i parametri che e hanno ricevuto uno score pi` basso nella fase sperimentale. u Ovvero, per il recommender che prende in considerazione le preferenze degli utenti e stabilisce una Neigbourhood sulla base di questi, la scelta ricade su una EuclideanSimilarity con una Threshold Neigbourhood. Per il recommender che stabilisce linsieme di neighbourhood, misurando la similitudine degli utenti sulla base delle categorie, la scelta ricadr` su di una a FixedNeighbourhood con EuclideanSimilarity.

94

Capitolo 5

Conclusioni
Intime ` un social network per il browsing video che risponde alle esigenze dee gli ultimi anni: ovvero di rendere le applicazioni Web capaci di gestire grandi quantit` di dati e di permettere agli utenti di navigare agevolmente tra questi. a Intime risponde alle due principali sde proprie dei social network intelligenti: il ltraggio dei contenuti informativi di Internet realizzato attraverso Recommendation di contenuto per ogni utente e la prolazione automatica che rende ogni utente diverso dagli altri, associandogli dati che lo contraddistinguano. Sono stati raggiunti tutti gli obiettivi pressati per il progetto, in quanto le stime sulle raccomandazioni di video sono positive ed ` possibile categorize zare ecacemente video e risorse, alloscuro degli utenti, utilizzando le loro annotazioni. Tali risultati sono stati ottenuti mediante luso di strategie consolidate e implementate solidamente in framework largamente utilizzati nel campo del Web, in grado di rendere lapplicazione scalabile e pronta a sostenere un traco di dati in costante aumento come succede per la maggior parte delle applicazioni Web. Intime, inoltre, dispone di WikipediaMiner: un ecace strumento in grado di utilizzare il contenuto informativo di Wikipedia per vari scopi, come ad esempio, per determinare la vicinanza semantica tra pi` concetti. u Il sistema funziona completamente in modo automatico e migliorer` sia le sue a raccomandazioni che la categorizzazione delle risorse con il crescere delle iscrizioni al network e laumentare del dataset delle preferenze. Per le Recommendation ` stato sviluppato un sistema in grado di agire diversae mente in base a diverse esigenze; nel caso in cui lutente si sia appena connesso sono state prese in considerazione le categorie di interesse di Facebook per riuscire a restituire delle Raccomandazioni coerenti con i suoi interessi, mentre nel caso in cui lutente operi attivamente nel network, per esempio guardando video e votandoli, gli verranno fornite delle nuove raccomandazioni coerenti con la sua attivit`. Inne, per quel che riguarda i suggerimenti di nuovi contenuti, a il network ` pronto a sostenere grandi quantit` di dati in quanto un algoritmo e a distribuito di Recommendation si occupa di fornire periodicamente nuove valide raccomandazioni agli utenti. 95

Per la prolazione si ` deciso di caratterizzare ogni utente in base a delle cae tegorie di interesse: gi` dal primo accesso si avr` nella propria pagina alcune a a categorie e per ognuna di queste una lista di risorse suggerite corrispondenti a pagine di Wikipedia, ` possibile selezionare alcune di queste e trascinarle in e unapposita lista di risorse di interesse. In questo modo sar` possibile per gli a utenti curare il proprio prolo sulla base di quelle categorie e risorse di interesse selezionate in modo automatico dal sistema: ogni azione compiuta come apporre un commento su un video o selezionare risorse di interesse comporter` delle a modiche sulla propria pagina del prolo. Il sistema acquisisce dati mediante lattivit` degli utenti sui video e sulla pagina a del proprio prolo: su ogni video ` possibile commentare ogni singolo frame e e porre annotazioni relative a pagine di Wikipedia o ad utenti di Facebook; sulla pagina del prolo ` possibile curare i propri interessi, selezionandoli tra le altere native proposte dal sistema in base alla propria attivit`. a ` E stato raggiunto pienamente il presupposto di social network, poich il sistema e di notiche interno, e quello tramite Facebook, tiene aggiornati gli utenti sulle azioni che li riguardano, cos` da poter tenere sempre sotto controllo le proprie preferenze. Linterfaccia del sistema ` stata sviluppata rispettando i principi di usabilit`. e a Molto soddisfacente ` anche la compatibilit` cross-browser, in quanto la Web e a Application ` pienamente funzionante sugli ultimi browser pi` conosciuti. In e u particolare sono stati eseguiti test su: Mozilla Firefox, Google Chrome, Safari, Opera e Internet Explorer.

5.1

Sviluppi futuri:

Volendo concludere vengono presentati quelli che, secondo il candidato, sono possibili miglioramenti o futuri sviluppi del sistema:
essendo in continuo aumento la tendenza di accedere accedere ai social network da dispositivi mobili, deve essere progettata uninterfaccia apposita che permetta una navigazione agevole per questo tipo di dispositivi potrebbe essere implementato un meccanismo automatico per individuare i punti salienti di un video in modo da semplicare la navigazione del suo contenuto data la natura semantica di Intime, ` necessario esprimere la semantica e contenuta nelle pagine nel formato RDFa, ovvero tramite triple del tipo (soggetto, predicato, complemento). Per raggiungere tale scopo pu` essere o utilizzato il formato di markup GRDDL, capace di estrarre i dati RDF dalle pagine XHTML per estrarre informazioni dai video, oltre alle annotazioni sui commenti, potrebbero essere utilizzati algoritmi di analisi dei video che utilizzino procedure tipiche della Computer Vision

96

le scelte fatte per i recommender in real-time tengono conto del dataset delle preferenze attuale; ` probabile che gli sviluppi successivi del network e portino a considerazioni di tipo dierente. Non ` possibile stabilire a priori e quali saranno le congurazioni ottimali dei recommender in futuro con il crescere del dataset; solo un test empirico sui nuovi dati potr` ssare quali a siano le congurazioni pi` adatte da adottare u linstallazione di WikipediaMiner utilizza dei dump di Wikipedia risalenti al 22 Luglio 2011, poich Wikipedia ` continuamente in evoluzione sar` e e a necessario utilizzare dei dump pi` recenti per avere dati pi` aggiornati. u u linterfaccia e lusabilit` del sistema dovrebbe essere ulteriormente miglioa rata. Per un nuovo utente connesso al network pu` risultare non molto o intuitiva

97

Appendice A

Screenshot delle Pagine Web


Lappendice contiene le sreenshot delle seguenti pagine web: 1. Home Page 2. Video Suggestion Page 3. Video Page 4. Prole Page 5. Resource Page 6. Category Page

98

Figura A.1: Home Page

99

Figura A.2: Video Suggestion Page

100

Figura A.3: Video Page

101

Figura A.4: Prole Page 102

Figura A.5: Resource Page

103

Figura A.6: Category Page

104

Elenco delle gure


2.1 2.2 2.3 2.4 2.5 2.6 2.7 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 4.1 Fenomeno del Long Tail . . . . . . . . . . . . . . . . . . . . . Fenomeno del Long Tail in termini di un recommender video Cosine similarity and Pearson correlation for centered data . . Tanimoto similarity . . . . . . . . . . . . . . . . . . . . . . . . Fixed-size neighbourhood . . . . . . . . . . . . . . . . . . . . . Threshold-based neighbourhood . . . . . . . . . . . . . . . . . . Raccomandazione tramite matrice di co-occorrenza . . . . . . . Logo di Apache Hadoop . . . . . . . . . . . . . . . Logo di Apache Mahout . . . . . . . . . . . . . . . Relazione di Mahout con altri progetti Apache . . Intime: architettura web . . . . . . . . . . . . . . . Ricerca . . . . . . . . . . . . . . . . . . . . . . . . Correzione . . . . . . . . . . . . . . . . . . . . . . . drag-and-drop di una risorsa . . . . . . . . . . . . . Tooltip della risorsa Nirvana . . . . . . . . . . . . . Scrollbar . . . . . . . . . . . . . . . . . . . . . . . . Logo MediaWiki . . . . . . . . . . . . . . . . . . . Algoritmo con matrice di co-occorrenza in Mahout Suggerimento di una nuova categoria di interesse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 8 11 12 14 15 18 23 24 25 28 30 31 42 51 52 63 74 88

Graci che rappresentano landamento degli score nei dierenti recommender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Home Page . . . . . . Video Suggestion Page Video Page . . . . . . Prole Page . . . . . . Resource Page . . . . Category Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

93 99 100 101 102 103 104

A.1 A.2 A.3 A.4 A.5 A.6

105

Listings
3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 3.20 3.21 3.22 3.23 3.24 3.25 3.26 3.27 3.28 3.29 3.30 3.31 3.32 3.33 3.34 3.35 3.36 Drag-and-Drop: Dichiarazione elementi Draggable e Droppable . Drag-and-Drop: Dichiarazione liste sortable connesse . . . . . . . Drag-and-Drop: Dichiarazione lista interest content come Sortable Autocomplete: Dichiarazione form autocomplete . . . . . . . . . Autocomplete: Campo di inserimento nuova categoria . . . . . . Blueimp: inizializzazione delluploader . . . . . . . . . . . . . . . Blueimp: costruttore uploader php . . . . . . . . . . . . . . . . . Blueimp: uploader php . . . . . . . . . . . . . . . . . . . . . . . . Chiamata asincrona . . . . . . . . . . . . . . . . . . . . . . . . . Chiamata asincrona: inizializzazione . . . . . . . . . . . . . . . . Chiamata asincrona: passaggio parametri . . . . . . . . . . . . . Chiamata asincrona: esecuzione . . . . . . . . . . . . . . . . . . . Upload transcoding . . . . . . . . . . . . . . . . . . . . . . . . . . Tooltips: semplice dichiarazione tooltip BeautyTips . . . . . . . . Tooltips: Dichiarazione tooltip immagini delle suggestions . . . . Scrollbar: Inizializzazione . . . . . . . . . . . . . . . . . . . . . . MediaElements.js: HTML5 . . . . . . . . . . . . . . . . . . . . . MediaElements.js: inizializzazione del player . . . . . . . . . . . . FFmpeg: installazione su Ubuntu . . . . . . . . . . . . . . . . . . Facebook PHP SDK: inizializzazione della libreria Facebook . . . Facebook PHP SDK: ottenere informazioni sulla connessione . . Facebook PHP SDK: ottenere le informazioni base sullutente . . Facebook PHP SDK: ottenere il link per la connessione a Facebook Facebook PHP SDK: ottenere il link per la disconnessione da Facebook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Facebook PHP SDK: ottenere i likes di Facebook dellutente . . . Facebook JavaScript SDK: inizializzare la libreria . . . . . . . . . Facebook JavaScript SDK: ottenere lo stato di connessione . . . Facebook JavaScript SDK: ottenere informazioni circa lutente . Facebook JavaScript SDK: ottenere i likes Facebook di un utente Facebook JavaScript SDK: mettere un post in bacheca di un amico Facebook JavaScript SDK: ottenere gli amici di un utente . . . . Trigger: ricopia unistanza dalla tabella preferences alla preferences last . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trigger: elimina listanza pi` vecchia se la dimensione della tau bella supera le 100000 istanze . . . . . . . . . . . . . . . . . . . . Connessione JDBC: Mahout API . . . . . . . . . . . . . . . . . . Recommender: Cold Start . . . . . . . . . . . . . . . . . . . . . . Recommender: la classe IntimeGenericUserBasedRecommender . 106 41 41 42 43 44 45 46 47 48 48 49 49 50 50 51 52 53 53 54 58 58 58 59 60 60 61 61 62 62 62 63 67 67 69 69 70

3.37 3.38 3.39 4.1

Recommender: un piccolo esempio di output json . . . . Recommender: fase successiva alla cold start . . . . . . File sql.php per generare lsql a partire da un singolo le Mahout: evaluate di un recommender . . . . . . . . . .

. . . . . . . . . . di output . . . . .

70 71 76 91

107

List of Algorithms
1 2 3 4 User based recommender . . . . . . Item based recommender . . . . . . Slope-One: precomputation . . . . . Slope-One: recommender algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 16 16

108

Elenco delle tabelle


2.1 2.2 4.1 4.2 4.3 4.4 4.5 Tabella delle preferenze: un esempio . . . . . . . . . . . . . . . . Tanimoto e Log-Likelihood Similarity: un esempio . . . . . . . . Evaluate di un recommender . . . . . . . . . . . . . . . . . . . . Scarto quadratico medio per recommender che utilizza solo le preferenze con una Fixed-Neighbourhood . . . . . . . . . . . . . Scarto quadratico medio per recommender che utilizza le categorie di interesse con una Fixed-Neighbourhood . . . . . . . . . . . Scarto quadratico medio per recommender che utilizza solo le preferenze con una Threshold-Neighbourhood . . . . . . . . . . . Scarto quadratico medio per recommender che utilizza le categorie di interesse con una Threshold-Neighbourhood . . . . . . . . . 9 13 90 92 92 92 93

109

Bibliograa
[1] M. Bertini, A. Del Bimbo, A. Ferracani, and D. Pezzatini, A social network for video annotation and discovery based on semantic proling, in Proc. of International World Wide Web Conference (WWW) - DEMO Session, Lyon, France, 2012. [Online]. Available: http://www.micc.uni.it/publications/2012/BDFP12 [2] A. Tscher and M. Jahrer, The BigChaos Solution to the Netix Grand o Prize, 2009. [3] Y. Koren, The BellKor Solution to the Netix Grand Prize, 2009. [4] M. Piotte and M. Chabbert, The Pragmatic Theory solution to the Netix grand prize, Aug. 2009. [5] C. Anderson, The Long Tail, 2009. [6] A. Rajaraman and J. D. Ullman, Mining of Massive Datasets. Cambridge University Press, July 2012. [7] D. Goldberg, D. Nichols, B. M. Oki, and D. Terry, Using collaborative ltering to weave an information tapestry, Commun. ACM, pp. 6170, Dec. 1992. [8] T. Segaran, Programming Collective Intelligence: Building Smart Web 2.0 Applications. OReilly, 2007. [9] A. M. Daniel Lemire, Slope One Predictors for Online Rating-Based Collaborative Filtering, Apr. 2005. [10] T. White, Hadoop: The Denitive Guide. OReilly, june 2009.

[11] G. Ingersoll, Introducing Apache Mahout, Sep. 2009. [Online]. Available: http://www.ibm.com/developerworks/java/library/j-mahout/ index.html?S TACT=105AGX01&#38;S CMP=HP [12] E. Gamma, R. Helm, R. Johnson, and J. Vlissides, Design Patterns. Addison-Wesley, January 1995.

110

Ringraziamenti
Per il percorso appena concluso ringrazio il Professor Alberto Del Bimbo, relatore del progetto e interlocutore paziente e disponibile. Esprimo, inoltre, gratitudine al Dott. Andrea Ferracani e al Dott. Daniele Pezzatini per lincoraggiamento intellettuale e pratico ricevuto e per la loro disponibilit` che ` stata cruciale nella realizzazione di questo progetto. Un aiuto a e prezioso e costante mi ` stato dato dal Dott. Tiberio Uricchio che mi ha facilie tato la risoluzione di alcuni problemi pratici sorti in itinere. La collaborazione di queste persone mi ha fatto maturare e capire che il lavoro di squadra pu` sempre essere approfondito e migliorato ed ` attivit` in progress, o e a fruttuosa nelle esperienze future. Un ringraziamento speciale al mio collega Francesco Gelli con il quale ho lavorato in modo collaborativo e costante traendo sostegno in tutto il periodo di svolgimento dellelaborato. Le persone a me pi` vicine, che hanno contribuito in maniera pi` indiretta alla u u realizzazione di questa tesi e mi hanno oerto opportunit` di dialogo, come pure a numerosi incoraggiamenti nei momenti pi` dicili, sono state elemento fondante u per la conclusione del lavoro.

111

Das könnte Ihnen auch gefallen