« Analyses des réponses ouvertes » : différence entre les versions
Aucun résumé des modifications |
|||
(50 versions intermédiaires par 5 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
{{tutoriel | |||
|fait_partie_du_cours=Analytique et exploration de données | |||
|fait_partie_du_module=Text mining | |||
|pas_afficher_sous-page=Non | |||
|statut=à finaliser | |||
|difficulté=intermédiaire | |||
|cat tutoriels=Analytique et exploration de données | |||
}} | |||
[[Catégorie:R]] | |||
==Problématique== | ==Problématique== | ||
Notre réflexion a pour but de proposer une solution pour traiter les questions ouvertes dans le cas des évaluations des cours. Dans la plupart des | Notre réflexion a pour but de proposer une solution pour traiter les questions ouvertes dans le cas des évaluations des cours. Dans la plupart des universités, des questionnaires sont proposés aux élèves afin qu'ils puissent donner leur avis sur les cours qu'ils ont suivis. La plupart du temps, ces questionnaires sont composés de questions à choix multiples mais également des questions ouvertes. | ||
* Les questions à choix multiples sont facilement traitables de manière automatique. | |||
* Le traitement des questions ouvertes est en revanche plus compliqué. | |||
* Les enseignants doivent généralement lire les différents commentaires pour avoir une idée des réponses des étudiants. | |||
Nous voudrions donc proposer une représentation automatique des questions ouvertes qui permettrait aux enseignants d'avoir une idée des réponses des étudiants sans avoir à les lire. | |||
'''Objectif :''' Notre but est de proposer une solution avec des programmes gratuits qui permettraient de mettre en avant les thèmes et les idées principales contenues dans les réponses des étudiants. | |||
==Solutions envisagées== | |||
===Fichier de données=== | |||
Pour notre exemple, nous avons utilisé le logiciel d'analyse statistique Limesurvey. Il permet d'exporter les réponses sous format '''*.csv'''. | |||
Les | Les logiciels d'analyse et de text mining que nous allons utiliser ensuite pour notre analyse nécessite que le fichier source soit au format '''*.txt'''. | ||
Il suffit donc d'ouvrir le fichier .csv avec Excel puis d'enregistrer les réponses sous le format '''Texte (séparateur : tabulation) (*.txt)'''. Ainsi, chacune des lignes du fichier contiendra la réponse de l'un des participants. Ce qui permettra une meilleure analyse avec le logiciel IRaMuTeQ. | |||
===Tropes=== | ===Tropes=== | ||
====Déroulement de l’analyse==== | ====Déroulement de l’analyse==== | ||
Les différentes étapes de travail de Tropes sont décrites ici: [http://edutechwiki.unige.ch/fr/Tropes#Etapes_de_travail_de_Tropes|Tropes: Les étapes de travail] | |||
=====Préparation du corpus===== | =====Préparation du corpus===== | ||
Ligne 16 : | Ligne 39 : | ||
Ensuite, il ne faut pas mettre les réponses à toutes les questions dans un seul document car les résultats ne seront pas significatifs s'il n'y a aucune cohérence linéaire dans le texte soumis à Tropes. C'est pourquoi Tropes nous conseille deux solutions différentes si nous traitons des réponses à des questions ouvertes. | Ensuite, il ne faut pas mettre les réponses à toutes les questions dans un seul document car les résultats ne seront pas significatifs s'il n'y a aucune cohérence linéaire dans le texte soumis à Tropes. C'est pourquoi Tropes nous conseille deux solutions différentes si nous traitons des réponses à des questions ouvertes. | ||
Si toutes les réponses à toutes les questions sont contenues dans un même document, Tropes conseille d'utiliser des délimiteurs (cf: [[Tropes#L.E2.80.99outil_.E2.80.9CD.C3.A9limiteur.E2.80.9D|Tropes: L'outil délimiteur]]) afin de pouvoir séparer les réponses aux diverses questions. | Si toutes les réponses à toutes les questions sont contenues dans un même document, Tropes conseille d'utiliser des délimiteurs (cf: [[Tropes#L.E2.80.99outil_.E2.80.9CD.C3.A9limiteur.E2.80.9D|Tropes: L'outil délimiteur]]) afin de pouvoir séparer les réponses aux diverses questions. | ||
Une autre option est de créer un document par question contenant les réponses correspondantes. Il faut donc traiter séparément chacun des documents, chacune des questions. | |||
====Proposition de traitement avec Notepad++==== | |||
====Proposition de traitement avec Notepad++ | |||
=====Enlever les lignes vides===== | =====Enlever les lignes vides===== | ||
Aller dans '''''[Edition]''' > '''[Ligne]''' > '''[Enlever les lignes vides (contenant les blancs aussi)]''' | Aller dans '''''[Edition]''' > '''[Ligne]''' > '''[Enlever les lignes vides (contenant les blancs aussi)]''''' | ||
'' | |||
=====Enlever les espaces à la fin des phrases===== | =====Enlever les espaces à la fin des phrases===== | ||
Ligne 40 : | Ligne 59 : | ||
Il faut commencer par cocher la case Expression régulière tout en bas à gauche. | Il faut commencer par cocher la case Expression régulière tout en bas à gauche. | ||
Dans la case « Recherche », mettre un « $ ». Le signe « $ » est une expression régulière qui correspond à la fin d’une ligne. Donc, en d’autres termes, on demande au logiciel de chercher | Dans la case « Recherche », mettre un « $ ». Le signe « $ » est une expression régulière qui correspond à la fin d’une ligne. Donc, en d’autres termes, on demande au logiciel de chercher la fin de chacune des lignes du document. | ||
Dans la case « Remplacer par », mettre « . ». En d'autres termes, on demande au logiciel de mettre un point à la suite du dernier caractère d'une ligne. | Dans la case « Remplacer par », mettre « . ». En d'autres termes, on demande au logiciel de mettre un point à la suite du dernier caractère d'une ligne. | ||
Ligne 51 : | Ligne 70 : | ||
Dans la case « Recherche », mettre « .. » et dans la case « Remplacer par », mettre « . ». Réitérer l’opération jusqu’à ce qu’il n’y ait plus de cas trouvé. | Dans la case « Recherche », mettre « .. » et dans la case « Remplacer par », mettre « . ». Réitérer l’opération jusqu’à ce qu’il n’y ait plus de cas trouvé. | ||
Enfin, il faut enregistrer le nouveau fichier en format .txt avant de le rouvrir dans Tropes. | |||
====Solution avec R==== | |||
Tout d’abord, afin d’importer vos documents dans R, il vous faut créer un nouveau projet en allant dans '''File > New Project > New Directory > Empty Project'''. Ici, nommez votre projet comme vous le souhaitez. | |||
Dans votre espace de projet, créez un dossier « corpus » dans lequel vous insérerez tous les documents que vous souhaitez analyser. | |||
Dans RStudio, vous pouvez vérifier l’emplacement de votre espace de travail en entrant la fonction suivante : '''getwd()'''. | |||
Ensuite, vous pouvez charger vos documents avec la fonction suivante : '''cname<-file.path(".", "corpus")'''. Cette fonction va appeler tous les documents contenus dans le dossier « corpus » que vous avez créé auparavant. | |||
Ensuite, il faut charger le package de R qui va permettre de faire du text minining : '''library(tm)''' | |||
Il faut ensuite créer une variable qui va contenir tous nos documents. Pour ce faire, il faut rentrer la ligne de code suivante : '''docs<-Corpus(DirSource(cname))'''. | |||
=====Enlever les lignes blanches===== | |||
Pour retirer les lignes blanches contenues dans les documents, il faut créer une fonction. | |||
Nous allons créer une fonction qui va repérer chaque ligne dont le début est aussi la fin de la ligne (une ligne vide) et qui va faire un retour en arrière à cet endroit-là. | |||
Les lignes de codes suivantes nous permettent de le faire : | |||
<source lang="actionscript"> | |||
noSpace<-content_transformer(function(x,pattern) gsub(pattern, '\b', x)) | |||
docs<-tm_map(docs, noSpace, '^$') | |||
</source> | |||
=====Ajouter un point à la fin de chaque ligne===== | |||
Pour ajouter un point à la fin de chaque ligne, nous allons créer une seconde variable. Celle-ci va juste détecter la fin de chaque ligne et ajouter un point. | |||
Pour ce faire, il faut insérer les lignes suivantes dans RStudio : | |||
<source lang="actionscript"> | |||
addPoint<-content_transformer(function(x,pattern) gsub(pattern, ".", x)) | |||
docs<-tm_map(docs, addPoint, '$') | |||
</source> | |||
=====Voir le résultat et enregistrer===== | |||
Afin de pouvoir voir le résultat, vous pouvez entrer la ligne suivante : '''inspect(docs)''' | |||
Pour pouvoir enregistrer votre nouveau document, entrez la ligne suivante : '''writeCorpus(docs, path = ".", filenames = NULL)''' | |||
Vous pouvez remplacer le chemin où vous voulez l’enregistrer en l’indiquant dans « path ». | |||
=====Code complet à copier ===== | |||
<source lang="actionscript"> | |||
cname<-file.path(".", "corpus") | |||
dir(cname) | |||
library(tm) | |||
docs<-Corpus(DirSource(cname)) | |||
noSpace<-content_transformer(function(x,pattern) gsub(pattern, '\b', x)) | |||
docs<-tm_map(docs, noSpace, '^$') | |||
inspect(docs) | |||
addPoint<-content_transformer(function(x,pattern) gsub(pattern, ".", x)) | |||
docs<-tm_map(docs, addPoint, '$') | |||
writeCorpus(docs, path = ".", filenames = NULL) | |||
</source> | |||
====Utilisation envisagée==== | ====Utilisation envisagée==== | ||
Tropes est intéressant car il permet de faire ressortir les différents termes qui sont apparus dans le texte, avec leur nombre d'occurrence. Tropes nous permet d’afficher différents types de graphiques qui peuvent entre autres, permettre de se rendre compte de la proximité des termes entre eux. | Tropes est intéressant car il permet de faire ressortir les différents termes qui sont apparus dans le texte, avec leur nombre d'occurrence. Tropes nous permet d’afficher différents types de graphiques qui peuvent entre autres, permettre de se rendre compte de la proximité des termes entre eux. Tropes offre un autre intérêt car il est possible de visualiser les propositions où les termes apparaissent en cliquant sur ces derniers. | ||
====Limites de cette solution==== | ====Limites de cette solution==== | ||
=====Limites des graphes===== | =====Limites des graphes===== | ||
Tropes ne permet pas de faire | Tropes ne permet pas de faire de graphiques globaux. Les graphiques sont toujours centrés sur un terme en particulier, l’utilisateur n’a donc jamais une vision globale des résultats. | ||
=====Limites du logiciel===== | =====Limites du logiciel===== | ||
Ligne 73 : | Ligne 147 : | ||
====Préparation du corpus==== | ====Préparation du corpus==== | ||
Le logiciel IRaMuTeQ exige que le document contienne des variables de type : '''**** *nom_de_la_variable'''. | |||
Dans notre cas, il n’était pas possible d’insérer les variables de manière aléatoire. En effet, afin de pouvoir accéder aux propositions dans le concordancier, une variable doit précéder chacune des réponses. Il est aussi indispensable d’avoir un retour à la ligne entre la variable et le commentaire, autrement le logiciel interprète tout le texte comme une variable. Nous vous proposons donc une solution avec R afin de préparer le corpus de façon à pouvoir l’utiliser de manière optimale. | |||
Notre solution comprend plusieurs traitements qui permettent d’obtenir un document dont chaque réponse est précédée par une variable, et qui ne contient aucune ligne vide, ni aucune variable inutile. | |||
Il est facile avec R de coller un terme, dans notre cas une variable, au début de chacune des lignes. Le problème dans notre cas sont les lignes qui ne contiennent rien et qui sont dans notre corpus car il n'est pas possible de les supprimer et il n’est pas possible non plus de coller nos variables seulement dans les lignes contenant quelque chose. | |||
Nous avons donc dû trouver une solution pour ne pas ajouter de variables inutiles. Nous avons dû ajouter des caractères spécifiques dans les lignes vides. Par spécifique, nous entendons une suite de caractères qui serait unique. Dans notre cas, nous avons ajouté “vv”. Nous avons ensuite collé une variable contenant également une suite de caractères spécifiques, “**** *nouveau_commentaire zzz”. | |||
Les lignes vides contenaient donc : “**** *nouveau_commentaire zzz vv” ce qui nous permettait d'y accéder en recherchant les lignes se terminant par “vv” puis effacer le contenu de ces lignes. | |||
Nous avons ensuite remplacer les “zzz” du texte par des retours à la ligne. | |||
Ces traitements nous ont permis d’avoir un résultat de type : | |||
<source lang="actionscript"> | |||
**** *nouveau_commentaire | |||
texte | |||
**** *nouveau_commentaire | |||
texte | |||
</source> | |||
Voici ci-dessous le code que nous vous proposons et que vous pouvez utiliser tel quel dans R pour préparer des fichiers textes qui seront utilisables dans IRaMuTeQ. | |||
Tout d’abord afin d’importer vos documents dans R, il vous faut créer un nouveau projet en allant dans '''File > New Project > New Directory > Empty Project'''. Ici, nommer votre projet comme vous le souhaitez. | |||
Dans votre espace de projet, créez un dossier « corpus » dans lequel vous insérerez tous les documents que vous souhaitez analyser. | |||
Dans RStudio, vous pouvez vérifier l’emplacement de votre espace de travail en entrant la fonction suivante : '''getwd()'''. | |||
Ensuite, vous pouvez charger vos documents avec la fonction suivante : '''cname<-file.path(".", "corpus")'''. Cette fonction va appeler tous les documents contenus dans le dossier « corpus » que vous avez créé auparavant. | |||
Ensuite, il faut charger le package de R qui va permettre de faire du text minining : '''library(tm)''' | |||
Il faut ensuite créer une variable qui va contenir tous nos documents, pour ce faire, il faut rentrer la ligne de code suivante : '''docs<-Corpus(DirSource(cname))'''. | |||
=====Détection des lignes vides===== | |||
Afin de pouvoir repérer et accéder aux lignes vides facilement, nous allons insérer « vv » dans chacune d’elles. | |||
Pour ce faire, il faut entrer les lignes de code suivantes : | |||
<source lang="actionscript"> | |||
noSpace<-content_transformer(function(x,pattern) gsub(pattern, "vv", x)) | |||
docs<-tm_map(docs, noSpace, '^$') | |||
</source> | |||
=====Ajout de la variable===== | |||
Nous allons insérer cette variable au début de chaque ligne avec le code suivant qui utilise la fonction paste. Cette dernière permet de coller un ou plusieurs mots dans un fichier texte. Sans précision de position, elle colle le(s) mot(s) au début de chaque ligne. | |||
<source lang="actionscript"> | |||
coller<-content_transformer(function(x,y) paste("**** *nouveau_commentaire zzz", x)) | |||
docs<-tm_map(docs, coller, '^') | |||
</source> | |||
=====Suppression des variables inutiles===== | |||
Actuellement, le texte contient toujours des variables vides dont nous n’avons pas besoin. Afin de les supprimer, nous allons effacer toutes les lignes finissant par “vv”, c’est-à-dire les lignes qui ne contiennent pas de texte après leur variable. | |||
Pour ce faire, il faut rentrer le code suivant qui remplace le contenu des lignes finissant par "vv" par des retours chariot: | |||
<source lang="actionscript"> | |||
ligneVide<-content_transformer(function(x,pattern) gsub(pattern, '\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b', x)) | |||
docs<-tm_map(docs, ligneVide, 'vv$') | |||
</source> | |||
=====Insertion de saut à la ligne après chaque variable===== | |||
Enfin, nous ne souhaitons pas que la variable “**** *nouvau_commentaire” soit sur la même ligne que la réponse, nous voulons donc insérer un saut de ligne après chaque occurence de “**** *nouveau_commentaire”. | |||
Les lignes suivantes permettent de le faire en replaçant "zzz" par une expression régulière qui fait un retour à la ligne: | |||
<source lang="actionscript"> | |||
retour<-content_transformer(function(x,pattern) gsub(pattern, '\n', x)) | |||
docs<-tm_map(docs, retour, "zzz") | |||
</source> | |||
=====Voir, encoder et enregistrer le document===== | |||
Afin de pouvoir voir le résultat du traitement, vous pouvez entrer: ''' “inspect(docs)”'''. | |||
Ensuite, juste avant de l’enregistrer et pour s’assurer que le texte est bien encodé en UTF-8, veuillez entrer la ligne suivante: '''options(encoding = 'UTF-8')''' | |||
Vous pouvez enfin enregistrer votre nouveau document avec la ligne suivante: '''writeCorpus(docs, path = ".", filenames = NULL)''' | |||
=====Code complet à copier===== | |||
<source lang="actionscript"> | |||
cname<-file.path(".", "corpus") | |||
dir(cname) | |||
library(tm) | |||
docs<-Corpus(DirSource(cname)) | |||
noSpace<-content_transformer(function(x,pattern) gsub(pattern, "vv", x)) | |||
docs<-tm_map(docs, noSpace, '^$') | |||
coller<-content_transformer(function(x,y) paste("**** *nouveau_commentaire zzz", x)) | |||
docs<-tm_map(docs, coller, '^') | |||
ligneVide<-content_transformer(function(x,pattern) gsub(pattern, '\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b', x)) | |||
docs<-tm_map(docs, ligneVide, 'vv$') | |||
retour<-content_transformer(function(x,pattern) gsub(pattern, '\n', x)) | |||
docs<-tm_map(docs, retour, "zzz") | |||
options(encoding=’UTF-8’) | |||
writeCorpus(docs, path = ".", filenames = NULL) | |||
</source> | |||
=====Ouverture avec IRaMuTeQ:===== | |||
Lorsque vous ouvrez votre fichier avec IRaMuTeQ, voici les informations que vous devez sélectionner/cocher afin que les analyses se fassent correctement : | |||
[[Fichier:Iramuteq para.png|500px|centré]] | |||
====Utilisation envisagée==== | ====Utilisation envisagée==== | ||
IRaMuTeQ permet d'envisager plusieurs utilisations qui impliquent l'utilisation du logiciel par le lecteur (pour la liste des formes actives) ou alors la production de graphiques qui sont sauvegardés dans un format image et peuvent être partagés avec les lecteurs sans qu'ils aient besoin d'utiliser le logiciel. | |||
=====Liste des formes actives et concordancier===== | =====Liste des formes actives et concordancier===== | ||
En lançant une analyse statistique, il est possible d'avoir accès à un tableau contenant les formes actives et leur fréquence d'apparition. | |||
[[Fichier:Liste formes actives.png|centré|500px]] | |||
Il est ensuite possible d'avoir accès à des options concernant les termes en faisant un clic droit sur l'un d'eux. | |||
[[Fichier:Liste formes actives_concordancier.png|centré|500px]] | |||
Nous avons la possiblité d'avoir accès au concordancier de chaque terme. Il s'agit en fait d'un écran qui regroupe toutes les propositions où le terme est apparu. | |||
[[Fichier:Concordancier.png|centré|500px]] | |||
Le concordancier peut être enregistré en format html. Il est alors possible de transmettre ce fichier et de l'utiliser en dehors du logiciel IRaMuTeQ. Cependant, seul le concordancier est exporté et pas la liste. De plus, il faut reproduire la démarche pour les différents termes de la liste. | |||
Cette analyse est intéressante mais elle demande de lire le tableau afin de prendre connaissance des différents termes et de leur poids. Elle ne permet pas de se faire une idée rapide des idées/termes qui ont été cités dans les réponses. Elle présente cependant un énorme avantage : le concordancier. Il est intéressant pour le lecteur de pouvoir contextualiser les termes et de mieux les comprendre. | |||
Afin d'avoir accès au tableau et au concordancier, il est indispensable d'utiliser le logiciel. Il n'est pas possible de produire un fichier de résultat et de le fournir aux enseignants. | |||
=====Nuage de mots===== | =====Nuage de mots===== | ||
Ce dernier représente les formes actives en assignant une taille plus importante aux termes qui sont apparus le plus. Le traitement consiste à compter et lister les termes puis à produire un affichage graphique. | |||
[[Fichier:Nuage 1.png|centré]] | [[Fichier:Nuage 1.png|centré]] | ||
Ce type de graphique à l'avantage de donner une idée rapide des termes importants mais le manque de contexte est un réel problème. Il serait en effet intéressant de pouvoir avoir accès au contexte d'apparition des termes qui constituent le nuage. | |||
=====Analyse de similitudes===== | =====Analyse de similitudes===== | ||
Une analyse des similitudes est proposée dans IRaMuTeQ. Cette analyse se base sur le package poxy de R et produit ensuite des graphiques issus de la librairie "igraph" de R. | Une analyse des similitudes est proposée dans IRaMuTeQ. Cette analyse se base sur le package poxy de R et produit ensuite des graphiques issus de la librairie "igraph" de R. Les termes du texte entré dans IRaMuTeQ sont traduits en matrice et cette dernière est ensuite traité par R. | ||
Cette analyse calcule la proximité entre les formes actives (déterminée par le lexique) et produit ensuite un graphique. La taille des mots sur le graphique correspond au nombre d’occurrences du terme dans le texte. Le termes sont reliés. L'épaisseur des liens représente l'importance de la proximité entre les formes, c'est-à-dire si cette dernière est présente plusieurs fois. | |||
[[Fichier:Graph simi 1.png|800px|centré]] | [[Fichier:Graph simi 1.png|800px|centré]] | ||
Ce graphe est intéressant car il permet à l'enseignant de se faire une idée des associations entre les termes. Cela peut lui fournir une idée plus précise sur le sens des commentaires des étudiants. En effet, les liens donnent une information sur le contexte d'apparition des termes dans certains cas. Dans le graphique ci-dessus, nous voyons que le mot difficile est relié à "tp". Il y a un réel ajout d'information par rapport au nuage de mots. | |||
====Limites de cette solution==== | ====Limites de cette solution==== | ||
== | La limite des solutions proposées par IRaMuTeq la plus importante est le fait qu'il n'est pas possible d'avoir une représentation visuelle intéressante et un accès au contexte des termes en même temps et en dehors du logiciel. | ||
==Références== | |||
===Documentation sur Tropes=== | |||
* [http://tropes.fr/ManuelDeTropesV840.pdf Manuel de Tropes] | |||
* [http://edutechwiki.unige.ch/fr/Tropes Page Edutechwiki de Tropes] | |||
===Documentation sur IRaMuTeQ=== | |||
* [http://www.iramuteq.org/documentation/fichiers/documentation_iramuteq_21_12_2013.pdf Manuel d'utilisation de IRaMuTeQ] | |||
* [http://edutechwiki.unige.ch/fr/IRaMuTeQ Page Edutechwiki de IRaMuTeQ] | |||
===Documentation sur R=== | |||
*[http://edutechwiki.unige.ch/fr/Tutoriels_R Tutoriel Edutechwiki sur R] | |||
*[http://edutechwiki.unige.ch/fr/Premiers_pas_avec_R Premiers pas avec R] | |||
*[http://%20http://www.statmethods.net/management/userfunctions.html Créer une fonction avec R] | |||
*[http://w3.jouy.inra.fr/unites/miaj/public/formation/initiationRv4.pdf Initiation à R] | |||
*[http://cran.r-project.org/doc/contrib/Kauffmann_aide_memoire_R.pdf Référence des fonctions principales de R] | |||
*[http://onepager.togaware.com/TextMiningO.pdf Text Mining avec R] | |||
*[http://stat.ethz.ch/R-manual/R-devel/library/base/html/paste.html Concaténation avec R] |
Dernière version du 22 mars 2020 à 22:38
Analytique et exploration de données | |
---|---|
Module: Text mining | |
⚐ à finaliser | ☸ intermédiaire |
⚒ 2020/03/22 | |
Catégorie: Analytique et exploration de données |
Problématique
Notre réflexion a pour but de proposer une solution pour traiter les questions ouvertes dans le cas des évaluations des cours. Dans la plupart des universités, des questionnaires sont proposés aux élèves afin qu'ils puissent donner leur avis sur les cours qu'ils ont suivis. La plupart du temps, ces questionnaires sont composés de questions à choix multiples mais également des questions ouvertes.
- Les questions à choix multiples sont facilement traitables de manière automatique.
- Le traitement des questions ouvertes est en revanche plus compliqué.
- Les enseignants doivent généralement lire les différents commentaires pour avoir une idée des réponses des étudiants.
Nous voudrions donc proposer une représentation automatique des questions ouvertes qui permettrait aux enseignants d'avoir une idée des réponses des étudiants sans avoir à les lire.
Objectif : Notre but est de proposer une solution avec des programmes gratuits qui permettraient de mettre en avant les thèmes et les idées principales contenues dans les réponses des étudiants.
Solutions envisagées
Fichier de données
Pour notre exemple, nous avons utilisé le logiciel d'analyse statistique Limesurvey. Il permet d'exporter les réponses sous format *.csv.
Les logiciels d'analyse et de text mining que nous allons utiliser ensuite pour notre analyse nécessite que le fichier source soit au format *.txt.
Il suffit donc d'ouvrir le fichier .csv avec Excel puis d'enregistrer les réponses sous le format Texte (séparateur : tabulation) (*.txt). Ainsi, chacune des lignes du fichier contiendra la réponse de l'un des participants. Ce qui permettra une meilleure analyse avec le logiciel IRaMuTeQ.
Tropes
Déroulement de l’analyse
Les différentes étapes de travail de Tropes sont décrites ici: Les étapes de travail
Préparation du corpus
Tropes durant son analyse, va mettre bout à bout toutes les phrases contenues dans les documents analysés. Dans le cas de réponses à des questions ouvertes, les personnes ne pensent pas forcément à ajouter de la ponctuation (point à la fin des phrases par exemple), ce qui fait que Tropes ne pourra pas effectuer un découpage optimal. Il faut donc penser à rajouter les signes de ponctuation pour pouvoir séparer les différents propos.
Ensuite, il ne faut pas mettre les réponses à toutes les questions dans un seul document car les résultats ne seront pas significatifs s'il n'y a aucune cohérence linéaire dans le texte soumis à Tropes. C'est pourquoi Tropes nous conseille deux solutions différentes si nous traitons des réponses à des questions ouvertes. Si toutes les réponses à toutes les questions sont contenues dans un même document, Tropes conseille d'utiliser des délimiteurs (cf: Tropes: L'outil délimiteur) afin de pouvoir séparer les réponses aux diverses questions. Une autre option est de créer un document par question contenant les réponses correspondantes. Il faut donc traiter séparément chacun des documents, chacune des questions.
Proposition de traitement avec Notepad++
Enlever les lignes vides
Aller dans [Edition] > [Ligne] > [Enlever les lignes vides (contenant les blancs aussi)]
Enlever les espaces à la fin des phrases
Aller dans [Edition] > [Traitement des espacements] > [Enlever les blancs en fin de ligne]
Ajouter un point à la fin de chaque phrase
Faire CTRL+H pour ouvrir l’onglet de Recherche et remplacement.
Cette fenêtre s’affiche :
Il faut commencer par cocher la case Expression régulière tout en bas à gauche.
Dans la case « Recherche », mettre un « $ ». Le signe « $ » est une expression régulière qui correspond à la fin d’une ligne. Donc, en d’autres termes, on demande au logiciel de chercher la fin de chacune des lignes du document.
Dans la case « Remplacer par », mettre « . ». En d'autres termes, on demande au logiciel de mettre un point à la suite du dernier caractère d'une ligne.
Enlever les points en trop à la fin de chaque phrase
Il se peut qu'il y ait des phrases qui contenaient déjà un/des point(s) avant notre dernière manipulation. Vu qu'on veut que nos lignes ne contiennent qu'un seul point final, on doit retirer les points en trop.
Pour ce faire, il faut rouvrir la fenêtre de Recherche et remplacement (Ctrl+H). Dans le « Mode de recherche », sélectionner « Mode normal ».
Dans la case « Recherche », mettre « .. » et dans la case « Remplacer par », mettre « . ». Réitérer l’opération jusqu’à ce qu’il n’y ait plus de cas trouvé.
Enfin, il faut enregistrer le nouveau fichier en format .txt avant de le rouvrir dans Tropes.
Solution avec R
Tout d’abord, afin d’importer vos documents dans R, il vous faut créer un nouveau projet en allant dans File > New Project > New Directory > Empty Project. Ici, nommez votre projet comme vous le souhaitez.
Dans votre espace de projet, créez un dossier « corpus » dans lequel vous insérerez tous les documents que vous souhaitez analyser. Dans RStudio, vous pouvez vérifier l’emplacement de votre espace de travail en entrant la fonction suivante : getwd().
Ensuite, vous pouvez charger vos documents avec la fonction suivante : cname<-file.path(".", "corpus"). Cette fonction va appeler tous les documents contenus dans le dossier « corpus » que vous avez créé auparavant.
Ensuite, il faut charger le package de R qui va permettre de faire du text minining : library(tm)
Il faut ensuite créer une variable qui va contenir tous nos documents. Pour ce faire, il faut rentrer la ligne de code suivante : docs<-Corpus(DirSource(cname)).
Enlever les lignes blanches
Pour retirer les lignes blanches contenues dans les documents, il faut créer une fonction.
Nous allons créer une fonction qui va repérer chaque ligne dont le début est aussi la fin de la ligne (une ligne vide) et qui va faire un retour en arrière à cet endroit-là.
Les lignes de codes suivantes nous permettent de le faire :
noSpace<-content_transformer(function(x,pattern) gsub(pattern, '\b', x))
docs<-tm_map(docs, noSpace, '^$')
Ajouter un point à la fin de chaque ligne
Pour ajouter un point à la fin de chaque ligne, nous allons créer une seconde variable. Celle-ci va juste détecter la fin de chaque ligne et ajouter un point.
Pour ce faire, il faut insérer les lignes suivantes dans RStudio :
addPoint<-content_transformer(function(x,pattern) gsub(pattern, ".", x))
docs<-tm_map(docs, addPoint, '$')
Voir le résultat et enregistrer
Afin de pouvoir voir le résultat, vous pouvez entrer la ligne suivante : inspect(docs)
Pour pouvoir enregistrer votre nouveau document, entrez la ligne suivante : writeCorpus(docs, path = ".", filenames = NULL)
Vous pouvez remplacer le chemin où vous voulez l’enregistrer en l’indiquant dans « path ».
Code complet à copier
cname<-file.path(".", "corpus")
dir(cname)
library(tm)
docs<-Corpus(DirSource(cname))
noSpace<-content_transformer(function(x,pattern) gsub(pattern, '\b', x))
docs<-tm_map(docs, noSpace, '^$')
inspect(docs)
addPoint<-content_transformer(function(x,pattern) gsub(pattern, ".", x))
docs<-tm_map(docs, addPoint, '$')
writeCorpus(docs, path = ".", filenames = NULL)
Utilisation envisagée
Tropes est intéressant car il permet de faire ressortir les différents termes qui sont apparus dans le texte, avec leur nombre d'occurrence. Tropes nous permet d’afficher différents types de graphiques qui peuvent entre autres, permettre de se rendre compte de la proximité des termes entre eux. Tropes offre un autre intérêt car il est possible de visualiser les propositions où les termes apparaissent en cliquant sur ces derniers.
Limites de cette solution
Limites des graphes
Tropes ne permet pas de faire de graphiques globaux. Les graphiques sont toujours centrés sur un terme en particulier, l’utilisateur n’a donc jamais une vision globale des résultats.
Limites du logiciel
Tropes est intéressant si l’enseignant sait déjà se servir du logiciel. S'il ne le connaît pas, l’enseignant doit installer Tropes sur son ordinateur et il doit apprendre à se servir du logiciel.
De plus, l’exportation des données depuis Tropes n’est pas facile et enlèverait toute l’interactivité proposée dans les divers graphiques, ce qui est un des atouts du logiciel.
IRaMuTeQ
Déroulement de l’analyse
IRaMuTeQ est une interface de R. Ce qui veut dire que c'est le logiciel R qui fait les analyses. IRaMuTeQ prépare les données et écrit des scripts qui sont ensuite traités dans R. Enfin, les résultats des analyses de R (les graphiques,...) sont affichés dans l'interface.
Préparation du corpus
Le logiciel IRaMuTeQ exige que le document contienne des variables de type : **** *nom_de_la_variable.
Dans notre cas, il n’était pas possible d’insérer les variables de manière aléatoire. En effet, afin de pouvoir accéder aux propositions dans le concordancier, une variable doit précéder chacune des réponses. Il est aussi indispensable d’avoir un retour à la ligne entre la variable et le commentaire, autrement le logiciel interprète tout le texte comme une variable. Nous vous proposons donc une solution avec R afin de préparer le corpus de façon à pouvoir l’utiliser de manière optimale.
Notre solution comprend plusieurs traitements qui permettent d’obtenir un document dont chaque réponse est précédée par une variable, et qui ne contient aucune ligne vide, ni aucune variable inutile.
Il est facile avec R de coller un terme, dans notre cas une variable, au début de chacune des lignes. Le problème dans notre cas sont les lignes qui ne contiennent rien et qui sont dans notre corpus car il n'est pas possible de les supprimer et il n’est pas possible non plus de coller nos variables seulement dans les lignes contenant quelque chose.
Nous avons donc dû trouver une solution pour ne pas ajouter de variables inutiles. Nous avons dû ajouter des caractères spécifiques dans les lignes vides. Par spécifique, nous entendons une suite de caractères qui serait unique. Dans notre cas, nous avons ajouté “vv”. Nous avons ensuite collé une variable contenant également une suite de caractères spécifiques, “**** *nouveau_commentaire zzz”.
Les lignes vides contenaient donc : “**** *nouveau_commentaire zzz vv” ce qui nous permettait d'y accéder en recherchant les lignes se terminant par “vv” puis effacer le contenu de ces lignes.
Nous avons ensuite remplacer les “zzz” du texte par des retours à la ligne.
Ces traitements nous ont permis d’avoir un résultat de type :
**** *nouveau_commentaire
texte
**** *nouveau_commentaire
texte
Voici ci-dessous le code que nous vous proposons et que vous pouvez utiliser tel quel dans R pour préparer des fichiers textes qui seront utilisables dans IRaMuTeQ.
Tout d’abord afin d’importer vos documents dans R, il vous faut créer un nouveau projet en allant dans File > New Project > New Directory > Empty Project. Ici, nommer votre projet comme vous le souhaitez.
Dans votre espace de projet, créez un dossier « corpus » dans lequel vous insérerez tous les documents que vous souhaitez analyser.
Dans RStudio, vous pouvez vérifier l’emplacement de votre espace de travail en entrant la fonction suivante : getwd().
Ensuite, vous pouvez charger vos documents avec la fonction suivante : cname<-file.path(".", "corpus"). Cette fonction va appeler tous les documents contenus dans le dossier « corpus » que vous avez créé auparavant.
Ensuite, il faut charger le package de R qui va permettre de faire du text minining : library(tm)
Il faut ensuite créer une variable qui va contenir tous nos documents, pour ce faire, il faut rentrer la ligne de code suivante : docs<-Corpus(DirSource(cname)).
Détection des lignes vides
Afin de pouvoir repérer et accéder aux lignes vides facilement, nous allons insérer « vv » dans chacune d’elles.
Pour ce faire, il faut entrer les lignes de code suivantes :
noSpace<-content_transformer(function(x,pattern) gsub(pattern, "vv", x))
docs<-tm_map(docs, noSpace, '^$')
Ajout de la variable
Nous allons insérer cette variable au début de chaque ligne avec le code suivant qui utilise la fonction paste. Cette dernière permet de coller un ou plusieurs mots dans un fichier texte. Sans précision de position, elle colle le(s) mot(s) au début de chaque ligne.
coller<-content_transformer(function(x,y) paste("**** *nouveau_commentaire zzz", x))
docs<-tm_map(docs, coller, '^')
Suppression des variables inutiles
Actuellement, le texte contient toujours des variables vides dont nous n’avons pas besoin. Afin de les supprimer, nous allons effacer toutes les lignes finissant par “vv”, c’est-à-dire les lignes qui ne contiennent pas de texte après leur variable.
Pour ce faire, il faut rentrer le code suivant qui remplace le contenu des lignes finissant par "vv" par des retours chariot:
ligneVide<-content_transformer(function(x,pattern) gsub(pattern, '\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b', x))
docs<-tm_map(docs, ligneVide, 'vv$')
Insertion de saut à la ligne après chaque variable
Enfin, nous ne souhaitons pas que la variable “**** *nouvau_commentaire” soit sur la même ligne que la réponse, nous voulons donc insérer un saut de ligne après chaque occurence de “**** *nouveau_commentaire”.
Les lignes suivantes permettent de le faire en replaçant "zzz" par une expression régulière qui fait un retour à la ligne:
retour<-content_transformer(function(x,pattern) gsub(pattern, '\n', x))
docs<-tm_map(docs, retour, "zzz")
Voir, encoder et enregistrer le document
Afin de pouvoir voir le résultat du traitement, vous pouvez entrer: “inspect(docs)”.
Ensuite, juste avant de l’enregistrer et pour s’assurer que le texte est bien encodé en UTF-8, veuillez entrer la ligne suivante: options(encoding = 'UTF-8')
Vous pouvez enfin enregistrer votre nouveau document avec la ligne suivante: writeCorpus(docs, path = ".", filenames = NULL)
Code complet à copier
cname<-file.path(".", "corpus")
dir(cname)
library(tm)
docs<-Corpus(DirSource(cname))
noSpace<-content_transformer(function(x,pattern) gsub(pattern, "vv", x))
docs<-tm_map(docs, noSpace, '^$')
coller<-content_transformer(function(x,y) paste("**** *nouveau_commentaire zzz", x))
docs<-tm_map(docs, coller, '^')
ligneVide<-content_transformer(function(x,pattern) gsub(pattern, '\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b', x))
docs<-tm_map(docs, ligneVide, 'vv$')
retour<-content_transformer(function(x,pattern) gsub(pattern, '\n', x))
docs<-tm_map(docs, retour, "zzz")
options(encoding=’UTF-8’)
writeCorpus(docs, path = ".", filenames = NULL)
Ouverture avec IRaMuTeQ:
Lorsque vous ouvrez votre fichier avec IRaMuTeQ, voici les informations que vous devez sélectionner/cocher afin que les analyses se fassent correctement :
Utilisation envisagée
IRaMuTeQ permet d'envisager plusieurs utilisations qui impliquent l'utilisation du logiciel par le lecteur (pour la liste des formes actives) ou alors la production de graphiques qui sont sauvegardés dans un format image et peuvent être partagés avec les lecteurs sans qu'ils aient besoin d'utiliser le logiciel.
Liste des formes actives et concordancier
En lançant une analyse statistique, il est possible d'avoir accès à un tableau contenant les formes actives et leur fréquence d'apparition.
Il est ensuite possible d'avoir accès à des options concernant les termes en faisant un clic droit sur l'un d'eux.
Nous avons la possiblité d'avoir accès au concordancier de chaque terme. Il s'agit en fait d'un écran qui regroupe toutes les propositions où le terme est apparu.
Le concordancier peut être enregistré en format html. Il est alors possible de transmettre ce fichier et de l'utiliser en dehors du logiciel IRaMuTeQ. Cependant, seul le concordancier est exporté et pas la liste. De plus, il faut reproduire la démarche pour les différents termes de la liste.
Cette analyse est intéressante mais elle demande de lire le tableau afin de prendre connaissance des différents termes et de leur poids. Elle ne permet pas de se faire une idée rapide des idées/termes qui ont été cités dans les réponses. Elle présente cependant un énorme avantage : le concordancier. Il est intéressant pour le lecteur de pouvoir contextualiser les termes et de mieux les comprendre.
Afin d'avoir accès au tableau et au concordancier, il est indispensable d'utiliser le logiciel. Il n'est pas possible de produire un fichier de résultat et de le fournir aux enseignants.
Nuage de mots
Ce dernier représente les formes actives en assignant une taille plus importante aux termes qui sont apparus le plus. Le traitement consiste à compter et lister les termes puis à produire un affichage graphique.
Ce type de graphique à l'avantage de donner une idée rapide des termes importants mais le manque de contexte est un réel problème. Il serait en effet intéressant de pouvoir avoir accès au contexte d'apparition des termes qui constituent le nuage.
Analyse de similitudes
Une analyse des similitudes est proposée dans IRaMuTeQ. Cette analyse se base sur le package poxy de R et produit ensuite des graphiques issus de la librairie "igraph" de R. Les termes du texte entré dans IRaMuTeQ sont traduits en matrice et cette dernière est ensuite traité par R.
Cette analyse calcule la proximité entre les formes actives (déterminée par le lexique) et produit ensuite un graphique. La taille des mots sur le graphique correspond au nombre d’occurrences du terme dans le texte. Le termes sont reliés. L'épaisseur des liens représente l'importance de la proximité entre les formes, c'est-à-dire si cette dernière est présente plusieurs fois.
Ce graphe est intéressant car il permet à l'enseignant de se faire une idée des associations entre les termes. Cela peut lui fournir une idée plus précise sur le sens des commentaires des étudiants. En effet, les liens donnent une information sur le contexte d'apparition des termes dans certains cas. Dans le graphique ci-dessus, nous voyons que le mot difficile est relié à "tp". Il y a un réel ajout d'information par rapport au nuage de mots.
Limites de cette solution
La limite des solutions proposées par IRaMuTeq la plus importante est le fait qu'il n'est pas possible d'avoir une représentation visuelle intéressante et un accès au contexte des termes en même temps et en dehors du logiciel.