Analyse de sentiments de tweets en apprenant à partir des smileys ;)


Comme nous avons pu déjà le souligner, ce blog se veut un cadre d’échanges et de partage avec la mise en avant de problématiques données assorties de la proposition de scénarios/solutions type prêts à l’usage.

Dans cette dynamique, J’ai aujourd’hui le plaisir de publier dans ce blog ce billet rédigé par Jeremy Samama, consultant Microsoft Services Data Insights. Je profite de cette occasion pour remercier très sincèrement Jeremy pour cette contribution. Ce billet est pour l’essentiel une republication sur ce blog du billet éponyme déjà publié sur le blog Machine Learning France.

Je vous souhaite une bonne lecture de ce billet.

–Philippe

__________________________________________________________________________________________________________

L’analyse de sentiments relève de plusieurs disciplines et en l’occurrence d’une part du traitement du langage (Natural Language Processing ou NLP) et d’autre part de l’apprentissage automatique (#MachineLearning ou ML).

Cette dernière constitue l’une des illustrations de la manière de tirer parti d’informations contenues dans du texte. Nous allons détailler dans ce billet comment procéder à une analyse de sentiments sur des tweets en utilisant Azure Machine Learning (Azure ML) et Azure HDInsight (Hadoop) et en apprenant comme le titre l’indique à partir des smileys (frimousse ou binette diront certains), désormais un élément de langage à part entière pour exprimer des émotions et donc des sentiments.

L’analyse de sentiments

Analyser les sentiments sur les réseaux sociaux revêt un intérêt majeur en marketing lorsqu’il s’agit de savoir ce que pensent les gens sur un produit déjà lancé ou de savoir quel produit plairait à la plupart des personnes. En général, il est simple de récupérer des informations sur Twitter donc notre analyse portera sur ce réseau social spécifique.

Il existe plusieurs services permettant de réaliser cette tâche, et en particulier :

  • Sentiment140 qui offre une API performante
  • sentiment viz qui permet de visualiser très simplement des informations pertinentes à partir des tweets.

L’idée de ce billet est de réaliser cette analyse de sentiments « à la main » en utilisant le moins de dépendances dans la mesure du possible.

Effectuer une analyse de sentiments consiste à attribuer à chaque tweet un sentiment : ‘Positif’, ‘Négatif’ ou ‘Neutre’. Pour procéder à une telle analyse de sentiments, nous allons utiliser des méthodes d’apprentissage automatique, et plus particulièrement les méthodes de classification.

Constitution du jeu de données

Afin d’obtenir une base de donnée conséquente pour l’analyse de sentiments, nous avons récupéré pendant quelques mois tous les tweets contenants certains mots clé à l’aide de l’API Streaming fournie par Twitter.

Ces tweets ont été stockés dans un compte de stockage Azure.

Nous nous sommes ensuite servis de cette base de données pour entraîner un algorithme de classification.

image

Pour effectuer cette analyse, nous souhaitons adopter une démarche d’apprentissage supervisé. Nous devons donc disposer pour cela d’un historique de tweets dont le sentiment est connu.

Comme nous disposons d’un grand nombre de tweets, nous supposons qu’il est capable d’extraire un grand nombre de tweets contenant des smileys. Ainsi :

  1. Les tweets contenant des smileys contents J (U+263A en Unicode) seront classés comme positifs,
  2. Et les tweets contenant des smileys mécontents seront négatifs L (U+2639).

Concernant le reste des tweets, il nous est impossible de connaître leur sentiment avec cette approche pour le moment.

Un premier traitement consiste à garder seulement les tweets en français contenant des smileys et attribuer un score correspondant au sentiment du smiley. Si l’on se concentre ici sur le français, l’approche pourrait bien évidemment fonctionner dans d’autres langues, voire avec plusieurs langues.

Avec ce premier filtre, nous passons ainsi de 130 millions de tweets (600 Go) à 1 million de tweets (100 Mo).

image

Pour réaliser cette extraction de caractéristiques à grande échelle, nous avons utilisé le Framework Apache Hadoop, et plus particulièrement Azure HDInsight, « 100 % d’Apache Hadoop » offert comme un service de cloud Microsoft Azure.

Pour créer un cluster Azure HDInsight, il suffit de se connecter sur le portail Azure et suivre les instructions à l’écran.

image

image

Pour plus de détail, vous pouvez vous reporter aux tutoriels Prise en main des clusters Hadoop 2.2 avec HDInsight et Analyse des données Twitter avec HDInsight.

Une fois connecté au cluster Hadoop, il est possible d’exécuter un script Pig. Apache Pig est une surcouche de Hadoop qui permet d’écrire des jobs Map/Reduce avec un langage de plus haut niveau. Dans ce contexte, Pig supporte les UDF (User Defined Functions), c’est à dire des fonctions définies par l’utilisateur dans un autre langage de programmation comme Java ou encore Python, voire comme ce fut le cas ici du Python s’exécutant au sein de la machine virtuelle Java (JVM), à savoir du Jython.

La capture suivante illustre la façon dont est codé le traitement de tous les fichiers en Pig :

image

Et l’une des fonctions écrite en python contenue dans 2_prepare_dataset_jython.py :

image

Après avoir écrit en ligne de commande « pig 2_prepare_dataset.pig », le traitement se lance. Le résultat du traitement batch se présente comme suit.

image

Analyse de texte en apprentissage automatique : transformer le texte en vecteur

Comme abordé dans un précédent billet sur ce blog, il existe plusieurs méthodes pour extraire des caractéristiques du texte.

Considérons que chaque tweet est un sac de mots (ou n-grams) sans ordre. L’idée de cette sélection de caractéristiques (feature selection) est de décider du sentiment du tweet en fonction de la fréquence de chaque mot dans le tweet. Vu la longueur des tweets, il est aussi pertinent de considérer la présence de chaque mot plutôt que sa fréquence.

La vectorisation du texte s’effectuera en 2 étapes :

  1. Construction d’un vocabulaire de mots en parcourant le texte
  2. Transformation de chaque tweet en vecteur contenant la présence de chaque mot dans le vocabulaire

Par exemple, pour une approche unigramme (mot) :

image

Une astuce pour appliquer cette vectorisation à grande échelle consiste à utiliser une méthode de hachage : si le nombre de mots dans le vocabulaire est connu, on peut déterminer quelle colonne remplir en déterminant le condensat du mot considéré. Ainsi, s’il y a 1000 mots dans notre vocabulaire, il nous faudra utiliser à minima une fonction de hachage qui transforme un mot en un entier entre 1 et 1000, valeur qui désignera l’index du vecteur à fixer à 1 pour chaque mot dans un document.

Dans la pratique, il convient de disposer d’une fonction de hachage avec plus de 1000 sorties possibles comme la fonction ne connaît pas le vocabulaire à l’avance et ce de façon à éviter les collisions.

Avec Azure Machine Learning

Azure Machine Learning (Azure ML) est muni d’un module où est implémentée une fonction de hachage adaptée au traitement de texte : Feature Hashing qui tire parti de la bibliothèque Vowpal Wabbit (VW) pour calculer un condensat MurmurHash3 32-bits.

Ce module se situe dans l’onglet Text Analytics. Pour utiliser ce module, deux paramètres doivent être spécifiés :

image

  1. Hashing bitsize qui est un entier tel qu’il y a 2bitsize mots dans le vocabulaire,
  2. N-grams qui désigne la taille des groupes de mots à considérer.

Nous allons procéder à l’analyse de sentiments sur les tweets en nous contentant d’un échantillon de 1000 tweets et avec :

  1. Hashing bitsize estimé à 10 : on considère qu’il y a environ 1000 mots dans le vocabulaire (pas très élaboré diront certains),
  2. N-grams égal à 1 (analyse sur les mots).

Voici le schéma résultant qui permet de réaliser cette étude sous Azure ML :

image

Si vous avez des difficultés à mettre en place ce type d’expérience sur Azure ML, n’hésitez pas à lire ou à relire le billet Les premiers pas avec ML Studio sur le blog ML France.

Il est temps de partager quelques résultats :

image

Les performances globales de l’algorithme peuvent être visualisées sous forme de matrice de confusion ou de courbe ROC :

image

image

Utilisation de l’analyseur de sentiment entraîné

Comme expliqué dans le billet Les premiers pas avec ML Studio mentionné ci-avant, il est possible d’exporter le modèle entraîné sous forme de service Web. Reprenons l’expérience précédente et cliquons sur la sortie du module Train Model afin de sauvegarder le modèle entraîné.

image

image

Le modèle est alors disponible dans le bandeau de gauche dans l’onglet Trained Models.

image

Il suffit alors de créer une nouvelle expérience comme suit.

Cliquez sur RUN puis sur PUBLISH WEB SERVICE. Notons au passage que l’entrée (pastille verte) est composée uniquement du texte du tweet et la sortie (pastille bleue) est composée uniquement du sentiment renvoyé par l’algorithme entraîné.

image

Si tout s’est bien passé, nous devrions pouvoir utiliser le service Web afin de déterminer le sentiment d’un texte sans smiley. Il ne reste plus qu’à tester tout cela 😉

image

image

Les expressions que l’on retrouve souvent dans les tweets sont très bien prédites :

  • « c’est trop de la balle » est bien classé comme positif
  • « j’ai trop le seum » (nouvelle expression utilisée par les 15-20 ans signifiant « j’ai le spleen ») est bien classée comme negative

image

Par contre, le modèle a ses limites : les mots peu ou pas du tout rencontrés dans les tweets étudiés sont mal prédits : « mon hamster est mort » est classé positif…

A grand merci à mon collègue Benjamin Guinebertière (@benjguin) pour toute l’aide qu’il a apporté dans la réalisation de ce billet.

N’hésitez pas à poster vos questions en commentaires 🙂

Comments (0)