Accéder à la page principale du cours

Séance 1 - Fréquence d’occurrence des mots et fréquence de co-occurrence des mots

Adrien Guille, Université Lyon 2

Pour cette séance, 3 packages sont nécessaires : text2vec pour manipuler le texte, Matrix pour manipuler les matrices sparses produites par text2vec et stopwords pour éliminer facilement les mot-vides.

L’objectif est d’observer certaines propriétés statistique du langage, qui expliquent pourquoi il est difficile d’estimer la fréquence de co-occurrence des mots, mais aussi de tester naïvement l’hypothèse distributionnelle, en observant les contextes de quelques mots.

library(text2vec)
library(Matrix)
library(stopwords)

Chargement du corpus ‘text8’

On charge les \(10^8\) premiers octets du dump anglophone de Wikipedia du 3 mars 2006 (source : http://mattmahoney.net/dc/textdata.html ; fichier utilisé ici : http://mediamining.univ-lyon2.fr/people/guille/word_embedding/text8.zip) :

corpus <- readLines('../Data/text8', n=1, warn=FALSE)

Extraction du vocabulaire

On instancie un itérateur chargé de transformer le texte en une séquence de tokens, on en extrait le vocabulaire et on affiche les 10 mots les plus fréquents :

iterator <- itoken(corpus,tokenizer=space_tokenizer)
vocabulary <- create_vocabulary(iterator)
print(nrow(vocabulary))
## [1] 253854
print(sum(vocabulary$term_count))
## [1] 17005207

Le vocabulaire comporte 253 854 mots distincts, le corpus comporte 17 005 207 tokens. On affiche les mots les plus fréquents :

tail(vocabulary, 5)

Sans surprise, les mots les plus fréquents sont des mots-vides.

Calcul et visualisation de la distribution de la fréquence des mots

On affiche l’histogramme uniquement pour les fréquences d’occurrence inférieures ou égales à 20, par souci de lisibilité :

vocabulary_20 <- vocabulary[which(vocabulary$term_count <= 20), ]
histogram <- hist(vocabulary_20$term_count, 
                  breaks=20, 
                  main='Word frequency distribution', 
                  xlab='Word frequency', 
                  ylab='Frequency of word frequency')

On constate que la plupart des mots du vocabulaire sont des “hapax legomena”, i.e. n’occurrent qu’une seul fois dans ce corpus.

Visualisation de la fréquence en fonction du rang

La loi de Zipf modélise la relation entre la fréquence d’un mot, \(f_r\), et son rang, \(r\) :

\[ f_r \simeq f_\text{max}\frac{1}{r^{-k}} \]

ordered_vocabulary <- vocabulary[order(-vocabulary$term_count), ]
plot(ordered_vocabulary$term_count[1:100], 
     main='Word frequency versus rank', 
     xlab='Word rank', 
     ylab='Word frequency')

Si on prend le logarithme de la fréquence, le modèle devient :

\[ \log(f_r) \simeq \log(f_\text{max}) + k \log(r) \]

plot(ordered_vocabulary$term_count[1:10000], 
     main='Word frequency versus rank', 
     xlab='Word log-rank', 
     ylab='Word log-frequency', 
     log='xy')