Analyse de Sentiments : Comprendre les Opinions dans le Texte
Ce chapitre aborde les méthodes d’analyse de sentiments, des approches basées sur les lexiques aux modèles d’apprentissage automatique, pour évaluer les émotions et opinions.
Analyse de Sentiments
Opinion Mining
Apprentissage Supervisé
Authors
Affiliation
Wilson Toussile12
ENSPY
1ENSPY, 2ESSFAR
Published
May 24, 2025
1 Introduction à l’Analyse de Sentiments
L’analyse de sentiments, également désignée sous le terme d’exploration d’opinions (Opinion Mining), est un sous-domaine fascinant et en pleine expansion du Traitement du Langage Naturel (NLP), de l’exploration de textes (Text Mining) et de la linguistique computationnelle. Son objectif principal est d’identifier, d’extraire, de quantifier et d’étudier les états affectifs et les informations subjectives exprimés dans des contenus textuels.
1.1 Qu’est-ce que l’Analyse de Sentiments ?
Concrètement, l’analyse de sentiments cherche à déterminer l’attitude ou le jugement émotionnel d’un auteur – qu’il soit positif, négatif ou neutre – à l’égard d’un sujet particulier, d’un produit, d’une personne, d’une organisation, d’un service ou d’un événement. Au-delà de cette polarité de base (positif/négatif/neutre), des analyses plus fines peuvent chercher à identifier des émotions spécifiques (joie, colère, tristesse, peur, etc.) ou l’intensité du sentiment exprimé.
Par exemple, face à un avis client tel que : > “J’ai adoré ce téléphone, l’appareil photo est incroyable mais la batterie se décharge un peu trop vite.”
Une analyse de sentiments viserait à comprendre : * Le sentiment global (potentiellement mitigé ou positif avec une réserve). * Le sentiment spécifique envers “l’appareil photo” (positif). * Le sentiment spécifique envers “la batterie” (négatif).
Cette capacité à disséquer l’opinion contenue dans le langage humain ouvre la voie à une multitude d’applications.
1.2 Importance et Applications
À l’ère numérique, où des volumes massifs de données textuelles sont générés quotidiennement (réseaux sociaux, avis en ligne, blogs, forums, etc.), l’analyse de sentiments est devenue un outil indispensable pour de nombreux secteurs :
Entreprises et Marketing :
Compréhension des retours clients : Analyser automatiquement les avis sur les produits, les commentaires sur les services, les réponses aux enquêtes pour identifier les points forts et les points faibles. (Bengfort et al., 2018, mentionne l’analyse de texte pour les produits “language-aware”).
Gestion de la réputation de la marque (Brand Reputation Management) : Surveiller en temps réel ce qui se dit sur une marque ou ses produits sur les réseaux sociaux et le web.
Études de marché : Évaluer la perception de nouvelles campagnes publicitaires, identifier les attentes des consommateurs.
Veille concurrentielle : Analyser les sentiments exprimés à l’égard des concurrents.
Politique et Secteur Public :
Suivi de l’opinion publique : Analyser les réactions des citoyens à des politiques, des discours ou des candidats lors d’élections.
Analyse des discours politiques : Identifier les thèmes émotionnels et la polarisation.
Médias et Journalisme :
Analyser la tonalité des articles de presse sur certains sujets.
Comprendre l’engagement et la réaction des lecteurs aux contenus publiés.
Finance (FinTech) :
Analyser les nouvelles financières et les opinions sur les réseaux sociaux pour prédire les tendances du marché (analyse de sentiment boursier).
Santé :
Analyser les retours de patients sur des traitements ou des établissements de soins.
Étudier les discussions sur des forums de santé pour comprendre les préoccupations liées à certaines maladies.
Recherche en Sciences Sociales et Humaines :
Étudier l’évolution des attitudes et des émotions sur des sujets de société.
Analyser des corpus littéraires ou historiques pour y déceler des tendances affectives.
L’automatisation de cette analyse permet de traiter des volumes de données qu’il serait impossible d’examiner manuellement, offrant ainsi des insights rapides et à grande échelle.
1.3 Niveaux d’Analyse
L’analyse de sentiments peut être effectuée à différents niveaux de granularité, chacun répondant à des questions d’analyse distinctes :
Niveau Document (Document-Level Sentiment Analysis) :
Objectif : Déterminer le sentiment global exprimé dans l’ensemble d’un document (ex: un avis produit entier, un article de blog).
Hypothèse : Le document traite principalement d’un seul sujet ou exprime une opinion dominante.
Exemple : Classer un avis de film comme “globalement positif” ou “globalement négatif”.
Niveau Phrase (Sentence-Level Sentiment Analysis) :
Objectif : Déterminer le sentiment exprimé dans chaque phrase individuelle au sein d’un document.
Utilité : Un document peut contenir plusieurs opinions, parfois contradictoires. Ce niveau permet d’identifier ces nuances.
Exemple : Dans l’avis “Le film était long et ennuyeux, mais les acteurs étaient excellents.”, la première phrase exprime un sentiment négatif et la seconde un sentiment positif.
Niveau Aspect ou Entité (Aspect-Based Sentiment Analysis - ABSA) :
Objectif : Identifier le sentiment exprimé à l’égard d’aspects (ou caractéristiques, attributs) spécifiques d’une entité (produit, service, personne, etc.).
Processus :
Identifier les entités mentionnées dans le texte.
Pour chaque entité, identifier les aspects ou attributs discutés.
Déterminer la polarité du sentiment pour chaque paire (entité, aspect).
Exemple : Pour un avis sur un restaurant : “La pizza [entité: nourriture, aspect: plat] était délicieuse [sentiment: positif], mais le service [entité: service, aspect: général] était horriblement lent [sentiment: négatif].”
Importance : C’est le niveau d’analyse le plus fin et souvent le plus utile pour obtenir des retours exploitables (ex: quels aspects spécifiques d’un produit les clients aiment ou n’aiment pas). Il est cependant plus complexe à mettre en œuvre.
Le choix du niveau d’analyse dépendra des objectifs spécifiques du projet et de la nature des données textuelles disponibles. Pour ce chapitre, nous nous concentrerons principalement sur le niveau document et phrase, tout en introduisant les concepts de l’ABSA.
2 Approches Principales de l’Analyse de Sentiments
Pour déterminer la polarité émotionnelle d’un texte, deux grandes familles de méthodes se distinguent. Chacune possède ses propres mécanismes, avantages et inconvénients, et le choix entre elles dépendra souvent de la nature des données disponibles, des ressources et des objectifs spécifiques du projet.
2.1 Approche Basée sur un Lexique (Lexicon-Based)
Cette approche, parfois qualifiée d’approche “basée sur un dictionnaire” ou “basée sur des règles” (lorsqu’elle est enrichie de règles heuristiques), s’appuie sur l’utilisation de lexiques de sentiments. Un lexique de sentiments est essentiellement un dictionnaire de mots où chaque mot (ou parfois expression) est préalablement annoté avec une polarité de sentiment (par exemple, positif, négatif, neutre) et, dans certains cas, une mesure de l’intensité de ce sentiment.
Le principe général est d’analyser un texte en identifiant les mots porteurs de sentiment et en agrégeant leurs scores pour obtenir une évaluation globale du sentiment du texte. Par exemple, un texte contenant de nombreux mots marqués comme “positifs” dans le lexique et peu de mots “négatifs” sera probablement classé comme positif.
Cette méthode est souvent considérée comme plus transparente car les “règles” de décision sont directement liées aux scores des mots du lexique. Elle ne nécessite généralement pas de phase d’entraînement sur des données étiquetées spécifiques au problème, ce qui peut être un avantage lorsque de telles données sont rares ou coûteuses à obtenir.
2.2 Approche Basée sur l’Apprentissage Automatique (Machine Learning-Based)
L’approche basée sur l’apprentissage automatique (ou Machine Learning) traite l’analyse de sentiments comme un problème classique de classification de texte supervisée. Au lieu de s’appuyer sur des lexiques prédéfinis, cette méthode “apprend” à distinguer les sentiments à partir d’exemples.
Le processus typique implique : 1. La constitution d’un corpus d’entraînement, c’est-à-dire un ensemble de textes qui ont été manuellement étiquetés par des humains avec la catégorie de sentiment appropriée (positif, négatif, neutre). 2. L’extraction de caractéristiques (features) à partir de ces textes (par exemple, en utilisant des modèles comme le sac de mots avec pondération TF-IDF, ou des plongements de mots). 3. L’entraînement d’un modèle de classification (comme Naïve Bayes, la Régression Logistique, les SVM, ou des modèles d’apprentissage profond comme les réseaux de neurones récurrents ou les transformateurs) sur ces données étiquetées. Le modèle apprend ainsi à associer certains motifs de caractéristiques textuelles à des étiquettes de sentiment spécifiques.
Une fois entraîné, le modèle peut être utilisé pour prédire la polarité du sentiment de nouveaux textes qu’il n’a jamais vus auparavant. Cette approche a le potentiel d’atteindre de meilleures performances, en particulier pour des textes complexes ou spécifiques à un domaine, car le modèle peut apprendre des nuances et des contextes qui ne sont pas explicitement encodés dans un lexique général. Cependant, sa performance est fortement dépendante de la qualité et de la quantité des données d’entraînement étiquetées. (Bengfort et al., 2018, aborde largement la classification pour l’analyse de texte).
Dans les sections suivantes, nous allons explorer plus en détail chacune de ces deux approches, en examinant leurs mécanismes, leurs avantages, leurs inconvénients et des exemples concrets de mise en œuvre.
3 Analyse de Sentiments Basée sur un Lexique
L’approche basée sur un lexique est l’une des méthodes les plus directes et intuitives pour réaliser une analyse de sentiments. Elle s’appuie sur l’idée que certains mots portent intrinsèquement une connotation positive ou négative.
3.1 Principe de Fonctionnement
Le cœur de cette méthode réside dans l’utilisation d’un lexique de sentiments (ou dictionnaire de polarités). Ce lexique contient une liste de mots et, pour chaque mot, une indication de sa polarité émotionnelle (par exemple, “excellent” est positif, “horrible” est négatif) et parfois un score d’intensité (par exemple, “bon” = +1, “excellent” = +3 ; “mauvais” = -1, “terrible” = -3).
Le processus général pour analyser le sentiment d’un texte est le suivant :
Segmentation du texte : Le texte est divisé en unités (généralement des mots, après une tokenisation).
Recherche dans le lexique : Chaque mot du texte est recherché dans le lexique de sentiments.
Attribution de scores : Si un mot est trouvé dans le lexique, son score de sentiment associé est récupéré.
Agrégation des scores : Les scores de sentiment des mots du texte sont combinés pour produire un score de sentiment global pour le texte. Ce score global est ensuite souvent classé en catégories (positif, négatif, neutre) en fonction de seuils prédéfinis.
Par exemple, un texte avec plus de mots à score positif élevé qu’à score négatif sera classé comme positif.
3.2 Lexiques de Sentiments Courants
Plusieurs lexiques de sentiments ont été développés et sont couramment utilisés, principalement pour l’anglais, mais des initiatives existent pour d’autres langues ou peuvent être adaptées :
AFINN (développé par Finn Årup Nielsen) : Contient une liste de mots anglais avec un score entier allant de -5 (le plus négatif) à +5 (le plus positif). Il est simple et largement utilisé.
Bing Liu’s Opinion Lexicon (Bing Liu et collaborateurs) : Comprend deux listes de mots anglais : une liste de mots à polarité positive et une liste de mots à polarité négative. C’est l’un des lexiques les plus cités. (Silge & Robinson, 2017, Chapter 2 utilisent ce lexique avec tidytext).
NRC Word-Emotion Association Lexicon (Saif Mohammad et Peter Turney) : Ce lexique est plus riche car il n’associe pas seulement les mots à une polarité positive ou négative, mais aussi à huit émotions de base (colère, peur, anticipation, confiance, surprise, tristesse, joie, dégoût). Il est disponible pour plusieurs langues.
VADER (Valence Aware Dictionary and sEntiment Reasoner) : Particulièrement adapté aux textes courts et informels des médias sociaux. VADER est sensible aux majuscules (ex: “GREAT” est plus intense que “great”), à la ponctuation (ex: “!!!”), aux émoticônes (ex: “:)”), aux acronymes courants et aux modificateurs d’intensité. Il fournit un score composite normalisé entre -1 (le plus négatif) et +1 (le plus positif).
SentiWordNet : Une ressource lexicale où chaque synset (ensemble de synonymes) de WordNet est associé à trois scores numériques décrivant sa positivité, sa négativité et son objectivité (neutralité). Chaque score varie de 0.0 à 1.0, et leur somme est 1.0 pour chaque synset.
Il est important de noter que l’efficacité d’un lexique peut varier en fonction du domaine d’application. Un lexique général peut ne pas bien performer sur des textes très spécialisés (juridique, médical) où certains mots ont des connotations spécifiques.
3.3 Processus Détaillé et Exemples Pratiques
Décomposons plus finement les étapes :
Prétraitement du Texte :
Tokenisation : Séparer le texte en mots.
Normalisation : Convertir en minuscules (sauf si le lexique est sensible à la casse, comme VADER pour les majuscules d’emphase). La suppression de la ponctuation doit être faite avec soin, car certains signes (comme “!”) peuvent indiquer une intensité.
Suppression des mots-vides : Généralement recommandée, mais il faut faire attention à ne pas supprimer des mots qui pourraient être importants pour le sentiment, en particulier les négations.
Recherche Lexicale et Attribution de Scores :
Pour chaque token du texte prétraité, on vérifie s’il existe dans le lexique de sentiments choisi.
Si oui, on récupère sa polarité ou son score.
Agrégation des Scores :
Méthode simple : Sommer tous les scores des mots trouvés dans le texte. Un score total positif indique un sentiment positif, un score négatif un sentiment négatif, et un score proche de zéro un sentiment neutre.
Comptage : Compter le nombre de mots positifs et le nombre de mots négatifs. Le sentiment est déterminé par la catégorie qui a le plus de mots.
Exemple : “Le service était lent mais la nourriture était bonne.”
Lexique: {“lent”: -1, “bonne”: +1}
Mots positifs: 1 (“bonne”)
Mots négatifs: 1 (“lent”)
Résultat : Neutre ou Mitigé (selon la règle de décision).
Gestion des Modificateurs (crucial pour la précision) :
Négations : Des mots comme “pas”, “non”, “jamais”, “aucun” inversent typiquement la polarité du mot ou de l’expression qui suit.
Stratégie : Lorsqu’une négation est détectée, le score du mot (ou des quelques mots) suivant la négation peut être inversé (multiplié par -1) ou son intensité modifiée.
Exemple : “Ce n’est pas mauvais.”
“mauvais” : -2
“pas mauvais” : -1 * (-2) = +2 (Positif)
Intensificateurs et Atténuateurs (Modulateurs) :
Intensificateurs (ex: “très”, “extrêmement”, “incroyablement”, “vraiment”) augmentent l’intensité du sentiment.
Atténuateurs (ex: “un peu”, “plutôt”, “légèrement”) diminuent l’intensité du sentiment.
Stratégie : Multiplier le score du mot concerné par un facteur (ex: >1 pour les intensificateurs, <1 pour les atténuateurs). VADER intègre nativement ce type de logique.
Simplicité et Transparence : L’approche est relativement facile à comprendre et à mettre en œuvre. Les raisons d’une classification de sentiment sont souvent directement traçables aux mots du lexique.
Pas (ou peu) de Données d’Entraînement Nécessaires : Contrairement aux méthodes d’apprentissage automatique, il n’est généralement pas nécessaire de disposer d’un grand corpus de textes étiquetés pour commencer.
Rapidité d’Exécution : Le calcul du score est souvent rapide, ce qui est avantageux pour de grands volumes de données ou des applications en temps réel.
Bon Point de Départ : Peut servir de baseline solide ou être intégré comme une caractéristique dans des modèles plus complexes.
Inconvénients
Couverture du Lexique : Les lexiques, même importants, ne peuvent pas contenir tous les mots ou expressions, en particulier l’argot, les néologismes, ou le jargon spécifique à un domaine.
Gestion du Contexte : La signification d’un mot peut changer radicalement en fonction du contexte. Les approches lexicales simples ont du mal à saisir ces nuances.
Exemple : Le mot “imprévisible” peut être positif pour un film (“un scénario imprévisible”) mais négatif pour la fiabilité d’une voiture.
Sarcasme, Ironie et Langage Figuré : Ces formes de langage, où le sens littéral contredit le sentiment réel, sont extrêmement difficiles à détecter avec une approche lexicale seule.
Spécificité au Domaine : Un lexique généraliste peut mal performer sur des textes d’un domaine très spécialisé où les termes ont des connotations de sentiment différentes.
Dépendance à la Qualité du Lexique : La performance est directement liée à la qualité, la taille et la pertinence du lexique utilisé. Créer ou adapter un lexique pour une langue ou un domaine spécifique peut être coûteux en temps.
3.5 Exemples de Code
Ici, nous allons illustrer comment utiliser une approche lexicale simple.
# Utilisation de VADER (Valence Aware Dictionary and sEntiment Reasoner)# VADER est bien adapté aux textes des médias sociaux et gère les négations,# l'intensité, la ponctuation, les majuscules, et les emojis.# Il est principalement conçu pour l'anglais.# pip install vaderSentimentfrom vaderSentiment.vaderSentiment import SentimentIntensityAnalyzeranalyzer = SentimentIntensityAnalyzer()texts_fr = ["Ce film est absolument génial et fantastique !", # Très positif"Je n'ai pas aimé ce produit, c'est une déception.", # Négatif"Le service était correct, sans plus.", # Neutre"C'est une idée TERRIBLEMENT mauvaise.", # Très négatif avec emphase"Ce n'est pas mauvais du tout :)", # Positif malgré négation + emoji"Le temps aujourd'hui est ensoleillé."# Plutôt objectif/neutre]# Bien que VADER soit pour l'anglais, testons pour voir sa logique sur des traductions conceptuelles# Pour une analyse en français, il faudrait un lexique français ou un modèle entraîné en français.texts_en_equivalent = ["This movie is absolutely brilliant and fantastic!","I did not like this product, it's a disappointment.","The service was okay, nothing more.","This is a TERRIBLY bad idea.","It's not bad at all :)","The weather today is sunny."]print("Analyse avec VADER (sur équivalents anglais) :")
Analyse avec VADER (sur équivalents anglais) :
Code
for i, text inenumerate(texts_en_equivalent): vs = analyzer.polarity_scores(text)print(f"Texte original (FR): {texts_fr[i]}")print(f"Texte analysé (EN): {text} -> Scores VADER: {vs}")# Le score 'compound' est une métrique normalisée entre -1 et +1.# Généralement: compound > 0.05 -> positif; compound < -0.05 -> négatif; sinon neutre. sentiment ="Neutre"if vs['compound'] >=0.05: sentiment ="Positif"elif vs['compound'] <=-0.05: sentiment ="Négatif"print(f"Sentiment VADER: {sentiment}\n")
Texte original (FR): Ce film est absolument génial et fantastique !
Texte analysé (EN): This movie is absolutely brilliant and fantastic! -> Scores VADER: {'neg': 0.0, 'neu': 0.377, 'pos': 0.623, 'compound': 0.85}
Sentiment VADER: Positif
Texte original (FR): Je n'ai pas aimé ce produit, c'est une déception.
Texte analysé (EN): I did not like this product, it's a disappointment. -> Scores VADER: {'neg': 0.436, 'neu': 0.564, 'pos': 0.0, 'compound': -0.6608}
Sentiment VADER: Négatif
Texte original (FR): Le service était correct, sans plus.
Texte analysé (EN): The service was okay, nothing more. -> Scores VADER: {'neg': 0.0, 'neu': 0.725, 'pos': 0.275, 'compound': 0.2263}
Sentiment VADER: Positif
Texte original (FR): C'est une idée TERRIBLEMENT mauvaise.
Texte analysé (EN): This is a TERRIBLY bad idea. -> Scores VADER: {'neg': 0.662, 'neu': 0.338, 'pos': 0.0, 'compound': -0.8331}
Sentiment VADER: Négatif
Texte original (FR): Ce n'est pas mauvais du tout :)
Texte analysé (EN): It's not bad at all :) -> Scores VADER: {'neg': 0.0, 'neu': 0.406, 'pos': 0.594, 'compound': 0.705}
Sentiment VADER: Positif
Texte original (FR): Le temps aujourd'hui est ensoleillé.
Texte analysé (EN): The weather today is sunny. -> Scores VADER: {'neg': 0.0, 'neu': 0.588, 'pos': 0.412, 'compound': 0.4215}
Sentiment VADER: Positif
Code
# Exemple d'approche lexicale très simple en français (conceptuel)lexique_fr_simple = {"génial": 2, "fantastique": 3, "aimé": 2, "déception": -2, "correct": 0,"mauvais": -2, "terrible": -3, "ensoleillé": 1, "bon": 1, "pas": 0# "pas" sera géré par une règle}negations = ["pas", "n'", "ne", "jamais"]def sentiment_lex_fr_simple(text): tokens = text.lower().replace("'", " ").split() score =0 negate =Falsefor token in tokens:if token in negations: negate =Truecontinueif token in lexique_fr_simple: current_score = lexique_fr_simple[token]if negate: current_score *=-1# Inverser le score negate =False# Réinitialiser pour le prochain mot score += current_scorereturn scoreprint("\nAnalyse avec lexique français simple (conceptuel) :")
Analyse avec lexique français simple (conceptuel) :
Code
for text in texts_fr: score = sentiment_lex_fr_simple(text) sentiment ="Neutre"if score >0: sentiment ="Positif"elif score <0: sentiment ="Négatif"print(f"Texte: {text} -> Score: {score}, Sentiment: {sentiment}")
Texte: Ce film est absolument génial et fantastique ! -> Score: 5, Sentiment: Positif
Texte: Je n'ai pas aimé ce produit, c'est une déception. -> Score: -2, Sentiment: Négatif
Texte: Le service était correct, sans plus. -> Score: 0, Sentiment: Neutre
Texte: C'est une idée TERRIBLEMENT mauvaise. -> Score: 0, Sentiment: Neutre
Texte: Ce n'est pas mauvais du tout :) -> Score: 2, Sentiment: Positif
Texte: Le temps aujourd'hui est ensoleillé. -> Score: 0, Sentiment: Neutre
R
Code
# install.packages(c("tidytext", "dplyr", "stopwords", "stringr"))library(tidytext)library(dplyr)library(stringr) # pour str_detect# Exemple de textes en françaistexts_fr_df <-tibble(id =1:4,text =c("This movie is absolutely brilliant and fantastic!","I did not like this product, it's a disappointment.","This is a TERRIBLY bad idea.","It's not bad at all :)" ))# Obtenir le lexique "bing"bing_lexicon <-get_sentiments("bing") # colonnes: word, sentiment (positive/negative)# print(head(bing_lexicon))sentiment_bing_fr <- texts_fr_df %>%unnest_tokens(word, text) %>%# Pour une démo, nous allons "tricher" en supposant que les mots français sont dans le lexique anglais# Idéalement, on traduirait ou on utiliserait un lexique françaisinner_join(bing_lexicon, by ="word", relationship ="many-to-many") %>%# Utiliser relationship pour compatibilitécount(id, sentiment) %>%# Compter les mots positifs/négatifs par texte tidyr::pivot_wider(names_from = sentiment, values_from = n, values_fill =0) %>%# Mettre en formemutate(sentiment_score = positive - negative,final_sentiment =case_when( sentiment_score >0~"Positif (Bing)", sentiment_score <0~"Négatif (Bing)", sentiment_score ==0~"Neutre (Bing)",is.na(sentiment_score) ~"Neutre (Bing)" )) %>%right_join(texts_fr_df, by="id") %>%# Rejoindre avec les textes originauxselect(id, text, positive, negative, sentiment_score, final_sentiment)cat("\nAnalyse avec lexique 'bing' (appliqué aux mots français comme s'ils étaient anglais pour démo):\n")print(sentiment_bing_fr)# Une approche plus correcte pour le français nécessiterait un lexique français.# Exemple conceptuel avec un petit lexique français personnalisé:lexique_fr_perso <-tribble(~word, ~value,"génial", 2,"fantastique", 3,"aimé", 2, # "ai" + "aimé" -> lemmatisation serait utile"déception", -2,"correct", 0,"mauvais", -2,"terrible", -3,"ensoleillé", 1,"bon", 1,"pas", 0# Négation à gérer séparément)# La gestion des négations dans tidytext est plus complexe et se fait souvent en amont# ou avec des N-grammes et des règles spécifiques.sentiment_custom_lex_fr <- texts_fr_df %>%unnest_tokens(word, text) %>%left_join(lexique_fr_perso, by ="word") %>%group_by(id, text) %>%summarise(sentiment_score =sum(value, na.rm =TRUE), .groups ="drop") %>%mutate(final_sentiment =case_when( sentiment_score >0~"Positif (Custom)", sentiment_score <0~"Négatif (Custom)",TRUE~"Neutre (Custom)" ))cat("\nAnalyse avec lexique français personnalisé (simple, sans gestion de négation avancée):\n")print(sentiment_custom_lex_fr)# Pour VADER en R, il existe le package 'vader'.# install.packages("vader")# library(vader)# vader_scores_list <- lapply(texts_en_equivalent, function(txt) vader_get_sentiment(txt)) # Utiliser équivalents anglais# print(vader_scores_list)
Malgré ses limitations, l’approche basée sur un lexique demeure une technique précieuse, en particulier pour obtenir rapidement une première évaluation du sentiment, pour des langues avec peu de ressources d’entraînement, ou lorsque l’explicabilité des résultats est primordiale.
4 Analyse de Sentiments Basée sur l’Apprentissage Automatique
Contrairement à l’approche lexicale qui s’appuie sur des dictionnaires de mots pré-codés, l’analyse de sentiments basée sur l’apprentissage automatique (Machine Learning - ML) traite cette tâche comme un problème de classification de texte supervisée. L’objectif est d’entraîner un modèle à “apprendre” comment distinguer les différentes classes de sentiment (positif, négatif, neutre) à partir d’un grand nombre d’exemples de textes préalablement étiquetés.
4.1 Vue d’Ensemble du Processus Supervisé
Le flux de travail typique pour une analyse de sentiments basée sur l’apprentissage automatique comprend les étapes suivantes :
Collecte et Préparation des Données Étiquetées : Constitution d’un corpus où chaque texte est associé à une étiquette de sentiment.
Prétraitement du Texte : Nettoyage et normalisation des textes.
Extraction de Caractéristiques (Feature Extraction) : Transformation des textes en une représentation numérique que les algorithmes de ML peuvent traiter.
Choix et Entraînement du Modèle : Sélection d’un algorithme de classification et son entraînement sur les données étiquetées.
Évaluation du Modèle : Mesure de la performance du modèle sur des données non vues.
Utilisation du Modèle : Déploiement du modèle pour prédire le sentiment de nouveaux textes.
4.2 Étape 1 : Collecte et Préparation des Données Étiquetées
C’est sans doute l’étape la plus cruciale. La qualité et la quantité des données d’entraînement détermineront en grande partie la performance du modèle final.
Sources de données étiquetées :
Datasets publics : De nombreux corpus sont disponibles pour la recherche, comme le dataset de critiques de films IMDb, les datasets de sentiments Twitter, ou les avis produits Amazon.
Annotation manuelle : Si aucun dataset adapté n’existe pour votre domaine spécifique, il peut être nécessaire d’annoter manuellement un ensemble de vos propres données. Ce processus implique que des annotateurs humains lisent les textes et leur assignent une étiquette de sentiment. Des plateformes d’annotation (ex: Amazon Mechanical Turk, Doccano, Label Studio) peuvent faciliter ce travail.
Annotation semi-automatique ou active learning : Des techniques pour réduire l’effort d’annotation manuelle.
Qualité des étiquettes : Les étiquettes doivent être cohérentes. Il est courant d’avoir plusieurs annotateurs pour chaque texte et d’utiliser des mesures d’accord inter-annotateurs (ex: Kappa de Cohen) pour s’assurer de la fiabilité des étiquettes.
Équilibre des classes : Idéalement, le nombre d’exemples pour chaque classe de sentiment (positif, négatif, neutre) devrait être équilibré. Si une classe est fortement majoritaire, le modèle pourrait avoir tendance à prédire cette classe plus souvent. Des techniques de rééquilibrage (sur-échantillonnage de la classe minoritaire, sous-échantillonnage de la classe majoritaire, ou génération de données synthétiques comme SMOTE) peuvent être appliquées.
4.3 Étape 2 : Prétraitement Spécifique au Sentiment
Cette étape s’appuie sur les techniques vues au Chapitre 2, mais avec quelques considérations spécifiques au sentiment :
Normalisation : Conversion en minuscules, suppression des URLs, des noms d’utilisateur, etc.
Tokenisation.
Ponctuation : Certains signes de ponctuation (comme ! ou ?) peuvent être porteurs de sentiment. Leur suppression totale n’est pas toujours souhaitable. On peut les traiter comme des tokens séparés ou les utiliser pour ajuster des scores d’intensité.
Mots-vides (Stop Words) : La suppression des mots-vides doit être effectuée avec prudence. Des mots comme “pas”, “ne”, “jamais” sont cruciaux car ils modifient la polarité du sentiment. Il est souvent préférable de conserver ces négations ou d’utiliser des N-grammes qui les capturent (ex: “pas bon”).
Lemmatisation ou Racisation (Stemming) : La lemmatisation est généralement préférée car elle ramène les mots à leur forme sémantique de base (lemme), ce qui est plus pertinent pour le sentiment que la simple racine du stemming.
Emojis et Émoticônes : Ces éléments sont de forts indicateurs de sentiment et devraient être traités. Ils peuvent être remplacés par des tokens textuels descriptifs (ex: : ) devient _EMOJI_SMILEY_).
Gestion des majuscules : Des mots écrits en majuscules peuvent indiquer une emphase (ex: “GREAT” vs “great”). Cette information peut être conservée comme une caractéristique ou utilisée pour moduler les scores de sentiment.
4.4 Étape 3 : Extraction de Caractéristiques (Feature Extraction)
Une fois le texte nettoyé, il doit être transformé en une série de vecteurs numériques (features) que les algorithmes de ML peuvent utiliser.
Modèle Sac de Mots (Bag-of-Words) avec pondération TF ou TF-IDF :
Chaque document est représenté par un vecteur où chaque dimension correspond à un mot (ou token) du vocabulaire.
La valeur peut être la fréquence brute, la présence/absence binaire, ou le score TF-IDF du mot dans le document. Le TF-IDF est souvent un bon choix car il donne plus de poids aux mots qui sont discriminants pour un document par rapport à l’ensemble du corpus.
N-grammes de Mots :
Utiliser des séquences de N mots consécutifs (bigrammes, trigrammes) comme caractéristiques en plus des unigrammes (mots seuls).
Permet de capturer un contexte local important, des expressions idiomatiques et des modificateurs comme les négations (ex: le bigramme “pas_bon” est différent de la simple présence des mots “pas” et “bon” séparément).
Plongements de Mots (Word Embeddings) :
Des modèles comme Word2Vec, GloVe, ou FastText apprennent des représentations vectorielles denses des mots dans un espace de plus faible dimension (comparé aux DTM TF-IDF).
Ces vecteurs capturent des relations sémantiques entre les mots (ex: les vecteurs de “joyeux” et “content” seront proches).
Pour obtenir un vecteur de document, on peut faire la moyenne (ou la somme pondérée) des embeddings des mots qu’il contient, ou utiliser des modèles plus sophistiqués qui apprennent directement des embeddings de documents (comme Doc2Vec).
Les embeddings pré-entraînés sur de vastes corpus (comme Google News pour Word2Vec, ou Common Crawl pour FastText) peuvent être utilisés comme point de départ et potentiellement affinés sur le corpus spécifique à la tâche. (Les détails sur les embeddings seront vus au Chapitre 8).
Autres caractéristiques potentielles :
Caractéristiques linguistiques : Nombre d’adjectifs, d’adverbes, présence de certains types de verbes.
Scores de sentiment basés sur un lexique : Le score de sentiment obtenu par une approche lexicale (voir section précédente) peut lui-même être utilisé comme une caractéristique additionnelle pour un modèle ML.
Métadonnées : Longueur du texte, nombre de mots en majuscules, nombre de points d’exclamation, etc.
Le choix des caractéristiques (feature engineering) est une étape cruciale qui peut grandement influencer la performance du modèle.
4.5 Étape 4 : Choix et Entraînement du Modèle
Une fois les caractéristiques extraites, un algorithme de classification est choisi et entraîné sur l’ensemble d’entraînement (training set). L’ensemble de données est généralement divisé en un ensemble d’entraînement et un ensemble de test (et parfois un ensemble de validation pour l’ajustement des hyperparamètres).
Classifieurs Traditionnels (Shallow Learning) :
Naïve Bayes (en particulier Multinomial Naive Bayes) : Très utilisé pour la classification de texte en raison de sa simplicité, de sa rapidité et de ses performances souvent étonnamment bonnes, surtout avec des données TF-IDF. Il suppose une indépendance conditionnelle des caractéristiques.
Régression Logistique : Un autre classifieur linéaire robuste et efficace, qui modélise la probabilité d’appartenance à une classe. Il est souvent bien calibré et ses coefficients peuvent fournir une certaine interprétabilité.
Machines à Vecteurs de Support (SVM) : Particulièrement efficaces dans les espaces de grande dimension (comme ceux issus des caractéristiques textuelles) et pour trouver des frontières de décision complexes. Les SVM avec des noyaux linéaires sont couramment utilisés pour le texte.
Arbres de Décision et Forêts Aléatoires (Random Forests) : Peuvent capturer des interactions non linéaires entre les caractéristiques, mais peuvent être moins performants que les SVM ou la régression logistique sur des données textuelles très dispersées.
Apprentissage Profond (Deep Learning) : (Sera détaillé au Chapitre 8)
Réseaux de Neurones Récurrents (RNN), LSTMs, GRUs : Conçus pour traiter des données séquentielles, ils peuvent modéliser l’ordre des mots et les dépendances à longue distance.
Réseaux de Neurones Convolutifs (CNN) : Peuvent extraire des motifs locaux (N-grammes de différentes tailles) pertinents pour le sentiment.
Transformateurs (Transformers) – ex: BERT, RoBERTa, XLNet : Architectures de pointe qui utilisent des mécanismes d’attention pour pondérer l’importance des différents mots dans leur contexte. Les modèles pré-entraînés sur d’immenses corpus peuvent être “fine-tunés” (ré-entraînés légèrement) sur des tâches spécifiques de classification de sentiments avec des performances souvent supérieures.
Le processus d’entraînement consiste à ajuster les paramètres du modèle pour minimiser une fonction de perte (qui mesure l’erreur du modèle) sur les données d’entraînement.
4.6 Étape 5 : Évaluation du Modèle
Après l’entraînement, la performance du modèle est évaluée sur un ensemble de test (test set) – des données étiquetées que le modèle n’a jamais vues auparavant. Cela donne une estimation de la capacité du modèle à généraliser à de nouvelles données. Les métriques d’évaluation seront détaillées dans la section 4.5.
4.7 Avantages et Inconvénients de l’Approche ML
Avantages :
Haute Performance Potentielle : Les modèles ML, en particulier les modèles d’apprentissage profond, peuvent atteindre des niveaux de précision élevés, surtout s’ils sont entraînés sur des données de bonne qualité et spécifiques au domaine.
Adaptabilité : Le modèle apprend les caractéristiques pertinentes directement à partir des données, ce qui lui permet de s’adapter à différents domaines, styles d’écriture, et nuances de langage pourvu que les données d’entraînement soient représentatives.
Découverte de Motifs Complexes : Capable d’identifier des relations subtiles entre les mots et les sentiments que les approches lexicales, plus rigides, pourraient manquer.
Inconvénients :
Nécessité de Données Étiquetées : Requiert un volume conséquent de données textuelles manuellement étiquetées, ce qui peut être un processus coûteux en temps et en ressources.
Effort d’Ingénierie des Caractéristiques (Feature Engineering) : Pour les modèles traditionnels, le choix et la création de bonnes caractéristiques sont essentiels et demandent de l’expertise. (Moins vrai pour les modèles de deep learning qui apprennent souvent leurs propres représentations).
“Boîte Noire” (Black Box) : Certains modèles, notamment les réseaux de neurones profonds, peuvent être difficiles à interpréter. Comprendre pourquoi un modèle a pris une décision particulière peut être complexe.
Coût Computationnel : L’entraînement de modèles complexes, en particulier les grands modèles de deep learning, peut nécessiter des ressources matérielles importantes (GPU) et du temps.
Sensibilité aux Biais des Données : Si les données d’entraînement contiennent des biais (par exemple, si certains groupes démographiques expriment le sentiment différemment et sont sous-représentés), le modèle peut hériter et amplifier ces biais.
4.8 Exemples de Code
Ici, nous allons illustrer une approche ML classique pour l’analyse de sentiments, en utilisant la Régression Logistique.
# Importation des bibliothèques nécessairesimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_score, classification_report, confusion_matriximport re# Données d'exemple (simulant des critiques de produits/films)# Dans un cas réel, vous chargeriez un dataset plus conséquent.data = {'text': ["J'adore ce produit, il est fantastique et très utile !", # Positif"Absolument horrible, je ne le recommande pas du tout.", # Négatif"C'est un film moyen, ni bon ni mauvais.", # Neutre (sera filtré)"Le service client était excellent et rapide.", # Positif"Une perte de temps totale, très décevant.", # Négatif"Plutôt bon, mais pourrait être amélioré sur certains aspects.", # Neutre (sera filtré)"Je suis très satisfait de cet achat.", # Positif"Qualité médiocre, ne vaut pas le prix.", # Négatif"Un chef-d'œuvre ! Incroyable du début à la fin.", # Positif"Pas terrible, je m'attendais à mieux.", # Négatif"Ce livre est captivant et bien écrit.", # Positif"Je suis vraiment déçu par la performance.", # Négatif"Une expérience formidable, je reviendrai !", # Positif"Le pire achat que j'ai jamais fait.", # Négatif"Excellent rapport qualité-prix, je recommande vivement.", # Positif"Ne fonctionne pas comme annoncé, très frustrant.", # Négatif"Le personnel était amical et serviable.", # Positif"Je regrette d'avoir dépensé mon argent pour ça."# Négatif ],'sentiment': [1, 0, 2, 1, 0, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0] # 1: Positif, 0: Négatif, 2: Neutre}df = pd.DataFrame(data)# Pour simplifier, nous allons faire une classification binaire (Positif/Négatif)# Filtrons les neutres et remappons les sentiments si nécessaire.# Ici, nous allons considérer les 'Neutres' comme 'Négatifs' pour un exemple binaire simple.# Ou, mieux, filtrons-les pour un exemple purement Positif/Négatif.df_binary = df[df['sentiment'] !=2].copy() # Créer une copie pour éviter SettingWithCopyWarning# df_binary['sentiment'] = df_binary['sentiment'].replace({2: 0}) # Si on voulait les traiter comme négatifsprint("Données pour classification binaire (Positif/Négatif):")
Données pour classification binaire (Positif/Négatif):
Code
print(df_binary)
text sentiment
0 J'adore ce produit, il est fantastique et très... 1
1 Absolument horrible, je ne le recommande pas d... 0
3 Le service client était excellent et rapide. 1
4 Une perte de temps totale, très décevant. 0
6 Je suis très satisfait de cet achat. 1
7 Qualité médiocre, ne vaut pas le prix. 0
8 Un chef-d'œuvre ! Incroyable du début à la fin. 1
9 Pas terrible, je m'attendais à mieux. 0
10 Ce livre est captivant et bien écrit. 1
11 Je suis vraiment déçu par la performance. 0
12 Une expérience formidable, je reviendrai ! 1
13 Le pire achat que j'ai jamais fait. 0
14 Excellent rapport qualité-prix, je recommande ... 1
15 Ne fonctionne pas comme annoncé, très frustrant. 0
16 Le personnel était amical et serviable. 1
17 Je regrette d'avoir dépensé mon argent pour ça. 0
Code
# Prétraitement simple du texte (minuscules, suppression de ponctuation basique)def preprocess_text(text): text = text.lower() text = re.sub(r'[^\w\s]', '', text) # Supprime la ponctuationreturn textdf_binary['cleaned_text'] = df_binary['text'].apply(preprocess_text)# Séparation des données en ensembles d'entraînement et de testX_train, X_test, y_train, y_test = train_test_split( df_binary['cleaned_text'], df_binary['sentiment'], test_size=0.3, # 30% pour le test random_state=42# Pour la reproductibilité)# Extraction de caractéristiques avec TF-IDFtfidf_vectorizer = TfidfVectorizer(max_features=100) # Limiter le nombre de features pour cet exempleX_train_tfidf = tfidf_vectorizer.fit_transform(X_train)X_test_tfidf = tfidf_vectorizer.transform(X_test)# Entraînement du modèle de Régression Logistiquelog_reg_model = LogisticRegression(random_state=42)log_reg_model.fit(X_train_tfidf, y_train)
LogisticRegression(random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
LogisticRegression(random_state=42)
Code
# Prédictions sur l'ensemble de testy_pred = log_reg_model.predict(X_test_tfidf)# Évaluation du modèleaccuracy = accuracy_score(y_test, y_pred)conf_matrix = confusion_matrix(y_test, y_pred)class_report = classification_report(y_test, y_pred, zero_division=0)print(f"\n--- Évaluation du Modèle de Régression Logistique ---")
--- Évaluation du Modèle de Régression Logistique ---
# Pour voir les features les plus importantes (coefficients)# feature_names = tfidf_vectorizer.get_feature_names_out()# coefs = log_reg_model.coef_[0]# important_features = pd.DataFrame({'feature': feature_names, 'coefficient': coefs})# print("\nFeatures importantes (Positif vs Négatif):")# print(important_features.sort_values(by='coefficient', ascending=False).head(5)) # Top 5 Positif# print(important_features.sort_values(by='coefficient', ascending=True).head(5)) # Top 5 Négatif (les plus petits coefs)
L’approche par apprentissage automatique, bien que plus exigeante en termes de données et potentiellement de ressources computationnelles, offre généralement une plus grande flexibilité et des performances supérieures pour l’analyse de sentiments, en particulier lorsque des nuances contextuelles et des spécificités de domaine sont importantes.
5 Évaluation des Systèmes d’Analyse de Sentiments
Que l’approche soit basée sur un lexique ou sur l’apprentissage automatique, il est crucial d’évaluer sa performance.
Rappel (Recall) / Sensibilité : Capacité à identifier tous les positifs. ($ VP / (VP+FN) $)
Score F1 (F1-Score) : Moyenne harmonique de la précision et du rappel. ($ 2 (Précision Rappel) / (Précision + Rappel) $) Particulièrement utile pour les datasets déséquilibrés.
5.2 Matrice de Confusion
Tableau qui visualise les performances d’un classifieur en montrant les Vrais Positifs (VP), Vrais Négatifs (VN), Faux Positifs (FP), et Faux Négatifs (FN).
5.3 Importance de l’Ensemble de Test
Pour les approches ML, l’évaluation DOIT être faite sur un ensemble de données que le modèle n’a jamais vu pendant l’entraînement.
6 Conclusion et Perspectives
L’analyse de sentiments est un outil puissant pour transformer les données textuelles non structurées en insights exploitables sur les opinions et les émotions. Bien qu’elle présente des défis, les avancées continues, notamment en apprentissage profond, ouvrent la voie à des analyses de plus en plus précises et nuancées. Le choix de l’approche (lexique ou ML) dépendra des ressources disponibles (données étiquetées, temps, expertise), du niveau de performance requis et de la nature du problème à résoudre.
7 Exercices
Exercise 1 (Analyse de Sentiments sur des Critiques de Films (Anglais)) L’objectif de cet exercice est d’appliquer et de comparer les approches basées sur un lexique et sur l’apprentissage automatique pour l’analyse de sentiments sur un corpus de critiques de films en anglais.
Corpus Suggéré : Le dataset “IMDb Movie Reviews” est un classique pour cette tâche. Il contient 50 000 critiques de films, équitablement réparties entre sentiments positifs et négatifs (25 000 de chaque). * Vous pouvez le trouver facilement dans des bibliothèques comme scikit-learn (souvent inclus dans les datasets exemples) ou tensorflow_datasets / keras.datasets pour Python, ou le télécharger manuellement. * Alternative : Le dataset “Sentiment140” pour des tweets, si vous préférez un texte plus court et informel.
Tâches :
Préparation des Données :
Chargez une partie du dataset (par exemple, 1000 critiques positives et 1000 négatives pour commencer, afin de gérer le temps de calcul).
Effectuez un prétraitement de base : conversion en minuscules, suppression de la ponctuation (ou gestion spécifique), suppression des balises HTML si présentes (fréquent dans le dataset IMDb).
Approche Basée sur un Lexique :
Choisissez un lexique de sentiments en anglais (par exemple, VADER, Bing Liu via tidytext en R, ou AFINN).
Pour chaque critique, calculez un score de sentiment.
Définissez un seuil pour classer chaque critique comme “positive” ou “négative” en fonction du score.
Évaluez la performance de cette approche (exactitude, précision, rappel, F1-score) en comparant avec les étiquettes réelles du dataset.
Approche Basée sur l’Apprentissage Automatique :
Divisez vos données en ensembles d’entraînement et de test (par exemple, 80% / 20%).
Extraction de Caractéristiques : Utilisez TF-IDF sur votre ensemble d’entraînement. Expérimentez avec les unigrammes, puis avec les unigrammes et bigrammes (ngram_range=(1,2)).
Entraînement du Modèle : Entraînez un classifieur simple comme la Régression Logistique ou Naïve Bayes sur les caractéristiques TF-IDF.
Évaluation : Évaluez la performance du modèle sur l’ensemble de test en utilisant les mêmes métriques (exactitude, précision, rappel, F1-score, matrice de confusion).
Comparaison et Analyse :
Comparez les performances des deux approches. Laquelle semble la mieux adaptée pour ce corpus ?
Examinez quelques exemples où les modèles se sont trompés. Quelles pourraient être les raisons (sarcasme, négations complexes, contexte spécifique au domaine du cinéma) ?
Comment la gestion des mots-vides (stop words) ou la lemmatisation/racinisation pourraient-elles influencer les résultats de chaque approche ? (Optionnel : testez ces variations).
Outils Suggérés : * Python :nltk, scikit-learn (pour TF-IDF, modèles ML, métriques), vaderSentiment. * R :tidytext (pour les lexiques, tokenisation), dplyr, tm (pour TF-IDF), caret ou tidymodels (pour les modèles ML et l’évaluation).