Ricerca autonoma di informazioni (focused e intelligent crawler): valutare tecniche di crawling intelligente sul social network TWITTER per trovare informazioni rilevanti impiegando non solo le search API.
Un tool per cercare TWEET su un determinato TOPIC utilizzando tecniche di clustering e crawling intelligente.
- NewsAPI: libreria REST per cercare e recuperare articoli (news) da tutto il web e popolare il database delle news;
- Unirest4j: comoda libreria per fare richieste HTTP;
- BoilerPIPE: libreria Google per estrarre testo dalle pagine HTML;
- TAGme4j: TagMe API client per applicazioni Java;
- MONGOdb: database noSQL per la memorizzazione semplice dei dati persistenti;
- Jongo: libreria per fare il cast al volo dei dati estratti da mongoDB nelle relative classi;
- WEKA: libreria per eseguire gli algoritmi di apprendimento automatico e di data mining;
- TWITTER4j: libreria per interfacciarsi con le API e lo stream di twitter.
- NewsAPI: newsAPI previa registrazione gratuita sul sito;
- TagMe: apikey previa registrazione gratuita sul sito;
- Twitter: apikey + apiSecret previa registrazione gratuita sul sito;
- Twitter4j: properties previa autenticazione e via OAUTH dalla classe sopra (vedi file .env generato).
N.B. Ogni passo della classe Main è autocontenuto ed apparte alcune dipendenze dei parametri dei metodi, ogni passo può essere eseguito in maniera totalmente indipendente dagli altri in quanto memorizza/preleva dati direttamente dal database.
E' necessario creare preliminarmente i seguenti database Mongo con le seguenti collezioni:
- tfc -> news, news2annotations, label1, label2, label3, cluster0, cluster1, cluster2, cluster3;
- twitterDB -> en, smooth, tweet2hashtag, hashtag2vec, tweetONtopic, wordsONtopic.
- CLUSTERING ONE - ottenuto dal testo delle news filtrando le stopwords ed eseguendo stemming del testo per poi utilizzare il TF-IDF per clusterizzare
newsController.newsExtractionAndSave()
: crea e popola il database di news, estraendo il contenuto delle news ed effettuando stopwords e stemming;newsController.newsCleaning()
: ripulisce il db da eventuali news senza testo;clusteringOneController.createMatrix()
: calcola i tf-idf delle parole estratte e crea la matrice per eseguire il clustering;fileController.saveCluster(1)
: crea il file arff per il training;cluster1 = clusteringOneController.executeCluster()
: esegue il clustering.
- CLUSTERING TWO - ottenuto dal testo delle news e basato sulla probabilità dei link delle annotazioni di TagMe
newsController.annotationsExtractionAndSave(sogliaMinimaLink)
: estrae le annotazioni dal testo delle news con TAGME4jnewsController.news2AnnCleaning()
: ripulisce il db da eventuali news senza annotazioni;cluster2_matrix = clusteringTwoController.createMatrix()
: salva le probabilità dei link di TAGME sopra una certa soglia e crea la matrice per eseguire il clustering;fileController.saveCluster(2)
: crea il file arff per il training;cluster2 = clusteringTwoController.executeCluster()
: esegue il clustering.
- CLUSTERING THREE - clustering del clustering di supporto (clustering 0) creato con il grado di relatività tra annotazioni di TagMe e basato sulla media delle probabilità dei link delle annotazioni di TagMe all'interno dei cluster
clusteringThreeController.createMatrix0()
: crea la matrice per addestrare il clustering di supporto con il grado di relatività tra annotazioni TAGME;fileController.saveCluster(0)
: crea il file arff per il training del clustering di supporto;cluster0 = clusteringThreeController.executeCluster0()
: esegue il clustering di supporto;clusteringThreeController.createMatrix(cluster0, cluster2_matrix)
: crea la matrice per addestrare il clustering finale;fileController.saveCluster(3)
: crea il file arff per il training del clustering finale;cluster3 = clusteringThreeController.executeCluster()
: esegue il clustering finale.
- SMOOTHING STREAMS con Normalized Stupid Backoff - focused crawler ottimizzato su un determinato lessico attuale (background) e addestrato su un determinato topic in continuo aggiornamento (coda runtime) che verrà selezionato in automatico tra i top topics dell'ultimo clustering e i topic ottenuti facendo uno stream di tutti i tweets di twitter per qualche giorno/settimana
TweetPopulate
: popola il background di twitter (lasciarlo in esecuzione per qualche giorno..);
topics = classifier.getTopics()
: estrae i top topic dal clustering three;tweetElaborator.elaborateBackground()
: elabora i tweet memeorizzati nel db in una forma tweet -> hashtag;tweetElaborator.createHashtag2vec(sogliaMinimaHashtag)
: estrae e memorizza solo gli hashtag che superano una certa soglia di tweet;common = tweetElaborator.findCommonTopic(topics)
: trova un topic in comune tra gli hashtag scelti ed i top topic del clustering three;tweetElaborator.createBackgroundForTopic(common)
: crea il background sul topic scelto memorizzando i tweet nel db;tweetElaborator.createWord2weight(sogliaMinimaWords)
: salva le probabilità rispetto alle parole contenute nel background model;
TweetSmoothingStreams
: apre lo stream di twitter ed esegue il focused crawler in real time memorizzando solo i tweet pertinenti.
Per quanto riguarda i clustering è evidente che sarebbe necessaria una maggiore ricchezza di news su cui basare i diversi clustering, che magari potrebbero scaturire da altre APIs (da testare) che magari renderebbero più ricca la base da cui far partire i clustering.
Per quanto riguarda lo smoothing stream invece sarebbe interessante creare un background di tweet molto più corposo, magari accumulando tweet per un intero mese e andarlo a integrare tenendo conto anche del CLUSTERING ONE come corpus linguistico; si vede infatti una notevole presenza di parole rumorose come FOLLOW o CLICK e altre, che dovrebbero essere rimosse in quanto non costituiscono contenuto informativo riguardante un topic in particolare.
Risulta poi difficile il settaggio della soglia di perplessità dello Smoothing Stream in quanto dipende fortemente dal numero di parole del tweet, quindi magari sarebbe interessante trovare un modo per settarlo in automatico, oppure modificare tale misura per renderla indipendente dal numero di parole del tweet.