Wordcloud pour illustrer un article

Librairies

library(tidyverse)
library(tidytext)
library(pdftools)

library(proustr)
library(stopwords)
library("mixr") # Lise Vaudor package

library(magick)
library(wordcloud2)

Récupérer le texte du PDF

Avec la fonction pdf_text du package pdf_tools

txt <- pdf_text("Article Revue Balisages_Joëlle Le Marec et Eva Sandri_25 octobre 2022.pdf")

On obtient ainsi un chr de 17 éléments (correspondants aux 17 pages)

Une question se pose, qu’est ce que je garde, pourquoi, comment ?

Est ce que j’enlève titre et abstract ? noms d’autrice, biblio ?

L’abstract en anglais ça me parait évident, je vais aussi virer la biblio mais pas les noms.

J’en profite pour enlever les 2 pages de bibliographie, c’est pourquoi je ne garde que txt[1:15]

zz <- textConnection(txt[1:15])  #enleve page 16 et 17

rl <- readLines(zz) # lit toutes les lignes (803)

tib<- tibble(txt = rl,
             lignes = 1:length(rl)) %>%
  filter(!lignes %in% 30:47)  #J'enleve seulement l'abstract (lignes 30 à 47)

On a maintenant un tableau tib qui contient une colonne txt avec du texte et une colonne lignes, avec le numéro de ligne associé (de 1 à 785)

Nettoyage du texte

C’est la partie laborieuse, je remplace les apostrophes, les chiffres, les liens internet, etc…

tib <- tib %>%
  mutate(txt = txt %>%
           str_replace_all(pattern = "’|'", replacement =  " ") %>% #remplace apostrophe par espace
           str_replace_all(pattern = "\\d", replacement = "") %>% # remplace un chiffre par un espace
           str_remove_all("http\\S*") %>% # enlève tout ce qui commence par http
           str_remove_all("\\S*@\\S*")) %>% # enlève tout ce qui contient @
  unnest_tokens(output = "word",
                input = txt,
                token = "words",
                format = "text") %>%
  filter(str_length(word) > 1) #enleve tous les trucs de taille 1, chiffre ou character

J’ai maintenant un tableau tib de deux colonnes, lignes qui contient le numéro de la ligne et word qui contient des mots (un par ligne). Ce tableau contient 6526 lignes.

Gestion des stopwords (mots vides de sens)

J’ai utilisé ici les packages proustr, stopwrds et mixr (de Lise Vaudor)

tib <- tib %>%
  filter(!word %in% proust_stopwords()) %>%
  filter(!word %in% stopwords("fr", source = "stopwords-iso"))

Il ne reste plus que 2971 mots qui ont du sens. Parmi ces mots ils y a bien sûr des adjectifs, noms, verbes… des singulier et des pluriels, que l’on voudrait regrouper.

J’utilise le lexique 382 du package mixr, qui contient 125721 observations, j’ai essayé avec un lexique un peu plus récent (le 383) mais ça n’était pas vraiment mieux.

lexique382=mixr::get_lexicon("fr")
dplyr::sample_n(lexique382,10)
## # A tibble: 10 × 3
##    word           lemma        type 
##    <chr>          <chr>        <chr>
##  1 mourante       mourant      adj  
##  2 biographes     biographe    nom  
##  3 poétiquement   poétiquement adv  
##  4 traduis        traduire     ver  
##  5 beigne         beigne       nom  
##  6 demandant      demander     ver  
##  7 mûriraient     mûrir        ver  
##  8 étourdissantes étourdissant adj  
##  9 danseras       danser       ver  
## 10 souviendrais   souvenir     ver
tib_non_vides <- tib %>%
  left_join(lexique382) %>%
  mutate(word = if_else(
    is.na(lemma),
    word,
    lemma)) %>%
  select(lignes, word)
## Joining, by = "word"

Je calcule ensuite la fréquence d’apparition de chaque mot

mot_freq<- tib_non_vides %>%
  count(word, sort = TRUE)


mot_freq
## # A tibble: 1,256 × 2
##    word             n
##    <chr>        <int>
##  1 savoir          40
##  2 pratique        33
##  3 public          26
##  4 conversation    24
##  5 féministe       24
##  6 espace          21
##  7 lieu            21
##  8 collectif       20
##  9 cours           20
## 10 étudiant        19
## # … with 1,246 more rows

Wordcloud

J’utilise ici le package wordcloud2 qui permet de choisir la forme de nuage que l’on souhaite, comme j’avais fait dans le précédent post avec une forme de canard.

C’est un article sur le féminisme, donc j’ai choisi cette image symbolique pour la forme du nuage.

image_read("feminism.jpg") %>%
  image_scale("200x")
mot_freq %>%
  wordcloud2(figPath = "feminism.jpg",
             widgetsize = c(820,1382),
             color = "purple")

La fonction est souvent longue pour afficher le wordcloud donc je n’éxecute pas le code précédent mais ça donnera comme résultat qqchose comme ça (les mots sont placés aléatoirement mais leur taille dépend de leur fréquence donc ne changera pas). Ce qu’il y a d’intéressant dans la version HTML, même si elle est parfois un peu longue à charger, c’est qu’elle est interactive et permet donc de savoir le nombre d’occurrence d’un mot en passant la souris dessus.

Et voilà !

 Share!

 
comments powered by Disqus