Home
Machine Learning: accedere alle recensioni di IMDb

19 Gennaio 2018

Machine Learning: accedere alle recensioni di IMDb

di

Per capire che cosa pensa veramente il pubblico di un film ci si può fare aiutare dal calcolatore e da algoritmi smart.

[Riproduciamo un estratto da Machine Learning con Python di Sebastian Raschka, libro che accompagna nel mondo del machine learning e all’uso di Python come linguaggio ideale per interrogare i dati nel modo migliore.]

Accedere al dataset delle recensioni dei film di IMDb

L’analisi del sentiment, chiamata anche opinion mining, è una popolare branca del campo ben più ampio dell’elaborazione del linguaggio naturale (NLP). Il suo scopo è quello di analizzare la polarità dei documenti. Un compito molto diffuso nell’analisi del sentiment è la classificazione dei documenti sulla base delle opinioni e delle emozioni espresse dagli autori a proposito di un determinato argomento.

Lavoreremo con un grosso dataset di recensioni di film tratto da IMDb (Internet Movie Database) che è stato raccolto da Maas et al. (A. L. Maas, R. E. Daly, P. T. Pham, D. Huang, A. Y. Ng e C. Potts, Learning Word Vectors for Sentiment Analysis, in “Proceedings of the 49th Annual Meeting of the Association for Computational Linguistics: Human Language Technologies”, pp. 142–150, Portland, Oregon, USA, Giugno 2011, Association for Computational Linguistics). Il dataset è costituito da 50.000 recensioni di film, che sono state etichettate come positive o negative. Si intende che un film è stato valutato positivamente se ha ricevuto più di sei stelle su IMDb e negativamente se ha ricevuto meno di cinque stelle. Nei prossimi paragrafi, inizieremo a estrarre informazioni utili da un sottoinsieme di queste recensioni, per costruire un modello che sia in grado di prevedere se un determinato recensore ha apprezzato o meno un film.

Un archivio compresso del dataset di recensioni sui film (84.1 MB) può essere scaricato da http://ai.stanford.edu/~amaas/data/sentiment/.

  • Se utilizzate Linux o Mac OS X, potete aprire una nuova finestra del terminale, poi utilizzare il comando cd per accedere alla directory download ed eseguire il comando tar -zxfaclImdb_v1.tar.gz per decomprimere il dataset.
  • Se invece utilizzate Windows, potete scaricare un sistema di archiviazione gratuito come 7-Zip (http://www.7-zip.org) per estrarre i file dall’archivio scaricato.

Dopo aver estratto con successo il dataset, potete assemblare i singoli documenti testuali dall’archivio scaricato decompresso per formare un unico file CSV. Nella prossima sezione di codice, leggeremo le recensioni dei film all’interno di un oggetto pandas DataFrame, operazione che può richiedere anche una decina di minuti su un computer desktop standard. Per rappresentare i progressi e il tempo stimato prima del completamento, utilizzeremo il pacchetto PyPrind (Python Progress Indicator, https://pypi.python.org/pypi/PyPrind/) che l’autore del libro ha sviluppato alcuni anni fa proprio per questi scopi. PyPrind può essere installato eseguendo il comando pip install pyprind.

>>> import pyprind 
>>> import pandas as pd
>>> import os
>>> pbar = pyprind.ProgBar(50000)
>>> labels = {'pos':1, 'neg':0}
>>> df = pd.DataFrame()
>>> for s in ('test', 'train'):
... for l in ('pos', 'neg'):
... path ='./aclImdb/%s/%s' % (s, l)
... for file in os.listdir(path):
... with open(os.path.join(path, file), 'r') as infile:
... txt = infile.read()
... df = df.append([[txt, labels[l]]], ignore_index=True)
... pbar.update()
>>> df.columns = ['review', 'sentiment']
0% 100%
[##############################] | ETA[sec]: 0.000
Total time elapsed: 725.001 sec

Eseguendo il codice precedente, dobbiamo innanzitutto inizializzare una nuova barra di progressione (l’oggetto pbar) con 50.000 iterazioni, il numero di documenti che dobbiamo leggere. Utilizzando cicli for nidificati, abbiamo eseguito un’iterazione sulle sue directory train e test della directory principale aclImdb e abbiamo letto i singoli file di testo dalle subdirectory pos e neg che alla fine abbiamo aggiunto al DataFrame df, insieme a un’etichetta della classe intera (1 per positivo e 0 per negativo).

Poiché le etichette delle classi in un dataset assemblato sono ordinate, dobbiamo mescolare DataFrame utilizzando la funzione permutation del modulo np.random. Questo sarà utile poi per suddividere il dataset nei set di addestramento e di test nei prossimi paragrafi, quando trarremo i dati direttamente dall’unità dischi locale. Per comodità, memorizzeremo anche il dataset di recensioni assemblato e mescolato sotto forma di file CSV:

>>> import numpy as np 
>>> np.random.seed(0)
>>> df = df.reindex(np.random.permutation(df.index))
>>> df.to_csv('./movie_data.csv', index=False)

Confermiamo rapidamente di aver salvato con successo i dati nel formato corretto leggendo il file e stampando un estratto dei primi tre campioni:

>>> df = pd.read_csv('./movie_data.csv') 
>>> df.head(3)

Se state eseguendo gli esempi di codice in IPython Notebook, a questo punto dovreste vedere i primi tre campioni del dataset, come nella tabella seguente.

Campioni dal dataset IMDb
Recensione Sentiment
0 In 1974, the teenager Martha Moxley (Maggie Gr… 1
1 OK… so… I really like Kris Kristofferson a… 0
2 ***SPOILER*** Do not read this, if you think a… 0

 

Machine Learning con Python

A domanda, un buon dataset e l’appropriato codice Python rispondono.

  [Per scoprire ancora di più su Machine Learning con Python è possibile scaricare Indice, Introduzione e Capitolo 1, in formato PDF. Sono inoltre reperibili su GitHub gli esempi di codice e dati illustrati nel libro].

L'autore

  • Sebastian Raschka
    Sebastian Raschka è professore associato di statistica presso la University of Wisconsin-Madison. Per il suo lavoro su machine learning e deep learning ha ricevuto l'Outstanding Graduate Student Award 2016-2017. Il suo bestseller è proprio Machine Learning con Python, la cui prima edizione è stata tradotta in 7 lingue.

Iscriviti alla newsletter

Novità, promozioni e approfondimenti per imparare sempre qualcosa di nuovo

Gli argomenti che mi interessano:
Iscrivendomi dichiaro di aver preso visione dell’Informativa fornita ai sensi dell'art. 13 e 14 del Regolamento Europeo EU 679/2016.