Naive Bayes e Sentiment Analysis con Python
Come scrivere un programma in Python per distinguere tra una recensione positiva da una negativa o neutrale?
In questo articolo vediamo come usare Naive Bayes e Sentiment Analysis con Python sfruttando dei dataset in italiano.
Il procedimento è valido per qualsiasi tipo di lingua: infatti, trattandosi di un metodo supervisionato, sarà sufficiente fornire un dataset in input che contenga dei testi già classificati; questo ci permetterà di adattare il procedimento a qualsiasi lingua!
Intro
La sentiment analysis è un processo che permette di determinare se un testo esprime un contenuto positivo, negativo o neutrale. In altre parole, ci permette di chiedere al sistema di analizzare un testo e dirci che tipo di giudizio esprime.
Non a caso, la sentiment analysis è spesso associata all’opinion mining: in che modo possiamo misurare il giudizio degli utenti su una certa tematica?
I livelli di applicazioni di questo tipo di attività sono molteplici: nel settore dei social media, analizzare le emozioni degli utenti espresse tramite le varie reazioni o i post è fondamentale per finalità di marketing.
Non solo: in campo politico, tenere traccia delle opinioni politiche sfruttando i social media permette di anticipare e gestire al meglio le campagne elettorali; un esempio di come farlo, ce lo insegna Obama durante la sua corsa alla Presidenza nel 2008.
Gestire diverse lingue
L’analisi del sentiment sta diventando una parte sempre più importante della comunicazione a causa del numero crescente di persone che utilizzano attivamente i social media e i diversi canali online - attualmente contiamo circa 5 miliardi di persone per la precisione.
Se si considera che solo il 25,9% degli utenti di Internet parla inglese come madrelingua, l’analisi del sentiment in lingue diverse dall’inglese diventa sempre più importante; ecco perché questo processo nella sola lingua inglese non è sufficiente.
Riconoscendo che il sentimento è intrinsecamente legato alla lingua e alla cultura, riconoscere la lingua è un prerequisito fondamentale per questo tipo di analisi.
Senza identificare la lingua di un post sui social media, un algoritmo non sarà in grado di decifrare le informazioni sul giudizio!
Questa capacità, tuttavia, deve essere integrata nel modello utilizzato; semplicemente non è possibile coinvolgere dei linguisti umani per tradurre in inglese l’intero pool di post sui social media in lingua straniera e poi far assegnare loro un punteggio.
Detto questo, è giusto sottolineare che l’analisi del sentiment multilingue coinvolge molte risorse ed è ancora difficile trovare strumenti che eseguano effettivamente questa attività in più di una lingua contemporaneamente…
Ma come fare in italiano?
Classificare delle recensioni
Vediamo dunque come applicare l’analisi del sentiment per classificare delle recensioni; per farlo, utilizzeremo delle frasi tipo che descrivono il giudizio degli utenti rispetto ad un film che hanno appena visto.
Per valutare il sentiment è possibile usare diversi algoritmi, tra i quali la regressione logistica o Naive Bayes; questi permettono di calcolare la probabilità che un commento o una recensione sia positivo o negativo, partendo da alcuni dati pre-esistenti.
Se, ad esempio, leggessi la seguente recensione:
Film stupendo, pieno di colpi di scena, travolgente ed emozionante. Eccezionale!
saprei senza dubbio che si tratta di una recensione positiva.
Anche nel caso in cui leggessi:
Non capisco cosa ci sia di tanto eccezionale in questo film… tutti dicono che sia stupendo, ma è abbastanza banale.
è facile classificare il giudizio dell’utente come negativo.
Questo evidenzia un problema: esistono dei casi in cui delle parole negative vengano usate in un contesto positivo.
Quindi, non è sufficiente basarsi sulla presenza dei singoli termini positivi o negativi, ma è necessario calcolare la probabilità che un termine compaia in una recensione positiva o negativa che sia.
Nella sentiment analysis è possibile usare dei metodi supervisionati e non: nel primo caso, si ha un dataset etichettato dove le recensioni sono classificate; nel secondo caso, si associa un punteggio ad ogni termine presente in una lista di parole che sono polarizzate come positive o negative.
In questo caso d’uso, vediamo come sfruttare un metodo supervisionato avendo a disposizione dei dataset che sono già stati etichettati per classificare le recensioni come positive o negative (in fondo trovate tutti i riferimenti).
In particolare, andremo ad utilizzare Naive Bayes: si tratta di un metodo supervisionato che calcola la probabilità che un testo sia polarizzato positivamente o negativamente sulla base del dataset fornito.
Esempio
Per farlo, partiamo da un dataset molto semplice: lo scopo di questo articolo non è infatti trasformare il dataset, ma piuttosto, avendone uno pronto a disposizione, sfruttarlo per l’attività di sentiment analysis.
In prima battuta, consideriamo quindi il seguente dataset:
train2 = [("E' stata una bella esperienza", "positive"),
("Male recitato, male interpretato, pessimo", "negative"),
("Il miglior film che ho mai visto, incredibile", "positive"),
("Una perdita di tempo", "negative"),
("Ben diretto, ben recitato, mi è piaciuto, bellissimo", "positive"),
("Mi è piaciuta la fotografia e gli attori sono fantastici", "positive"),
("Davvero deluso di questo film", "negative"),
("Tutti i personaggi sono belli e ben interpretati", "positive"),
("Purtroppo faceva schifo", "negative"),
("Orribile e mediocre, sono orripilato", "negative")]
Ognuna di queste recensioni è stata classificata come positive o negative. Il dataset è molto piccolo, quindi il modello non sarà perfetto: sarà sufficiente utilizzare un dataset più completo!
A questo punto, procediamo nel pre-processare i nostri dati: come primo step, andiamo a rendere in minuscolo tutte le parole contenute in ogni frase presente nel nostro dataset, e creiamo un dizionario a partire da questo:
dictionary = set(word.lower() for passage in train2 for word in word_tokenize(passage[0]))
Dizionario creato a partire dal dataset
Fatto questo, creiamo l’insieme di train, dove andremo a creare una sorta di mapping tra le parole presenti nelle diverse frasi; creiamo quindi un dizionario dove andiamo a segnare le parole che, a partire da dictionary, sono presenti in ogni frase:
Nella prima frase sono presenti la parola “stata” e “bella”, che quindi vengono segnate come “True”
A questo punto, passiamo il nostro set di parole al classificatore, che in questo caso sarà NaiveBayesClassifier: come parametro, gli forniremo proprio l’insieme di train appena creato.
classifier = nltk.NaiveBayesClassifier.train(t)
Ci siamo quasi: il nostro classificatore ha usato i dati in input per creare un modello che adesso andremo a testare. Usiamo una frase fuori dal dataset iniziale e vediamo se riesce a classificare correttamente la recensione:
test_data = "Questo libro era terribile, sono orripilato"
test_data_features = {word.lower(): (word in word_tokenize(test_data.lower())) for word in dictionary}
>> negative
print(classifier.classify(test_data_features))
test_data2 = "Bellissimo, è stato incredibile"
test_data_features2 = {word.lower(): (word in word_tokenize(test_data2.lower())) for word in dictionary}
print(classifier.classify(test_data_features2))
>> positive
Ottimo! Il risultato, considerato il dataset iniziale, è un buono. Da non sottovalutare assolutamente di utilizzare dei dataset più completi: di seguito, alcune risorse utili per poter sfruttare dei dati in italiano per migliorare il modello appena creato.
Risorse utili
- Dataset SENTIPOLC
- Dataset T4SA
- Codice completo