tm ou tidytext ? Introduction au text-mining avec R

Des chiffres, des chiffres, toujours des chiffres ? Eh non, pas que ! La science des données passe également par l’analyse de contenus textuels : une spécialisation appelée « fouille de texte » (si vous êtes d’humeur franco-française), mais plus connue sous le nom de « text-mining ».


Aujourd’hui, premier volet de notre série de billets sur le text-mining.

Le text-mining, qu’est-ce que c’est ?

Discipline liée au data mining (vous l’auriez deviné), le text-mining regroupe l’ensemble des méthodes qui permettent d’analyser un texte avec des méthodes statistiques. L’objectif ? Faire émerger du sens d’une suite de mots : livres, discours, tweets… Et tout commence par « quels sont les mots le plus utilisés », pour se diriger, à terme, vers des questions bien plus complexes.

Car oui, vaste sujet que celui du text-mining : on entre par la porte de l’analyse fréquentielle, et l’on navigue jusqu’à l’intelligence artificielle. Cependant, puisqu’il faut bien commencer quelque part, commençons par une introduction au text-mining avec R. Dans ce billet, nous vous présenterons deux méthodes : la méthode « classique », avec le package tm, et la méthode du tidy text-mining, inspirée des travaux d’Hadley Wickham (eh oui, encore lui !).

Première étape, donc : installer les packages, et trouver un texte à fouiller. Pour notre corpus, nous utiliserons le package gutenbergr, qui permet de télécharger le contenu d’un livre accessible sur le Projet Gutenberg. Penchons-nous, à tout hasard, sur le livre : « The philosophy of mathematics« .

install.packages(c("tm", "tidytext", "gutenbergr"))
lapply(X = c("tm", "tidytext", "gutenbergr", "magrittr", "ggplot2", "dplyr"), FUN =library, character.only = TRUE)
book <- gutenberg_works(title == "The philosophy of mathematics")$gutenberg_id %>%
  gutenberg_download() %>% 
  gutenberg_strip()

Text-mining, la méthode « classique »

Pourquoi parle-t-on de méthode classique ? C’est très simple : parce que tm est le package de text-mining historique : sa première version a été publiée sur le CRAN le 13 janvier 2007… il y a donc dix ans. tidytext, de son côté, date d’avril 2016.

Nous l’avions dit plus haut, ce billet se concentrera sur la première étape du text-mining : analyser la fréquence d’apparition des mots dans notre ouvrage. Un processus qui demande une première phase de transformation des données :
– d’abord en transformant notre texte en corpus,
– en le débarrassant du superflu grâce à la fonction tm_map,
– en transformant notre corpus en Term-Document Matrix,
– puis enfin en data.frame.

booktm <- book %>%
  #Transformer en corpus
  VectorSource() %>%
  Corpus() %>% 
  #Nettoyer le corpus
  tm_map(content_transformer(tolower)) %>%
  tm_map(stripWhitespace) %>%
  tm_map(removeNumbers) %>%
  tm_map(removePunctuation) %>%
  tm_map(removeWords, stopwords("english")) %>% 
  #Transformer en matrice 
  TermDocumentMatrix() %>%
  as.data.frame.matrix() %>%
  mutate(name = row.names(.)) %>%
  arrange(desc(`1`))

Nous voici donc avec un premier data.frame contenant une liste de fréquence d’apparition des mots dans le texte. Ce qui donne, si nous le visualisons avec ggplot :

tkrtheme <- theme(plot.title=element_text(margin=margin(0,0,20,0), size=20, hjust = 0.5),
        plot.subtitle = element_text(margin=margin(0,0,20,0), size = 15, hjust = 0.5),
        panel.background = element_rect(fill = "white"), 
        panel.grid.major = element_line(colour = "grey"), 
        plot.margin = margin(20,50,20,50)) 
capt <- "www.thinkr.fr"

ggplot(booktm[1:25,], aes(reorder(name, `1`), `1`)) + 
  geom_bar(stat = "identity", fill = "#E3693E") +
  geom_text(aes(label= as.character(`1`)), check_overlap = TRUE, size = 4) + 
  coord_flip() + 
  xlab(" ") + 
  ylab("Volume") + 
  labs(title = "25 mots les plus récurrents avec le package tm",
       caption = capt) + 
  tkrtheme

tm-mining

Tidy text-mining

Approche plus récente popularisée par Julia Silge et David Robinson, la méthode du tidy text-mining étend la philosophie des tidy data d’Hadley Wickham, et l’applique à l’analyse textuelle. Voici donc la version « new school » de l’analyse de fréquence d’un texte :

#Pour commencer, créeons un data_frame
tidytext <- data_frame(line = 1:nrow(book), text = book$text) 
#Analyse de fréquence 
tidytext <- tidytext %>%
  unnest_tokens(word, text) %>%
  anti_join(stop_words) %>%
  count(word, sort = TRUE) 

ggplot(tidytext[1:25,], aes(reorder(word, n), n)) + 
  geom_bar(stat = "identity", fill = "#E3693E") +
  geom_text(aes(label= as.character(n)), check_overlap = TRUE, size = 4) + 
  coord_flip() + 
  xlab(" ") + 
  ylab("Volume") + 
  labs(title = "25 mots les plus récurrents avec le package tidytext",
       caption = capt) + 
  tkrtheme

tidy text mining

Comment choisir ?

Bonne question… Et sur ce point, vous vous confronterez à deux écoles : celle des adeptes/habitués des méthodes classiques, et l’école de l’ordocosme. Si l’on s’attarde sur les résultats, on constate également une différence de volume : le nettoyage par le package tm conserve 517 unités, là où tidytext en conserve 407… ce qui n’est pas sans changer le contenu des 25 mots les plus récurrents : on remarque par exemple que tm conserve two et three, là où ils disparaissent avec notre seconde méthode. Un paramètre qui dépend notamment de la liste de « mots-vides » contenue dans chaque package.

Le point fort de la méthode tidytext ? Tout d’abord : beaucoup moins de lignes de code. Ensuite, un package qui a été pensé pour fonctionner avec tous les autres outils du tidyverse, notamment tidyr et dplyr. Maintenant, ne vous reste qu’à choisir votre camps… et peut-être que nos prochains billets vous aideront à trancher 😉 !


À propos de l'auteur

Colin Fay

Colin Fay

Data scientist & R Hacker


Commentaires


À lire également