Le blog de Fabrice ARNAUD

AMC : correction automatique de QCM

Pour dire merci….

Avant de commencer, QUELQUES PETITS CONSEILS POUR PRÉPARER LA RENTRÉE…


AMC : correction automatique de QCM

Temps de lecture : 17 minutes

Mise à jour du 29 septembre 2021


Présentation
Un exemple pour commencer
Supplément : créer un QCM avec des questions aléatoires
Conclusion
Quelques évaluations au format LaTeX
Annexes : source.tex et Script.py


Je profite de la période estivale pour approfondir l’usage d’AMC ( Auto Multiple Choice). Il s’agit d’un projet libre et gratuit qui fonctionne sous Linux. Il consiste à produire et corriger automatiquement des QCM au format papier. La documentation d’AMC est en français, est très complète et associée à un forum et un wiki très actif. AMC utilise son propre langage pour créer le QCM, AMC-TXT, il permet surtout de composer en LaTeX ce qui est assez simple même pour les débutants.

La dernière version stable 1.4.0 date du 29 décembre 2018. Le développement semble encore actif et une version 1.5.0 rc2 est disponible sous Ubuntu. Le forum indique qu’une communauté francophone et anglophone est encore active.

Un exemple pour commencer

Avant le détail des étapes nécessaires à cette réalisation, voici un exemple :

Un QCM crée en LaTeX avec l’extension Auto Multiple Choice.

La copie a été complétée par l’élève. (C’est Xournal qui a fait le travail ! ).

AMC corrige ensuite automatiquement la copie.

J’avais également ajouté quelques commentaires pour la correction et AMC a préparé le corrigé.

^Évidemment, les notes des élèves ont été stockées au format Libreoffice ou csv :

 

Efficace !

Reprenons maintenant les différentes étapes nécessaires à la réalisation de ce QCM : de la conception du sujet à la correction automatique des copies. 

Les différentes étapes :

  1. Préparation et impression du sujet ;
  2. Distribution des sujet du QCM pré-rempli à chacun des élèves ;
  3. Passage de l’épreuve ;
  4. Récupération des copies ;
  5. Passage à la photocopieuse de la liasse de copie pour produire un fichier pdf ; contenant les images des copies ;
  6. Correction et annotation des copies dans AMC ;
  7. Envoi des copies corrigées par mail pour les élèves ayant fourni cette information ;
  8. Usage du script pour création des fichiers individuels contenant pour chaque élève la copie corrigée et la correction individualisée ;
  9. Récupération du fichier csv contenant les notes des élèves pour import dans Pronote ;
  10. Rendu des copies originales des élèves dans le même état qu’ils mes les avaient données. Le QRCODE de la copie mène vers la copie corrigée et la correction individualisée.

Pour la partie technique et détaillée, il faut maintenant passer par la succession d’actions suivantes :

Etape n° 0 : le matériel

AMC est avant tout un logiciel libre prévu pour fonctionner sous Linux. Il est disponible pour la plupart des grandes distributions (ici nous sommes sous Ubuntu 21.04 et l’installation se fait avec sudo apt-get install auto-multiple-choice pour une version 1.5.0rc2). Il fonctionne également avec Mac OS X. Pour Windows cela semble plus compliqué même si ce lien semble rendre cela possible (j’ai appris à cette occasion qu’il était possible d’utiliser Linux sous Windows avec un truc qui s’appelle WPS… mais comme je n’ai pas cet OS je ne peux rien dire de plus ! ).

AMC propose de créer les QCM en utilisant LaTeX. Une distribution LaTeX est donc nécessaire. J’utilise depuis longtemps TeXLive que j’aime beaucoup (ici j’utilise sudo apt-get install texlive).

Signalons enfin qu’il est possible de se passer de LaTeX car AMC a prévu un langage spécifique AMC-TXT pour coder les QCM. Il faut cependant préciser qu’il n’est pas nécessaire d’être un expert en LaTeX pour créer un QCM. Je recommande l’utilisation de LaTeX dans AMC car il permet une configuration très fine du sujet. Le code est particulièrement simple et lisible. 

Etape n° 1 : préparation du QCM

Quand on lance AMC on peut créer un nouveau projet. Pour nous simplifier dans notre apprentissage, AMC propose des modèles de QCM prêt à l’usage. Pour cet exemple je suis parti du modèle Groupes.

Il faut penser à configurer AMC pour l’adapter à votre configuration : éditeur de texte, lecteur pdf, distribution LaTeX…

Il y a plusieurs étapes dans le processus d’usage d’un QCM, chacune des ces étapes est traitée dans l’un des quatre onglets d’AMC :

  1. Préparation
  2. Saisie
  3. Notation
  4. Rapport

Nous sommes pour l’instant dans la partie Préparation.

Comme annoncé je suis passé par LaTeX. J’ai passé un peu de temps à construire un fichier source dont je souhaite me resservir pour l’ensemble de mes futurs QCM. Voici ce fichier source.tex. Vous pouvez consulter le contenu de ce fichier en bas de cette page.

J’ai ajouté quelques package en entête :

Le package geometry permet ensuite de régler les marges.

En lisant la documentation d’AMC, j’ai modifié quelques paramètres pour les adapter à mes besoins :

\AMCinterIrep=0pt
\AMCinterBrep=0.5ex
\AMCinterIquest=0pt
\AMCinterBquest=6ex % écart vertical entre les questions
\AMCpostOquest=7mm
\setlength{\AMChorizAnswerSep}{3em plus 4em}
\setlength{\AMChorizBoxSep}{1em}

\AMCrandomseed{1527384} %%% Générateur aléatoire

\AMCtext{explain}{\color{red} \bf}

\def\AMCbeginQuestion#1#2{\par\noindent{\textsc{\textbf{\color{violet} \lefthand~Question #1} #2~:~~}} }

Le paramètre essentiel pour moi est AMCinterBquest qui gère l’écart entre les questions. Il vaut ici 6ex soit 6 fois la hauteur de la lettre x. Je l’adapte à chaque fois en fonction des questions et du sujet. On peut aussi imaginer un QCM en recto-verso.

J’ai modifié la commande explain qui permet d’ajouter des commentaires dans la correction. Les commentaires sont en rouge et en gras (bf).

J’ai également modifié la présentation des entêtes des questions. Elles sont en violet, gras et petite capitale précédée par un petite main gauche \lefthand (merci fourier-orns !).

Enfin AMCrandomseed permet en modifiant ce paramètre d’obtenir un autre mélange aléatoire.

Même si tout cela peut paraître complexe, cette complexité est en fait la grande liberté de LaTeX : une possibilité de configurer chaque détail de la manière la plus fine possible…

On passe maintenant à l’essentiel, la préparation des questions.

La force d’AMC, sa puissance extraordinaire même, est sa capacité à mélanger les questions et pour chaque question de mélanger les réponses possibles de manière aléatoire. Avec une seule préparation de QCM on obtient autant de QCM différents que d’élèves ce qui évite les tricheries habituelles sur ce genre d’exercice.

Dans le fichier source la création de questions ressemble à cela :

\element{N1}{
\begin{question}{Q01}
Calculer \((-5)+(-3)+(+9)\)
\begin{reponseshoriz}
\bonne{\((+1)\)}
\mauvaise{\((-1)\)}
\mauvaise{\((-2)\)}
\mauvaise{\((+2)\)}
\mauvaise{\(0\)}
\mauvaise{\((+3)\)}
\end{reponseshoriz}
\explain{La bonne stratégie consiste à ajouter d'abord ensemble les nombres positifs puis les nombres négatifs. On termine alors par la somme des deux termes restants.}
\end{question}
}

Oui, le code source est en français et assez explicite ! Je crée un groupe N1 (Niveau 1) et une question Q01 (Question 1 mais tout autre désignation est possible) dans ce groupe. La bonne réponse et les mauvaises réponses sont précisées. Sur cet exemple les réponses sont écrites sur la même ligne de manière horizontale d’où le begin{reponseshoriz} … end{reponseshoriz}. On peut aussi passer à la ligne pour chaque réponse avec begin{reponses} … end{reponses}. Dans mon cas, il n’ y a qu’une seule bonne réponse begin{question}… end{question} mais il est possible de préparer des questions avec des réponses multiples begin{questionmult}…end{questionmult}

Je ne dis rien du code LaTeX dans ce cas. Pour le collège ou le lycée quelques rudiments vous seront utiles et un article de ce blog pourrait vous aider.

On passe enfin à la préparation de la fiche du sujet. Dans cet exemple j’ai crée trois groupes : N1, N2 et N3 avec plusieurs questions dans chaque groupe.

Les habitués du LaTeX ont déjà remarqué que le fameux \begin{document} qui débute un document n’apparaît qu’à la fin du fichier source. La raison est que les éléments que nous allons afficher sont définis dans des macros et au final une seule macro terminale déclenche l’ensemble du dispositif.

Le sujet du QCM est donc préparé dans une macro \newcommand{\sujet}. La raison de ce choix est que je souhaite que chacune des copies soit pré-remplie avec le nom, prénom, classe et date pour chaque élève. Cela va me simplifier l’organisation de la passation. Pour faire cela le package csvsimple qui est chargé avec auto-multiple-choice permet de créer autant de copie individualisée que de ligne dans un fichier csv qui contient la liste des élèves.

Plus précisément, mon fichier 401.csv ressemble à cela :

nom,prenom,classe,id,mail
AVOGADRO,Amedeo,401,0002,spame@ac3j.fr
AZIAKZ,Albert,401,0003,spame@ac3j.fr
BOHR,Niels,401,0004,spame@ac3j.fr
COPERNIC,Nicolas,401,0005,spame@ac3j.fr
EEE,Albert,401,0006,spame@ac3j.fr

La commande \csvreader[head to column names]{../../\Liste}{}{\sujet} (\Liste est une variable que j’ai défini en haut du fichier source et qui contient le nom du fichier csv) appelle la commande \sujet autant de fois que le fichier csv contient de ligne. À chaque ligne les variables qui correspondent à la première ligne du fichier csv sont créés \nom \prenom \classe ce qui permet l’individualisation du sujet.

Attention : j’ai rencontré des difficultés quand j’ai tenté de modifier certains noms contenant un espace en plaçant un caractère spécial comme un _ . Dans ma configuration cela provoque une erreur en LaTeX alors que l’espace fonctionne !

La commande \sujet est donc le modèle du QCM. On trouve mon entête avec mes fleurs en magenta et le titre du QCM (titre que j’ai défini en haut du fichier source avec la date pour me simplifier la vie). Je crée ensuite le \champnom pour placer le nom, prénom et classe de chaque élève à partir du fichier csv.

On remarque au début de la macro \sujet la commande \AMCassociation{\id}. Cette commande permet l’identification automatique des élèves dans AMC au moment de la correction (voir plus bas). J’utilise aussi la commande \onecopy{1} pour produire le QCM. C’est csvsimple qui décide du nombre de copie et pas AMC donc pas de \onecopy{20} dans mon cas.

Les commandes \restituegroupe{N1} \restituegroupe{N2} \restituegroupe{N3} permettent ensuite de mélanger les questions et les réponses tout en préservant chaque groupe. En clair, les questions de niveau 1 sont mélangées puis apparaissent les questions de niveau 2, etc.. Aucun élève ne commencera sont QCM par des questions de niveau 3 !

Pour conclure la fiche, j’ajoute un QRCODE avec l’extension qrcode. Ce QRCODE mène à la correction individuelle pour chaque élève. Le nom du fichier pdf dépend de l’élève et du nom unique du sujet. Le QCM distribuée aux élèves contient à l’avance le lien vers le futur fichier contenant leur copie corrigée et la correction détaillée. Je prépare seulement le lien unique en LaTeX et un fichier du même nom dans AMC (voir plus bas).

Ouf ! Le plus dur est fait. Ce modèle de QCM me servira dorénavant dans la plupart de mes prochains projets. Je n’aurai plus qu’à modifier le contenu des questions sans me soucier de la forme.

Reste à valider le sujet dans AMC. Dans l’onglet Préparation, en laissant le nombre d’exemplaires à 0 (c’est csvsimple qui commande) il faut Mettre à jour les documents.

On peut observer le Sujet obtenu et les Documents : 

Il faut ensuite Imprimer les copies (même si je ne me sers pas des copies imprimés dans mon cas personnel). Dans mon cas j’ai choisi un impression dans un fichier dans les paramètres et j’ai crée un dossier pour placer ces copies…. inutiles pour moi.

En ce qui me concerne, à l’issue de cette étape c’est le fichier DOC-sujet.pdf qui se trouve à la racine du projet dont je vais me servir pour imprimer les copies pour les élèves.

Il est temps de passer à l’étape suivante.

Etape n° 2 : passation du QCM

J’imprime le fichier DOC-sujet.pdf à la racine du projet, il contient les copies des élèves dans l’ordre alphabétique. Je distribue les copies pré-remplies avec les identifiants des élèves. Et c’est à eux de travailler.

Il faut demander aux élèves de noircir les cases au crayon de papier ou au stylo noir. En cas d’erreur il faut gommer ou faire disparaître la case complètement. Il ne faut pas tenter de reproduire une case vide sur un espace blanc car la moindre erreur dans ce tracé fera penser à AMC que la case est cochée. Il vaut mieux gommer ou la faire disparaître totalement !

Je peux ramasser les copies dans l’ordre aléatoire habituel.

Un petit tour en salle des profs pour scanner toutes les copies que je pose négligemment dans le chargeur de la photocopieuse. J’obtiens en quelques secondes un fichier pdf avec mes copies scannées dans le désordre.

Etape n° 3 : correction du QCM

On passe dans l’onglet Saisie d’AMC.  On choisit le mode Automatique pour importer le fichier pdf contenant les copies des élèves.

Le mode Manuelle permet de compléter à la main les copies pour lesquelles il y aurait des difficultés ( ratures, mauvais scan…).

L’onglet suivant, Notation va nous permettre de corriger les copies et de produire les copies corrigées.

On clique sur Corriger avec la case Mettre à jour le barème cochée.

Etape n° 4 : identification des étudiants

Le paramétrage dans le fichier source permet l’identification automatique des candidats. (\AMCassociation{\id}). id est une des colonnes du fichier csv. Il s’agit d’un identifiant unique pour chaque élève, on peut lui donner le nom de son choix.

Dans AMC il faut sélectionner id dans Identifiant unique dans cette liste puis choisir Pré-association dans Titre du code pour association automatique.

Reste à cliquer sur Automatique dans Association entre copies et étudiants. Chez moi, AMC associe parfaitement bien tous les élèves… sauf le premier de la liste (est-ce un bug d’AMC, un bug de ma part ?? ). En utilisant le mode Manuelle il est très simple de finir d’associer cette dernière copie ou toutes celles qui ne correspondent pas.

On peut enfin passer aux résultats.

Etape n° 5 : obtention des notes et des copies corrigées

Dans Export des notes on peut obtenir les notes au format Libreoffice, Pdf ou csv pour importation dans Pronote.

Je récupère ensuite les copies corrigées en choisissant un Fichier par étudiant avec Sujet corrigé. J’ai choisi un modèle de nom de fichier qui correspond au lien QRCODE que j’ai crée dans mon fichier LaTeX. Pour mémoire dans le fichier source j’ai :

\newcommand{\fichier}{https://pi.ac3j.fr/wp-content/uploads/QCM/\Identifiant-\classe-\nom-\prenom.pdf}

\hfill \qrcode[height=1.5cm]{\fichier}

\Identifiant est une variable qui code le nom de mon projet dans le fichier source, dans ce cas il s’agit de 4RELADD ( Quatrième Relatif Addition).

Dans AMC mon modèle est 4RELADD-(classe)-(nom)-(prenom).

Je n’ai pas trouvé de variable dans AMC pour désigner le nom du projet 4RELADD. Par contre (classe), (nom) et (prenom) sont les champs de mon fichier csv.

J’obtiens ainsi dans le dossier de mon projet ./cr/corrections/pdf/ les fichiers individuels des copies corrigées.

Si les élèves ont une adresse mail, je peux l’ajouter dans mon fichier csv. Dans les paramètres, il suffit de configurer le mail en SMTP avec le nom d’utilisateur et le mot de passe. Les élèves recevront alors directement leur copie corrigée et notée.

Etape n° 6 : ajout du corrigé et mise en ligne

Cette dernière étape est facultative.

Je souhaite que les élèves accèdent à leurs copies corrigées directement en ligne (économie de papier) et que le corrigé individuel avec mes commentaires soit aussi disponible dans ce fichier.

AMC semble proposer de faire cela mais en cherchant un peu, il me semble que cela n’est pas possible que dans le mode Ensemble, mode qui oblige à séparer le sujet de la page contenant la feuille réponse.

Pour répondre à ce besoin j’ai donc été obligé de créer un petit script dont le boulot consiste à découper le fichier DOC-corrige.pdf qui contient les corrections individualisées avec les commentaires, puis à ajouter ce corrigé à chacune des copies corrigés des élèves.

Ce script se contente de découper le fichier DOC-corrige.pdf avec pdftk. Je repère le nombre de page du corrigé (qui dépend de mes commentaires) et je crée un fichier par élèves. Ensuite avec le même outil je concatène le fichier contenant le corrigé et la copie de l’élève en préservant le nom du fichier.

Enfin pour préserver la sécurité des fichiers, je protège chaque document par un mot de passe (la date de naissance des élèves au format 8 chiffres). C’est encore pdftk qui permet cela ! Les mots de passe sont stockés dans le fichier csv qui contient la liste des élèves, ainsi certains d’entre eux ont pu modifier ce mot de passe pour leurs futures copie. 

 J’envoie ensuite tout cela sur un espace dédié qui correspond au QRCODE sur la copie de l’élève. Il s’agit d’un dossier FTP sur l’espace fourni par IONOS l’hébergeur de ce blog. J’ai modifié le .htaccess pour permettre au navigateur d’avoir la liste des fichiers. Nos ENT dans l’Éducation Nationale empêche pour la plupart l’envoi massif de fichier et fixe des quotas trop bas pour les enseignants. Je suis donc obligé de passer par cet espace personnel (que je finance) pour proposer ce service à mes élèves. L’envoi des fichiers en SFTP est très rapide et peut même être automatisé !

Les élèves n’ont plus qu’à scanner le QRCode de leur copie pour obtenir leurs copies corrigées ! Ils peuvent aussi se rendre sur l’espace FTP pour consulter leurs copies tout au long de l’année.

Ce script est disponible en bas de cette page.

Supplément : créer un QCM avec des questions aléatoires

AMC permet déjà de mélanger les questions et les réponses ce qui est très efficace pour éviter les petits coup d’œil à droite et à gauche pendant les évaluations.

On peut aller encore plus loin en programmant des questions où les valeurs numériques sont aléatoires. On utilise pour cela l’extension fp. La documentation d’AMC contient quelques paragraphes à ce sujet. Voici un exemple personnel qui utilise cette fonctionnalité.

Bientôt !

Conclusion

Voilà un bel outil, très adaptable à la pratique de chacun. En ce qui me concerne, pour parler un peu pédagogie et laisser la technique de côté, j’aime à proposer à mes élèves une question du jour quand ils arrivent en classe. C’est un bon moyen de gérer les aspects administratifs de notre métier (appel, vérification de carnet, ramassage de papiers… ) tout en ayant une classe en pleine activité mathématique.

Ces QCM prendront leur place à cet endroit. J’ai souvent utilisé des outils comme Plickers et surtout QCMCam qui permettent de proposer des QCM interactifs avec correction immédiate grâce aux votes par QRCode (voir cet article sur le blog). Je trouve paradoxalement ces outils chronophages en comparaison de la bonne vieille fiche papier. Il y a une côté ludique qui est agréable au départ mais qui finalement fait perdre du temps. Sans parler de la perte de la fiche QRCODE pour voter…

Ce genre d’évaluation par QCM va me permettre d’effectuer plus régulièrement des vérifications de l’acquisition des gestes techniques indispensables. En supprimant la pression de la note, ces évaluations peuvent aussi avoir un caractère diagnostique. Je vais surtout m’en servir en cours d’acquisition pour obliger mon public parfois un peu indolent à rester actif dans ces apprentissages.

Quelques évaluations au format LaTeX

Annexes : source.tex et Script.py

source.tex :

%{{{ Informations légales
% --- Auteur : Fabrice ARNAUD
% --- Web : pi.ac3j.fr
% --- Mail : contact@ac3j.fr
% --- Nom fichier : source.tex 
% --- Dernière modification : vendredi 30 juillet 2021 à 10:02:36
%
%Licence CC-BY-SA 4.0
%
% Ce document est placé sous licence CC-BY-SA 4.0 qui impose certaines conditions de ré-utilisation.
% Vous êtes autorisé :
% - PARTAGER : copier, distribuer le matériel par tous moyens et sous tous formats ;
% - ADAPTER : remixer, transformer et créer à partir du matériel pour toute utilisation, y compris commerciale.
% Selon les conditions suivantes :
% - ATTRIBUTION : vous devez créditer le matériel, indiquer un lien vers la licence et indiquer si des modifications ont été effectuées. Vous devez indiquer ces informations par tous moyens raisonnables, sans toutefois suggérer que l'auteur vous soutient.
% - PARTAGE DANS LES MÊMES CONDITIONS : Dans le cas où vous effectuez un remix, que vous transformez, ou créez à partir du matériel composant l'Oeuvre originale, vous devez diffuser l'Oeuvre modifiée dans les même conditions, c'est à dire avec la même licence avec laquelle l'Oeuvre originale a été diffusée.
% - PAS DE RESTRICTIONS SUPPLÉMENTAIRES : Vous n'êtes pas autorisé à appliquer des conditions légales ou des mesures techniques qui restreindraient légalement autrui à utiliser l'Oeuvre dans les conditions décrites par la licence.
%
% Consulter : https://creativecommons.org/licenses/by-sa/4.0/deed.fr
%
%}}}
\documentclass[a4paper]{article}

\newcommand{\Identifiant}{4RELADD} % Identifiant unique du fichier
\newcommand{\Theme}{Nombres relatifs --- Somme} % Thème du QCM
\newcommand{\Date}{Lundi 2 septembre 2021} % Date prévisible du QCM
\newcommand{\Liste}{401.csv} % Liste d'élèves concernés

%{{{ Entêtes

\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{fp}
\usepackage{ifthen}
\usepackage{fourier}
\usepackage{qrcode}

\usepackage[francais,bloc]{automultiplechoice}

\geometry{ verbose, a4paper, % a4
tmargin=1cm, % Marge haute
bmargin=1cm, % Marge basse
lmargin=1.5cm, % Marge gauche
rmargin=1.5cm, % Marge droite
headheight=17pt, % Entête
headsep=0.5cm, % Séparateur entête
footskip=1cm, % Pied de page
marginparwidth=0pt, % Taille de la marge
includehead,
includefoot,
heightrounded 
}

\setlength\parindent{0pt}% Halte à l'indentation

%%% Présentation des questions

\AMCinterIrep=0pt
\AMCinterBrep=0.5ex
\AMCinterIquest=0pt
\AMCinterBquest=6ex % écart vertical entre les questions
\AMCpostOquest=7mm
\setlength{\AMChorizAnswerSep}{3em plus 4em}
\setlength{\AMChorizBoxSep}{1em}

\AMCrandomseed{1527384} %%% Générateur aléatoire

\AMCtext{explain}{\color{red} \bf}

\def\AMCbeginQuestion#1#2{\par\noindent{\textsc{\textbf{\color{violet} \lefthand~Question #1} #2~:~~}} }

%}}}
%{{{ Les questions

\setdefaultgroupmode{withoutreplacement}

\element{N1}{
\begin{question}{Q01}
Calculer \((-5)+(-3)+(+9)\)
\begin{reponseshoriz}
\bonne{\((+1)\)}
\mauvaise{\((-1)\)}
\mauvaise{\((-2)\)}
\mauvaise{\((+2)\)}
\mauvaise{\(0\)}
\mauvaise{\((+3)\)}
\end{reponseshoriz}
\explain{La bonne stratégie consiste à ajouter d'abord ensemble les nombres positifs puis les nombres négatifs. On termine alors par la somme des deux termes restants.}
\end{question}
}

\element{N1}{
\begin{question}{Q02}
Calculer \((-7)+(+11)+(-3)\)
\begin{reponseshoriz}
\bonne{\((+1)\)}
\mauvaise{\((-1)\)}
\mauvaise{\(0\)}
\mauvaise{\((-2)\)}
\mauvaise{\((+3)\)}
\mauvaise{\((+2)\)}
\end{reponseshoriz}
\end{question}
}

\element{N1}{
\begin{question}{Q03}
Calculer \((-11)+(-3)+(+3)+(+7)\)
\begin{reponseshoriz}
\bonne{\((-4\)}
\mauvaise{\((+4)\)}
\mauvaise{\((-3)\)}
\mauvaise{\((+3)\)}
\mauvaise{\((+2)\)}
\mauvaise{\((-2)\)}
\end{reponseshoriz}
\explain{Il fallait remarquer la présence de deux nombres opposés \((-3)\) et \((+3)\) !}
\end{question}
}

\element{N1}{
\begin{question}{Q04}
Calculer \((+13)+(-7)+(-3)\)
\begin{reponseshoriz}
\bonne{\((+3\)}
\mauvaise{\((-3)\)}
\mauvaise{\(0\)}
\mauvaise{\((+2)\)}
\mauvaise{\((-2)\)}
\mauvaise{\((-1)\)}
\end{reponseshoriz}
\end{question}
}

\element{N2}{
\begin{question}{Q05}
Calculer \((-5)+(-3)+(+7)+(-3)+(+11)\)
\begin{reponseshoriz}
\bonne{\((+7)\)}
\mauvaise{\((-7)\)}
\mauvaise{\((+6)\)}
\mauvaise{\((-6)\)}
\mauvaise{\((-5)\)}
\mauvaise{\((+5)\)}
\end{reponseshoriz}
\explain{En ajoutant \((-5)\), \((-3)\) et \((-3)\) on arrive à \((-11)\). La présence de \((+11)\) permet de conclure rapidement.}
\end{question}
}

\element{N2}{
\begin{question}{Q06}
Calculer \((+3)+(-7)+(+8)+(-5)\)
\begin{reponseshoriz}
\bonne{\((-1)\)}
\mauvaise{\((+1)\)}
\mauvaise{\((-2)\)}
\mauvaise{\((-3)\)}
\mauvaise{\((+3)\)}
\mauvaise{\((+23)\)}
\end{reponseshoriz}
\end{question}
}

\element{N2}{
\begin{question}{Q07}
Calculer \((-4)+(+8)+(-11)+(-7)+(+3)\)
\begin{reponseshoriz}
\bonne{\((-11)\)}
\mauvaise{\((+11)\)}
\mauvaise{\((-12)\)}
\mauvaise{\((-13)\)}
\mauvaise{\((+13)\)}
\mauvaise{\((-9)\)}
\end{reponseshoriz}
\end{question}
}

\element{N3}{
\begin{question}{Q08}
Calculer \((-7)+(-8)+(+15)+(+7)+(-15)\)
\begin{reponseshoriz}
\bonne{\((-8)\)}
\mauvaise{\((+8)\)}
\mauvaise{\((-7)\)}
\mauvaise{\((+7)\)}
\mauvaise{\((+15)\)}
\mauvaise{\((-15)\)}
\end{reponseshoriz}
\end{question}
}

\element{N3}{
\begin{question}{Q09}
Calculer \((+3,76)+(-7,4)+(+8,112)+(-3,76)+(-8,112)\)
\begin{reponseshoriz}
\bonne{\((-7,4)\)}
\mauvaise{\((+3,76)\)}
\mauvaise{\((-8,112)\)}
\mauvaise{\((-11,789)\)}
\mauvaise{\((+3,567)\)}
\mauvaise{\(0\)}
\end{reponseshoriz}
\explain{Il fallait remarquer la présence d'opposés pour simplifier le calcul !}
\end{question}
}

\element{N3}{
\begin{question}{Q10}
Calculer \((-1,1)+(-3,1)+(+2,6)+(-1,3)\)
\begin{reponseshoriz}
\bonne{\((-2,9)\)}
\mauvaise{\((+2,9)\)}
\mauvaise{\((-1,2)\)}
\mauvaise{\((+1,2)\)}
\mauvaise{\((+2,6)\)}
\mauvaise{\(0\)}
\end{reponseshoriz}
\explain{Pour effectuer ce genre de calcul, on peut passer des unités aux dixièmes. On peut plus facilement effectuer \((-11)+(-31)+(+26)+(-13)\).}
\end{question}
}
%}}} Fin des questions
%{{{ Le sujet

\newcommand{\sujet} % Création d'une macro sujet pour usage avec liste.csv
{

\AMCassociation{\id}

\onecopy{1}{


%%% debut de l'en-tête des copies :

\centerline{{\color{magenta} \Huge \floweroneleft} \hspace{1cm} \Large {\color{violet} \textsc{QCM} --- \Theme} \hspace{1cm} {\color{magenta} \Huge \floweroneright}}

\champnom{
\begin{minipage}{\linewidth}

\vspace{0.5cm}

\textsc{\textbf{\color{blue} Nom :} \nom \hfill \textbf{\color{blue} Prénom :} \prenom \hfill \textbf{\color{blue} Classe :} \classe \hfill \textbf{\color{blue} Date :} \Date}

\end{minipage}
}

\bigskip

\textit{Pour chacune des questions, une seule réponse est possible. Vous devez noircir la case qui correspond à la bonne réponse.}

\bigskip

%%% fin de l'en-tête

\restituegroupe{N1}

\restituegroupe{N2}

\restituegroupe{N3}

\newcommand{\fichier}{https://pi.ac3j.fr/wp-content/uploads/QCM/\Identifiant-\classe-\nom-\prenom.pdf}

\hfill \qrcode[height=1.5cm]{\fichier}

} % fin exemplaire
} % }}} fin sujet

\begin{document}

\csvreader[head to column names]{../../\Liste}{}{\sujet}

\end{document}

</blockquote id= »sh »>
Mon script bricolé pour ajouter la correction aux copies individuelles : 

#!/usr/bin/python3
#
# Fabrice ARNAUD
#
# Mise à jour du 25 septembre 2021
#
# Objectifs :
# - création des fichiers individuels copies et correction
# - sécurisation par mot de passe de chaque fichier
#
#
# Un argument en entrée :
# - le dossier contenant le QCM genre ./Quatrieme/RELATIF_ADDITION
#
# Le script commence par récupérer le code court de cette évaluation genre 4-RELADD puis le numéro de la classe concernée 403 pour 403.csv
# Pour faire cela il consulte le fichier source.tex où j'ai défini deux macros qui contiennent ces informations.
# Pour me simplifier la vie, j'ai crée un fichier 300.csv qui concatène les listes d'élèves de mes deux troisièmes afin de n'utiliser qu'un dossier pour AMC.
# J'ai ajouté dans mes listes d'élèves quelques élèves fictifs en fin de liste en cas de nouvel élève non prévu et pour montrer la correction sans gêner qui que ce soit.


import re                   # Le module pour la gestion des expressions régulières
import os                   # Pour parler au système, copier, créer, supprimer des dossiers et fichiers
import sys
import shutil
import time
import zipfile

from os import listdir

from datetime import datetime
import locale

locale.setlocale(locale.LC_TIME,'')

dossier = sys.argv[1]           # Dossier du projet : le seul argument

###### Lecture du prefixe et de la classe  dans le fichier source.tex

source = dossier + "source.tex"

fichier = open(source)
ligne = fichier.readline()

while ligne:
    ligne = fichier.readline()
    try:
        prefixe = re.search(r'Identifiant}{([A-Z0-9]+)}',ligne).group(1)
    except AttributeError:
        pass
    try:
        classe  = re.search(r'Liste}{([0-9]+).csv}',ligne).group(1)
    except AttributeError:
        pass
fichier.close()

print("********** Préparation des copies pour la classe de " + classe + " pour l'évaluation dont le code est " + prefixe)

###### Lecture du fichier contenant les noms et mot de passe des élèves

fichier_classe="./" + classe + ".csv"  # Le fichier 403.csv qui se trouve au même niveau que Script.csv

mot_de_passe = []

fichier = open(fichier_classe,"r")
ligne = fichier.readline()

while ligne:                            # Les mots de passe des élèves sont stockés dans le tableau mot_de_passe
    ligne = fichier.readline()
    code = ligne[-9:]
    code = code[:8]
    mot_de_passe.append(code)

fichier.close()

del mot_de_passe[-1]

nb_eleve = len(mot_de_passe)

print("********** Lecture de la liste des élèves de " + classe)

##########

os.system("mkdir ./temp/")

dossier_copie = dossier + "cr/corrections/pdf/"

commande = "rm -rf " +  dossier_copie + "*"

os.system(commande)

print ("********** Correction et annotation des copies")

commande = "auto-multiple-choice annotate --project " + dossier + " --names-file ./" + classe + ".csv --filename-model '(NOM)_(PRENOM)_(CLASSE)_" + prefixe +"' 2>/dev/null"

os.system(commande)

liste_fichier = []
for fichier in listdir(dossier_copie):
    liste_fichier.append(fichier)

liste_fichier.sort()

i = 0          
for fichier in liste_fichier:    
    i += 1 
#    commande ="gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH  -dQUIET -sOutputFile=./temp/" + str(i) + ".pdf " + dossier_copie + fichier
##### Je ne compresse plus les fichiers
    commande = "cp -f "+ dossier_copie + fichier + " ./temp/" + str(i) + ".pdf"
    os.system(commande)   

commande = "cp -rf " + dossier + "DOC-corrige.pdf ./temp/"
os.system(commande)

os.chdir("./temp/")

###### Nombre de page de la correction

os.system("rm -f ./temp_page")

os.system("exiftool -T ./DOC-corrige.pdf -s3 -PageCount >> ./temp_page")

fichier = open("./temp_page","r")
nb_pagec = int(fichier.readline())
fichier.close()

nb_page = nb_pagec // nb_eleve

########""

page = nb_eleve * nb_page + 1
k = 1

print("********** Concaténation des copies avec la correction.")

for i in range(1,page,nb_page):
    if nb_page == 1:
        commande = "pdftk DOC-corrige.pdf cat " + str(i) + " output C" + str(k) + ".pdf"
    else:
        j = i + nb_page - 1
        commande = "pdftk DOC-corrige.pdf cat " + str(i) + "-" + str(j) + " output C" + str(k) + ".pdf"
    
    os.system(commande)
    k +=1

k = 0

print ("*********** Création et protection des fichiers personnels des élèves.")

for fichier in liste_fichier:    
    print("            -> Protection du fichier : " + fichier + "avec le mot de passe : " + mot_de_passe[k])
    commande = "pdftk " + str(k+1) + ".pdf " + "C" + str(k+1) + ".pdf output " + fichier + " user_pw " + mot_de_passe[k] + "2>/dev/null"
    os.system(commande)
    
    k +=1


os.chdir("..")

for fichier in liste_fichier:
    commande = "mv -f ./temp/" + fichier + " ./QCM_Cloud/" + fichier 
    os.system(commande) 

os.system("rm -rf ./temp/")

Le blog de Fabrice ARNAUD — Licence CC BY-NC-SA 4.0


12 réponses à “AMC : correction automatique de QCM”

  1. Avatar de sylvain
    sylvain

    Je m’étais intéressé comme toi à AMC cet été et ce qui m’a retenu pour le moment, c’est l’étape n°5 de ton article (ou n°7 dans la liste des étapes plus haut) à savoir la restitution des copies corrigées. En effet, nous avons un ENT qui ne connait pas le publi-postage 🙁
    Tu parles d’un espace dédié où les élèves peuvent récupérer leur copie corrigée via un QRcode. Puis-je savoir de quel espace dédié tu parles là ?
    Merci pour ta réponse et ton travail de manière générale, très inspirant.
    Sylvain

    1. Avatar de Fabrice ARNAUD

      J’ai simplement placé mes copies sur le serveur FTP de mon hébergeur Ionos. J’ai modifié le htaccess pour autoriser le listing des fichiers par un navigateur.
      Tous les PDF sont dans un dossier et je mets le lien dans l’ENT. Pour assurer la confidentialité chaque PDF passe par pdftk où j’ajoute un mot de passe (par défaut la date de naissance à 8 chiffres).
      Toute cette usine à gaz est préparé par un script Python qui me simplifie bien la vie…

    2. Avatar de Fabrice ARNAUD

      PS : je vais bientôt mettre à jour cet article en y plaçant mon nouveau script python ainsi que les modèles des QCM que je propose en quatrième et troisième…. Ça marche trop bien !!!!

      1. Avatar de chhefproduit
        chhefproduit

        bonjour, j ai utilise votre fichier source comme modèle mais quand je fais la compilation le format pdf ne s affiche pas 🙁

  2. Avatar de sylv
    sylv

    Bonjour,
    Je n’ai pas encore testé AMC, mais rien que de vous lire, j’avais envie de vous dire merci du partage !
    Belle soirée.

  3. Avatar de Philippe
    Philippe

    Merci beaucoup, je crois que je vais passer le temps nécessaire à mettre tout cela en oeuvre

  4. Avatar de Aurelia Deshayes
    Aurelia Deshayes

    Bonjour,
    Merci pour la qualité de la présentation. J’utilise AMC depuis longtemps et c’est un outil fantastique. Pour la première fois j’ai un souci que je ne sais pas résoudre, peut être pourriez vous m’aider: le document de corrections individuelles ne correspond pas à mon document de sujets. Donc la correction est totalement erronée. Je ne sais pas à quel niveau je dois agir pour régénérer correctement ce document de corrections individuelles (et les documents qui servent pour la correction automatique en même temps). Merci.

    1. Avatar de Guillaume GM
      Guillaume GM

      Je sais que cela fait longtemps et que soit tu as trouvé soit tu as abandonné. Je vais répondre pour les autres utilisateurs s’ils lient le message. C’est probablement dû au fait que tu as utilisé du random pour générer tes questions. Si tu l’as fait et que n’as pas généré une graine au début de ton programme. AMC va en générer une nouvelle lors de la correction. Il est possible de retrouver la graine d’origine si on l’oubli, mais mieux vaut y penser préalablement.

      En résumé, aléatoire => graine obligatoire

      La documentation est bien expliquée ou sur le wiki du site AMC

  5. Avatar de SylvainF
    SylvainF

    Merci pour cet article très bien écrit ! Cela révolutionne mes corrections pour des promos de 150-300 étudiants… ou plutôt : je vais pouvoir les évaluer plus régulièrement !!

    1. Avatar de Fabrice ARNAUD

      C’est vrai que cet outil est vraiment génial. Merci aux développeurs !

  6. Avatar de Guillaume gm
    Guillaume gm

    Salut, je me demandais par rapport à ton script pour scinder ton pdf en plusieurs fichiers. Est-ce que ça fonctionne bien? Par exemple, si un élève à 100% et l’autre n’a aucune bonne réponse. L’élève qui a 100% n’a aucun commentaire donc aucune page supplémentaire tandis que l’élève qui a 0% ou plusieurs erreur aura besoin de beaucoup plus de place pour les commentaires par exemple 2 pages de plus.
    Cela ne va-t-il pas donner 2 pages pour les 2 élèves au lieu de 1 page et 3 pages?
    Il me semble que cette partie dans ton code est \nbpages/nbeleves

    1. Avatar de Fabrice ARNAUD

      Salut,
      Mon script est un peu ancien. Une piste que j’utilise aujourd’hui pour découper simplement des fichiers pdf produits en LaTeX. J’utilise le package index de Ctan qui permet de créer plusieurs index différents. J’ajoute dans ma macro un \index[autre]{identifiant} en début de qcm et la même chose à la fin. En compilant, LaTeX me produit un fichier adx contenant une ligne par \index, ligne contenant le numéro de page. Il ne reste plus qu’à passer par Python pour récupérer le numéro de début de page et la fin pour construire le script à base de pdftk.

      Espérant être clair

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Merci pour votre visite !