Sentiment analysis, il mio approccio

La mia app PolisTweet colleziona tweet popolari dei politici italiani. Ho recentemente reso disponibile una sezione di Analisi dei Sentimenti, che mostra in che modo la comunicazione politica su Twitter sia polarizzata rispetto ai sentimenti trasmessi, e quale tipologia di contenuto (positivo, negativo, neutrale riguardo la carica emotiva delle parole utilizzate) sia più gradito dai follower. Ho deciso di focalizzarmi sulla comunicazione da parte degli influencer di Twitter, anziché optare per il classico approccio che studia il sentimento espresso dalle reazioni degli utenti.

Il Dizionario delle Radici

Dopo aver studiato e testato i migliori approcci attuali alla Sentiment analysis (regole grammaticali sintattico-semantiche, metodi euristici, metodi combinati), ho deciso di sviluppare una soluzione ottimizzata per i contenuti generati su Twitter.

Gli utenti di Twitter tendono ad utilizzare molti hashtags e parole aggregate, quindi un classico algoritmo basato su dizionario non riesce a riconoscere molte parole presenti nel testo. Ho creato un nuovo dizionario, che comprende solo la radice di ogni parola (ad esempio la radice “buon” per le parole: buono, buona, buone, buoni, buonissimo etc.) e l’ho utilizzato per cercare le radici all’interno di ogni parola di un certo tweet (così che ad esempio, la radice “buon” sia riconosciuta all’interno dell’hashtag #lavoltabuona).

Il dizionario di radici italiano è un file di testo, in cui ogni riga contiene una radice ed un punteggio positivo o negativo (nel range -5/+5), separati da una tabulazione. Un estratto del dizionario inglese (le tabulazioni sono sostituite da spazi doppi):

aghast	  -2
agog  	2
agonis	  -3
agoniz	  -3
agree	  1
alarm	  -2
alas	  -1
alert	  -1

Ora, uso il codice seguente per importare i dati dal mio file di dizionario:

function get_dictionary () {
  $dictionary = array();
  $rows = explode("\n", file_get_contents('./dictionary-roots.txt'));
  foreach ($rows as $val) {
    list($word,$score) = explode("\t", $val);
    $dictionary[$word] = $score;
  }
  return $dictionary;
}

Il dizionario è utilizzato dalla funzione get_sentiment, che compara il testo del tweet con ogni radice e calcola un punteggio. Le radici associabili a un sentimento eventualmente contenute nel nome dell’account Twitter di riferimento sono ignorate (esempio: la radice “forz” usata da alcuni esponenti del partito Forza Italia). Il punteggio finale è diviso per il numero di parole del tweet, per bilanciare i punteggi più alti generati da contenuti più lunghi.

function get_sentiment ($text='', $twitter_account='', $dictionary='') {
  $word_count = str_word_count($text);
  // CHECK FOR EMPTY CONTENT
  if ($word_count == 0) {
    return 0;
  }
  // CHECK FOR EMPTY DICTIONARY
  if ($dictionary=='') {
    $dictionary = get_dictionary();
  }
  $total_score = 0;
  foreach ($dictionary as $word => $score) {
    // COUNTERACT TWITTER ACCOUNT NAME INFLUENCE
    if ($twitter_account!='' && stripos($twitter_account, $word) !== false) {
      continue;
    }
    $total_score += $score * substr_count(strtolower($text), strtolower($word));
  }
  // COMPARE TOTAL SCORE TO TOTAL WORD COUNT
  $final_score = round( $total_score * 100 / ($word_count + 2) );
  return $final_score;
}

Puoi scaricare il Dizionario delle Radici dalla pagina Github del progetto.

Lavori che hanno usato il Dizionario delle Radici

Questo lavoro ha costruito un dizionario combinando il mio Dizionario delle Radici con altre due fonti.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *