I sequel sono migliori dell'originale?

May 09 2023
Di: Justin Cheigh e Daisuke Yamada Abstract: In questo articolo cerchiamo di rispondere alla domanda se i sequel siano migliori dell'originale. Per fare ciò, eseguiamo un'analisi del sentiment sulle recensioni di particolari serie di film.

Di: Justin Cheigh e Actarus Yamada

Abstract: In questo articolo cerchiamo di rispondere alla domanda se i sequel siano migliori dell'originale. Per fare ciò, eseguiamo un'analisi del sentiment sulle recensioni di particolari serie di film. Sebbene ci siamo addestrati su un set di dati kaggle contenente 50.000 recensioni di film, scarteremo anche recensioni di film da IMDb utilizzando la libreria di selenio di Python . Dai un'occhiata al nostro repository GitHub e grazie per aver letto!

Una serie che vedremo

Motivazione

Ti sei mai chiesto se i sequel siano effettivamente migliori dell'originale? Sì... ci siamo passati tutti. In effetti, la risposta a questa domanda secolare ci ha perseguitato per tutta la mia vita. Abbiamo setacciato e setacciato le risposte. La teoria cinematografica standard non ha dato risposte concrete. La linguistica e la teoria letteraria non andavano proprio bene. La filosofia ha solo aumentato la confusione. Quindi, ci siamo rivolti all'ultima risorsa possibile: la scienza dei dati. Dopo una veloce maratona di Kung Fu Panda, ci siamo messi al lavoro.

Il nostro piano era addestrare un modello di analisi del sentiment utilizzando dati etichettati. Con questo modello potremmo determinare il sentimento delle recensioni di film di diverse serie. Da qui potremmo sviluppare alcune euristiche per misurare la popolarità di ogni film, permettendoci di confrontare i sequel e l'originale.

Scraping e pre-elaborazione dei dati

Per iniziare, avevamo bisogno di dati. Abbiamo trovato un set di dati IMDb su kaggle contenente 50.000 recensioni di film, ciascuna etichettata come positiva o negativa . Questo set di dati era perfetto per addestrare un modello di analisi del sentimento binario, ma avevamo anche bisogno di dati sulle recensioni di film di varie serie.

Abbiamo scelto di lavorare con 4 diverse serie: Harry Potter, Star Wars, Kung Fu Panda e Cars. Dopo aver trovato recensioni / classifiche di film su IMDb per ogni film di ogni serie, abbiamo raschiato i dati usando il selenio. Abbiamo salvato questi dati come una cartella di file CSV (/reviews/original), ciascuno contenente (almeno) recensioni di film e valutazioni a stelle associate. D'ora in poi ci riferiremo a queste valutazioni a stelle come valutazioni critiche o solo valutazioni.

A differenza del nostro set di dati di addestramento, che aveva etichettato i valori del sentimento ( sentimento positivo o negativo ), queste recensioni avevano valutazioni effettive determinate dal critico ( 1–10 , dove 1 è il peggiore e 10 il migliore). Riconosceremo questa discrepanza durante la nostra analisi in seguito.

Esempio di dati raschiati- Kung Fu Panda 2

Modello di analisi del sentiment

Successivamente, abbiamo deciso di addestrare il nostro modello di analisi dei sentimenti. Il primo passo è codificare la recensione in un vettore numerico. Il metodo ingenuo consiste semplicemente nel codificare a caldo le parole. Tuttavia, questo porta a un enorme vettore di input che manca di qualsiasi comprensione semantica delle parole (ad esempio tratta USA e America come completamente diversi).

Pertanto, abbiamo scelto di utilizzare un livello di incorporamento di parole. Gli incorporamenti di parole rappresentano le parole come vettori numerici in un modo che tiene conto della somiglianza semantica . Ad esempio, i sinonimi possono essere "vicini" l'uno all'altro nello spazio vettoriale e potresti anche apprendere relazioni semantiche come nella seguente:

Esempio di vantaggio degli incorporamenti di parole (da developer.google.com)

Nello specifico, abbiamo utilizzato un incorporamento di parole GloVe pre-addestrato per definire un livello di incorporamento nel nostro modello. Una volta definito questo livello di incorporamento, siamo passati a definire il nostro modello. Per il nostro modello sottostante abbiamo scelto di utilizzare un LSTM (Long Short-Term Memory) bidirezionale. Gli LSTM sono un tipo di rete neurale ricorrente (RNN) progettata per gestire le dipendenze a lungo termine.

Negli RNN tradizionali, comunemente otteniamo il problema del gradiente di estinzione (o esplosione), poiché richiediamo la retropropagazione nel tempo . Gli LSTM risolvono questo problema avendo una cella di memoria in grado di controllare il flusso di informazioni. Vale a dire, ci sono 3 porte: la porta di ingresso (nuove informazioni che entrano nella cella), la porta dimenticata (quanta informazione della cella corrente viene dimenticata) e la porta di uscita (quanta parte dello stato della cella viene utilizzata per produrre l'output di LSTM ). Queste porte, rappresentate da attivazioni sigmoidee, consentono dipendenze a lungo termine. Di seguito puoi vedere l'architettura di un LSTM:

Architettura LSTM

Un LSTM bidirezionale si basa su questa struttura utilizzando 2 LSTM, consentendo il flusso di informazioni in entrambe le direzioni. In altre parole, LSTM conserva le informazioni solo dal passato, ma gli LSTM bidirezionali preservano le informazioni sia dal passato che dal futuro. Ciò consente alla rete di avere un contesto delle parole circostanti e di seguito viene mostrata un'immagine della sua architettura:

Architettura LSTM bidirezionale

Abbiamo implementato il nostro LSTM bidirezionale come segue:

# define pre-trained embedding layer
pre_emb = Embedding(
  input_dim=len(word_index)+1, 
  output_dim=seqlen, 
  weights=[embedding_matrix], # from GloVe embedding
  input_length=seqlen, 
  trainable=True
  )

with tf.device(device):
    # define bidirectional LSTM
    model = Sequential([
        pre_emb, # embedding layer
        Bidirectional(LSTM(128, return_sequences=True)), 
        Dropout(0.2),
        Bidirectional(LSTM(64)),
        Dropout(0.2),
        Dense(128, activation='relu'),
        Dropout(0.2),
        Dense(1, activation="sigmoid") # binary classification
    ])

    # compile
    model.compile(
        loss=BinaryCrossentropy(from_logits=True),
        optimizer='adam',
        metrics=['accuracy']
    )

Una volta addestrato, questo modello ha ottenuto un'accuratezza dell'86,9% sul set di test, rispetto a una linea di base del 50%! Ora che abbiamo questo modello addestrato, possiamo usarlo nelle recensioni dei film scartate. Quindi abbiamo preso i nostri file CSV scartati e abbiamo aggiunto una colonna "Sentimento" , che conteneva uno 0 (negativo) o 1 (positivo) in base alla previsione del sentimento del nostro modello della recensione. Questi file CSV sono stati salvati in /reviews/annotated.

Risultati e analisi

Grande! Quindi per ogni recensione per ogni film di ogni serie abbiamo due informazioni: la previsione del sentimento del nostro modello (0 o 1) e la valutazione effettiva della critica (1-10). Definiamo qualche notazione. Correggi una recensione r . Sia M(r) la previsione del sentimento binario del nostro modello della recensione e sia C(r) la valutazione effettiva della critica del film a cui si riferisce la recensione.

Qual è la relazione tra M(r) e C(r) ? Bene, le recensioni con buone valutazioni dovrebbero intuitivamente avere un sentimento positivo, il che implica che vogliamo una correlazione positiva tra M(r) e C(r). Infatti, il caso ideale assoluto è la seguente relazione (assumendo che C(r) rifletta il livello assoluto, o oggettivo, di soddisfazione):

Caso ideale per la relazione M(r)/C(r).

Allora, qual è la relazione reale?

Relazione tra M(r) e C(r)

Analizziamo queste trame. Ogni colonna rappresenta un film di una serie. Lavoreremo con la colonna più a sinistra, che rappresenta il primo film di Harry Potter, come esempio. Lascia che R sia l'insieme delle recensioni raschiate per questo film. Quindi possiamo interpretare la trama come segue:

  • Il numero più alto (7,7) è il punteggio critico medio; formalmente media(C(R)).
  • Il numero in rosso è la valutazione critica media per le recensioni che il nostro modello ha previsto come positive; formalmente mean({C(r) | r in R e M(r) = 1}).
  • Il numero in blu è la valutazione critica media per le recensioni che il nostro modello ha previsto come negative; formalmente mean({C(r) | r in R e M(r) = 0}).

Dopo aver visto ciò, abbiamo deciso di esplorare ulteriormente la distribuzione di C(r) raggruppata per M(r). Otteniamo i seguenti grafici:

Distribuzione di M(r) data C(r) per Star Wars/Harry Potter

Ad esempio, il grafico Harry Potter Positive mostra la distribuzione delle valutazioni della critica per le recensioni dei film di Harry Potter che il nostro modello ha classificato come contenenti un sentimento positivo. Come ci aspetteremmo o speriamo che assomiglino a queste trame? Torniamo alla nostra equazione ideale per la relazione tra M(r) e C(r). Ci auguriamo che le trame positive abbiano solo recensioni con valutazione > 5, mentre le trame negative abbiano solo recensioni con valutazione ≤ 5.

Per lo meno vorremmo un aumento del numero di recensioni man mano che la valutazione aumenta per Positivo e viceversa per Negativo. Questo sembra vero per i grafici positivi, a indicare che il nostro modello è in grado di classificare bene le recensioni valutate positivamente. Tuttavia, questo non è vero per Negativo; il nostro modello non è in grado di classificare correttamente le recensioni con valutazione negativa.

Questo è curioso. Una possibile spiegazione è che le recensioni positive sono più esplicite; dicono cose come "Questo film è stato fantastico!". D'altra parte, le recensioni con valutazioni negative possono essere un po' più difficili da decifrare. Considera la seguente recensione (falsa): "Anche se alcuni potrebbero amare il CGI e le animazioni in questo film, non ero un fan". Questo è un caso estremamente difficile per una rete neurale. Ci sono parole come "amore" o "fan" che sono comunemente associate a un sentimento positivo, ma è necessario comprendere veramente il contesto per sapere che si tratta di una recensione negativa.

Questa è solo una possibile ipotesi. Per avere un'idea migliore, abbiamo creato wordcloud per ogni film raggruppato per sentimento positivo/negativo:

Wordclouds per le recensioni di Harry Potter (a sinistra è Positivo, a destra in Negativo)

Abbiamo notato alcune cose importanti qui. Il primo è che parole molto prevedibili come "Harry Potter", "libro", "film", "scena", "film" e altre sono molto diffuse. Uno dei motivi in ​​particolare è che il nostro incorporamento GloVe utilizzava un corpus fisso. Potrebbe essere stato utile utilizzare uno strato di incorporamento di parole specifico per il nostro corpus specifico. Anche se abbiamo cercato di tenere conto di ciò rendendo addestrabile il livello di incorporamento, forse avremmo anche potuto provare un metodo diverso diverso da GloVe.

Vediamo anche parole come "buono" nei wordcloud positivi e negativi, il che ribadisce il nostro problema con la classificazione delle recensioni negative. Grande! Ora che abbiamo eseguito alcune visualizzazioni dei dati e abbiamo una migliore comprensione del nostro set di dati, vogliamo definire un'euristica H(m) che prenda un film di input m e restituisca un valore proporzionale a quanto piace il film alle persone.

Analisi euristica e ulteriore

Volevamo che H(m) tenesse conto sia della previsione del nostro modello che dell'attuale valutazione critica. Definiamo H(m) come segue:

Per prima cosa pesiamo il numero di valutazioni positive in base alla valutazione critica media delle valutazioni positive. Quindi prendiamo questo e sottraiamo il numero di valutazioni negative ponderate per la valutazione critica media delle recensioni negative. Questa è una buona euristica, ma dobbiamo ricordare che il nostro modello non è il migliore per classificare le recensioni negative. Pertanto, in realtà non ci interessa la valutazione media delle recensioni negative, il che riduce la nostra euristica a quanto segue:

Quindi, usando questa euristica, quali sono i nostri risultati? Per ognuna delle quattro serie abbiamo deciso di creare due trame. Il primo è la valutazione media della critica rispetto al film e il secondo è la nostra euristica rispetto al film:

Trame di Harry Potter
Trame di Guerre Stellari
Trame di Kung Fu Panda
Trame di automobili

Nota quando raggruppi per serie il grafico della valutazione media non cambia troppo , indicando che tutti i film di ciascuna serie sono visti approssimativamente a un livello simile dai revisori. Questo potrebbe essere solo indicativo delle persone che effettivamente pubblicano recensioni su questo sito e della loro disponibilità a dare punteggi diversi.

La trama giusta sembra piuttosto casuale per ogni serie. Si noti che il numero effettivo sull'asse y è piuttosto irrilevante, poiché la classifica relativa è davvero ciò che conta. Non c'è una tendenza evidente su H(m) crescente o decrescente con il progredire della serie. Sembra che gli originali tendano ad essere leggermente più popolari del sequel , anche se ci sono sicuramente delle eccezioni (Star Wars).

Un'altra nota interessante è che, oltre a Harry Potter, il film finale è il meno o il più popolare secondo la nostra euristica. Ciò ha intuitivamente senso, poiché la serie interrompe la produzione a causa della mancanza di popolarità o termina con una nota positiva. Inoltre, questo non si applica a Harry Potter, poiché sono appena finiti una volta che i libri sono finiti.

Conclusione e lavoro futuro

Grande! Non abbiamo trovato tendenze definite sui sequel peggiori o migliori degli originali, ma abbiamo avuto la possibilità di immergerci in questo argomento. Siamo stati in grado di utilizzare correttamente gli incorporamenti di parole GloVe e implementare un LSTM bidirezionale. Inoltre siamo stati in grado di raccogliere dati con successo e produrre alcune analisi.

In futuro probabilmente esploreremo modelli di PNL più complicati, come i trasformatori. Tuttavia, il nostro problema più grande era definire una buona euristica H(m). È difficile determinare con certezza se la nostra euristica fosse buona o meno, ma ci sono motivi per suggerire che potrebbe mancare.

Ad esempio, supponi che a_p sia costante tra i film per alcune serie. Abbiamo visto dalle nostre trame che questo non è un presupposto enorme. Quindi la nostra euristica si riduce a H(m) = C * r_p -r_n , dove C = a_p è costante. Ciò significa che le recensioni critiche sono a malapena prese in considerazione nella nostra euristica, il che è problematico poiché sappiamo già che il nostro modello non è il migliore per classificare le recensioni negative.

Nonostante queste battute d'arresto, questo è stato nel complesso un progetto davvero divertente! Grazie per aver letto!