Analyser une question ouverte avec R.temis

Données

Le corpus utilisé dans cet exemple contient un extrait des réponses à une question ouverte issue de l’enquête Populations, Espaces de Vie, Environnements (Ined, 1992). L’intitulé de la question est celui-ci :Si je vous dis Environnement, qu’est ce que cela évoque pour vous ?.

PEE, Ined

Pour chaque enquêté, on dispose de caractéristiques socio-démographiques (https://data.ined.fr/index.php/catalog/41).

Les données sont stockées dans un tableau, dit individus x variables, contenant 2017 lignes (le nombre de répondants) et 16 colonnes. Ces colonnes correspondent aux variables suivantes : identifiant du questionnaire, caractéristiques des répondants (ou métadonnées) et en 16ème colonne la variable correspondant à la question ouverte (variable textuelle). Les textes des réponses constituent le corpus.

Extrait des données

Appel du package

library(R.temis)
corpus <- import_corpus("data/PEE_K1_extract.csv", format="csv",textcolumn=16,language="fr")

Création du tableau lexical

La fonction build_dtm crée le tableau lexical (Document Term Matrix dans R).

dtm <-build_dtm(corpus, remove_stopwords=F,min_length=2)
dtm
<<DocumentTermMatrix (documents: 2017, terms: 1157)>>
Non-/sparse entries: 11298/2322371
Sparsity           : 100%
Maximal term length: 17
Weighting          : term frequency (tf)

Les lignes du tableau lexical correspondent ici aux 2017 réponses extraites de l’enquête “Populations, Espaces de Vie, Environnements (PEE), Ined 1992) et les colonnes aux 1157 mots distincts du corpus.

Affichage

# des metadonnées
View(meta(corpus))

# des réponses à la QO
View(sapply(corpus,as.character))

# d'un extrait du Tableau lexical
inspect(dtm)
#as.matrix(dtm[1:10, c("de", "abus")])

Occurrences

Explorer le lexique

La fonction dictionary crée le dictionnaire associé au lexique. On peut explorer via RStudio : affichage des mots par ordre alphabétique ou par fréquence.

On affiche la liste des mots les plus fréquents avec la fonction frequent_terms.

dic<-dictionary(dtm,remove_stopwords = F)

frequent_terms(dtm, n=20)
          Global occ.  Global %
la               1112 9.0983472
nature            888 7.2655866
de                823 6.7337588
les               417 3.4118802
le                406 3.3218786
vie               382 3.1255114
ce                362 2.9618720
qui               352 2.8800524
autour            193 1.5791196
est               192 1.5709377
tout              190 1.5545737
entoure           183 1.4973000
cadre             173 1.4154803
pollution         146 1.1945672
nous              135 1.1045655
on                129 1.0554737
où                119 0.9736541
campagne          111 0.9081983
qualité           108 0.8836524
bien              105 0.8591065

Le mot nature est évoqué 888 fois dans cet extrait des réponses à la question ouverte (PEE) et représente plus de 7% des occurrences.

Global % correspond à l’occurrence du mot (nature 888) rapportée à l’ensemble des “mots” du corpus des réponses. p_global <- (888 / sum(col_sums(dtm))) * 100 = 7.26

Le nombre total de mots du corpus est obtenu en additionnant les fréquences de chaque mot du tableau lexical par  `sum(col_sums(dtm))` soit 12222. 

nature représente 7,26% des mots du corpus.

Afficher le nuage de mots

Ici affiche les mots de plus de 20 occurrences et on choisit de ne pas afficher les mots-outils (fonction word_cloud),

cloud<-word_cloud(dtm, color="black", n=100, min.freq=10,remove_stopwords=T)

Les occurrences de quelques mots doivent être précisées dans la légende de ce graphique pour aider sa compréhension.

Concordances

Les concordances permettent, pour chaque mot, de rassembler l’ensemble des textes (ici les réponses à la question ouverte) dans lesquels il apparaît (fonction concordances).

Ici par exemple on cherche comprendre pourquoi le mot enquêté apparait dans les réponses.

concordances(corpus,dtm,"enquêté")
X158 
tout ce qui ce passe à l'extérieur du logement de l'enquêté
X1487 
ce qui entoure l'enquêté, voir, sentir
#concordances(corpus,dtm,"alentour")
#concordances(corpus,dtm,"sur")
#concordances(corpus,dtm,"que")

On doit afficher les concordances à chaque étape d’interprétation des résultats.

Cooccurrences

Terme le plus associé (positivement ou négativement) à un terme

On utilise la fonction cooc_terms qui affiche les termes coocurrents à un mots choisi (ici logement) dans l’ensemble du corpus.

cooc_terms(dtm,"logement", n=10)
          % Term/Cooc. % Cooc./Term   Global % Cooc. Global   t value  Prob.
logement    10.6194690  100.0000000 0.09818360    12     12       Inf 0.0000
du           4.4247788   11.9047619 0.34364261     5     42  3.944244 0.0000
mon          3.5398230   10.0000000 0.32727868     4     40  3.296309 0.0005
alentours    2.6548673    9.6774194 0.25364098     3     31  2.762872 0.0029
personnes    1.7699115   16.6666667 0.09818360     2     12  2.558003 0.0053
enquêté      0.8849558   50.0000000 0.01636393     1      2  2.087832 0.0184
principal    0.8849558   50.0000000 0.01636393     1      2  2.087832 0.0184
vivent       0.8849558   50.0000000 0.01636393     1      2  2.087832 0.0184
---------           NA           NA         NA    NA     NA        NA     NA
la           3.5398230    0.3597122 9.09834724     4   1112 -2.063841 0.0195
nature       0.8849558    0.1126126 7.26558665     1    888 -2.894881 0.0019

% Term/Cooc. — Fréquence relative du mots parmi les mots du sous-corpus (contenant le terme choisi)

# Calcul du nombre de mots dans les réponses contenant le mot "logement"
rs <- row_sums(dtm)  # somme des occurrences par document
# regroupement selon présence de "famille"
groupe <- as.vector(dtm[, "logement"] > 0)
sum(rs[groupe])
[1] 113

(12/113)*100=10.619- 10,6% de logement parmi l’ensemble de mots dans les réponses contenant logement. (3/113)*100=2.65 - 2,65% des occurrences de alentours dans l’ensemble de mots dans les réponses contenant logement.

% Cooc./Term — Part des cooccurrences dans les occurrences du mot choisi (3/31)*100=9.67 -9,67,1 % des réponses contiennent logement et alentours

Global % — Fréquence globale du mot dans le corpus (idem plus haut)

Les mots sont classés par t value décroissante. La “t value” est la transformation de la p-value en score z (quantile de la loi normale standard) : t.val <- qnorm(p.val). Plus le t value est élevée, plus l’association est forte et non aléatoire. Le test hypergéométrique répond à la question : la cooccurrence observée est-elle due au hasard ? ou, en d’autres termes, Ce “mot” apparaît-il significativement plus souvent qu’attendu dans les titres contenant “logement” ?. Ici, le test est significatif pour quasiement tous les mots (t value >1.96) et proba faible.

On verra par la suite qu’on peut produire un graphe de mots pour présenter des cooccurrences.

Analyse factorielle sur un tableau lexical entier

L’analyse factorielle sur un tableau lexical met en évidence les mots les plus cooccurrents. La lecture des mots les plus contributifs aux axes et les concordances permettent d’identifier des champs lexicaux. Par la suite, elle peut aider à de justifier (ou non) la lemmatisation de certains mots (partie suivante).

resTLE <-corpus_ca(corpus,dtm, sparsity=0.985)
37 documents have been skipped because they do not include any occurrence of the terms retained in the final document-term matrix. Increase the value of the 'sparsity' parameter if you want to include them. These documents are: X75, X114, X130, X197, X284, X377, X402, X554, X561, X585, X725, X776, X844, X861, X909, X911, X917, X940, X1026, X1108, X1141, X1148, X1154, X1396, X1470, X1512, X1522, X1565, X1576, X1608, X1720, X1743, X1789, X1796, X1871, X1877, X1983.
Variable(s) X, qnumq have been skipped since they contain more than 100 levels.
#explor(resTLE)
res <- explor::prepare_results(resTLE)
explor::CA_var_plot(res, xax = 1, yax = 2, lev_sup = TRUE, var_sup = FALSE,
    var_sup_choice = , var_hide = "Row", var_lab_min_contrib = 0, col_var = "Position",
    symbol_var = "Type", size_var = "Contrib", size_range = c(23.4375, 312.5),
    labels_size = 10, point_size = 25, transitions = TRUE, labels_positions = NULL,
    xlim = c(-3, 2.91), ylim = c(-2.42, 3.49))

Les aides à l’interprétation classiques (valeurs propres, contributions, coordonnées, …) sont stockées dans resTLE que l’on explore avec grâce à la fonction explor. Dans la fenêtre graphe de l’interface graphique, masquer les lignes et décocher modalités supplémentaires pour afficher uniquement les mots.

Extrait d’aides à l’interprétation de l’AFC

Mettre les QO en regard avec les métadonnées

On dispose des variables suivantes : sexe, age en classes (aget), situation matrimoniale(matrim), pratique religieuse (pratique), avoir des enfants oui/non(enf), activite, profession regroupée (prof), diplôme (dipl), vote écolo oui/non (vote), type d’habitat, type de localité (local), revenu, region.

Répartitions

Vérifier la répartition des caractéristiques des enquêté pour chaque métadonnée.

library (questionr)

table(meta(corpus)$sexe)
table(meta(corpus)$aget)
table(meta(corpus)$matrim)
table(meta(corpus)$pratique)
table(meta(corpus)$enf)
table(meta(corpus)$activite)
table(meta(corpus)$prof)
table(meta(corpus)$dipl)
table(meta(corpus)$vote)
table(meta(corpus)$habitat)
table(meta(corpus)$localite)
table(meta(corpus)$revenu)
table(meta(corpus)$region)

Nombre de mots par sous-corpus

Ici on compte les mots de chaque sous-corpus (ou catégorie) crée à partir de la variable Region de l’enquête.

lexical_summary(dtm, corpus,"region", unit = "global")  
                           
Per category total:             Bretagne       Centre   Jura_Alpes
  Number of terms            2142.000000   686.000000  1702.000000
  Number of unique terms      411.000000   162.000000   383.000000
  Percent of unique terms      19.187675    23.615160    22.502938
  Number of hapax legomena    239.000000    95.000000   244.000000
  Percent of hapax legomena    11.157796    13.848397    14.336075
  Number of words            2142.000000   686.000000  1702.000000
                           
Per category total:         Mediterrannée         Nord S_BassinParis
  Number of terms             1256.000000  1907.000000    842.000000
  Number of unique terms       304.000000   361.000000    237.000000
  Percent of unique terms       24.203822    18.930257     28.147268
  Number of hapax legomena     181.000000   204.000000    156.000000
  Percent of hapax legomena     14.410828    10.697431     18.527316
  Number of words             1256.000000  1907.000000    842.000000
                           
Per category total:              S_Ouest        Seine Corpus total
  Number of terms            1445.000000  2242.000000 12222.000000
  Number of unique terms      306.000000   472.000000  1157.000000
  Percent of unique terms      21.176471    21.052632     9.466536
  Number of hapax legomena    182.000000   279.000000   650.000000
  Percent of hapax legomena    12.595156    12.444246     5.318279
  Number of words            1445.000000  2242.000000 12222.000000

Le corpus contient 12 222 mots dont 1 157 mots distincts, alors que le corpus des enquêtés de la région Seine contient 2 242 mots dont 472 mots distints. On pourrait comparer ici le % de mots distincts (indicateur de richesse du vocabulaire) 9,5% vs 21% en région Seine.

Specificités

Mots spécifiques par modalités

# selon lla tranche d'age
specific_terms(dtm,meta(corpus)$aget, n=5)
$`20-29ans`
          % Term/Level % Level/Term  Global % Level Global occ.   t value
pollution    2.3171615    21.917808 1.1945672    32         146  3.597375
nature       9.7031137    15.090090 7.2655866   134         888  3.520068
la          11.4409848    14.208633 9.0983472   158        1112  3.079918
écologie     1.0861694    23.437500 0.5236459    15          64  2.622351
---------           NA           NA        NA    NA          NA        NA
pas          0.0724113     1.587302 0.5154639     1          63 -2.600224
           Prob.
pollution 0.0002
nature    0.0002
la        0.0010
écologie  0.0044
---------     NA
pas       0.0047

$`30-39ans`
        % Term/Level % Level/Term   Global % Level Global occ.   t value  Prob.
espace     1.5224913     44.89796 0.80183276    44          98  4.535542 0.0000
vert       0.5536332     48.48485 0.27000491    16          33  2.949616 0.0016
travail    0.3114187     56.25000 0.13091147     9          16  2.575370 0.0050
aux        0.2422145     63.63636 0.09000164     7          11  2.548321 0.0054
-------           NA           NA         NA    NA          NA        NA     NA
des        0.3460208     10.75269 0.76092293    10          93 -3.020565 0.0013

$`40-49ans`
         % Term/Level % Level/Term   Global % Level Global occ.   t value
vie         3.8917717     27.48691 3.12551137   105         382  2.476145
odeurs      0.2594514     58.33333 0.09818360     7          12  2.459497
cela        0.1482580     80.00000 0.04090983     4           5  2.335376
produits    0.1111935    100.00000 0.02454590     3           3  2.299162
--------           NA           NA         NA    NA          NA        NA
espaces     0.1482580      8.00000 0.40909835     4          50 -2.420948
          Prob.
vie      0.0066
odeurs   0.0070
cela     0.0098
produits 0.0107
--------     NA
espaces  0.0077

$`50-59ans`
          % Term/Level % Level/Term  Global % Level Global occ.   t value
plaisir      0.4329004    41.176471 0.1390934     7          17  2.647314
autour       2.2881880    19.170984 1.5791196    37         193  2.253119
sur          0.3092146    41.666667 0.0981836     5          12  2.190012
---------           NA           NA        NA    NA          NA        NA
pollution    0.5565863     6.164384 1.1945672     9         146 -2.603730
eau          0.0000000     0.000000 0.3845524     0          47 -3.022971
           Prob.
plaisir   0.0041
autour    0.0121
sur       0.0143
---------     NA
pollution 0.0046
eau       0.0013

$`60ans+`
        % Term/Level % Level/Term   Global % Level Global occ.   t value  Prob.
coin       0.1100110    100.00000 0.03272787     4           4  2.417029 0.0078
-------           NA           NA         NA    NA          NA        NA     NA
espace     0.4950495     18.36735 0.80183276    18          98 -2.450984 0.0071
qualité    0.5500550     18.51852 0.88365243    20         108 -2.549664 0.0054
vie        2.2827283     21.72775 3.12551137    83         382 -3.519802 0.0002
nature     5.8580858     23.98649 7.26558665   213         888 -3.932301 0.0000

% Term/Level indique le % du mot par rapport à l’ensemble de mots de cette catégorie (ici les 20-29ans).

# Nb de mots total des réponses des 20-29ans
lexical_summary(dtm, corpus,"aget", unit = "global") 
# 1381 mots dans les réponses des 20-29 ans

Pollution représente 2,31 % (32/1381) des mots des 20-29ans.

% Level/Term indique le % du mot pour cette catégorie (ici les 20-29ans) par rapport son occurrence global.
21,92% (32/146) des mots pollution sont évoqués par des 20-29ans.

Global indique le % du mot par rapport à l’ensemble des mots du corpus(cf plus haut).

La t value permet d’évaluer la significativité du test hypergéométrique pour déterminer si la fréquence d’un “mot” dans une catégorie donnée est significativement plus élevée que sa fréquence globale dans l’ensemble du corpus Les “mots” sont ordonnés selon leur significativité et une valeur négative de la significativité indique un sous-emploi du mot dans la catégorie (par exemple espaces pour les 40-49ans). En pratique, une valeur test supérieure à 1,96 permet d’interpréter une sur-représentation significative d’une catégorie donnée (p < 0,05) et supérieure à 3,09 une sur-repésentation très significative. Quand la t_value est négative, on conclue à une sous-représentation de ce “mot”.

Les mots pollution et nature sont spécifiques des répondants jeunes (moins de 30ans)…

Réponses spécifiques par modalités

La fonction characteristic_docs affiche les documents représentatifs d’une catégorie donnée de répondants ici.

Remarque : Le calcul de la distance est fondé sur la métrique du Khi2 et mesure l’écart entre le profil d’une réponse (ici) et le profil moyen de la réponse de la catégorie. Ce critère a tendance à favoriser les textes longs car plus ils contiennent de “mots”, plus ils ont de chance de contenir de “mots” communs, et donc de se rapprocher du profil moyen.

#Réponses spécifiques selon la région
characteristic_docs(corpus,dtm,meta(corpus)$region, ndocs=3)
Documents characteristic of: Bretagne 
X1426: distance 4.44 
la nature, le cadre de vie

X1499: distance 4.505 
la nature, ce qui est autour de nous

X21: distance 5.345 
la nature, cadre de vie

Documents characteristic of: Centre 
X1262: distance 4.234 
la nature, tout ce qui est autour de moi

X1303: distance 4.234 
tout ce qui est autour de moi, la nature

X1025: distance 4.446 
tout ce qui est autour de moi, les gens, la nature

Documents characteristic of: Jura_Alpes 
X978: distance 4.388 
le cadre de vie, la nature

X1777: distance 4.667 
tout ce qui est autour de nous, la nature

X264: distance 4.934 
tout ce qui est autour de moi, la nature

Documents characteristic of: Mediterrannée 
X1787: distance 5.44 
la qualité de vie, tout ce qui nous entoure

X299: distance 6.101 
cadre de vie, tout ce qui nous entoure

X103: distance 6.237 
la nature

Documents characteristic of: Nord 
X988: distance 4.565 
c'est le cadre de vie, la qualité de la vie

X464: distance 5.121 
cadre de vie, la nature

X1832: distance 5.121 
cadre de vie, la nature

Documents characteristic of: S_BassinParis 
X171: distance 4.469 
le cadre de vie, la pollution, la nature

X491: distance 5.596 
ce qui est autour de moi, la nature

X100: distance 6.188 
la nature

Documents characteristic of: S_Ouest 
X516: distance 4.349 
la nature, le cadre de vie

X193: distance 4.667 
la nature, ce qui est autour de nous

X1766: distance 5.055 
tout ce qui nous entoure, la nature, la pollution

Documents characteristic of: Seine 
X461: distance 4.415 
le cadre de vie, la nature

X763: distance 4.415 
le cadre de vie, la nature

X118: distance 6.047 
la nature

Analyse factorielle sur tableau de contingence

La fonction corpus_ca permet d’effectuer une AFC qui met en relation les “mots” et un ensemble de variables qualitatives (les métadonnées).

On choisit les variables (ici : sexe, aget, matrim, pratique, enf, activite, prof, dipl, vote, habitat, localite, revenu) pour créer le tableau de contingence croisant les mots du corpus et les modalités des métadonnées sur lequel on calcule l’AFC. Comme des “mots” rares peuvent créer des axes articifiels, nous gardons uniquement les “mots” qui apparaissent dans au moins 2% des réponses. Pour cela, on réduit le tableau lexical (dtm) aux “mots” les plus fréquents avec l’option sparsity=0.98. Plus la valeur de sparsity est base, moins on garde de “mot” pour l’AFC.

resTLA<-corpus_ca(corpus,dtm, variables =c("sexe","aget",   "matrim","pratique","enf","activite","prof","dipl","vote",  "habitat"   ,"localite","revenu"),sparsity=0.98)
71 documents have been skipped because they do not include any occurrence of the terms retained in the final document-term matrix. Increase the value of the 'sparsity' parameter if you want to include them. These documents are: X22, X29, X32, X75, X114, X128, X130, X131, X140, X142, X197, X284, X360, X377, X402, X496, X514, X532, X554, X561, X563, X583, X585, X609, X619, X632, X685, X725, X766, X768, X776, X777, X787, X798, X844, X861, X909, X911, X917, X940, X971, X1010, X1026, X1065, X1086, X1108, X1116, X1141, X1148, X1154, X1186, X1239, X1280, X1370, X1377, X1396, X1470, X1512, X1522, X1565, X1576, X1608, X1657, X1720, X1743, X1779, X1789, X1796, X1871, X1877, X1983.
Variable(s) X, qnumq have been skipped since they contain more than 100 levels.
# explor(resTLA)

On ouvre l’interface graphique via explor( ).
Décocher l’affichage des modalités supplémentaires dans l’interface graphique de la fenêtre Graphique pour ne pas afficher les numéros des textes mais seulement les “mots” et les modalités des variables.

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 = 2, col_var = "Position",
    symbol_var = "Type", size_var = "Contrib", size_range = c(26.25, 350), labels_size = 10,
    point_size = 28, transitions = TRUE, labels_positions = NULL, xlim = c(-0.393,
        0.447), ylim = c(-0.413, 0.426))

Ici encore on regarde les aides à l’interprétation classiques (valeurs propres, contributions, coordonnées, …) stockées dans resTLA avec la fonction explor

Extrait des aides à l’interprétation de l’AFC sur TLA

On affiche les réponses les plus contributives aux axes 1 à 3 (fonction extreme_docs).

# Documents les plus illustratifs par axe
extreme_docs(corpus,resTLA,axis=1,ndocs=2)
Most extreme documents on the positive side of axis 1:


 Most extreme documents on the negative side of axis 1:
X53 
écologie
X417 
écologie
extreme_docs(corpus,resTLA,axis=2,ndocs=2)
Most extreme documents on the positive side of axis 2:


 Most extreme documents on the negative side of axis 2:
X155 
espaces verts, bois, rivières
X635 
espaces verts
extreme_docs(corpus,resTLA,axis=3,ndocs=2)
Most extreme documents on the positive side of axis 3:
X259 
destruction des biens, poubelles, égouts
X696 
des champs, des bois


 Most extreme documents on the negative side of axis 3:

Graphe de mots

arbre <- terms_graph(dtm, min_occ = 30, interactive=T)

Et pour aller plus loin

Analyser des sous-corpus

On créer des sous corpus à l’aide des métadonnées ou de mots au choix.

Classifications du tableau lexical

Va regrouper les réponses contenant des mots cooccurrents et permet ainsi de repérer des champs lexicaux.

Avec R.temis

clusTLE <- corpus_ca(corpus, dtm,variables = NULL, ncp =  6, sparsity = 0.98)
71 documents have been skipped because they do not include any occurrence of the terms retained in the final document-term matrix. Increase the value of the 'sparsity' parameter if you want to include them. These documents are: X22, X29, X32, X75, X114, X128, X130, X131, X140, X142, X197, X284, X360, X377, X402, X496, X514, X532, X554, X561, X563, X583, X585, X609, X619, X632, X685, X725, X766, X768, X776, X777, X787, X798, X844, X861, X909, X911, X917, X940, X971, X1010, X1026, X1065, X1086, X1108, X1116, X1141, X1148, X1154, X1186, X1239, X1280, X1370, X1377, X1396, X1470, X1512, X1522, X1565, X1576, X1608, X1657, X1720, X1743, X1779, X1789, X1796, X1871, X1877, X1983.
Variable(s) X, qnumq have been skipped since they contain more than 100 levels.
#Afficher le dendrogramme
#plot(clusTLE$call$tree)
#clusTLE$desc.var

Ici on selectionne 7 classes

clus <- corpus_clustering(clusTLE,7)

Description des classes

Pour chaque numéro de classe déterminé dans l’étape précédente, R affiche les mots et textes spécifiques qui vont permettre de déterminer les champs lexicaux de chacune.

On ajoute la variable de classe (clus) aux métadonnées initiales.

corpus_cl <- add_clusters(corpus,clus)
#View(meta(corpus_cl))
#clusTLE$desc.var

Mots spécifiques

On se sert de cette variable issue de la classification pour calculer les spécificités

specific_terms(dtm,meta(corpus_cl)$clus, n=5)
Warning in rollup.simple_triplet_matrix(t(x), 2L, INDEX[as.character(k)], :
NA(s) in 'index'
$`1`
          % Term/Level % Level/Term   Global % Level Global occ.   t value
écologie     36.956522    53.125000 0.53094408    34          64       Inf
pollution     6.521739     4.109589 1.21121619     6         146  3.133503
problèmes     2.173913    18.181818 0.09125601     2          11  2.744472
---------           NA           NA         NA    NA          NA        NA
de            0.000000     0.000000 6.82760909     0         823 -2.976769
la            0.000000     0.000000 9.22515348     0        1112 -3.650148
           Prob.
écologie  0.0000
pollution 0.0009
problèmes 0.0030
---------     NA
de        0.0015
la        0.0001

$`2`
         % Term/Level % Level/Term  Global % Level Global occ. t value Prob.
air          2.011331     71.71717 0.8213041    71          99     Inf     0
calme        2.351275     80.58252 0.8544881    83         103     Inf     0
campagne     2.436261     77.47748 0.9208561    86         111     Inf     0
la          18.583569     58.99281 9.2251535   656        1112     Inf     0
nature      17.223796     68.46847 7.3668492   608         888     Inf     0

$`3`
        % Term/Level % Level/Term  Global % Level Global occ.   t value Prob.
arbres      4.411765    56.896552 0.4811681    33          58       Inf     0
espaces     6.283422    94.000000 0.4148001    47          50       Inf     0
les        17.647059    31.654676 3.4594326   132         417       Inf     0
verts       5.614973    91.304348 0.3816161    42          46       Inf     0
-------           NA           NA        NA    NA          NA        NA    NA
de          1.470588     1.336574 6.8276091    11         823 -6.989877     0

$`4`
           % Term/Level % Level/Term   Global % Level Global occ.  t value
entourage     66.666667    34.146341 0.34013605    14          41      Inf
secteur        4.761905    25.000000 0.03318401     1           4 2.459769
habitation     4.761905     6.250000 0.13273602     1          16 1.918399
naturel        4.761905     5.882353 0.14103202     1          17 1.892283
milieu         4.761905     2.777778 0.29865605     1          36 1.547024
            Prob.
entourage  0.0000
secteur    0.0070
habitation 0.0275
naturel    0.0292
milieu     0.0609

$`5`
        % Term/Level % Level/Term  Global % Level Global occ.   t value Prob.
cadre      5.6864338    80.924855 1.4352082   140         173       Inf     0
de        17.2623883    51.640340 6.8276091   425         823       Inf     0
qualité    3.5337124    80.555556 0.8959681    87         108       Inf     0
vie       12.3883022    79.842932 3.1690725   305         382       Inf     0
-------           NA           NA        NA    NA          NA        NA    NA
ce         0.2437043     1.657459 3.0031525     6         362 -10.95007     0

$`6`
     % Term/Level % Level/Term  Global % Level Global occ. t value Prob.
bien     5.103858     81.90476 0.8710801    86         105     Inf     0
dans     2.492582     62.68657 0.5558321    42          67     Inf     0
être     4.094955     72.63158 0.7881201    69          95     Inf     0
on       5.578635     72.86822 1.0701842    94         129     Inf     0
où       5.044510     71.42857 0.9872242    85         119     Inf     0

$`7`
        % Term/Level % Level/Term  Global % Level Global occ. t value Prob.
autour      4.835040     88.08290 1.6011283   170         193     Inf     0
ce          9.812287     95.30387 3.0031525   345         362     Inf     0
entoure     5.005688     96.17486 1.5181682   176         183     Inf     0
est         4.095563     75.00000 1.5928323   144         192     Inf     0
il          1.251422     86.27451 0.4230961    44          51     Inf     0

Réponses specifiques

characteristic_docs(corpus_cl,dtm,meta(corpus_cl)$clu, ndocs=3)
Warning in rollup.simple_triplet_matrix(t(x), 2L, INDEX[as.character(k)], :
NA(s) in 'index'
Documents characteristic of: 1 
X47: distance 19.13 
nature, écologie

X294: distance 19.13 
nature, écologie

X359: distance 19.13 
nature, écologie

Documents characteristic of: 2 
X24: distance 3.751 
la nature

X65: distance 3.751 
la nature

X80: distance 3.751 
la nature

Documents characteristic of: 3 
X630: distance 9.34 
ce qui nous entoure, la nature, les espaces verts, la mer

X727: distance 14.02 
la nature, le calme, les espaces verts, le bon air

X1091: distance 14.6 
les arbres, la nature

Documents characteristic of: 4 
X1053: distance 21.69 
nature, entourage

X1255: distance 21.69 
entourage, nature

X115: distance 44.4 
entourage

Documents characteristic of: 5 
X241: distance 2.511 
la nature, qualité de la vie, cadre de vie

X988: distance 2.63 
c'est le cadre de vie, la qualité de la vie

X461: distance 2.871 
le cadre de vie, la nature

Documents characteristic of: 6 
X1756: distance 7.402 
le cadre de vie où on est

X1482: distance 8.899 
la nature, le bien être, le calme

X814: distance 8.902 
c'est où on vit, le respect de la nature

Documents characteristic of: 7 
X1777: distance 2.428 
tout ce qui est autour de nous, la nature

X264: distance 2.736 
tout ce qui est autour de moi, la nature

X1262: distance 2.736 
la nature, tout ce qui est autour de moi

Avec Rainette (type Alceste)

On pourrait également faire une classification avec le package Rainette. En savoir plus sur https://juba.github.io/rainette/articles/introduction_usage.html

Son utilisation nesessite aussi d’appeler le package quanteda.

Attention risque de conflit entre les packages tm (chargé par R.temis) et quanteda : ne pas lancer library(quanteda).

Ici on utilise le corpus non lemmatisé.

library(rainette)
corpus

# On adapte le TLE pour quanteda
dfm <- quanteda::as.dfm(dtm)
quanteda::docvars(dfm, "doc_id") <- 1:nrow(dfm)

# On exécute rainette

resrai <- rainette(dfm, min_uc_size = 3, k = 10, doc_id = "doc_id", cc_test = 0.3,
  tsj = 3)

Exploration interactive

rainette_explor(resrai,dfm)

groups <-cutree_rainette(resrai, k = 10)

Description des classes

rainette_stats(groups, dfm, n_terms = 5)

On récupère la variable issue de la classification Rainette pour des traitements ultérieurs

meta(corpus, "classe") <- cutree_rainette(resrai, k = 10)
#View(meta(corpus))
library(knitr)
purl("PEEK1b.qmd")