توليد الأسئلة هو مهمة إنشاء أسئلة تلقائيًا من فقرة نصية. الطريقة الأكثر فاعلية لهذا الغرض هي الإجابة على إدراك توليد الأسئلة. في الإجابة على إدراك أن توليد الأسئلة ، يتم تقديم النموذج مع الإجابة والمقطع وطلب إنشاء سؤال لهذا الإجابة من خلال النظر في سياق المرور. في حين أن هناك العديد من الأوراق المتاحة لمهمة QG ، إلا أنها لا تزال غير سائدة مثل ضمان الجودة. أحد الأسباب هو أن معظم الأوراق السابقة تستخدم نماذج/أنابيب معالجة معقدة وليس لديها نماذج تدرب مسبقًا. القليل من الأوراق الحديثة ، وخاصة الأونلم والنبي على الأوزان التي تم تدريبها مسبقًا على QG ، لكن الاستخدام يبدو معقدًا للغاية.
ويهدف هذا المشروع كدراسة مفتوحة المصدر على توليد الأسئلة مع المحولات التي تم تدريبها مسبقًا (وتحديداً نماذج SEQ-2-SEQ) باستخدام طرق مباشرة إلى الأمام دون خطوط أنابيب معقدة كثيرًا. الهدف من ذلك هو توفير البرامج النصية المبسطة لتجهيز البيانات وتدريبها وسهلة الاستخدام لخطوط الأنابيب للاستدلال.
يتم إجراء التجارب الأولية باستخدام مجموعة بيانات Squadv1 ونموذج T5 مع تنسيقات معالجة الإدخال المختلفة كما هو موضح أدناه.
للإجابة على النماذج المدركة ، يمكن معالجة نص الإدخال بطريقتين.
1. تنسيق الإعدادية:
هنا يتم إضافة الإجابة ببساطة قبل السياق وفصلها رمز SEP. على سبيل المثال
42 [SEP] 42 is the answer to life, the universe and everything.
بالنسبة لنموذج T5 ، تتم معالجة الإدخال مثل هذا
answer: 42 context: 42 is the answer to life, the universe and everything.
2. تسليط الضوء على التنسيق
هنا يتم تمييز فترة الإجابة داخل النص مع الرموز المميزة الخاصة.
<hl> 42 <hl> is the answer to life, the universe and everything.
تم اقتراح هذه الفكرة في ورقة "نموذج متكرر يستند إلى Bert لتوليد الأسئلة". انظر القسم 4.3
نظرًا لأن الإجابة تحتاج النماذج المدركة إلى إجابات لإنشاء سؤال ، نحتاج إلى شيء يمكنه استخراج الإجابة مثل الامتدادات من النص. يمكن القيام بذلك باستخدام طرق مختلفة مثل NER ، والتمديد النسيج الاسم. مع T5 ، يتم الإجابة على توافق باستخدام النص إلى التنسيق.
نظرًا لأن تنسيق التمييز سيحتاج إلى معرفة موضع الإجابة المستخرجة يمتد إدخال استخراج الإجابة على النحو التالي
<hl> .<sep> الرموز.على سبيل المثال لهذا النص
Python is a programming language. Created by Guido van Rossum and first released in 1991.
سيتم إنشاء أمثلة التالية
نص الإدخال: <hl> Python is a programming language. <hl> Created by Guido van Rossum and first released in 1991.
النص الهدف: Python <sep>
و
نص الإدخال: Python is a programming language. <hl> Created by Guido van Rossum and first released in 1991 <hl>.
النص الهدف: Guido van Rossum <sep> 1991 <sep>
في وقت الاستدلال ، يتم تقسيم النص إلى جمل ويتم تمييز كل جملة.
بالنسبة للإجابة ، فإن توليد الأسئلة المدركين ، عادةً ما نحتاج إلى 3 نماذج ، والتي ستستخرج الإجابة مثل الفترات ، سيقوم النموذج الثاني بإنشاء سؤال حول هذا الإجابة ، والثالث سيكون نموذج ضمان الجودة الذي سيأخذ السؤال وإنتاج إجابة ، ثم يمكننا مقارنة الإجابات لمعرفة ما إذا كان السؤال الذي تم إنشاؤه صحيحًا أم لا.
وجود 3 نماذج لمهمة واحدة هو الكثير من التعقيد ، لذلك الهدف هو إنشاء نموذج متعدد المهام يمكنه القيام بكل هذه المهام الثلاثة
تم ضبط نموذج T5 بطريقة متعددة المهام باستخدام بادئات المهمة كما هو موضح في الورقة.
في توليد أسئلة من طرف إلى طرف ، يتم تمثيل النموذج لإنشاء أسئلة دون تقديم الإجابات. تناقش هذه الورقة هذه الأفكار بمزيد من التفصيل. هنا يتم تدريب نموذج T5 على إنشاء أسئلة متعددة في وقت واحد من خلال توفير السياق فقط. يتم فصل الأسئلة بواسطة الرمز المميز <sep> . إليك كيفية معالجة الأمثلة
نص الإدخال: Python is a programming language. Created by Guido van Rossum and first released in 1991.
النص المستهدف: Who created Python ? <sep> When was python released ? <sep>
يمكن العثور على جميع تفاصيل التدريب في مشروع WANDB هذا
النتائج على Squad1.0 dev set باستخدام النهج أعلاه. لفك تشفير ، يتم استخدام البحث عن شعاع مع num_beams 4 مع Max Decoding Length to 32.
بالنسبة لنماذج QA-QG متعددة المهام ، يتم خصوصية درجات EM و F1 مثل QA-EM و QA-F1.
يتم استخدام الحزمة NLG-Eval لحساب المقاييس.
| اسم | Bleu-4 | نيزك | روج ل | QA-EM | QA-F1 | QG-format |
|---|---|---|---|---|---|---|
| T5-Base-QG-HL | 21.3226 | 27.0854 | 43.5962 | - | - | تسليط الضوء |
| T5-Base-QA-QG-HL | 21.0141 | 26.9113 | 43.2484 | 82.46 | 90.272 | تسليط الضوء |
| T5-Small-QA-QG-HL | 18.9872 | 25.2217 | 40.7893 | 76.121 | 84.904 | تسليط الضوء |
| T5-Small-Qg-HL | 18.5921 | 24.9915 | 40.1886 | - | - | تسليط الضوء |
| T5-Small-Qg-Prepend | 18.2791 | 24.6722 | 39.958 | - | - | مسبقة |
transformers==3.0.0
nltk
nlp==0.2.0 # only if you want to fine-tune.
بعد تثبيت nltk تفعل
python -m nltk.downloader punktاستخدم خط الأنابيب WHCH Mimics؟ محولات خط أنابيب لسهولة الاستدلال.
ينقسم خط الأنابيب إلى 3 مهام
question-generation : لنماذج توليد أسئلة مهمة واحدة.multitask-qa-qg : لنماذج QA متعددة المهام ، QG.e2e-qg : لتوليد أسئلة شامل. 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?' }]تنسيق مسبق
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?'
] بشكل افتراضي ، سيستخدم كل من خطوط الأنابيب نماذج T5-Small* ، لاستخدام النماذج الأخرى تمر المسار من خلال Paramter model .
افتراضيًا ، سيقوم خط أنابيب question-generation بتنزيل نموذج Valhalla/T5-Small-QG-HL مع تنسيق QG highlight . إذا كنت ترغب في استخدام تنسيق prepend ، فوفر المسار إلى نموذج prepend وضبط qg_format على "prepend" . لاستخراج الإجابة مثل الممتدات ، تستخدم نموذج Valhalla/T5-Small-QA-QG-HL ، يمكنك توفير نموذج مختلف من خلال معلمة ans_model .
نموذج multitask-qa-qg مخصص لنماذج المهام المتعددة التي يمكنها استخراج الإجابة مثل الامتدادات ، والقيام QG و QA ، لذلك لن تحتاج إلى منفصلة ans_model . بشكل افتراضي ، يتم استخدام نموذج Valhalla/T5-Small-QA-QG-HL بتنسيق highlight . إذا كنت ترغب في استخدام تنسيق prepend ، فوفر المسار إلى نموذج prepend وضبط qg_format على "prepend"
خط أنابيب e2e-qg مخصص لتوليد الأسئلة الشاملة. يمكن لهذه النماذج إنشاء أسئلة متعددة في وقت واحد دون الإجابة على الإجابة. بشكل افتراضي ، يستخدم Valhalla/T5-Small-E2E-QG
لدعم تنسيقات البيانات المختلفة ، يتوقع المدرب مجموعة بيانات مخزنة مؤقتًا معجزة ، بحيث يمكنك معالجة البيانات بالطريقة التي تريدها. يجب حفظ مجموعة البيانات المخزنة مؤقتًا باستخدام torch.save ويجب أن تُرجع dict مع source_ids ، target_ids ، attention_mask مفاتيح من __getitem__ .
source_ids : نص المصدر المشفرtarget_ids : النص المستهدف المشفرattention_mask : قناع الانتباه لـ source_ids يعتني T2TDataCollator بإعداد input_ids labels اليمنى. كما أنه يزيل الدُفعات ديناميكيًا لإزالة الرموز المفرطة للحشو ، لتسريع التدريب.
تحتوي data/squad_multitask على مجموعة بيانات Squad التي تم تعديلها للإجابة على توليد أسئلة مدرك (باستخدام كل من تنسيقات إعداد وتسليط الضوء) ، والإجابة على الأسئلة (نص إلى نص) ، واستخراج الإجابة وتوليد أسئلة من طرف إلى طرف. يمكن تحميل مجموعة البيانات هذه باستخدام الرهيبة؟ مكتبة nlp ، وهذا يجعل المعالجة سهلة للغاية.
لمعالجة وذاكرة التخزين المؤقت لمجموعة البيانات ، استخدم البرنامج النصي prepare_data.py . سيقوم بتحميل الرمز المميز الصحيح اعتمادًا على وسيطة model_type . يضيف اثنين من الرموبين الجدد <sep> و <hl> إلى الرمز المميز ويحفظه على {model_type}_qg_tokenizer مسار. يجب عليك تمرير هذا الرمز المميز إلى البرنامج النصي.
سيتم حفظ مجموعات البيانات في data/ الدليل. يجب عليك توفير أسماء الملفات باستخدام وسيطات train_file_name و valid_file_name .
معالجة البيانات لتوليد أسئلة مهمة واحدة مع Aightly_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 معالجة بيانات المعالجة لـ QA-QG متعددة المهام مع Aightly_QG_Format
يتم استخدام وسيطة valid_for_qg_only لتحديد ما إذا كان يجب أن تحتوي مجموعة التحقق من الصحة فقط على بيانات لمهمة QG. بالنسبة لتجاربي متعددة المهام ، استخدمت بيانات التحقق من الصحة بمهمة QG فقط بحيث يمكن مقارنة منحنى فقدان التقييم بصرف
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 مجموعة بيانات المعالجة لتوليد الأسئلة من طرف إلى طرف
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 استخدم البرنامج النصي run_qg.py لبدء التدريب. ويستخدم فئة Trainer Transformers لتدريب النماذج.
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 100أو إذا كنت ترغب في تدريبه من البرنامج النصي أو دفتر ملاحظات بعد ذلك
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 ) استخدم البرنامج النصي eval.py لتقييم النموذج.
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.txtسيؤدي هذا إلى حفظ الإخراج في ملف {Output_Path}.
لحساب المقاييس قم بتثبيت حزمة NLG-Eval وتشغيلها
nlg-eval --hypothesis=hypothesis_t5-base-qg-hl.txt --references=data/references.txt --no-skipthoughts --no-glove