Chapitre 5 Résumer l’information par des métriques

Avant de réaliser quelques graphiques pour montrer le contenu lexical de nos textes il faudra la plupart du temps quelques calculs basiques sur nos données (par exemple agréger les données pour obtenir les fréquences d’occurrence des termes).

Pour réaliser ces quelques transformations on peut généralement utiliser les fonctions de dplyr.

Ici, on repart du tableau suivant

tib_mots_nonvides <- read_csv("data/tib_mots_nonvides.csv") %>% 
  na.omit()
head(tib_mots_nonvides)
## # A tibble: 6 x 5
##   doc                      auteur                mot     lemma   type 
##   <chr>                    <chr>                 <chr>   <chr>   <chr>
## 1 data/blog_de_ginette.htm Emma, 22 ans, Limoges poule   poule   nom  
## 2 data/blog_de_ginette.htm Emma, 22 ans, Limoges mur     mur     nom  
## 3 data/blog_de_ginette.htm Emma, 22 ans, Limoges pain    pain    nom  
## 4 data/blog_de_ginette.htm Emma, 22 ans, Limoges dur     dur     adj  
## 5 data/blog_de_ginette.htm Emma, 22 ans, Limoges nourrir nourrir ver  
## 6 data/blog_de_ginette.htm Emma, 22 ans, Limoges petits  petit   adj

On pourrait être amené à

  • calculer la fréquence des mots
  • calculer la fréquence des mots pour différentes parties du corpus
  • ne garder que les \(n\) mots les plus fréquents
  • etc.

5.1 Fréquences d’occurrence

freq_mots <- tib_mots_nonvides %>%
  group_by(lemma) %>% 
  summarise(freq=n()) %>% 
  arrange(desc(freq)) %>% 
  na.omit()
head(freq_mots)
## # A tibble: 6 x 2
##   lemma   freq
##   <chr>  <int>
## 1 canard     5
## 2 thon       5
## 3 cochon     4
## 4 petit      4
## 5 chat       3
## 6 danser     3

Ici, je n’en ai pas besoin (mon jeu de données est tout petit) mais je pourrais également filtrer les données pour ne garder qu’une fréquence minimale, ou ne garder que les \(n\) mots les plus fréquents…

freq_mots %>%
  filter(freq>=5)
## # A tibble: 2 x 2
##   lemma   freq
##   <chr>  <int>
## 1 canard     5
## 2 thon       5
freq_mots %>% top_n(3,freq)
## # A tibble: 4 x 2
##   lemma   freq
##   <chr>  <int>
## 1 canard     5
## 2 thon       5
## 3 cochon     4
## 4 petit      4

Pour faciliter ce processus que l’on est amené à réaliser fréquemment pour analyser des données textuelles, j’ai créé une fonction tidy_frequencies (package mixr) qui regroupe l’ensemble des étapes:

mixr::tidy_frequencies(tib_mots_nonvides,lemma,top_n=10)
## # A tibble: 12 x 2
##    lemma        n
##    <chr>    <int>
##  1 canard       5
##  2 thon         5
##  3 cochon       4
##  4 petit        4
##  5 chat         3
##  6 danser       3
##  7 poule        3
##  8 chose        2
##  9 écrire       2
## 10 gaiement     2
## 11 grain        2
## 12 préférer     2

5.2 Co-occurrences, corrélations

Si l’on s’intéresse non plus seulement à la fréquence individuelle des termes mais qu’on cherche à caractériser les termes qui sont souvent employés ensemble (au sein d’un même commentaire par exemple) on peut utiliser les fonctions du package widyr.

library(widyr)
mots_cooc <- tib_mots_nonvides %>%
  pairwise_count(lemma,feature=auteur,sort=TRUE) 

head(mots_cooc)
## # A tibble: 6 x 3
##   item1  item2      n
##   <chr>  <chr>  <dbl>
## 1 cochon petit      3
## 2 petit  cochon     3
## 3 petit  poule      2
## 4 cochon poule      2
## 5 canard poule      2
## 6 poule  petit      2
motA:T motA:F Total
motB:T \(N_{TT}\) \(N_{TF}\) \(N_{T.}\)
motB:F \(N_{FT}\) \(N_{FF}\) \(N_{F.}\)
Total \(N_{.T}\) \(N_{.F}\) N

\[Cor=\frac{N_{TT}N_{FF}-N_{TF}N_{FT}}{\sqrt{N_{T.}N_{F.}N_{.F}N_{.T}}}\]

mots_cors <- tib_mots_nonvides %>% 
  pairwise_cor(lemma,auteur,sort=TRUE)
head(mots_cors)
## # A tibble: 6 x 3
##   item1   item2 correlation
##   <chr>   <chr>       <dbl>
## 1 pain    mur             1
## 2 dur     mur             1
## 3 nourrir mur             1
## 4 mur     pain            1
## 5 dur     pain            1
## 6 nourrir pain            1

Pour la suite on va joindre les tableaux mots_cooc et mot_cors

mots_cooc <- left_join(mots_cooc,
                       mots_cors,
                       by=c("item1","item2"))

5.3 Spécificités

Le package textometry (réalisé par l’équipe TXM) comprend une fonction qui permet de calculer des scores de spécificité. Pour plus de compatibilité avec le tidyverse j’ai écrit une fonction tidy_specificities() qui reprend cette fonction et renvoie un résultat tabulaire conforme à la logique “tidyverse”.

mixr::tidy_specificities(tib_mots_nonvides,lemma, doc)
## # A tibble: 144 x 4
##    lemma    doc                         spec     n
##    <chr>    <chr>                      <dbl> <int>
##  1 thon     data/blog_de_jean-marc.htm 1.87      5
##  2 cochon   data/blog_de_ginette.htm   1.16      3
##  3 danser   data/blog_de_norbert.htm   0.744     2
##  4 gaiement data/blog_de_jean-marc.htm 0.724     2
##  5 préférer data/blog_de_jean-marc.htm 0.724     2
##  6 poule    data/blog_de_ginette.htm   0.706     2
##  7 aimer    data/blog_de_norbert.htm   0.562     1
##  8 bec      data/blog_de_norbert.htm   0.562     1
##  9 cancaner data/blog_de_norbert.htm   0.562     1
## 10 claquer  data/blog_de_norbert.htm   0.562     1
## # ... with 134 more rows