Nuage de mots

Auteur.e.s
Claire Chabanet, Inra
Résumé

Création de graphique sous la forme de nuage de mots avec le package wordcloud

À partir d’une chaîne de caractères

Préparation du texte

Soit le texte suivant:

TexteOrig <- "L'objectif de ce site est d'aider la communauté d'utilisateurs R à obtenir  
plus facilement de l'information et de l'aide sur ce logiciel et à mutualiser les 
connaissances et pratiques quant à son utilisation.
La rubrique Sites référencés contient une sélection de liens relatifs à R que nous 
avons jugés utiles et pertinents.  
Chaque SITE comporte une description plus ou moins détaillée et quelques mots-clés 
permettant une recherche ciblée.
La rubrique Fiches techniques contient un ensemble de fiches PRATIQUES plus 
spécifiques, rédigées par nous-mêmes ou librement disponibles sur des sites 
extérieurs. Là aussi, des mots-clés aident à la recherche.

  La rubrique Tutoriels fournit une liste de DOCUMENTS pédagogiques accessibles sur 
notre site.  La rubrique FAQ contient les trucs et astuces ainsi que des réponses 
courtes à des questions posées précises. 
Les réponses peuvent aussi, être des liens vers des fiches techniques."

Ce texte contient 943 caractères. On commencer par homogénéiser/épurer le texte.

On transforme le texte pour n’avoir que des caractères minuscules, avec la fonction base::tolower()

TexteMod <- tolower(TexteOrig)  # en minuscules
cat(TexteMod)
## l'objectif de ce site est d'aider la communauté d'utilisateurs r à obtenir  
## plus facilement de l'information et de l'aide sur ce logiciel et à mutualiser les 
## connaissances et pratiques quant à son utilisation.
## la rubrique sites référencés contient une sélection de liens relatifs à r que nous 
## avons jugés utiles et pertinents.  
## chaque site comporte une description plus ou moins détaillée et quelques mots-clés 
## permettant une recherche ciblée.
## la rubrique fiches techniques contient un ensemble de fiches pratiques plus 
## spécifiques, rédigées par nous-mêmes ou librement disponibles sur des sites 
## extérieurs. là aussi, des mots-clés aident à la recherche.
## 
##   la rubrique tutoriels fournit une liste de documents pédagogiques accessibles sur 
## notre site.  la rubrique faq contient les trucs et astuces ainsi que des réponses 
## courtes à des questions posées précises. 
## les réponses peuvent aussi, être des liens vers des fiches techniques.

On supprime les mots non signifiants avec la fonction removeWords() contenue dans le package tm. La liste de ces mots est fournie sous la forme d’un vecteur de type character. Ici, on va utiliser la liste proposée par la fonction stopwords() pour le français.

library("tm")
## Loading required package: NLP
stopwords(kind = "french")[1:40]
##  [1] "au"    "aux"   "avec"  "ce"    "ces"   "dans"  "de"    "des"  
##  [9] "du"    "elle"  "en"    "et"    "eux"   "il"    "je"    "la"   
## [17] "le"    "leur"  "lui"   "ma"    "mais"  "me"    "même"  "mes"  
## [25] "moi"   "mon"   "ne"    "nos"   "notre" "nous"  "on"    "ou"   
## [33] "par"   "pas"   "pour"  "qu"    "que"   "qui"   "sa"    "se"

Danss cette liste, on trouve en plus des articles, conjonctions de coordination, adjectifs possessifs, …, les différentes formes du verbe être et du verbe avoir. On peut aussi utiliser sa propre liste de mots.

TexteMod <- removeWords(TexteMod, stopwords("french"))  # supprimer certains 'petits mots'
cat(TexteMod)
## 'objectif   site  'aider  communauté 'utilisateurs r  obtenir  
## plus facilement  'information   'aide   logiciel   mutualiser  
## connaissances  pratiques quant   utilisation.
##  rubrique sites référencés contient  sélection  liens relatifs  r   
##  jugés utiles  pertinents.  
## chaque site comporte  description plus  moins détaillée  quelques mots-clés 
## permettant  recherche ciblée.
##  rubrique fiches techniques contient  ensemble  fiches pratiques plus 
## spécifiques, rédigées  -mêmes  librement disponibles   sites 
## extérieurs. là aussi,  mots-clés aident   recherche.
## 
##    rubrique tutoriels fournit  liste  documents pédagogiques accessibles  
##  site.   rubrique faq contient  trucs  astuces ainsi   réponses 
## courtes   questions posées précises. 
##  réponses peuvent aussi, être  liens vers  fiches techniques.

On enlève les signes de ponctuation avec la fonction removePonctuation():

TexteMod <- removePunctuation(TexteMod)  # supprimer la ponctuation
cat(TexteMod)
## objectif   site  aider  communauté utilisateurs r  obtenir  
## plus facilement  information   aide   logiciel   mutualiser  
## connaissances  pratiques quant   utilisation
##  rubrique sites référencés contient  sélection  liens relatifs  r   
##  jugés utiles  pertinents  
## chaque site comporte  description plus  moins détaillée  quelques motsclés 
## permettant  recherche ciblée
##  rubrique fiches techniques contient  ensemble  fiches pratiques plus 
## spécifiques rédigées  mêmes  librement disponibles   sites 
## extérieurs là aussi  motsclés aident   recherche
## 
##    rubrique tutoriels fournit  liste  documents pédagogiques accessibles  
##  site   rubrique faq contient  trucs  astuces ainsi   réponses 
## courtes   questions posées précises 
##  réponses peuvent aussi être  liens vers  fiches techniques

Enfin, on supprime les espaces excédentaires avec la fonction stripWhitespace() contenue dans le package tm.

TexteMod <- stripWhitespace(TexteMod)  # supprimer les espaces

On a réduit notre texte de 943 à 717 caractères

Construction du nuage de mots

Pour réaliser le nuage de mots, on va utiliser le package wordcloud et construire le nuage de mots avec la fonction wordcloud().

library("wordcloud")
## Loading required package: RColorBrewer
formatR::usage(FUN = wordcloud, width = 70, tidy = TRUE)
## wordcloud(words, freq, scale = c(4, 0.5), min.freq = 3,
##     max.words = Inf, random.order = TRUE, random.color = FALSE,
##     rot.per = 0.1, colors = "black", ordered.colors = FALSE,
##     use.r.layout = FALSE, fixed.asp = TRUE, ...)

Le choix des mots à conserver pour le graphique se fait sur la fréquence avec l’argument min.freq= et leur positionnement avec l’argument random.order= et l’amplitude avec l’argument scale=.

Pour afficher tous les mots dont la fréquence est au moins égale à 1:

# scale : pour gérer l'amplitude des tailles des mots
wordcloud(TexteMod, min.freq = 1, scale = c(2.5, 0.5))

et pour faire apparaître les mots les plus fréquents au centre

wordcloud(TexteMod, min.freq = 1, random.order = FALSE, scale = c(2.5, 
    0.5))

On peut aussi colorer les mots en fonction de leur fréquence (colors= et random.color=FALSE).

pal <- brewer.pal(6, "Dark2")  # choix de la palette de couleurs
pal <- pal[-(1)]
set.seed(98)  # pour répéter exactement le wordle (même tirage au sort)
# rot.per : proportion de mots avec rotation à 90 degrés
wordcloud(TexteMod, min.freq = 1, scale = c(3, 0.2), colors = pal, random.color = TRUE, 
    rot.per = 0.2, random.order = TRUE)

À partir d’une collection de fichiers

Pour cela, il faut créer un corpus, c’est à-dire une collection de documents que l’on va regrouper dans un répertoire. Ici, l’exemple utilise 6 fables de La Fontaine stockées dans 6 fichiers dans le dossier LaFontaine.

Fables <- Corpus(DirSource("LaFontaine", encoding = "UTF-8", mode = "text"))
Fables
## <<SimpleCorpus>>
## Metadata:  corpus specific: 1, document level (indexed): 0
## Content:  documents: 6

La préparation du corpus, utilise les mêmes opérations que précédemment, mais on utilise la fonction tm_map().

Fables <- tm_map(Fables, content_transformer(tolower))
Fables <- tm_map(Fables, removeWords, stopwords("french"))
Fables <- tm_map(Fables, removePunctuation)
Fables <- tm_map(Fables, removeNumbers)
Fables <- tm_map(Fables, stripWhitespace)

On peut ensuite faire la représentation:

set.seed(8)
wordcloud(Fables, min.freq = 2, scale = c(4, 0.5), random.order = FALSE, 
    random.color = TRUE, rot.per = 0.1, colors = brewer.pal(8, "Dark2"))