Die Fragegenerierung ist die Aufgabe, Fragen aus einem Textabsatz automatisch zu generieren. Der unkomplizierte Weg für dies ist die Beantwortungsbewusstseinserzeugung. Beantwortet AUSWAHRE FRAGE ERGINERUNG Das Modell wird mit der Antwort und der Passage dargestellt und gebeten, eine Frage zu dieser Antwort zu generieren, indem Sie den Übergangskontext berücksichtigen. Obwohl es viele Papiere für die QG -Aufgabe gibt, ist es immer noch nicht so Mainstream wie QA. Einer der Gründe ist, dass die meisten früheren Papiere komplizierte Modelle/Verarbeitungspipelines verwenden und keine vorgeborenen Modelle zur Verfügung stehen. Nur wenige jüngste Arbeiten, insbesondere Unilm und Prophetnet, haben SOTA-Vorausgebläser für QG, aber die Verwendung scheint ziemlich kompliziert zu sein.
Dieses Projekt wird als Open-Source-Studie zur Fragengenerierung mit vorgebrachten Transformatoren (insbesondere SEQ-2-Seq-Modellen) unter Verwendung von unkomplizierten End-to-End-Methoden ohne viel komplizierte Pipelines angestrebt. Ziel ist es, vereinfachte Datenverarbeitungs- und Schulungsskripte bereitzustellen und Pipelines für Inferenz einfach zu verwenden.
Erste Experimente werden unter Verwendung des SquadV1 -Datensatzes und des T5 -Modells mit unterschiedlichen Eingangsverarbeitungsformaten durchgeführt, wie nachstehend beschrieben.
Für die Antwortmodelle für Antwort kann der Eingabentext auf zwei Arten verarbeitet werden.
1. Format vorbereiten:
Hier wird die Antwort einfach vor dem Kontext hinzugefügt und durch SEP -Token getrennt. Zum Beispiel
42 [SEP] 42 is the answer to life, the universe and everything.
Für das T5 -Modell wird die Eingabe so verarbeitet
answer: 42 context: 42 is the answer to life, the universe and everything.
2. Highlight -Format
Hier wird die Antwortspanne im Text mit speziellen Highlight -Token hervorgehoben.
<hl> 42 <hl> is the answer to life, the universe and everything.
Diese Idee wird in dem Papier "Ein wiederkehrendes Bert-basiertes Modell für die Fragengenerierung" vorgeschlagen. Siehe Abschnitt 4.3
Da die Antwort bewusstes Modelle Antworten für die Erstellung von Fragen benötigen, benötigen wir etwas, das Antwort wie Spannweiten aus dem Text extrahieren kann. Dies kann anhand verschiedener Methoden wie NER, Nomen-Phrase-Ausdruck usw. erfolgen. Hier wird jedoch ein Modell geschult, um Antworten wie Spans zu extrahieren, um zu sehen, wie es funktioniert. Bei T5 erfolgt die Antwortauslöschung mithilfe des Text-zu-Format.
Da das Highlight -Format die Position der extrahierten Antwort kennen muss, wird die Eingabe für die Antwortextraktion wie folgt verarbeitet
<hl> Token.<sep> Token.Zum Beispiel für diesen Text
Python is a programming language. Created by Guido van Rossum and first released in 1991.
Die folgenden Beispiele werden erstellt
Eingabtext: <hl> Python is a programming language. <hl> Created by Guido van Rossum and first released in 1991.
Zieltext: Python <sep>
Und
Eingabtext: Python is a programming language. <hl> Created by Guido van Rossum and first released in 1991 <hl>.
Zieltext: Guido van Rossum <sep> 1991 <sep>
Zum Zeitpunkt der Inferenz wird der Text in Sätze aufgeteilt und jeder Satz wird hervorgehoben.
Für die Beantwortung der Fragen zur Fragen zur Erzeugung benötigen wir normalerweise 3 Modelle, die zuerst die Antwort wie Spans extrahieren. Das zweite Modell wird zu einer Frage zu dieser Antwort generiert.
3 Modelle für einzelne Aufgaben zu haben sind viel Komplexität. Ziel ist es, ein Multi-Task-Modell zu erstellen, das alle diese 3 Aufgaben ausführen kann
Das T5-Modell wird in mehrerer Task-Weise fein abgestimmt unter Verwendung von Aufgabenpräfixen, wie im Papier beschrieben.
In der End-to-End-Fragengenerierung ist das Modell AKSED, um Fragen zu generieren, ohne die Antworten zu geben. In diesem Papier werden diese Ideen ausführlicher erörtert. Hier ist das T5 -Modell geschult, um mehrere Fragen gleichzeitig zu generieren, indem nur der Kontext bereitgestellt wird. Die Fragen werden vom <sep> -Token getrennt. So werden die Beispiele verarbeitet
Eingabtext: Python is a programming language. Created by Guido van Rossum and first released in 1991.
Zieltext: Who created Python ? <sep> When was python released ? <sep>
Alle Schulungsdetails finden Sie in diesem Wandb -Projekt
Ergebnisse im Squad1.0 Dev Set unter Verwendung der obigen Ansätze. Für die Dekodierung wird die Strahlsuche mit num_beams 4 mit maximaler Dekodierungslänge auf 32 verwendet.
Für Multitask-QA-QG-Modelle sind die EM- und F1-Scores als QA-EM und QA-F1 privat.
Das NLG-Eval-Paket wird zur Berechnung der Metriken verwendet.
| Name | Bleu-4 | METEOR | Rouge-l | QA-EM | QA-F1 | QG-Format |
|---|---|---|---|---|---|---|
| T5-Base-QG-HL | 21.3226 | 27.0854 | 43,5962 | - - | - - | Highlight |
| T5-Base-QA-QG-HL | 21.0141 | 26.9113 | 43.2484 | 82.46 | 90.272 | Highlight |
| T5-Small-QA-QG-HL | 18.9872 | 25.2217 | 40.7893 | 76.121 | 84.904 | Highlight |
| T5-Small-QG-HL | 18.5921 | 24.9915 | 40.1886 | - - | - - | Highlight |
| T5-Small-QG-Vorbereitung | 18.2791 | 24.6722 | 39,958 | - - | - - | vorbereiten |
transformers==3.0.0
nltk
nlp==0.2.0 # only if you want to fine-tune.
Nach der Installation nltk tun
python -m nltk.downloader punktVerwenden Sie die Pipeline, die die Pipeline für die Transformatoren für einfache Schlussfolgerungen mimet.
Die Pipeline ist in 3 Aufgaben unterteilt
question-generation : Für einzelne Task-Fragen-Generierungsmodelle.multitask-qa-qg : Für QG-Modelle mit mehreren Aufgaben.e2e-qg : Für die End-to-End-Fragengenerierung. from pipelines import pipeline
nlp = pipeline ( "question-generation" )
nlp ( "42 is the answer to life, the universe and everything." )
= > [{ 'answer' : '42' , 'question' : 'What is the answer to life, the universe and everything?' }]Vorbereitungsformat
nlp = pipeline ( "question-generation" , model = "valhalla/t5-small-qg-prepend" , qg_format = "prepend" )
nlp ( "42 is the answer to life, the universe and everything." )
= > [{ 'answer' : '42 ' , 'question' : 'What is the answer to life, the universe, and everything?' }] nlp = pipeline ( "multitask-qa-qg" )
# to generate questions simply pass the text
nlp ( "42 is the answer to life, the universe and everything." )
= > [{ 'answer' : '42' , 'question' : 'What is the answer to life, the universe and everything?' }]
# for qa pass a dict with "question" and "context"
nlp ({
"question" : "What is 42 ?" ,
"context" : "42 is the answer to life, the universe and everything."
})
= > 'the answer to life, the universe and everything' nlp = pipeline ( "e2e-qg" )
nlp ( "Python is a programming language. Created by Guido van Rossum and first released in 1991." )
= > [
'What is a programming language?' ,
'Who created Python?' ,
'When was Python first released?'
] Standardmäßig verwenden beide Pipelines die T5-Small* -Modelle, um die anderen Modelle zu verwenden, um den Pfad über model zu übergeben.
Standardmäßig wird die question-generation -Pipeline das Valhalla/T5-Small-QG-HL-Modell mit highlight QG-Format herunterladen. Wenn Sie das Vorbereitungsformat verwenden möchten, geben Sie den Pfad zum Prepend -Modell an und setzen Sie qg_format auf "prepend" . Zum Extrahieren von Antwort wie Spannweiten, die Valhalla/T5-Small-QA-QG-HL-Modell verwendet, können Sie ein anderes Modell über den Parameter ans_model bereitstellen.
Das multitask-qa-qg Modell gilt für Multitask-Modelle, die wie Spannweiten, Do QG und QA extrahieren können, sodass ein separates ans_model erforderlich ist. Standardmäßig wird Valhalla/T5-Small-QA-QG-HL-Modell mit highlight Format verwendet. Wenn Sie das Vorbereitungsformat verwenden möchten, geben Sie den Pfad zum Prepend -Modell an und setzen Sie qg_format auf "prepend"
Die e2e-qg Pipeline ist für die End-to-End-Fragengenerierung gedacht. Diese Modelle können ohne Antwortaufsicht mehrere Fragen gleichzeitig generieren. Standardmäßig verwendet es Valhalla/T5-Small-E2E-QG
Um verschiedene Datenformate zu unterstützen, erwartet der Trainer einen vorverarbeiteten zwischengesperrten Datensatz, sodass Sie die Daten so verarbeiten können, wie Sie es möchten. Der zwischengespeicherte Datensatz sollte mit torch.save gespeichert werden und ein dict mit source_ids , target_ids und attention_mask Tasten von __getitem__ zurückgeben.
source_ids : Codierter Quelltexttarget_ids : codierter Zieltextattention_mask : Aufmerksamkeitsmaske für die source_ids Der T2TDataCollator kümmert sich um die Vorbereitung der richtigen input_ids und labels . Außerdem werden die Chargen dynamisch geprägt, um übermäßige Polstertoken zu entfernen, um das Training zu beschleunigen.
Das Datensatz von data/squad_multitask enthält den modifizierten Squad-Datensatz für die Beantwortung der Fragen zur Erzeugung (sowohl mit Prepend- als auch Highlight-Formaten), Fragenbeantwortung (Text-to-Text), Antwortextraktion und End-to-End-Fragengenerierung. Dieser Datensatz kann mit dem Awesome geladen werden? nlp -Bibliothek, dies erleichtert die Verarbeitung sehr.
Um den Datensatz zu verarbeiten und zu zwischenstrahlen, verwenden Sie das Skript prepare_data.py . Es lädt den richtigen Tokenizer abhängig vom Argument model_type . Es fügt dem Tokenizer zwei neue Token <sep> und <hl> hinzu und speichert es unter {model_type}_qg_tokenizer Pfad. Sie sollten diesen Tokenizer an das Feinabstimmungsskript übergeben.
Die Datensätze werden im data/ Verzeichnis gespeichert. Sie sollten Dateinamen mit den Argumenten für train_file_name und valid_file_name angeben.
Verarbeiten Sie Daten für die Erzeugung der einzelnen Aufgabenfragen mit highlight_qg_format
python prepare_data.py
--task qg
--model_type t5
--dataset_path data/squad_multitask/
--qg_format highlight_qg_format
--max_source_length 512
--max_target_length 32
--train_file_name train_data_qg_hl_t5.pt
--valid_file_name valid_data_qg_hl_t5.pt Prozessdaten für Multi-Task-QA-QG mit highlight_qg_format
valid_for_qg_only Argument wird verwendet, um zu entscheiden, ob der Validierungssatz nur Daten für die QG -Aufgabe enthalten sollte. Für meine Multi-Task-Experimente habe ich Validierungsdaten mit nur QG-Aufgabe verwendet, damit die Bewertungsverlustkurve im Vergleich zu anderen Einzelaufgabenmodellen leicht verglichen werden kann
python prepare_data.py
--task multi
--valid_for_qg_only
--model_type t5
--dataset_path data/squad_multitask/
--qg_format highlight_qg_format
--max_source_length 512
--max_target_length 32
--train_file_name train_data_qa_qg_hl_t5.pt
--valid_file_name valid_data_qg_hl_t5.pt Verarbeiten Sie den Datensatz für die End-to-End-Fragengenerierung
python prepare_data.py
--task e2e_qg
--valid_for_qg_only
--model_type t5
--dataset_path data/squad_multitask/
--qg_format highlight_qg_format
--max_source_length 512
--max_target_length 32
--train_file_name train_data_e2e_qg_t5.pt
--valid_file_name valid_data_e2e_qg_t5.pt Verwenden Sie das Skript run_qg.py , um das Training zu starten. Es verwendet Transformers Trainer Class zum Training der Modelle.
python run_qg.py
--model_name_or_path t5-small
--model_type t5
--tokenizer_name_or_path t5_qg_tokenizer
--output_dir t5-small-qg-hl
--train_file_path data/train_data_qg_hl_t5.pt
--valid_file_path data/valid_data_qg_hl_t5.pt
--per_device_train_batch_size 32
--per_device_eval_batch_size 32
--gradient_accumulation_steps 8
--learning_rate 1e-4
--num_train_epochs 10
--seed 42
--do_train
--do_eval
--evaluate_during_training
--logging_steps 100oder wenn Sie es dann aus Skript oder Notebook trainieren möchten
from run_qg import run_qg
args_dict = {
"model_name_or_path" : "t5-small" ,
"model_type" : "t5" ,
"tokenizer_name_or_path" : "t5_qg_tokenizer" ,
"output_dir" : "t5-small-qg-hl" ,
"train_file_path" : "data/train_data_qg_hl_t5.pt" ,
"valid_file_path" : "data/valid_data_qg_hl_t5.pt" ,
"per_device_train_batch_size" : 32 ,
"per_device_eval_batch_size" : 32 ,
"gradient_accumulation_steps" : 8 ,
"learning_rate" : 1e-4 ,
"num_train_epochs" : 10 ,
"seed" : 42 ,
"do_train" : True ,
"do_eval" : True ,
"evaluate_during_training" : True ,
"logging_steps" : 100
}
# start training
run_qg ( args_dict ) Verwenden Sie das Skript eval.py zur Bewertung des Modells.
python eval.py
--model_name_or_path t5-base-qg-hl
--valid_file_path valid_data_qg_hl_t5.pt
--model_type t5
--num_beams 4
--max_decoding_length 32
--output_path hypothesis_t5-base-qg-hl.txtDadurch speichert die Ausgabe bei {output_path} Datei.
So berechnen Sie die Metriken
nlg-eval --hypothesis=hypothesis_t5-base-qg-hl.txt --references=data/references.txt --no-skipthoughts --no-glove