Nuage de mots en R : guide moderne avec tidytext et ggwordcloud

Transformez du texte en nuage de mots avec un workflow tidy, natif ggplot2

Data Visualization

Construisez un nuage de mots en R à la façon moderne — segmentez le texte avec tidytext, comptez les fréquences des mots, supprimez les mots vides et affichez un nuage natif ggplot2 avec ggwordcloud. Un remplacement propre de l’ancienne recette tm + wordcloud.

Auteur·rice
Date de publication

8 juillet 2026

Modifié

17 juillet 2026

AstuceCe que vous allez apprendre
  • Le pipeline moderne de nuage de mots en R : segmenter → supprimer les mots vides → compter → afficher — tout en tidy, tout natif ggplot2.
  • Comment transformer n’importe quel texte en table de fréquences des mots avec tidytext (unnest_tokens, stop_words, count).
  • Comment dessiner le nuage avec ggwordcloud (geom_text_wordcloud_area) — dimensionné selon la fréquence, coloré sur une échelle viridis, et habillable comme n’importe quel ggplot.
  • Pourquoi cela remplace l’ancienne recette tm + wordcloud() — sans Corpus, sans tm_map, sans TermDocumentMatrix.

Un nuage de mots transforme un bloc de texte en image : plus un mot apparaît souvent, plus il s’affiche en grand. C’est un moyen rapide et visuellement parlant de faire ressortir les thèmes dominants dans des réponses à une enquête, des avis, des discours ou tout texte libre.

La recette R classique pour cela utilisait les packages tm (text mining) et wordcloud — construire un Corpus, enchaîner des transformations tm_map() et en extraire une TermDocumentMatrix. Cela fonctionne encore, mais c’est verbeux et à l’écart de la chaîne d’outils tidy moderne. Cet article fait le même travail avec tidytext + ggwordcloud : une poignée d’étapes de pipeline qui produisent une table de fréquences tidy et un vrai ggplot que vous pouvez habiller, colorer et combiner comme n’importe quelle autre figure.

Nous utiliserons le discours de Gettysburg (domaine public) comme texte d’exemple — mais chaque étape fonctionne sur votre texte : collez-le dans une chaîne de caractères, ou lisez un fichier avec readLines().

Le pipeline moderne de nuage de mots en un coup d’œil

Quatre étapes vous mènent du texte brut au nuage terminé :

  1. Récupérez le texte dans un data frame à une colonne (une seule ligne de texte suffit).
  2. Segmentez — découpez le texte en mots individuels avec tidytext::unnest_tokens().
  3. Nettoyez + comptez — supprimez les mots vides courants (the, and, of…) avec stop_words, puis count() ce qui reste.
  4. Affichez la table de fréquences avec ggwordcloud::geom_text_wordcloud_area().

Tout ce qui suit est ce pipeline, une étape à la fois. Vous n’avez besoin que de trois packages : tidytext, dplyr et ggwordcloud (plus ggplot2 pour l’habillage).

Étape 1 — Mettez votre texte dans un data frame

D’abord, placez le texte quelque part où R peut le manipuler. Le workflow tidy attend un data frame avec une colonne de texte — chaque ligne peut contenir autant — ou aussi peu — de texte que vous voulez. Ici, nous déposons tout le discours dans un data frame à une seule ligne :

library(tidytext)
library(dplyr)
library(ggwordcloud)
library(ggplot2)

speech <- "Four score and seven years ago our fathers brought forth on this
continent, a new nation, conceived in Liberty, and dedicated to the proposition
that all men are created equal. Now we are engaged in a great civil war, testing
whether that nation, or any nation so conceived and so dedicated, can long endure.
We are met on a great battle-field of that war. We have come to dedicate a portion
of that field, as a final resting place for those who here gave their lives that
that nation might live. But, in a larger sense, we can not dedicate, we can not
consecrate, we can not hallow this ground. The brave men, living and dead, who
struggled here, have consecrated it, far above our poor power to add or detract.
The world will little note, nor long remember what we say here, but it can never
forget what they did here. It is for us the living, rather, to be dedicated here
to the unfinished work which they who fought here have thus far so nobly advanced.
It is rather for us to be here dedicated to the great task remaining before us,
that from these honored dead we take increased devotion to that cause for which
they gave the last full measure of devotion, that we here highly resolve that
these dead shall not have died in vain, that this nation, under God, shall have a
new birth of freedom, and that government of the people, by the people, for the
people, shall not perish from the earth."

text_df <- data.frame(text = speech, stringsAsFactors = FALSE)

Pour utiliser plutôt votre propre texte, lisez un fichier directement dans la même forme :

# One row per line of the file:
text_df <- data.frame(
  text = readLines("my-text.txt"),
  stringsAsFactors = FALSE
)

Étape 2 — Segmenter le texte avec tidytext

Ensuite, découpez le texte en mots individuels. unnest_tokens() le fait en un seul appel : donnez-lui le nom de la colonne de sortie (word) et la colonne d’entrée (text), et il renvoie un data frame long avec une ligne par mot — déjà en minuscules et débarrassé de la ponctuation :

tokens <- text_df |>
  unnest_tokens(word, text)

head(tokens, 8)
     word
1    four
2   score
3     and
4   seven
5   years
6     ago
7     our
8 fathers

C’est toute l’étape de « transformation + nettoyage du texte » de l’ancienne recette tm — passage en minuscules, suppression de la ponctuation, élimination des espaces — condensée en une seule ligne lisible.

Étape 3 — Supprimer les mots vides et compter les fréquences

La plupart de ces tokens sont des mots vides : des mots à haute fréquence et faible information comme the, and, of, we. tidytext fournit une table stop_words toute prête ; nous les supprimons donc avec un anti_join(), puis count() ce qui reste, trié par fréquence :

word_freq <- tokens |>
  anti_join(stop_words, by = "word") |>
  count(word, sort = TRUE)

head(word_freq, 10)
        word n
1     nation 5
2  dedicated 4
3       dead 3
4     people 3
5  conceived 2
6   dedicate 2
7   devotion 2
8      field 2
9     living 2
10       war 2

Le résultat est une table de fréquences des mots tidy — la même chose que produisait l’ancienne TermDocumentMatrix(), mais sous forme d’un simple data frame que vous pouvez inspecter, filtrer et tracer directement. Ici, les mots en tête — nation, dedicated, dead, people, conceived — résument instantanément le discours.

Vous voulez aussi éliminer vos propres mots vides (par exemple du remplissage propre à votre domaine) ? Filtrez-les simplement avant de tracer :

custom_stop <- c("said", "also", "one")
word_freq <- word_freq |>
  filter(!word %in% custom_stop)

Étape 4 — Afficher le nuage de mots avec ggwordcloud

Voici la récompense. ggwordcloud ajoute un geom ggplot : un nuage de mots n’est donc qu’un appel ggplot() classique — associez label au mot et size à sa fréquence, puis ajoutez geom_text_wordcloud_area(). Nous fixons d’abord une graine, car la disposition est placée aléatoirement — la fixer rend la figure reproductible :

set.seed(1234)
ggplot(word_freq, aes(label = word, size = n)) +
  geom_text_wordcloud_area() +
  scale_size_area(max_size = 24) +
  theme_minimal()

A monochrome word cloud of the Gettysburg Address rendered with ggwordcloud; 'nation', 'dedicated', 'people' and 'dead' are the largest words.

geom_text_wordcloud_area() dimensionne chaque mot pour que son aire — et pas seulement sa hauteur — soit proportionnelle à la fréquence, ce qui se lit plus honnêtement que l’ancien rendu de wordcloud(). scale_size_area(max_size = ...) contrôle la taille du plus grand mot ; ajustez-la pour l’adapter à votre canevas.

Ajouter de la couleur et garder chaque mot dans le cadre

Deux améliorations rendent le nuage prêt à publier. Associez la couleur à la fréquence pour que l’œil suive l’importance (une échelle viridis adaptée au daltonisme), et passez rm_outside = TRUE pour que tout mot qui ne rentre pas soit supprimé plutôt que coupé au bord :

set.seed(1234)
ggplot(word_freq, aes(label = word, size = n, color = n)) +
  geom_text_wordcloud_area(rm_outside = TRUE) +
  scale_size_area(max_size = 26) +
  scale_color_viridis_c() +
  theme_minimal()

A word cloud of the Gettysburg Address with words coloured on a viridis scale by frequency; the most frequent words are the largest and brightest.

Comme c’est un vrai ggplot, tout ce que vous savez déjà s’applique : remplacez par scale_color_gradient(low = "#cfe3f7", high = "#3a86d4") pour un dégradé azur de la marque, ajoutez un labs(title = ...), ou retirez la légende avec theme(legend.position = "none").

A wide ggplot2-native word cloud of the Gettysburg Address rendered with ggwordcloud, words sized by frequency and coloured on a viridis scale.

Limiter le nuage aux mots les plus fréquents

Pour un texte plus dense, un nuage aux centaines de mots minuscules n’est que du bruit. Ne gardez que les mots porteurs de signal — les équivalents des anciens arguments min.freq / max.words — en filtrant ou en découpant la table avant de tracer :

# Keep words used at least twice:
word_freq |> filter(n >= 2)

# Or keep only the 100 most frequent:
word_freq |> slice_max(n, n = 100)

Bonus — un diagramme en barres des fréquences des mots

Un nuage est parfait pour une vue d’ensemble rapide, mais pour des comparaisons exactes un diagramme en barres est plus précis. C’est un ggplot de plus sur la même table de fréquences — réordonnez les mots par effectif pour que les barres se lisent de haut en bas :

top_words <- head(word_freq, 12)

ggplot(top_words, aes(x = n, y = reorder(word, n))) +
  geom_col(fill = "#3a86d4") +
  labs(x = "Frequency", y = NULL, title = "Most frequent words") +
  theme_minimal(base_size = 13)

A horizontal bar chart of the 12 most frequent words in the Gettysburg Address, in brand azure, with 'nation' and 'dedicated' the longest bars.

Associez les deux : le nuage pour l’affiche, le diagramme en barres quand un lecteur demande exactement combien de fois chaque mot apparaît.

Questions fréquentes

Ce n’est pas nécessaire. La recette tm + wordcloud() (Corpus, tm_map, TermDocumentMatrix) fonctionne toujours, mais le pipeline tidytext + ggwordcloud présenté ici fait le même travail avec moins de code, renvoie un data frame tidy que vous pouvez inspecter et réutiliser, et produit un vrai ggplot que vous pouvez habiller et colorer. Optez pour la pile tidy pour tout nouveau projet.

Lisez le fichier dans le data frame à une colonne qui démarre le pipeline : text_df <- data.frame(text = readLines("my-text.txt"), stringsAsFactors = FALSE). Tout ce qui suit l’étape 1 — unnest_tokens(), l’anti_join() des mots vides, count() et geom_text_wordcloud_area() — reste inchangé.

La table stop_words intégrée à tidytext gère les plus courants. Pour des mots supplémentaires, filtrez-les avant de tracer : word_freq |> filter(!word %in% c("said", "also", "one")). Vous pouvez aussi ajouter votre liste à stop_words avec bind_rows() et conserver un seul anti_join().

ggwordcloud place les mots selon une disposition aléatoire ; chaque exécution diffère donc tant que vous ne fixez pas la graine. Appelez set.seed(1234) (n’importe quel entier) juste avant le tracé pour obtenir une disposition reproductible — essentiel pour une figure que vous versionnez ou publiez.

Oui. Le stemming regroupe dedicate, dedicated et dedication en une seule racine. Ajoutez le package SnowballC et transformez la colonne des tokens avant de compter : mutate(word = SnowballC::wordStem(word)). C’est optionnel — pour un nuage de mots destiné à l’affichage, les mots non racinisés se lisent souvent plus naturellement.

Pour aller plus loin dans /learn

Cet article est la recette ciblée. Comme un nuage de mots n’est qu’un ggplot, toute la boîte à outils ggplot2 — échelles, palettes de couleurs et thèmes — se transpose directement :

  • Série ggplot2 — les tutoriels complets, sous contrôle de reproductibilité, des geoms, échelles et thèmes.
  • Visualisation de données — tout le pilier, du premier graphique à la figure de publication.

Voir aussi

🟢 Avec un agent IA

Demandez à Prova « transforme cette colonne de réponses à une enquête en nuage de mots avec tidytext et ggwordcloud » — elle répond avec du code que vous pouvez exécuter sur vos propres données. The runtime is the judge. Demander à Prova →

Cette page vous a-t-elle été utile ?

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN

Citation

BibTeX
@online{kassambara2026,
  author = {Kassambara, Alboukadel},
  title = {Nuage de mots en R : guide moderne avec tidytext et
    ggwordcloud},
  date = {2026-07-08},
  url = {https://www.datanovia.com/blog/word-cloud-in-r},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
Kassambara, Alboukadel. 2026. “Nuage de mots en R : guide moderne avec tidytext et ggwordcloud.” July 8. https://www.datanovia.com/blog/word-cloud-in-r.