Analyses des réponses ouvertes
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 suivi. La plupart du temps, ces questionnaires sont composés de questions à choix multiples mais également des questions ouvertes.
Les questions à choix multiples sont facilement traitable 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ées des réponses des étudiants.
Nous voudrions proposé une représentation automatiques des questions ouvertes qui permettrait aux enseignants d'avoir une idée des réponses des étudiants sans avoir à les lire. Notre but est de proposé 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 de texte 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 les lignes où il y a un espace à la fin de la proposition.
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, 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, 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)).
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, '$')
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 des 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 du trouver une solution pour ne pas ajouter de variables inutiles. Nous avons du 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 coller 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 termiant 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) en 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, encode 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 soit implique l'utilisation du logiciel par le lecteur (pour la liste des formes actives) ou alors le production de graphique qui sont sauvegardés dans un format image et peuvent être partagé avec les lecteurs sans qu'il n'ait 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 pour les termes en faisant un clic droit sur l'un d'eux.
Il y a 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 possible alors 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 important 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 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 traduit 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 terme 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 donne une information sur le contexte d'apparition des termes dans certain 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.