Le générateur de questions est un système PNL pour générer des questions de style compréhension en lecture de textes tels que des articles de presse ou des extraits de pages de livres. Le système est construit à l'aide de modèles pré-entraînés à partir de transformateurs à câlins. Il existe deux modèles: le générateur de questions lui-même et l'évaluateur QA qui classe et filtre les paires de questions-réponses en fonction de leur acceptabilité.
Les cahiers de formation ont été mis à jour avec des scripts de formation. Pour courir:
python question_generator/training/qg_train.pypython question_generator/training/qa_eval_train.pyLes hyperparamètres peuvent être modifiés à l'aide d'arguments de ligne de commande. Voir les scripts pour la liste des arguments disponibles.
Les ensembles de données ont été téléchargés sur le HuggingFace Hub:
La façon la plus simple de générer des questions est de cloner le repo github, puis d'exécuter qg_run.py comme ceci:
git clone https://github.com/amontgomerie/question_generator
cd question_generator
pip install -r requirements.txt -qq
python run_qg.py --text_file articles/twitter_hack.txt
Cela générera 10 paires de réponses à des questions de style mixte (phrase complète et choix multiple) basées sur l'article spécifié dans --text_file et imprimez-les sur la console. Pour plus d'informations, consultez le cahier QG_Commandline_Example.
La classe QuestionGenerator peut également être instanciée et utilisée comme ceci:
from questiongenerator import QuestionGenerator
qg = QuestionGenerator ()
qg . generate ( text , num_questions = 10 ) Cela générera 10 questions de style mixte et renverra une liste de dictionnaires contenant des paires de questions-réponses. Dans le cas de questions à choix multiples, la réponse contiendra une liste de dictionnaires contenant les réponses et une valeur booléenne indiquant si la réponse est correcte ou non. La sortie peut être facilement imprimée à l'aide de la fonction print_qa() . Pour plus d'informations, consultez le cahier Question_Genation_Example.
Le nombre souhaité de questions peut être passé comme un argument de ligne de commande à l'aide --num_questions ou comme argument lors de l'appel qg.generate(text, num_questions=20 Si le nombre de questions choisi est trop grand, alors le modèle peut ne pas générer suffisamment. Le nombre maximum de questions dépendra de la durée du texte. des questions, comme les rangs de l'évaluateur d'AQ ont généré des questions et renvoient les meilleures.
Le système peut générer des questions avec des réponses à la phrase complète ( 'sentences' ), des questions avec des réponses à choix multiples ( 'multiple_choice' ), ou un mélange des deux ( 'all' ). Cela peut être sélectionné à l'aide des arguments --answer_style ou qg.generate(answer_style=<style>) .
Le modèle de générateur de questions prend un texte en entrée et publie une série de paires de questions et réponses. Les réponses sont des phrases et des phrases extraites du texte d'entrée. Les phrases extraites peuvent être des phrases complètes ou des entités nommées extraites à l'aide de Spacy. Les entités nommées sont utilisées pour des réponses à choix multiples. Les mauvaises réponses seront d'autres entités du même type que l'on trouve dans le texte. Les questions sont générées en concaténant la réponse extraite avec le texte intégral (jusqu'à un maximum de 512 jetons) comme contexte dans le format suivant:
answer_token <extracted answer> context_token <context>
La chaîne concaténée est ensuite codée et introduite dans le modèle de générateur de questions. L'architecture du modèle est t5-base . Le modèle prétrainé a été finetumé en tant que modèle de séquence à la séquence sur un ensemble de données constituait de plusieurs ensembles de données QA bien connus (Squad, Race, Coqa et MSMARCO). Les ensembles de données ont été restructurés en concaténant les champs de réponse et de contexte dans le format mentionné précédemment. La réponse et le contexte concaténés ont ensuite été utilisés comme entrée pour la formation, et le champ de questions est devenu les cibles.
Les ensembles de données peuvent être trouvés ici.
L'évaluateur QA prend une paire de réponses de questions comme entrée et publie une valeur représentant sa prédiction quant à savoir si l'entrée était une paire de questions et réponses valides ou non. Le modèle est bert-base-cased avec une tête de classification de séquence. Le modèle pré-entraîné a été finetumé sur les mêmes données que le modèle de générateur de questions, mais le contexte a été supprimé. La question et la réponse ont été concaténées 50% du temps. Au cours des 50% restants du temps, une opération de corruption a été effectuée (soit en échangeant la réponse par une réponse non liée, soit en copiant une partie de la question dans la réponse). Le modèle a ensuite été formé pour prédire si la séquence d'entrée représentait l'une des paires d'AQ d'origine ou une entrée corrompue.
L'entrée pour l'évaluateur QA suit le format pour BertForSequenceClassification , mais en utilisant la question et la réponse comme les deux séquences. C'est le format suivant:
[CLS] <question> [SEP] <answer [SEP]