Les suites sont-elles meilleures que l'original ?

May 09 2023
Par : Justin Cheigh et Daisuke Yamada Résumé : Dans cet article, nous cherchons à répondre à la question de savoir si les suites sont meilleures que l'original. Pour ce faire, nous effectuons une analyse des sentiments sur les critiques de séries de films particulières.

Par : Justin Cheigh et Daisuke Yamada

Résumé : Dans cet article, nous cherchons à répondre à la question de savoir si les suites sont meilleures que l'original. Pour ce faire, nous effectuons une analyse des sentiments sur les critiques de séries de films particulières. Bien que nous nous soyons entraînés sur un ensemble de données kaggle contenant 50 000 critiques de films, nous allons également récupérer les critiques de films d'IMDb à l'aide de la bibliothèque de sélénium de Python . Consultez notre référentiel GitHub et merci d'avoir lu !

Une série que nous allons regarder

Motivation

Vous êtes-vous déjà demandé si les suites étaient réellement meilleures que l'original ? Oui… nous sommes tous passés par là. En fait, la réponse à cette question séculaire nous a hantés toute ma vie. Nous avons fouillé et fouillé pour trouver des réponses. La théorie cinématographique standard n'a pas donné de réponses concrètes. La linguistique et la théorie littéraire ne correspondaient pas tout à fait. La philosophie n'a fait qu'accroître la confusion. Nous nous sommes donc tournés vers le dernier recours possible : la science des données. Après un rapide marathon de Kung Fu Panda, nous nous sommes mis au travail.

Notre plan était de former un modèle d'analyse des sentiments à l'aide de données étiquetées. Avec ce modèle, nous avons pu déterminer le sentiment des critiques de films de différentes séries. À partir de là, nous pourrions développer une heuristique pour mesurer la popularité de chaque film, nous permettant de comparer les suites et l'original.

Récupération et prétraitement des données

Pour commencer, nous avions besoin de données. Nous avons trouvé un ensemble de données IMDb sur kaggle contenant 50 000 critiques de films, chacune étiquetée comme positive ou négative . Cet ensemble de données était parfait pour former un modèle d'analyse des sentiments binaires, mais nous avions également besoin de données sur les critiques de films de diverses séries.

Nous avons choisi de travailler avec 4 séries différentes : Harry Potter, Star Wars, Kung Fu Panda et Cars. Après avoir trouvé des critiques / classements de films sur IMDb pour chaque film de chaque série, nous avons récupéré les données à l'aide de sélénium. Nous avons enregistré ces données sous la forme d'un dossier de fichiers CSV (/reviews/original), chacun contenant (au moins) des critiques de films et les notes associées. Nous appellerons désormais ces classements par étoiles des classements critiques ou simplement des classements.

Contrairement à notre ensemble de données de formation, qui avait des valeurs de sentiment étiquetées ( sentiment positif ou négatif ), ces avis avaient des notes réelles déterminées par le critique ( 1 à 10 , 1 étant le pire et 10 étant le meilleur). Nous reconnaîtrons cet écart lors de notre analyse ultérieure.

Exemple de données récupérées - Kung Fu Panda 2

Modèle d'analyse des sentiments

Après cela, nous avons entrepris de former notre modèle d'analyse des sentiments. La première étape consiste à coder l'examen dans un vecteur numérique. La méthode naïve consiste simplement à encoder les mots à chaud. Cependant, cela conduit à un énorme vecteur d'entrée qui manque de toute compréhension sémantique des mots (par exemple, traite les États-Unis et l'Amérique comme complètement différents).

Ainsi, nous avons choisi d'utiliser une couche d'incorporation de mots. Les incorporations de mots représentent les mots comme des vecteurs numériques d'une manière qui tient compte de la similarité sémantique . Par exemple, les synonymes peuvent être "proches" les uns des autres dans l'espace vectoriel, et vous pouvez également apprendre des relations sémantiques comme dans ce qui suit :

Exemple d'avantage des incorporations de mots (de developers.google.com)

Plus précisément, nous avons utilisé une intégration de mots GloVe pré-formée pour définir une couche d'intégration dans notre modèle. Une fois que nous avons défini cette couche d'intégration, nous avons défini notre modèle. Pour notre modèle sous-jacent, nous avons choisi d'utiliser un LSTM (Long Short-Term Memory) bidirectionnel. Les LSTM sont un type de réseau neuronal récurrent (RNN) conçu pour gérer les dépendances à plus long terme.

Dans les RNN traditionnels, nous rencontrons généralement le problème du gradient de fuite (ou d'explosion), car nous avons besoin d'une rétropropagation dans le temps . Les LSTM résolvent ce problème en ayant une cellule de mémoire qui peut contrôler le flux d'informations. À savoir, il y a 3 portes : la porte d'entrée (nouvelles informations entrant dans la cellule), la porte d'oubli (combien d'informations de cellule actuelles sont oubliées) et la porte de sortie (combien de l'état de la cellule est utilisé pour produire la sortie de LSTM ). Ces portes, représentées par des activations sigmoïdes, permettent des dépendances à plus long terme. Ci-dessous, vous pouvez voir l'architecture d'un LSTM :

Architecture LSTM

Un LSTM bidirectionnel s'appuie sur cette structure en utilisant 2 LSTM, permettant le flux d'informations dans les deux sens. En d'autres termes, les LSTM préservent uniquement les informations du passé, mais les LSTM bidirectionnels préservent les informations à la fois du passé et du futur. Cela permet au réseau d'avoir le contexte des mots environnants, et une image de son architecture est présentée ci-dessous :

Architecture LSTM bidirectionnelle

Nous avons implémenté notre LSTM bidirectionnel comme suit :

# 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']
    )

Une fois formé, ce modèle a obtenu une précision de 86,9 % sur l'ensemble de test, par rapport à une ligne de base de 50 % ! Maintenant que nous avons ce modèle formé, nous pouvons l'utiliser sur les critiques de films grattées. Nous avons donc pris nos fichiers CSV récupérés et ajouté une colonne "Sentiment" , qui contenait soit un 0 (négatif) soit un 1 (positif) en fonction de la prédiction du sentiment de notre modèle sur l'avis. Ces fichiers CSV ont été enregistrés dans /reviews/annotated.

Résultats et analyse

Super! Ainsi, pour chaque critique de chaque film de chaque série, nous avons deux informations : la prédiction de sentiment de notre modèle (0 ou 1) et la note réelle des critiques (1 à 10). Définissons quelques notations. Corriger un avis r . Soit M(r) la prédiction du sentiment binaire de notre modèle pour la critique, et soit C(r) la note réelle des critiques du film auquel la critique se rapporte.

Quelle est la relation entre M(r) et C(r) ? Eh bien, les critiques avec de bonnes notes devraient intuitivement avoir un sentiment positif, ce qui implique que nous voulons une corrélation positive entre M(r) et C(r). En fait, le cas idéal absolu est la relation suivante (en supposant que C(r) reflète le niveau absolu ou objectif de satisfaction) :

Cas idéal pour la relation M(r)/C(r)

Alors, quelle est la relation réelle?

Relation entre M(r) et C(r)

Décomposons ces parcelles. Chaque colonne représente un film dans une série. Nous allons travailler avec la colonne la plus à gauche, représentant le premier film Harry Potter, à titre d'exemple. Soit R l'ensemble des critiques grattées pour ce film. On peut alors interpréter le tracé comme suit :

  • Le chiffre le plus élevé (7,7) correspond à la note moyenne des critiques ; signifie formellement (C(R)).
  • Le nombre en rouge est la note moyenne des critiques pour les critiques que notre modèle a prédites comme positives ; signifie formellement ({C(r) | r dans R et M(r) = 1}).
  • Le nombre en bleu est la note moyenne des critiques pour les critiques que notre modèle a prédites comme négatives ; signifie formellement ({C(r) | r dans R et M(r) = 0}).

Après avoir vu cela, nous avons décidé d'explorer davantage la distribution de C(r) regroupés par M(r). On obtient les tracés suivants :

Distribution de M(r) étant donné C(r) pour Star Wars/Harry Potter

Par exemple, le graphique Harry Potter positif montre la distribution des notes des critiques pour les critiques de films Harry Potter que notre modèle a classés comme contenant un sentiment positif. À quoi pourrions-nous nous attendre ou espérer que ces parcelles ressemblent? Revenons à notre équation idéale pour la relation entre M(r) et C(r). Nous espérons que les parcelles positives n'ont que des critiques notées > 5, tandis que les parcelles négatives n'ont que des critiques notées ≤ 5.

À tout le moins, nous voudrions une augmentation du nombre d'avis à mesure que la note augmente pour le positif et vice versa pour le négatif. Cela semble vrai pour les tracés positifs, ce qui indique que notre modèle peut bien classer les avis notés positivement. Cependant, ce n'est pas vrai pour Negative; notre modèle ne peut pas bien classer les avis notés négativement.

C'est curieux. Une explication possible est que les avis positifs sont plus explicites ; ils disent des choses comme "Ce film était génial!". D'un autre côté, les critiques négatives peuvent être un peu plus difficiles à déchiffrer. Considérez la (fausse) critique suivante : "Bien que certains adorent le CGI et les animations de ce film, je n'étais pas fan". C'est un cas extrêmement difficile pour un réseau de neurones. Il y a des mots comme "amour" ou "fan" qui sont généralement associés à un sentiment positif, mais il faut vraiment comprendre le contexte pour savoir qu'il s'agit d'une critique négative.

Ce n'est qu'une hypothèse potentielle. Pour avoir une meilleure idée, nous avons créé des nuages ​​de mots pour chaque film lors du regroupement par sentiment positif/négatif :

Wordclouds for Harry Potter Reviews (la gauche est positive, la droite est négative)

Nous avons remarqué quelques choses importantes ici. La première est que des mots très prévisibles comme "Harry Potter", "livre", "film", "scène", "film" et plus sont très répandus. Une raison particulière est que notre intégration GloVe a utilisé un corpus fixe. Il aurait peut-être été avantageux d'utiliser une couche d'intégration de mots spécifique à notre corpus spécifique. Bien que nous ayons essayé d'en tenir compte en rendant la couche d'intégration entraînable, nous aurions peut-être également pu essayer une autre méthode que GloVe.

Nous voyons également des mots comme "bon" dans les nuages ​​​​de mots positifs et négatifs, ce qui réaffirme notre difficulté à classer les critiques négatives. Super! Maintenant que nous avons effectué une visualisation des données et que nous comprenons mieux notre ensemble de données, nous souhaitons définir une heuristique H(m) qui prend un film d'entrée m et génère une valeur proportionnelle au nombre de personnes qui aiment le film.

Analyse heuristique et approfondie

Nous voulions que H(m) tienne compte à la fois de la prédiction de notre modèle et de la note critique réelle. On définit H(m) comme suit :

Nous pondérons d'abord le nombre de notes positives par la note critique moyenne des notes positives. Nous prenons ensuite cela et soustrayons le nombre de notes négatives pondérées par la note critique moyenne des critiques négatives. C'est une bonne heuristique, mais nous devons nous rappeler que notre modèle n'est pas le meilleur pour classer les avis négatifs. Ainsi, nous ne nous soucions pas réellement de la note moyenne des avis négatifs, ce qui réduit notre heuristique à ce qui suit :

Alors, en utilisant cette heuristique, quels sont nos résultats ? Pour chacune des quatre séries, nous avons décidé de créer deux parcelles. Le premier est la note moyenne des critiques par rapport au film , et le second est notre heuristique par rapport au film :

Intrigues de Harry Potter
Complots de Star Wars
Complots de Kung Fu Panda
Voitures Parcelles

Remarquez que lors du regroupement par série, le tracé de la note moyenne ne change pas trop , ce qui indique que tous les films de chaque série sont à peu près vus à un niveau similaire par les critiques. Cela peut simplement indiquer les personnes qui publient des avis sur ce site et leur volonté de donner des scores différents.

La bonne intrigue semble assez aléatoire pour chaque série. Notez que le nombre réel sur l'axe des ordonnées n'est pas pertinent, car le classement relatif est vraiment ce qui compte. Il n'y a pas de tendance évidente à l'augmentation ou à la diminution de H(m) au fur et à mesure que la série progresse. Il semble que les originaux aient tendance à être légèrement plus populaires que la suite , bien qu'il y ait certainement des exceptions à cela (Star Wars).

Une autre remarque intéressante est que, outre Harry Potter, le film final est soit le moins, soit le plus populaire selon notre heuristique. Cela a intuitivement du sens, car la série arrête la production en raison d'un manque de popularité ou se termine sur une note positive. De plus, cela ne s'applique pas à Harry Potter, car ils viennent de se terminer une fois les livres terminés.

Conclusion et travaux futurs

Super! Nous n'avons pas trouvé de tendances précises sur les suites pires ou meilleures que les originaux, mais nous avons eu la chance de plonger dans ce sujet. Nous avons pu utiliser correctement les incorporations de mots GloVe et implémenter un LSTM bidirectionnel. De plus, nous avons réussi à récupérer des données et à produire des analyses.

À l'avenir, nous explorerons probablement des modèles NLP plus compliqués, tels que les transformateurs. Cependant, notre plus gros problème était de définir une bonne heuristique H(m). Il est difficile de déterminer avec certitude si notre heuristique était bonne ou non, mais il y a des raisons de suggérer qu'elle pourrait faire défaut.

Par exemple, supposons que a_p est constant dans les films pour certaines séries. Nous avons vu à partir de nos parcelles que ce n'est pas une hypothèse énorme. Alors notre heuristique se réduit à H(m) = C * r_p -r_n , où C = a_p est constant. Cela signifie que les avis des critiques sont à peine pris en compte dans notre heuristique, ce qui est problématique puisque nous savons déjà que notre modèle n'est pas le meilleur pour classer les avis négatifs.

Malgré ces déboires, ce fut dans l'ensemble un projet vraiment amusant ! Merci d'avoir lu!