Ce projet était initialement destiné à un cours d’IA à l’Université de Sofia. Pendant son exécution, j'ai été contraint par le temps et je n'ai pas pu mettre en œuvre toutes les idées que j'avais, mais j'ai l'intention de continuer à travailler dessus... et j'ai repris le sujet de mon mémoire de maîtrise, en utilisant les transformateurs T5 pour générer des questions. réponses par paires avec des distractions . Découvrez-le dans le référentiel Question-Generation-Transformers.
L'approche d'identification des mots-clés utilisés comme réponses cibles a été acceptée lors de la conférence RANLP2021 - Générer des réponses candidates pour les quiz et les générateurs de questions sensibles aux réponses.
L'idée est de générer des réponses à choix multiples à partir d'un texte, en divisant ce problème complexe en étapes plus simples :
Pour éviter tout conflit avec les packages python d'autres projets, il est conseillé de créer un environnement virtuel dans lequel les packages seront installés. Si vous ne le souhaitez pas, vous pouvez ignorer les commandes suivantes et installer directement le fichier exigences.txt.
Créez un environnement virtuel :
python -m venv venv
Entrez dans l'environnement virtuel :
Fenêtres :
. .venvScriptsactivate
Linux ou MacOS
source .venvScriptsactivate
Installez ipython dans le venv :
ipython kernel install --user --name=.venv
Installez Jupyter Lab à l'intérieur de venv :
pip install jupyterlab
pip install -r .requirements.txt
jupyter lab
Avant de pouvoir faire quoi que ce soit, je voulais mieux comprendre comment les questions sont posées et quel genre de mots correspondent aux réponses.
J'ai utilisé l'ensemble de données SQuAD 1.0 qui contient environ 100 000 questions générées à partir d'articles Wikipédia.
Vous pouvez en savoir plus sur les informations que j'ai trouvées dans le bloc-notes jupyter d'exploration des données .
Mon hypothèse était que les mots du texte seraient d'excellentes réponses aux questions . Tout ce que j'avais à faire était de décider quels mots ou quelles phrases courtes étaient suffisamment bons pour devenir des réponses.
J'ai décidé de faire une classification binaire sur chaque mot du texte. spaCy m'a vraiment aidé avec le marquage des mots.
J'avais pratiquement besoin de créer l'intégralité de l'ensemble de données pour la classification binaire. J'ai extrait chaque mot non-stop des paragraphes de chaque question de l'ensemble de données SQuAD et y ai ajouté quelques fonctionnalités telles que :
Et l'étiquette est Réponse - si le mot extrait du paragraphe est le même et au même endroit que la réponse à la question SQuAD.
Certaines autres fonctionnalités comme le score TF-IDF et la similitude cosinus avec le titre seraient géniales, mais je n'ai pas eu le temps de les ajouter.
En dehors de celles-ci, c'est à notre imagination de créer de nouvelles fonctionnalités - peut-être que ce soit au début, au milieu ou à la fin d'une phrase, des informations sur les mots qui l'entourent et plus encore... Bien qu'avant d'ajouter plus de fonctionnalités, il serait bien d'avoir une métrique pour évaluer si la fonctionnalité sera utile ou non.
J'ai trouvé le problème similaire au filtrage du spam , où une approche courante consiste à marquer chaque mot d'un e-mail comme provenant d'un spam ou non.
J'ai utilisé l'algorithme Gaussian Naive Bayes de scikit-learn pour classer chaque mot s'il s'agit d'une réponse.
Les résultats ont été étonnamment bons : d’un simple coup d’œil, l’algorithme a classé la plupart des mots comme réponses. Ceux qui n’y étaient pas étaient en fait inaptes.
Ce qui est intéressant avec Naive Bayes , c'est que vous obtenez la probabilité pour chaque mot. Dans la démo, je l'ai utilisé pour classer les mots de la réponse la plus probable à la réponse la moins probable.
Une autre hypothèse que j'avais était que la phrase d'une réponse pouvait facilement être transformée en question . Juste en plaçant un espace vide à la position de la réponse dans le texte, j'obtiens une question "cloze" (phrase avec un espace vide pour le mot manquant)
Réponse : Oxygène
Question : _____ est un élément chimique de symbole O et de numéro atomique 8.
J'ai décidé que cela ne valait pas la peine de transformer la question cloze en une phrase plus interrogative, mais j'imagine que cela pourrait être fait avec un réseau neuronal seq2seq , de la même manière que le texte est traduit d'une langue à une autre.
La partie s’est vraiment bien déroulée.
Pour chaque réponse, je génère les mots les plus similaires en utilisant l'intégration de mots et la similarité cosinus .
La plupart des mots sont très bien et pourraient facilement être confondus avec la bonne réponse. Mais il y en a qui ne sont évidemment pas appropriés.
Comme je n'avais pas d'ensemble de données avec des réponses incorrectes, je me suis rabattu sur une approche plus classique.
J'ai supprimé les mots qui n'étaient pas la même partie du discours ou la même entité nommée que la réponse, et j'ai ajouté un peu plus de contexte à la question.
J'aimerais trouver un ensemble de données avec des réponses à choix multiples et voir si je peux créer un modèle ML pour générer de meilleures réponses incorrectes.
Après avoir ajouté un projet de démonstration, les questions générées ne sont pas vraiment adaptées à une utilisation instantanée en classe, mais elles ne sont pas mauvaises non plus.
Ce qui est cool, c'est la simplicité et la modularité de l'approche, où vous pouvez trouver où ça va mal ( disons, c'est la classification des verbes ) et y insérer un correctif.
Avoir un réseau neuronal complexe ( comme le font tous les articles sur ces sujets ) fera probablement mieux, surtout à l'époque où nous vivons. Mais ce que j'ai découvert de formidable à propos de cette approche, c'est qu'elle constitue comme une passerelle permettant à un ingénieur logiciel , avec son esprit d'ingénierie logicielle, d'entrer dans le domaine de l'IA et d'obtenir des résultats significatifs.
Je trouve ce sujet assez intéressant et avec beaucoup de potentiel. Je continuerais probablement à travailler dans ce domaine.
Je me suis même inscrit à un Master en Data Mining et je réaliserai probablement des projets similaires. Je relierai tout ce qui est utile ici.
J'ai déjà consacré un peu plus de temps à terminer le projet, mais j'aimerais le transformer davantage en un tutoriel sur l'entrée dans le domaine de l'IA tout en ayant la possibilité de l'étendre facilement avec de nouvelles fonctionnalités personnalisées.
Mise à jour - 29.12.19 : Le référentiel est devenu très populaire, j'ai donc ajouté un nouveau bloc-notes ( Demo.ipynb ) qui combine tous les modules et génère des questions pour n'importe quel texte. J'ai réorganisé les autres cahiers et documenté le code (un peu mieux).
Mise à jour - 09.03.21 : Ajout d'un fichier exigences.txt avec des instructions pour exécuter un environnement virtuel et correction du bug a avec ValueError : les opérandes ne pouvaient pas être diffusés avec les formes (230, 121) (83, )
J'ai également commencé à travailler sur mon mémoire de maîtrise sur un sujet similaire à la génération de questions.
Mise à jour - 27.10.21 : J'ai téléchargé le code de mon mémoire de maîtrise dans le référentiel Question-Generation-Transformers. Je vous encourage fortement à le vérifier.
De plus, l'approche utilisant un classificateur pour sélectionner les candidats à la réponse a été acceptée comme article d'étudiant lors de la conférence RANLP2021. Papier ici.