Pas à pas pour analyser des mots associés avec R.temis

Rappel Utilisation de R.temis dans RStudio

Données

Réponses à une question ouverte sous forme de mots associés (en anglais)

Corpus utilisé : extrait de l’enquête EuroBroadMap financée par le 7ème programme cadre de recherche et développent de la commission européenne (FP7/2007-2013 ; grant agreement n° 225260 ; “Visions de l’Europe dans le monde”

Question ouverte posée sous forme de mots associés, en complément à une question en cartographie Draw your limit of Europe libellée ainsi : Quels ont les mots que vous associés le plus à “Europe”. Choississez 5 mots au maximum.

Question posée

Contexte

Questionnnaire posé dans la langue du pays et réponses traduites en anglais et saisies par chaque équipe partenaire du projet.

9340 étudiants intéerrogés dans 18 pays et 43 villes.

  • France, Belgique, Portugal, Roumanie, Hongrie, Malte, Suède
  • Moldavie, Russie, Turquie, Tunisie
  • Cameroun, Chine, Inde, Brésil, Azebaïdjan, Egypte, Sénégal

Localisation des enquêtés

Le corps EuroBroadMap

Le corpus utilisé dans cet exemple contient 8143 réponses. Les textes,variable textuelle, sont composés de quelques mots (textes courts) et sont associés à des métadonnées. G_State (pays d’enquête) G_City (ville d’enquête) G_Study (Domaine d’étude des enquêtés) A1_Gender (genre) A10_LevInc (niveau de revenu) A11_LevEdu_f (niveau d’éducation du père) A12_LevEdu_m (niveau d’éducation de la mère) PaysVis (nombre de pays visités) Nblang (nombre de langues parlées) VecuEtranger (a vécu à l’étranger)

Voir également Brennetot A., Emsellem K., Guérin-Pace F., Garnier B. 2013. Dire l’Europe à travers le monde. Les mots des étudiants dans l’enquête EuroBroadMap, Cybergéo http://cybergeo.revues.org/25684

Extrait du fichier

Extrait des données

Les mots cités par les répondants ont étés concaténés pour former un texte court (de 1 à 5 mots). 8443 étudiants sur les 9343 interrogés ont cité au moins un mot L’ensemble des textes correspondants aux réponses correspond à 40 873 mots dont 4 977 mots distincts/différents

Packages nécessaires

Nous utilisons R.temis dont le principe est de faciliter les étapes essentielles de l’analyse textuelle (importation du corpus et métadonnées, nettoyage et analyses) en s’appuyant au maximum sur les packages existants (tm, FactoMineR, explor, igraph, Shiny..).

library(R.temis)
library(dplyr)
library(questionr)

Importation du corpus

Le corpus et les métadonnées (variables qualitatives) sont dans un “tableau” ; la variable textuelle est en 14e colonne.

#corpus <- import_corpus("data/EBM_iram.txt", format="alceste", language="en")
corpus <- import_corpus("data/EBM_temis_BG_tot_sansAZEGSW2.csv",format="csv",textcolumn=14, language="en")
corpus
<<VCorpus>>
Metadata:  corpus specific: 1, document level (indexed): 13
Content:  documents: 8143

Le corpus est court, il ne sera pas découpé.

Création du lexique

Premier tableau lexical

1 : Lexique sans mots outils ni chiffres

Affichage d’un extrait du tableau lexical entier (TLE) ou DocumentTermMatrix (DTM), essentiellement rempli de 0.

#stopwords("en")
dtm <- build_dtm(corpus, remove_stopwords = T, remove_numbers = T)
dtm
<<DocumentTermMatrix (documents: 8143, terms: 4765)>>
Non-/sparse entries: 36161/38765234
Sparsity           : 100%
Maximal term length: 22
Weighting          : term frequency (tf)
#inspect(dtm)

Les lignes du tableau lexical (dtm) correspondent ici aux 8143 reponses et les colonnes aux 4765 mots différents utilisés par les étudiants.

On crée un premier lexique (dictionnaire) : ensemble des mots distincts du corpus

dictemis <- dictionary(dtm)
head(dictemis)
            Term Occurrences Stopword
abduction abduct           1         
aberrant   aberr           1         
abide       abid           1         
abiding     abid           1         
abroad    abroad           2         
absence   absenc           1         
#View(dictemis)

La lecture interactive du lexique par ordre de fréquences permet de repérer le registre du vocabulaire et en particulier les mots les plus fréquemment utilisés. La lecture par ordre alphabétique) permet de rechercher un terme précis et observer sa fréquence d’apparition ou trouver les mots mal orthographiés ou abréviés en vue de les corriger(si besoin).

2 : Mots les plus fréquents

On affiche la distibution des 10 mots les plus fréquents (occurrence et %).

frequent_terms(dtm, n=15)
            Global occ.  Global %
union              1125 3.0701635
developed           975 2.6608083
culture             868 2.3688017
development         866 2.3633436
european            643 1.7547690
euro                593 1.6183173
rich                575 1.5691947
freedom             430 1.1734847
history             421 1.1489234
continent           376 1.0261169
old                 362 0.9879104
countries           354 0.9660781
democracy           352 0.9606200
beautiful           346 0.9442458
world               344 0.9387878

Global % correspond à l’occurrence du mot rapportée à l’ensemble des “mots” du corpus. Pour calculer le nombre de mots du corpus : sum(col_sums(dtm))

On peut représenter cette distribution par un nuage de mots; La taille de la police utilié pour afficher chaque mot dépend de son occurrence. Plus le mot est cité dans les réponses, plus sa taille est grande. Ajouter une note de lecture !

cloud<-word_cloud(dtm, color="blue", n=60, min.freq=10)

On choisira qqs mots pour écrire la légende

3 : Bilan lexical

On peut utiliser des éléments quantitatifs sur le corpus pour le présenter, par exemple sa taille (nombre d’occurrences) ou le nombre de mots distincts (indicateur de “richesse” du vocabulaire). Pour faire ces comparaisons, le corpus est découpé en sous-parties à l’aide des modalités des métadonnées. Ici on compare par domaine d’étude

View(meta(corpus))

#lexical_summary(dtm, corpus, "G_State", unit="global" )
lexical_summary(dtm, corpus, "A1_Gender", unit="global" )

Le corpus contient au total 39176 mots mais seulement 36643 sont pris en compte dans les analyses dont 4765 “mots” distincts (après suppression de mots-outils et chiffres).

Si on compte uniquement les réponses données par les femmes, on retient 18067 “mots” et 3014 “mots” distincts.

4 : Calculer les spécificités

Le vocabulaire d’une sous-pooulation construite selon les modalités d’une variable qualitative (métadonnée) est comparé à l’ensemble. Un mot (term) est spécifique positivement (ou caractéristique) si sa fréquence y est “anormalement élevée” (la probabilité calculées à partir du modèle hypergéométrique). On dit aussi que ce mot est sur employé.

Mots spécifiques

On affiche les mots specifiques de chaque sous-population (ici contruite avec la variable A1_Gender) par ordre de valeur-test décroissante.

specific_terms(dtm,meta(corpus)$A1_Gender, n=10)
$F
           % Term/Level % Level/Term   Global % Level Global occ.   t value
fashion     0.669729341    69.540230 0.47485195   121         174  5.336719
monuments   0.099629158    94.736842 0.05185165    18          19  4.013511
travel      0.387446726    69.306931 0.27563245    70         101  3.968577
----------           NA           NA         NA    NA          NA        NA
continent   0.824708031    39.627660 1.02611686   149         376 -3.734723
uefa        0.005534953     5.263158 0.05185165     1          19 -3.899915
old         0.774893452    38.674033 0.98791038   140         362 -4.030856
xenophobia  0.132838878    27.272727 0.24015501    24          88 -4.102991
world       0.702939060    36.918605 0.93878776   127         344 -4.589863
occident    0.116234018    24.418605 0.23469694    21          86 -4.617441
football    0.260142802    29.375000 0.43664547    47         160 -5.048483
           Prob.
fashion    0e+00
monuments  0e+00
travel     0e+00
----------    NA
continent  1e-04
uefa       0e+00
old        0e+00
xenophobia 0e+00
world      0e+00
occident   0e+00
football   0e+00

$M
           % Term/Level % Level/Term   Global % Level Global occ.   t value
football     0.60831180    70.625000 0.43664547   113         160  5.048483
occident     0.34991387    75.581395 0.23469694    65          86  4.617441
world        1.16817399    63.081395 0.93878776   217         344  4.589863
xenophobia   0.34453058    72.727273 0.24015501    64          88  4.102991
old          1.19509044    61.325967 0.98791038   222         362  4.030856
uefa         0.09689922    94.736842 0.05185165    18          19  3.899915
continent    1.22200689    60.372340 1.02611686   227         376  3.734723
----------           NA           NA         NA    NA          NA        NA
travel       0.16688200    30.693069 0.27563245    31         101 -3.968577
monuments    0.00538329     5.263158 0.05185165     1          19 -4.013511
fashion      0.28531438    30.459770 0.47485195    53         174 -5.336719
           Prob.
football   0e+00
occident   0e+00
world      0e+00
xenophobia 0e+00
old        0e+00
uefa       0e+00
continent  1e-04
----------    NA
travel     0e+00
monuments  0e+00
fashion    0e+00
#specific_terms(dtm,meta(corpus)$G_State, n=10)

Exemple d’interprétation : le mot “fashion” est spécifique des filles. Il représente 0,66% (121/1867) de l’ensemble des occurrences des mots cités par des femmes ; 69% (121/174) des occurrences du mot “fashion” sont cités par des filles pour un % global de 0,47% (174/36643).

Le mot “footbal” est spécifique aux garçons respectivement (0,6%, 70 % et 0,43%). Ces valeurs sont significatives au seuil de 5% (p-value < 0.05 et t-value > 2).

Observez les mots spécifiques cités par les enquêtés en Russie. Que pensez-vous du mots mother ?

Réponses spécifiques

Le calcul de la distance est fondé sur la métrique du Khi2 et mesure l’écart entre le profil d’un document et le profil moyen du document de la sous-population. Ce critère a tendance à favoriser les documents longs car plus ils contiennent de « mots », plus ils ont de chance de contenir de « mots » cooccurrents, et donc de se rapprocher du profil moyen.

characteristic_docs(corpus,dtm,meta(corpus)$A1_Gender, ndocs=5)
Documents characteristic of: F 
X7545: distance 9.124 
development diversity euro european union rich history

X3498: distance 10.18 
culture history euro civilization european union

X4819: distance 10.63 
freedom history culture development union

X7100: distance 11.94 
european union euro continent rich diversity

X7174: distance 12.52 
old continent european union culture  

Documents characteristic of: M 
X6500: distance 9.92 
old continent european union euro development 

X7526: distance 10.09 
development culture european union  

X3130: distance 10.17 
continent union euro development culture

X6207: distance 11.27 
culture european union euro  

X3212: distance 12.13 
union rich countries euro continent power

5 : Lecture de concordances

Les concordances permettent, pour un mot choisit, de rassembler l’ensemble des unités de textes (ou documents) dans lesquels il apparaît. On vérifie ici l’usage de ces mots dans les titres avec la fonction concordances.

concordances(corpus, dtm, "fifa")
X938 
fifa hi-tech euro  
X940 
fifa nina richi car fashion christian dior
X2344 
eiffel tower fiat nato european union fifa
X3631 
stonehenge fifa high culture  
X7684 
freedom fifa tourism work revenue
X7685 
fifa tourism   
X7686 
tourism fifa nato  
X7962 
fifa liar arrogant  

Les 8 réponses contennat le mot fifa sont affichées. On peut les lire pour voir les cooccurrences à ce mot.

6 : Suppression de mots du lexique (au choix)

On décide d’éliminer certains mots. On en fait une liste qu’on supprime du lexique. Ici zigzag et vs.

asupp <- c("zigzag", "vs")
dictemis2 <- dictemis[!rownames(dictemis) %in% asupp,]

7 : Lemmatisation

La fonction combine_terms de R.temis permet de lemmatiser et donc réduire les mots à leur “racine”/ Token. On crée alors un nouveau tableau lexical … mais on ne va pas l’utiliser par la suite.

dtm2 <- combine_terms(dtm, dictemis2)
dtm2
<<DocumentTermMatrix (documents: 8143, terms: 3656)>>
Non-/sparse entries: 36092/29734716
Sparsity           : 100%
Maximal term length: 17
Weighting          : term frequency (tf)

La taille du vocabulaire est réduite à 3656 mots distincts au lieu de 4765 initialement.

On peut aussi modifier ce dictionnaire pour faire un nouveau lemmatiseur

#exportation du dictionnaire si besoin pour modifier la lemmatisation
write.csv2(dictemis, file="data/dictemis2.csv")
# on modifie le dictionnaire (.csv) avec un tableur et on le sauve au format .csv
dictemis2_l <- read.csv2("data/dictemis2_l.csv", row.names=1)
#View(dictemis2)
dtml<-combine_terms(dtm,dictemis2_l)

Créer des sous-corpus

On peut créer des sous-corpus à partir de la variable textuelle ou à partir des métadonnées.

# Ici par exemple par les réponses des enquêtées (Filles)
corpus_F <- corpus[meta(corpus,"A1_Gender") == "F"] 
# Ici les réponses contenant le mot continent
corpus_continent <- subset_corpus(corpus,dtm,"continent")

Repérer les cooccurrences

On affiche les mots cooccurrents, c’est à dire présents simultanément dans les unités textuelles). Les termes qui partagent un même contexte partagent des significations similaires

rappel : le tableau lexical

Recherche de mots cooccurrents à certains mots “au choix”

cooc_terms(dtm, "france", n=10)
            % Term/Cooc. % Cooc./Term   Global % Cooc. Global  t value Prob.
france         19.628647    100.00000 0.20194853    74     74      Inf     0
germany         8.488064     66.66667 0.13099364    32     48      Inf     0
italy           6.631300     55.55556 0.12280654    25     45      Inf     0
spain           5.835544     81.48148 0.07368392    22     27      Inf     0
england         2.917772     36.66667 0.08187103    11     30 7.728523     0
kingdom         2.387268     37.50000 0.06549682     9     24 6.993554     0
poland          1.591512     85.71429 0.01910324     6      7 6.740153     0
portugal        1.856764     46.66667 0.04093551     7     15 6.417648     0
belgium         1.591512     66.66667 0.02456131     6      9 6.371998     0
switzerland     1.856764     33.33333 0.05730972     7     21 5.970088     0
# Calcul du nombre de mots dans les réponses contenant le mot "france"
rs <- row_sums(dtm)  # somme des occurrences par document
# regroupement selon présence de "france"
groupe <- as.vector(dtm[, "france"] > 0)
sum(rs[groupe])
[1] 377

Parmi les réponses contenant le mot “france”, ce mot représente 19% (74/377) des occurrences et 66% des réponses qui contiennent “france” contiennent aussi “germany”.

Visualisations des cooccurrences

Autour des mots les plus centraux (analyse de similitude)

On génère un graphe de mots où les mots les plus fréquents sont centraux et où les liens représentent les cooccurrences avec ces mots. On a le choix entre 2 affichages :

  • Dans une fenêtre R Plot de R où on peut déplacer les mots et les liens mais on ne peut l’exporter qu’au format Postscript (non exécuté ici).
  • Dans la fenêtre Plots de RStudio où on pout utiliser la fonction zoom et exporter le graphe sous différents formats.
terms_graph(dtm, vertex.label.cex = 0.5, interactive = F)

Faire une Analyse factorielle des correspondances sur TLE dans le cas de ce corpus n’est pas pertinent car ces textes sont constitués de suites de mots cités (et non des phrases).

Analyse des correspondances sur le tableau lexical entier

La fonction corpus_ca exécute une Analyse factorielle sur le tableau lexical entier. Les plans factoriels permettent d’observer la position réciproque des mots et des réponses et de faire émerger des ensembles de champs lexicaux.

resTLE <- corpus_ca(corpus, dtm, sparsity=0.99)
#explor(resTLE)
rese <- explor::prepare_results(resTLE)
explor::CA_var_plot(rese, xax = 1, yax = 2, lev_sup = FALSE, var_sup = FALSE,
    var_sup_choice = , var_hide = "Row", var_lab_min_contrib = 1, col_var = "Position",
    symbol_var = "Type", size_var = "Contrib", size_range = c(52.5, 700), labels_size = 10,
    point_size = 56, transitions = TRUE, labels_positions = NULL, xlim = c(-1.95,
        3.33), ylim = c(-2.27, 3.02))

Mettre en relation mots et métadonnées

On va mettre en relation les mots et les caractéristiques des étudiants à disposition (métadonnées).

On peut afficher le tableau des métadonnées

View(meta(corpus))

G_State G_City G_Study A1_Gender A10_LevInc A11_LevEdu_f A12_LevEdu_m A13_Rank1 PaysVis Mixit Nblang VecuEtranger

Distributions

On affiche les effectifs et répartitions des métadonnées

tab1 <- freq(meta(corpus)$G_State)
tab1
       n    % val%
BEL  425  5.2  5.2
BRA  913 11.2 11.2
CHN 1139 14.0 14.0
CMR  989 12.1 12.1
FRA  547  6.7  6.7
HUN  222  2.7  2.7
IND  817 10.0 10.0
MDA  205  2.5  2.5
MLT  192  2.4  2.4
PRT  481  5.9  5.9
ROU  383  4.7  4.7
RUS  764  9.4  9.4
SEN  175  2.1  2.1
TUN  209  2.6  2.6
TUR  682  8.4  8.4
tab2 <- freq(meta(corpus)$G_Study) 
tab2
       n    % val%
     175  2.1  2.1
ART 1201 14.7 14.7
BUS 1379 16.9 16.9
ENG 1301 16.0 16.0
HEA 1260 15.5 15.5
POL 1251 15.4 15.4
SHS 1576 19.4 19.4
tab3 <- freq(meta(corpus)$A1_Gender) 
tab3
     n    % val%
F 4015 49.3 49.3
M 4128 50.7 50.7

Attention, il faudra peut-être faire un sous-corpus pour enlever les non réponses. Ex Corpus2 <- corpus[meta(corpus, "G_Study") != " "]

Analyse des correspondances sur le tableau lexical agrégé

Le tableau lexical agrégé croise en lignes les mots (termes) et en colonnes les modalités d’une ou plusieurs variables qualtatives (métadonnées) ; c’est un tableau de contigence sur lequel on peut exécuter une analyse factorielle. Celle-ci permet de structurer l’ensemble des mots en fonction ici des caractéristiques des enquêtés.

La fonction corpus_ca exécute une Analyse factorielle sur le tableau lexical créé ici avec les variables pays, domaine d’étude, genre et avoir_vecu_a_l_etranger. On a vérifié que les modalités étaient réparties “équitablement”. On cherche à repérer des profils types.

Les plans factoriels permettnt d’observer la position réciproque des mots et des métadonnées et de faire émerger des groupes de représentations qui s’attachent à des sous-populations

Rappel des noms de variables a disposition : G_State G_City G_Study A1_Gender A10_LevInc A11_LevEdu_f A12_LevEdu_m A13_Rank1 PaysVis Mixit Nblang VecuEtranger

resTLA <- corpus_ca(corpus, dtm, variables=c("G_State", "G_Study", "A1_Gender","VecuEtranger"), sparsity=0.99)
#explor(resTLA)
res <- explor::prepare_results(resTLA)
explor::CA_var_plot(res, xax = 1, yax = 2, lev_sup = FALSE, var_sup = FALSE,
    var_sup_choice = , var_hide = "None", var_lab_min_contrib = 0, col_var = "Position",
    symbol_var = "Type", size_var = NULL, size_range = c(10, 300), labels_size = 10,
    point_size = 56, transitions = TRUE, labels_positions = NULL, xlim = c(-1.01,
        1.85), ylim = c(-0.939, 1.92))

Les résultats de l’analyse factorielle (plans factoriels, contributions axes par axes) s’affichent dans une fenêtre interactive à l’exécution de la commande explor(). Les valeurs des contributions axes par axes permettent de déterminer les modalités des variables qui différencient le plus les champs lexicaux des réponses. Le signe - ou + des valeurs des coordonnées permettent de repérer les oppositions.

Exemple d’affichage des contributions

On remarque que la modalité de la varible domaine d’étude est vide (G_study_) dans toutes les réponses données au Sénégal. Il faudrait refaire l’analyse sans cette variable.

Aides à l’interprétation

On affiche les titres qui sont aux extrémités des axes (coordonnées les plus grandes sur les axes 1 et 2)

extreme_docs(corpus, resTLA, 1 , ndocs=5)
Most extreme documents on the positive side of axis 1:
X233 
romantic pretty relaxed  
X250 
pretty romantic mysterious  
X269 
romantic mean and ferocious   
X280 
romantic arts   
X283 
romantic leisure elegant fairy 


 Most extreme documents on the negative side of axis 1:
extreme_docs(corpus, resTLA, 2 , ndocs=5)
Most extreme documents on the positive side of axis 2:
X509 
exclusion racism arrogant  
X512 
eldorado racism colonialism exploited mercenaires
X531 
colonialism domination racism  
X1735 
egoism racism materialistic dupe domination
X1770 
racism chauvinsm slaver exploiter neo-colonialism


 Most extreme documents on the negative side of axis 2: