Analyse des sentiments dans R
Associez les jetons à des lexiques de sentiments pour mesurer la tonalité positive ou négative.
Analyse des sentiments dans R est une leçon R Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage R Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours R Academy comprend 4 leçons au total.
Présentation de l’analyse des sentiments
L’analyse des sentiments attribue une valence émotionnelle au texte. L’approche tidytext compare chaque mot à un lexique de sentiments, puis agrège les scores. Trois lexiques intégrés sont disponibles : AFINN (scores numériques), Bing (positif/négatif) et NRC (catégories d’émotions).
library(tidytext)
# Available sentiment lexicons
# AFINN: -5 to +5 numeric score
# Bing: binary positive/negative
# NRC: emotion categories (joy, fear, anger, ...)
# Preview AFINN
afinn_sample <- get_sentiments('afinn')
cat('AFINN rows:', nrow(afinn_sample), '\n')
cat('Score range:', range(afinn_sample$value), '\n')
print(head(afinn_sample, 5))get_sentiments('afinn')
Le lexique AFINN attribue aux 2 477 mots anglais des scores entiers allant de −5 (très négatif) à +5 (très positif). Il a été compilé par Finn Årup Nielsen et fonctionne bien pour les textes issus des réseaux sociaux et les avis.
library(tidytext)
library(dplyr)
afinn <- get_sentiments('afinn')
# Most positive and most negative words
cat('Most positive words:\n')
print(afinn |> slice_max(value, n = 5))
cat('\nMost negative words:\n')
print(afinn |> slice_min(value, n = 5))
# Score distribution
cat('\nScore distribution:\n')
print(table(afinn$value))get_sentiments('bing')
Le lexique Bing (Bing Liu et ses collaborateurs) classe 6 786 mots comme positifs ou négatifs. Il est plus vaste qu’AFINN et convient bien aux avis sur des produits et aux retours clients lorsque la simple polarité suffit.
library(tidytext)
library(dplyr)
bing <- get_sentiments('bing')
cat('Bing lexicon size:', nrow(bing), '\n')
cat('Positive words:', sum(bing$sentiment == 'positive'), '\n')
cat('Negative words:', sum(bing$sentiment == 'negative'), '\n')
# Sample positive and negative words
cat('\nSample positive:', head(bing$word[bing$sentiment == 'positive'], 8), '\n')
cat('Sample negative:', head(bing$word[bing$sentiment == 'negative'], 8), '\n')inner_join : notation des mots
inner_join(tokens, afinn, by = 'word') conserve uniquement les tokens présents dans le lexique AFINN et leur ajoute leurs scores. Les mots absents du lexique sont supprimés silencieusement — c'est à la fois un avantage (l'analyse se concentre sur les mots connus exprimant un sentiment) et une limite.
library(tidytext)
library(dplyr)
reviews <- tibble::tibble(
review_id = 1:3,
text = c(
'The product is excellent and outstanding quality',
'Terrible experience, broken and disappointing',
'Good value but slow delivery, acceptable overall'
)
)
scored <- reviews |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('afinn'), by = 'word')
cat('Scored words:\n')
print(scored[, c('review_id', 'word', 'value')])Sentiment net par document
Additionnez les scores AFINN par document avec group_by(document) |> summarise(sentiment = sum(value)) afin d'obtenir un score de sentiment net. Les sommes positives indiquent un sentiment globalement positif ; les sommes négatives indiquent un sentiment négatif.
library(tidytext)
library(dplyr)
reviews <- tibble::tibble(
review_id = 1:5,
text = c(
'excellent outstanding perfect love best amazing',
'terrible broken horrible awful waste money',
'good acceptable okay decent average',
'brilliant fantastic outstanding love recommend',
'poor bad disappointing slow useless'
)
)
net_sentiment <- reviews |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('afinn'), by = 'word') |>
group_by(review_id) |>
summarise(
sentiment = sum(value),
word_count = n()
) |>
mutate(polarity = ifelse(sentiment > 0, 'positive', 'negative'))
print(net_sentiment)Sentiment Bing : décomptes positifs et négatifs
Avec le lexique Bing, comparez le nombre de mots positifs et négatifs par document. Calculez sentiment = positive_n - negative_n pour obtenir un score de polarité net, ou représentez les deux décomptes sous forme de barres groupées pour visualiser leur composition.
library(tidytext)
library(dplyr)
corpus <- tibble::tibble(
chapter = 1:4,
text = c(
'the hero was brave courageous strong and victorious in battle',
'disaster struck terrible losses failure defeat mourning grief',
'love joy happiness beautiful peaceful wonderful morning',
'evil darkness corrupt wicked terrible pain suffering fear'
)
)
bing_sentiment <- corpus |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('bing'), by = 'word') |>
count(chapter, sentiment) |>
tidyr::pivot_wider(names_from = sentiment, values_from = n, values_fill = 0) |>
mutate(net = positive - negative)
print(bing_sentiment)Sentiment par chapitre ou section
Pour suivre le sentiment au fil de l'arc narratif, calculez le sentiment net par chapitre ou sur une fenêtre glissante. Cela révèle la structure émotionnelle : montée de l'action, point culminant, résolution. Utilisez ggplot2 avec geom_line() ou geom_bar() pour visualiser l'arc.
library(tidytext)
library(dplyr)
library(ggplot2)
# Simulate a 10-chapter story arc
set.seed(42)
chapters <- tibble::tibble(
chapter = 1:10,
text = c(
'peaceful beautiful joy love happy wonderful',
'good friends happy carefree enjoyable fun',
'worried anxious trouble fear uncertain dark',
'danger terrible threat awful pain suffering',
'fear horror disaster terrible devastation loss',
'fight battle struggle hard difficult challenge',
'hope courage determination brave strong resist',
'triumph victory success celebrate joy love',
'relief peace gratitude wonderful blessed happy',
'love joy peace beautiful grateful wonderful'
)
)
arc <- chapters |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('afinn'), by = 'word') |>
group_by(chapter) |>
summarise(net_sentiment = sum(value))
ggplot(arc, aes(chapter, net_sentiment)) +
geom_line(color = 'steelblue', linewidth = 1.2) +
geom_hline(yintercept = 0, linetype = 'dashed') +
labs(x = 'Chapter', y = 'Net Sentiment', title = 'Story Sentiment Arc') +
theme_minimal()Lexique NRC : catégories d'émotions
Le lexique NRC (Saif Mohammad et Peter Turney) classe 13 901 mots en huit émotions (colère, anticipation, dégoût, peur, joie, tristesse, surprise, confiance), ainsi qu'en catégories positive et négative. Filtrez par émotion avec filter(sentiment == 'joy').
library(tidytext)
library(dplyr)
nrc <- get_sentiments('nrc')
cat('NRC size:', nrow(nrc), '\n')
cat('Emotions:', paste(unique(nrc$sentiment), collapse = ', '), '\n')
# Words associated with 'joy'
joy_words <- nrc |> filter(sentiment == 'joy')
cat('\nJoy words:', nrow(joy_words), '\n')
cat('Sample:', head(joy_words$word, 10), '\n')
# Count words per emotion
nrc |>
count(sentiment, sort = TRUE) |>
print()Appliquer NRC à un corpus
Reliez le texte tokenisé au lexique NRC afin d'attribuer séparément un score à chaque émotion. Agrégez par document et par émotion avec count(doc_id, sentiment) pour voir quelles émotions dominent dans chaque document.
library(tidytext)
library(dplyr)
docs <- tibble::tibble(
doc_id = c(1, 1, 2, 2, 3, 3),
text = c(
'wonderful joyful happy love peace',
'excited surprise anticipation trust',
'fear anger terrible hate disgust',
'dark horrible awful suffering pain',
'curious wonder discovery learning',
'hope trust anticipation future growth'
)
)
nrc_scores <- docs |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('nrc'), by = 'word') |>
filter(!sentiment %in% c('positive', 'negative')) |> # keep only emotions
count(doc_id, sentiment, sort = TRUE)
cat('Emotion counts per document:\n')
print(nrc_scores)Principe du nuage de mots
Un nuage de mots représente la fréquence des mots en leur attribuant une taille proportionnelle à leur nombre d'occurrences. Les packages wordcloud ou wordcloud2 les génèrent à partir d'un tableau de données de mots et de fréquences. Colorez les mots selon leur sentiment à l'aide du lexique Bing pour obtenir un nuage coloré par sentiment.
library(tidytext)
library(dplyr)
# Prepare word frequencies coloured by Bing sentiment
corpus_text <- tibble::tibble(
text = c(
'excellent performance amazing results love beautiful',
'terrible failure poor broken horrible waste',
'brilliant outstanding success happy wonderful joy',
'awful disappointing bad slow useless frustrating'
)
)
word_freq <- corpus_text |>
unnest_tokens(word, text) |>
count(word, sort = TRUE) |>
left_join(get_sentiments('bing'), by = 'word') |>
mutate(
sentiment = replace(sentiment, is.na(sentiment), 'neutral'),
colour = case_when(
sentiment == 'positive' ~ '#2196F3',
sentiment == 'negative' ~ '#F44336',
TRUE ~ '#9E9E9E'
)
)
print(word_freq)
# In practice: wordcloud2(word_freq[, c('word','n')], color = word_freq$colour)Limites de l'analyse des sentiments fondée sur un lexique
L'analyse des sentiments fondée sur un lexique présente des échecs connus : la négation (« not good » est considéré comme positif), le sarcasme (« oh great, another bug »), le décalage de domaine (« sick » est positif dans l'argot) et les mots absents du vocabulaire. Tenez compte de ces limites lors de l'interprétation des résultats.
library(tidytext)
library(dplyr)
# Negation problem
neg_examples <- tibble::tibble(
text = c(
'not good at all', # negative, but 'good' scores +3
'not bad', # positive, but 'bad' scores -3
'sick beats bro' # slang positive, 'sick' is negative in AFINN
)
)
scored <- neg_examples |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('afinn'), by = 'word')
cat('Lexicon scores (naive - ignores negation):\n')
print(scored[, c('word', 'value')])
cat('\nNote: "not" is a stop word - the negation is lost!\n')Vérification rapide
Vous utilisez inner_join(tokens, afinn, by = 'word') pour attribuer des scores de sentiment. Qu'advient-il des mots de vos tokens qui ne figurent PAS dans le lexique AFINN ?
Récapitulatif : analyse des sentiments
Points essentiels :
- Trois lexiques principaux : AFINN (scores de −5 à +5), Bing (positif/négatif), NRC (8 émotions)
get_sentiments('afinn')/'bing'/'nrc'récupère le lexique sous forme de tibbleinner_join(tokens, lexicon, by = 'word')attribue des scores uniquement aux mots correspondants (les mots sans correspondance sont supprimés)- Sentiment net =
group_by(doc) |> summarise(sentiment = sum(value)) - Bing : comparez le nombre de mots
positive - negativepar document ou par section - NRC : filtrez par nom d'émotion pour isoler la peur, la joie, la colère, etc.
- Limite principale : les méthodes fondées sur un lexique ne gèrent pas la négation, le sarcasme ni l'argot propre à un domaine
library(tidytext)
library(dplyr)
tibble::tibble(text = 'excellent amazing love joy beautiful happy') |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('afinn'), by = 'word') |>
summarise(net_sentiment = sum(value)) |>
print()Apprends R avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 43
- Leçons
- 159
Questions Fréquemment Posées
La leçon « Analyse des sentiments dans R » est-elle gratuite ?
Oui — le texte complet de « Analyse des sentiments dans R » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours R Academy, passe à CoddyKit PRO. Le cours R Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Analyse des sentiments dans R » ?
Associez les jetons à des lexiques de sentiments pour mesurer la tonalité positive ou négative. Tu pratiques R Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer R Academy ?
Aucune expérience préalable n'est requise. R Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Analyse des sentiments dans R » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon R Academy ?
Oui. Chaque leçon R Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Tokenisation et suppression des mots vides
- TF-IDF et analyse de la fréquence des termes
- Analyse des sentiments dans R
- Modélisation des thèmes avec LDA