Textométrie

5) Tokénisation, lemmatisation

Lise Vaudor

ISIG, UMR 5600 EVS

2024-10-01

Exemple

Imaginons que l’on s’intéresse à un corpus de blogs (blog de Ginette, de Jean-Paul, de Norbert) qui parlent de choses et d’autres en lien avec la vie animale🐄 et champêtre🌻.

Langage naturel

Reprenons pour cette partie la table des commentaires du blog fictif “Ma vie à la ferme” (présenté dans le chapitre 2).

tibtot_commentaires <- readr::read_csv("data/tibtot_commentaires.csv")
tibtot_commentaires
doc texte auteur
data/blog_de_ginette.htm Et pour une poule sur un mur qui picoterait du pain dur? c’est bien beau de nourrir les petits cochons mais qu’en est-il des autres? Emma, 22 ans, Limoges
data/blog_de_ginette.htm Je vois que vous êtes, telle la petite poule rousse, bien aimable. Avez-vous pu compter sur l’aide du chat et du canard (et des cochons eux-mêmes!) pour semer vos 5 grains de blé? Les cochons se sont-ils régalés? Michel, 56 ans, Rennes
data/blog_de_jean-marc.htm Les thons, avec un t comme crocodile? ou les thons-thons? Eddie, 76 ans, Saint-Tropez
data/blog_de_jean-marc.htm Pourquoi ces thons ne préféraient-ils pas aller vers l’océan? Val d’Isère est un peu trop continental pour eux Yves, 40 ans, Lyon
data/blog_de_jean-marc.htm Tout ça me fait penser au blog de Ginette sur ses petits cochons, mais en moins bien écrit. Roberta, 18 ans, Collonges-au-Mont-d’Or
data/blog_de_jean-marc.htm Je préfère la chanson qui parle de canards qui dansent et cancanent gaiement. Eduardo, 29 ans, Fervaques
data/blog_de_jean-marc.htm On ne comprend pas trop cette passion pour la pêche plutôt que pour des choses saines comme les chats et les canards par exemple. Lise, 35 ans, Lyon
data/blog_de_jean-marc.htm Et pendant ce temps-là, le roi des thons, avec sa régulière, frétillait gaiement. Nadia, 43 ans, Lisieux
data/blog_de_norbert.htm A quel moment faut-il claquer du bec, si l’on est un canard qui aime à cancaner? Jonas, 37 ans, Strasbourg
data/blog_de_norbert.htm Norbert, mon petit chat, ça fait bien longtemps qu’on ne t’a pas vu danser. Julie, 34 ans, Saint-Julien Molin-Molette
data/blog_de_norbert.htm L’ambiance doit être sympa quand les poules dansent la danse des canards! Mickaël, 23 ans, Glos
data/blog_de_norbert.htm Vous devez avoir un grain pour écrire des choses pareilles! Viviane, 58 ans, Serrières

Principe de la tokenisation

Tokeniser, ça revient à définir de quelle manière on découpe nos textes pour les analyses ultérieures.

Par exemple, on peut décider que l’unité d’analyse (l’individu) pour nos analyses textuelles seront un des éléments suivants:

  • la phrase
  • le n-gram
  • le mot
  • etc.

Mise en oeuvre de la tokenisation

Pour réaliser cette tokenisation nous allons utiliser le package tidytext et notamment sa fonction unnest_tokens().

tibtot_commentaires %>% 
  tidytext::unnest_tokens(output="bigramme",
                          input=texte,
                          token="ngrams",
                          n=2) %>% 
  head(20)
doc auteur bigramme
data/blog_de_ginette.htm Emma, 22 ans, Limoges et pour
data/blog_de_ginette.htm Emma, 22 ans, Limoges pour une
data/blog_de_ginette.htm Emma, 22 ans, Limoges une poule
data/blog_de_ginette.htm Emma, 22 ans, Limoges poule sur
data/blog_de_ginette.htm Emma, 22 ans, Limoges sur un
data/blog_de_ginette.htm Emma, 22 ans, Limoges un mur
data/blog_de_ginette.htm Emma, 22 ans, Limoges mur qui
data/blog_de_ginette.htm Emma, 22 ans, Limoges qui picoterait
data/blog_de_ginette.htm Emma, 22 ans, Limoges picoterait du
data/blog_de_ginette.htm Emma, 22 ans, Limoges du pain
data/blog_de_ginette.htm Emma, 22 ans, Limoges pain dur
data/blog_de_ginette.htm Emma, 22 ans, Limoges dur c’est
data/blog_de_ginette.htm Emma, 22 ans, Limoges c’est bien
data/blog_de_ginette.htm Emma, 22 ans, Limoges bien beau
data/blog_de_ginette.htm Emma, 22 ans, Limoges beau de
data/blog_de_ginette.htm Emma, 22 ans, Limoges de nourrir
data/blog_de_ginette.htm Emma, 22 ans, Limoges nourrir les
data/blog_de_ginette.htm Emma, 22 ans, Limoges les petits
data/blog_de_ginette.htm Emma, 22 ans, Limoges petits cochons
data/blog_de_ginette.htm Emma, 22 ans, Limoges cochons mais

Mise en oeuvre de la tokenisation

Pour réaliser cette tokenisation nous allons utiliser le package tidytext et notamment sa fonction unnest_tokens().

tib_mots=tibtot_commentaires %>% 
  tidytext::unnest_tokens(output="mot",
                          input=texte,
                          token="words")
tib_mots %>% 
  head(20)
doc auteur mot
data/blog_de_ginette.htm Emma, 22 ans, Limoges et
data/blog_de_ginette.htm Emma, 22 ans, Limoges pour
data/blog_de_ginette.htm Emma, 22 ans, Limoges une
data/blog_de_ginette.htm Emma, 22 ans, Limoges poule
data/blog_de_ginette.htm Emma, 22 ans, Limoges sur
data/blog_de_ginette.htm Emma, 22 ans, Limoges un
data/blog_de_ginette.htm Emma, 22 ans, Limoges mur
data/blog_de_ginette.htm Emma, 22 ans, Limoges qui
data/blog_de_ginette.htm Emma, 22 ans, Limoges picoterait
data/blog_de_ginette.htm Emma, 22 ans, Limoges du
data/blog_de_ginette.htm Emma, 22 ans, Limoges pain
data/blog_de_ginette.htm Emma, 22 ans, Limoges dur
data/blog_de_ginette.htm Emma, 22 ans, Limoges c’est
data/blog_de_ginette.htm Emma, 22 ans, Limoges bien
data/blog_de_ginette.htm Emma, 22 ans, Limoges beau
data/blog_de_ginette.htm Emma, 22 ans, Limoges de
data/blog_de_ginette.htm Emma, 22 ans, Limoges nourrir
data/blog_de_ginette.htm Emma, 22 ans, Limoges les
data/blog_de_ginette.htm Emma, 22 ans, Limoges petits
data/blog_de_ginette.htm Emma, 22 ans, Limoges cochons

Nettoyage de la table

  • retirer les mots vides
  • extraire la racine des mots ou le lemme (stemming, lemmatisation)
  • retirer la ponctuation
  • retirer certains mots ou expressions
  • changer la casse (passer majuscules en minuscules)
  • retirer les liens, les “hashtags”, les emojis, etc.
  • etc.

Nettoyage de la table par suppression des mots vides

Pour des textes en anglais, tidytext comprend une liste de mots vides (“stopwords”)

tidytext::stop_words %>% 
  head(100)
word lexicon
a SMART
a’s SMART
able SMART
about SMART
above SMART
according SMART
accordingly SMART
across SMART
actually SMART
after SMART
afterwards SMART
again SMART
against SMART
ain’t SMART
all SMART
allow SMART
allows SMART
almost SMART
alone SMART
along SMART
already SMART
also SMART
although SMART
always SMART
am SMART
among SMART
amongst SMART
an SMART
and SMART
another SMART
any SMART
anybody SMART
anyhow SMART
anyone SMART
anything SMART
anyway SMART
anyways SMART
anywhere SMART
apart SMART
appear SMART
appreciate SMART
appropriate SMART
are SMART
aren’t SMART
around SMART
as SMART
aside SMART
ask SMART
asking SMART
associated SMART
at SMART
available SMART
away SMART
awfully SMART
b SMART
be SMART
became SMART
because SMART
become SMART
becomes SMART
becoming SMART
been SMART
before SMART
beforehand SMART
behind SMART
being SMART
believe SMART
below SMART
beside SMART
besides SMART
best SMART
better SMART
between SMART
beyond SMART
both SMART
brief SMART
but SMART
by SMART
c SMART
c’mon SMART
c’s SMART
came SMART
can SMART
can’t SMART
cannot SMART
cant SMART
cause SMART
causes SMART
certain SMART
certainly SMART
changes SMART
clearly SMART
co SMART
com SMART
come SMART
comes SMART
concerning SMART
consequently SMART
consider SMART
considering SMART

Pour un texte en français, on peut avoir recours au package proustr lien ici

proustr::proust_stopwords() %>% 
  head(100)
word
a
abord
absolument
afin
ah
ai
aie
aient
aies
ailleurs
ainsi
ait
allaient
allo
allons
allô
alors
anterieur
anterieure
anterieures
apres
après
as
assez
attendu
au
aucun
aucune
aucuns
aujourd
aujourd’hui
aupres
auquel
aura
aurai
auraient
aurais
aurait
auras
aurez
auriez
aurions
aurons
auront
aussi
autre
autrefois
autrement
autres
autrui
aux
auxquelles
auxquels
avaient
avais
avait
avant
avec
avez
aviez
avions
avoir
avons
ayant
ayez
ayons
b
bah
bas
basee
bat
beau
beaucoup
bien
bigre
bon
boum
bravo
brrr
c
car
ce
ceci
cela
celle
celle-ci
celle-là
celles
celles-ci
celles-là
celui
celui-ci
celui-là
celà
cent
cependant
certain
certaine
certaines
certains

Nettoyage de la table par suppression des mots vides

Pour ne garder que les mots signifiants, on peut ainsi faire une anti-jointure entre notre table et la table renvoyée par proust_stopwords():

tib_mots_nonvides <- tib_mots %>%
  anti_join(proustr::proust_stopwords(),by=c("mot"="word"))
tib_mots_nonvides %>% 
  head(100)
doc auteur mot
data/blog_de_ginette.htm Emma, 22 ans, Limoges poule
data/blog_de_ginette.htm Emma, 22 ans, Limoges mur
data/blog_de_ginette.htm Emma, 22 ans, Limoges picoterait
data/blog_de_ginette.htm Emma, 22 ans, Limoges pain
data/blog_de_ginette.htm Emma, 22 ans, Limoges dur
data/blog_de_ginette.htm Emma, 22 ans, Limoges c’est
data/blog_de_ginette.htm Emma, 22 ans, Limoges nourrir
data/blog_de_ginette.htm Emma, 22 ans, Limoges petits
data/blog_de_ginette.htm Emma, 22 ans, Limoges cochons
data/blog_de_ginette.htm Emma, 22 ans, Limoges qu’en
data/blog_de_ginette.htm Michel, 56 ans, Rennes vois
data/blog_de_ginette.htm Michel, 56 ans, Rennes petite
data/blog_de_ginette.htm Michel, 56 ans, Rennes poule
data/blog_de_ginette.htm Michel, 56 ans, Rennes rousse
data/blog_de_ginette.htm Michel, 56 ans, Rennes aimable
data/blog_de_ginette.htm Michel, 56 ans, Rennes compter
data/blog_de_ginette.htm Michel, 56 ans, Rennes l’aide
data/blog_de_ginette.htm Michel, 56 ans, Rennes chat
data/blog_de_ginette.htm Michel, 56 ans, Rennes canard
data/blog_de_ginette.htm Michel, 56 ans, Rennes cochons
data/blog_de_ginette.htm Michel, 56 ans, Rennes semer
data/blog_de_ginette.htm Michel, 56 ans, Rennes 5
data/blog_de_ginette.htm Michel, 56 ans, Rennes grains
data/blog_de_ginette.htm Michel, 56 ans, Rennes blé
data/blog_de_ginette.htm Michel, 56 ans, Rennes cochons
data/blog_de_ginette.htm Michel, 56 ans, Rennes régalés
data/blog_de_jean-marc.htm Eddie, 76 ans, Saint-Tropez thons
data/blog_de_jean-marc.htm Eddie, 76 ans, Saint-Tropez crocodile
data/blog_de_jean-marc.htm Eddie, 76 ans, Saint-Tropez thons
data/blog_de_jean-marc.htm Eddie, 76 ans, Saint-Tropez thons
data/blog_de_jean-marc.htm Yves, 40 ans, Lyon thons
data/blog_de_jean-marc.htm Yves, 40 ans, Lyon préféraient
data/blog_de_jean-marc.htm Yves, 40 ans, Lyon aller
data/blog_de_jean-marc.htm Yves, 40 ans, Lyon l’océan
data/blog_de_jean-marc.htm Yves, 40 ans, Lyon val
data/blog_de_jean-marc.htm Yves, 40 ans, Lyon d’isère
data/blog_de_jean-marc.htm Yves, 40 ans, Lyon continental
data/blog_de_jean-marc.htm Roberta, 18 ans, Collonges-au-Mont-d’Or penser
data/blog_de_jean-marc.htm Roberta, 18 ans, Collonges-au-Mont-d’Or blog
data/blog_de_jean-marc.htm Roberta, 18 ans, Collonges-au-Mont-d’Or ginette
data/blog_de_jean-marc.htm Roberta, 18 ans, Collonges-au-Mont-d’Or petits
data/blog_de_jean-marc.htm Roberta, 18 ans, Collonges-au-Mont-d’Or cochons
data/blog_de_jean-marc.htm Roberta, 18 ans, Collonges-au-Mont-d’Or écrit
data/blog_de_jean-marc.htm Eduardo, 29 ans, Fervaques préfère
data/blog_de_jean-marc.htm Eduardo, 29 ans, Fervaques chanson
data/blog_de_jean-marc.htm Eduardo, 29 ans, Fervaques canards
data/blog_de_jean-marc.htm Eduardo, 29 ans, Fervaques dansent
data/blog_de_jean-marc.htm Eduardo, 29 ans, Fervaques cancanent
data/blog_de_jean-marc.htm Eduardo, 29 ans, Fervaques gaiement
data/blog_de_jean-marc.htm Lise, 35 ans, Lyon comprend
data/blog_de_jean-marc.htm Lise, 35 ans, Lyon passion
data/blog_de_jean-marc.htm Lise, 35 ans, Lyon pêche
data/blog_de_jean-marc.htm Lise, 35 ans, Lyon choses
data/blog_de_jean-marc.htm Lise, 35 ans, Lyon saines
data/blog_de_jean-marc.htm Lise, 35 ans, Lyon chats
data/blog_de_jean-marc.htm Lise, 35 ans, Lyon canards
data/blog_de_jean-marc.htm Lise, 35 ans, Lyon exemple
data/blog_de_jean-marc.htm Nadia, 43 ans, Lisieux temps
data/blog_de_jean-marc.htm Nadia, 43 ans, Lisieux roi
data/blog_de_jean-marc.htm Nadia, 43 ans, Lisieux thons
data/blog_de_jean-marc.htm Nadia, 43 ans, Lisieux régulière
data/blog_de_jean-marc.htm Nadia, 43 ans, Lisieux frétillait
data/blog_de_jean-marc.htm Nadia, 43 ans, Lisieux gaiement
data/blog_de_norbert.htm Jonas, 37 ans, Strasbourg moment
data/blog_de_norbert.htm Jonas, 37 ans, Strasbourg faut
data/blog_de_norbert.htm Jonas, 37 ans, Strasbourg claquer
data/blog_de_norbert.htm Jonas, 37 ans, Strasbourg bec
data/blog_de_norbert.htm Jonas, 37 ans, Strasbourg l’on
data/blog_de_norbert.htm Jonas, 37 ans, Strasbourg canard
data/blog_de_norbert.htm Jonas, 37 ans, Strasbourg aime
data/blog_de_norbert.htm Jonas, 37 ans, Strasbourg cancaner
data/blog_de_norbert.htm Julie, 34 ans, Saint-Julien Molin-Molette norbert
data/blog_de_norbert.htm Julie, 34 ans, Saint-Julien Molin-Molette petit
data/blog_de_norbert.htm Julie, 34 ans, Saint-Julien Molin-Molette chat
data/blog_de_norbert.htm Julie, 34 ans, Saint-Julien Molin-Molette qu’on
data/blog_de_norbert.htm Julie, 34 ans, Saint-Julien Molin-Molette t’a
data/blog_de_norbert.htm Julie, 34 ans, Saint-Julien Molin-Molette danser
data/blog_de_norbert.htm Mickaël, 23 ans, Glos l’ambiance
data/blog_de_norbert.htm Mickaël, 23 ans, Glos sympa
data/blog_de_norbert.htm Mickaël, 23 ans, Glos poules
data/blog_de_norbert.htm Mickaël, 23 ans, Glos dansent
data/blog_de_norbert.htm Mickaël, 23 ans, Glos danse
data/blog_de_norbert.htm Mickaël, 23 ans, Glos canards
data/blog_de_norbert.htm Viviane, 58 ans, Serrières devez
data/blog_de_norbert.htm Viviane, 58 ans, Serrières grain
data/blog_de_norbert.htm Viviane, 58 ans, Serrières écrire
data/blog_de_norbert.htm Viviane, 58 ans, Serrières choses
data/blog_de_norbert.htm Viviane, 58 ans, Serrières pareilles

Nettoyage de la table par racinisation (stemming)

La racinisation (ou désuffixation, ou stemming en anglais) consiste (comme son nom l’indique) à extraire la racine d’un mot. Souvent, cette racine ne correspond pas à un “vrai mot”…

proustr::pr_stem_words(tib_mots_nonvides,mot) %>% 
  head(30)
doc auteur mot
data/blog_de_ginette.htm Emma, 22 ans, Limoges poul
data/blog_de_ginette.htm Emma, 22 ans, Limoges mur
data/blog_de_ginette.htm Emma, 22 ans, Limoges picot
data/blog_de_ginette.htm Emma, 22 ans, Limoges pain
data/blog_de_ginette.htm Emma, 22 ans, Limoges dur
data/blog_de_ginette.htm Emma, 22 ans, Limoges c’est
data/blog_de_ginette.htm Emma, 22 ans, Limoges nourr
data/blog_de_ginette.htm Emma, 22 ans, Limoges petit
data/blog_de_ginette.htm Emma, 22 ans, Limoges cochon
data/blog_de_ginette.htm Emma, 22 ans, Limoges qu’en
data/blog_de_ginette.htm Michel, 56 ans, Rennes vois
data/blog_de_ginette.htm Michel, 56 ans, Rennes petit
data/blog_de_ginette.htm Michel, 56 ans, Rennes poul
data/blog_de_ginette.htm Michel, 56 ans, Rennes rouss
data/blog_de_ginette.htm Michel, 56 ans, Rennes aimabl
data/blog_de_ginette.htm Michel, 56 ans, Rennes compt
data/blog_de_ginette.htm Michel, 56 ans, Rennes l’aid
data/blog_de_ginette.htm Michel, 56 ans, Rennes chat
data/blog_de_ginette.htm Michel, 56 ans, Rennes canard
data/blog_de_ginette.htm Michel, 56 ans, Rennes cochon
data/blog_de_ginette.htm Michel, 56 ans, Rennes sem
data/blog_de_ginette.htm Michel, 56 ans, Rennes 5
data/blog_de_ginette.htm Michel, 56 ans, Rennes grain
data/blog_de_ginette.htm Michel, 56 ans, Rennes blé
data/blog_de_ginette.htm Michel, 56 ans, Rennes cochon
data/blog_de_ginette.htm Michel, 56 ans, Rennes régal
data/blog_de_jean-marc.htm Eddie, 76 ans, Saint-Tropez thon
data/blog_de_jean-marc.htm Eddie, 76 ans, Saint-Tropez crocodil
data/blog_de_jean-marc.htm Eddie, 76 ans, Saint-Tropez thon
data/blog_de_jean-marc.htm Eddie, 76 ans, Saint-Tropez thon

Nettoyage de la table par lemmatisation

La lemmatisation consiste faire correspondre à un mot (ou forme) la forme neutre (ou lemme) que ce mot aurait par exemple par défaut dans un dictionnaire. Pour un nom, cela serait la forme au masculin singulier par exemple; pour un verbe conjugué, ce serait l’infinitif.

Il est possible de lemmatiser en utilisant l’outil TreeTagger (gratuit, mais propriétaire). Cet outil est utilisable dans R via le package koRpus vignette ici

Pour ma part, je lemmatise la plupart du temps en me basant sur une base de données lexicales libre, Lexique qui fait correspondre formes et lemmes de très nombreux mots en français. J’ai réalisé une simple jointure, sans considération syntaxique.

Nettoyage de la table par lemmatisation

lexique382=mixr::get_lexicon("fr")
dplyr::sample_n(lexique382,10)
word lemma type
madapolam madapolam nom
déféra déférer ver
concerner concerner ver
revérifié revérifié adj
récapitulation récapitulation nom
conciliations conciliation nom
tenseur tenseur nom
impassible impassible adj
saladiers saladier nom
superposition superposition nom

Nettoyage de la table par lemmatisation

Dans ce cas on réalise une jointure pour récupérer le lemme de chaque mot dans notre table:

tib_mots_nonvides <- dplyr::left_join(tib_mots_nonvides,
                                      lexique382,
                                      by=c("mot"="word"))
tib_mots_nonvides %>% 
  dplyr::select(mot,lemma) %>% 
  head(30)
mot lemma
poule poule
mur mur
picoterait NA
pain pain
dur dur
c’est NA
nourrir nourrir
petits petit
cochons cochon
qu’en NA
vois voir
petite petit
poule poule
rousse roux
aimable aimable
compter compter
l’aide NA
chat chat
canard canard
cochons cochon
semer semer
5 NA
grains grain
blé blé
cochons cochon
régalés régaler
thons thon
crocodile crocodile
thons thon
thons thon