Tag Archives: Algoritmo

Opinion spam: un nuovo algoritmo becca le recensioni false

Alla recente conferenza WWW tenutasi a fine aprile sono state presentate, come ogni anno, una nutrita serie di documenti e studi che proponevano nuove metodologie per meglio comprendere e analizzare il web.

Opinion spammingUna parte delle paper presentate alle conferenze WWW riguardano spesso nuovi algoritmi per classificare informazioni, fare il ranking di risorse o individuare lo spam. In altre parole, algoritmi di information retrieval, la disciplina su cui si basa la tecnologia dei motori di ricerca.

Leggere i documenti presentati ad ogni conferenza è un buon modo per capire di che cosa sono teoricamente capaci gli ingegneri dei motori di ricerca o di altri servizi web che gestiscono grandi quantità di dati. Io ritengo che le informazioni acquisite leggendo questi documenti siano molto più significative di quelle che si acquisiscono leggendo i brevetti degli algoritmi di Google.

Quest’anno, un documento in particolare ha attratto la mia attenzione e vi linko anche il PDF: “Spotting Fake Reviewer Groups in Consumer Reviews“.

Si tratta di una nuova metodologia chiamata GSRank, nata per individuare attività di opinion spamming e in particolare gruppi di recensori falsi tra quelli veri e genuini che scrivono recensioni o opinioni sui portali di prodotti o servizi.

Il documento non è scritto in inglese molto scorrevole e rutta anche un po’ di matematica; il presente articolo ha l’obiettivo spiegarvi questa nuova metodologia in modo che chiunque possa capirla.

L’articolo continua, leggi il resto… »

Whatsup 0.2: rinominare i cluster

Whatsup è e rimarrà uno strumento semplice, votato all’appoccio KISS.

La ragione di tale scelta è che dovrà macinare informazioni che gli arrivano da Google in qualche modo già filtrate; il fatto che si tratti delle keyphrase che mostrano un picco di ricerche, rappresenta a tutti gli effetti una prima selezione operata dagli stessi utenti, prima ancora che dal motore di ricerca.

Tuttavia l’esiguità dei dati ed il fatto che l’approccio al clustering sia strettamente statistico, impone dei limiti nel momento in cui si vuol tentare di migliorare un po’ il risultato.

Uno dei due obiettivi della versione 0.2 di Whatsup era quello di rivedere i nomi da assegnare alle categorie (parlo al passato perché nel momento in cui scrivo è già pronta la versione 0.3).

Nella versione 0.1 i nomi dei cluster erano scelti estraendo semplicemente la singola parola più frequente nelle keyphrase, spostando in un cluster così nominato le keyphrase che contenevano la parola stessa e ripetere il processo cercando la nuova parola più frequente nelle keyphrase rimanenti.

Se date un’occhiata all’immagine della mappa mentale pubblicata sul post iniziale di Whatsup 0.1, noterete che i cluster prodotti con questo criterio presentavano parole quasi sempre ben correlate con il nome del cluster, ma a volte la scelta era “sgraziata”.

Per esempio il cluster che conteneva le keyphrase “asse terrestre” e “asse terrestre spostato” acquisiva semplicemente il nome “terrestre”.

Nella versione 0.2 di Whatsup sono stati dunque aggiunti dei controlli per rinominare ciascun cluster con espressioni di due o più parole contigue (si veda Ngram), purché presenti più di una volta nelle keyphrase associate al cluster stesso.

Potete osservare il risultato della modifica nell’immagine presente su questa pagina.

Mappa realizzata con XMind di un cluster creato da Whatsup 0.2

Mappa realizzata con XMind di un cluster creato da Whatsup 0.2

La soluzione funziona molto bene con i nomi propri di persone perché naturalmente composti da almeno due parole. E l’osservazione può essere ovviamente estesa anche ai nomi propri in genere, come si può notare dalla presenza di un cluster chiamato “explorer 9”.

Esiste tuttavia un rischio nel rinominare i cluster in questo modo: assegnando un nome più specifico ci si allontana dalla genericità attorno alla quale il cluster è stato costruito. Il che significa che una volta rinominato, il cluster potrebbe presentare al proprio interno keyphrase generiche concettualmente più distanti dal nuovo nome.

Questo effetto negativo non si coglie dall’immagine allegata al presente post ma non mancherò di farvelo notare nelle prossime clusterizzazioni quando capiterà. Va detto però che tale problema è stato minimizzato con l’acquisizione di una maggiore quantità di keyphrase, come spiegherò quando tratterò la versione 0.3 del software.

Ho anche scritto che la rinominazione dei cluster era il primo di due obiettivi che mi ero posto di raggiungere nella versione 0.2; qual’era il secondo?

Come potete notare nell’immagine, alcune keyphrase appaiono in neretto e sono le keyphrase che l’algoritmo giudica più “importanti” di altre. Nel prossimo post scriverò come tale selezione è stata operata.

Whatsup 0.1: tipologia dei dati e algoritmo di clustering

L’algoritmo di clustering che ho sviluppato è estremamente semplice ma riesce ad ottenere discreti risultati nonostante l’esiguità di dati.

Il “nonostante” si applica perché in Information Retrieval la bontà di molte soluzioni non si fonda principalmente sulla qualità degli algoritmi bensì sulla qualità delle informazioni sulle quali gli algoritmi devono lavorare.

Uno stesso algoritmo può produrre risultati scadenti se applicato a pochi dati e risultati ottimi se applicato a basi di dati molto grandi. Google non è il leader nell’IR solo perché sviluppa buoni algoritmi ma anche perché disponde di una gigantesca quantità di informazioni sulla quale farli macinare.

Le informazioni prese in esame da Whatsup sono le keyphrase cercate dagli utenti su Google e, trattandosi nello specifico delle sole keyphrase che in un dato istante mostrano un picco di ricerche, la loro quantità è limitata. Attraverso i metodi che sto sfruttando al momento, la quantità delle keyphrase “hot” che è possibile estrarre da Google varia da 100 a 200 elementi.

Fortunatamente, nonostante la quantità non sia alta, i dati possiedono caratteristiche che vengono facilmente incontro anche all’algoritmo di clustering più semplice. In particolare, gli utenti sul Web cercano informazioni su uno specifico soggetto digitando ricerche molto diverse, varianti che fanno uso di sinonimi e altre che ripropongono le stesse parole in ordine differente.

A seguito di un’estrazione di keyphrase “di picco” da Google capita quindi che diverse di esse facciano riferimento allo stesso tema, usando parole e variazioni leggermente diverse, ma facilmente accomunabili da una o più parole in comune.

Di fronte a questi elementi di similarità, ho pensato che buoni risultati potessero essere ottenuti anche con un semplice algoritmo di clustering che cercasse nelle keyphrase la presenza di parole “importanti”. Ma cosa si intende per “importante”?

Il concetto di importanza va definito. Nel contesto in cui sto operando, ovvero un elenco di keyphrase “hot”, una parola che posso considerare importante potrebbe essere una parola che si ripete in più keyphrase. Più sono le keyphrase in cui la parola è presente e più essa può essere considerata importante per questo specifico contesto.

Tradotto in numeri, significa che il mio concetto di importanza si può limitare per il momento a calcolare la frequenza di ciascuna parola all’interno del corpus (in questo caso l’elenco delle keyphrase) e considerare importanti i termini che sono più frequenti.

Il metodo funziona bene solo se tiene conto del fatto che esistono particelle linguistiche che possono apparire frequentemente nelle keyphrase (articoli, preposizioni, ecc.) ma che non dovrebbero essere considerate importanti.

Le soluzioni per evitare che le particelle del discorso frequenti in lingua italiana inficino i risultati, sono sostanzialmente due: usare una lista di stop words oppure riuscire ad assegnare un peso inferiore o nullo a tali termini sfruttando statistiche su un corpus più grande.

Nonostante io possieda un grande storico delle ricerche su Google (in particolare su Google News), nella versione 0.1 di Whatsup mi sono limitato a usare una semplice lista di stop words. E’ stato veloce, indolore ed i risultati non sono niente male. Ovviamente le versioni successive di Whatsup preferiranno implementare soluzioni basate sull’analisi di dati storici.

Ho preso una lista di stop words italiane da qua, ne ho aggiunta qualcuna che mancava all’appello (es: “quando”) e ho prodotto una seconda lista di termini molto generici, come “news”, “notizie”, “video” o “ansa”. Ho infatti deciso di gestire normalmente questi termini tranne che durante la scelta dei nomi da attribuire ai cluster, che desidero incentrare su parole più specifiche.

Ecco dunque di seguito l’algoritmo finale di Whatsup 0.1, già obsoleto nel momento in cui scrivo ma che vi riporto perché nei post successivi sarà più facile spiegare il motivo di alcuni cambiamenti fatti nelle versioni successive del software, via via che ho acquisito visibilità sulla qualità della classificazione.

Mappa mentale con il risultato di Whatsup v0.1

Primo clustering fatto a mano con XMind

  1. Estraggo la parola più frequente nelle keyphrase (escludendo le stop words)
  2. Creo un cluster e lo chiamo come la parola trovata
  3. Assegno al cluster tutte le keyphrase che contengono la parola
  4. Una volta che una keyphrase viene assegnata ad un cluster, viene tolta dal bacino di keyphrase dalle quali estrarre, al prossimo giro, la nuova parola più frequente
  5. Prossimo giro: si torna al punto 1 fino a quando ci saranno parole ripetute in almeno due keyphrase diverse
  6. A questo punto rimarranno solo keyphrase che non contengono alcuna delle parole usate per dare nome ai cluster. Per ciascuna keyphrase non assegnata, l’assegno al cluster che condivide con essa la quantità maggiore di parole.
  7. Tutto ciò che rimane termina in un cluster speciale che chiamo “UNCATEGORIZED”

Pubblico nuovamente l’immagine con il risultato del clustering dell’algoritmo appena descritto.

Nei prossimi post vedremo i limiti del presente approccio e che cosa ho deciso di cambiare nelle versioni successive di Whatsup.