كان هذا المشروع في الأصل مخصصًا لدورة الذكاء الاصطناعي في جامعة صوفيا. أثناء تنفيذها، كنت مقيدًا بالوقت المحدد ولم أتمكن من تنفيذ جميع الأفكار التي كانت لدي، لكنني أخطط لمواصلة العمل عليها... وقد اخترت موضوع أطروحتي للماجستير، باستخدام محولات T5 لتوليد الأسئلة- الإجابة على أزواج جنبا إلى جنب مع المشتتات . يمكنك التحقق من ذلك في مستودع Question-Generation-Transformers.
تم قبول أسلوب تحديد الكلمات الرئيسية المستخدمة كإجابات مستهدفة في مؤتمر RANLP2021 - إنشاء إجابات مرشحة للاختبارات ومولدات الأسئلة المدركة للإجابة.
تتمثل الفكرة في إنشاء إجابات متعددة الاختيارات من النص، عن طريق تقسيم هذه المشكلة المعقدة إلى خطوات أبسط:
لتجنب أي تعارضات مع حزم بايثون من مشاريع أخرى، من الممارسات الجيدة إنشاء بيئة افتراضية سيتم تثبيت الحزم فيها. إذا كنت لا تريد ذلك، يمكنك تخطي الأوامر التالية وتثبيت ملف Requirements.txt مباشرةً.
إنشاء بيئة افتراضية:
python -m venv venv
أدخل البيئة الافتراضية:
ويندوز:
. .venvScriptsactivate
لينكس أو ماك
source .venvScriptsactivate
تثبيت ipython داخل venv:
ipython kernel install --user --name=.venv
قم بتثبيت مختبر jupyter داخل venv:
pip install jupyterlab
pip install -r .requirements.txt
jupyter lab
قبل أن أتمكن من فعل أي شيء، أردت أن أفهم المزيد حول كيفية صياغة الأسئلة ونوع الكلمات التي تجيب عليها.
لقد استخدمت مجموعة بيانات SQuAD 1.0 التي تحتوي على حوالي 100000 سؤال تم إنشاؤها من مقالات ويكيبيديا.
يمكنك القراءة عن الرؤى التي وجدتها في دفتر ملاحظات Data Exploration jupyter.
كان افتراضي أن الكلمات من النص ستكون إجابات رائعة على الأسئلة . كل ما كان علي فعله هو أن أقرر أي الكلمات أو العبارات القصيرة ستكون جيدة بما يكفي لتصبح إجابات.
قررت أن أقوم بتصنيف ثنائي لكل كلمة من النص. لقد ساعدني SpaCy حقًا في وضع علامات على الكلمات.
كنت بحاجة إلى إنشاء مجموعة البيانات بأكملها للتصنيف الثنائي. لقد قمت باستخراج كل كلمة متواصلة من فقرات كل سؤال في مجموعة بيانات SQuAD وأضفت بعض الميزات عليها مثل:
والتسمية هي الإجابة - ما إذا كانت الكلمة المستخرجة من الفقرة هي نفسها وفي نفس مكان إجابة سؤال SQuAD.
بعض الميزات الأخرى مثل درجة TF-IDF وتشابه جيب التمام مع العنوان ستكون رائعة، لكن لم يكن لدي الوقت لإضافتها.
بخلاف ذلك، الأمر متروك لخيالنا لإنشاء ميزات جديدة - ربما سواء كان ذلك في بداية الجملة أو وسطها أو نهايتها، ومعلومات حول الكلمات المحيطة بها والمزيد... على الرغم من أنه قبل إضافة المزيد من الميزات، سيكون من الجيد أن يكون لديك مقياس لتقييم ما إذا كانت الميزة ستكون مفيدة أم لا.
لقد وجدت أن المشكلة مشابهة لتصفية البريد العشوائي ، حيث تتمثل الطريقة الشائعة في وضع علامة على كل كلمة في رسالة بريد إلكتروني على أنها واردة من بريد عشوائي أو ليست بريدًا إلكترونيًا عشوائيًا.
لقد استخدمت خوارزمية Gaussian Naive Bayes الخاصة بـ scikit-Learn لتصنيف كل كلمة سواء كانت إجابة.
وكانت النتائج جيدة بشكل مدهش، ففي لمحة سريعة، صنفت الخوارزمية معظم الكلمات على أنها إجابات. تلك التي لم تكن في الواقع غير صالحة.
الشيء الرائع في Naive Bayes هو أنك تحصل على احتمالية كل كلمة. لقد استخدمت ذلك في العرض التوضيحي لترتيب الكلمات من الإجابة الأكثر احتمالاً إلى الإجابة الأقل احتمالاً.
وكان لدي افتراض آخر وهو أن جملة الإجابة يمكن بسهولة تحويلها إلى سؤال . فقط عن طريق وضع مسافة فارغة في موضع الإجابة في النص، أحصل على سؤال "cloze" (جملة بها مسافة فارغة للكلمة المفقودة)
الجواب: الأكسجين
سؤال: _____ عنصر كيميائي رمزه O وعدده الذري 8.
قررت أنه لا يستحق تحويل سؤال cloze إلى جملة تبدو أكثر استفهامًا، لكنني أتخيل أنه يمكن القيام بذلك باستخدام شبكة عصبية seq2seq ، على غرار الطريقة التي تتم بها ترجمة النص من لغة إلى أخرى.
تحول الجزء بشكل جيد حقا.
لكل إجابة أقوم بإنشائها هي الكلمات الأكثر تشابهًا باستخدام تضمينات الكلمات وتشابه جيب التمام .
معظم الكلمات جيدة ويمكن بسهولة الخلط بينها وبين الإجابة الصحيحة. ولكن هناك بعض من الواضح أنها ليست مناسبة.
نظرًا لعدم وجود مجموعة بيانات تحتوي على إجابات غير صحيحة، فقد اتبعت نهجًا أكثر كلاسيكية.
لقد قمت بإزالة الكلمات التي لم تكن نفس الجزء من الكلام أو نفس الكيان المسمى كالإجابة، وأضفت المزيد من السياق من السؤال.
أرغب في العثور على مجموعة بيانات تحتوي على إجابات متعددة الاختيارات ومعرفة ما إذا كان بإمكاني إنشاء نموذج ML لإنشاء إجابات غير صحيحة أفضل.
بعد إضافة مشروع تجريبي، فإن الأسئلة التي تم إنشاؤها ليست مناسبة حقًا للدخول إلى الفصل الدراسي على الفور، ولكنها ليست سيئة أيضًا.
الشيء الرائع هو بساطة النهج ونمطيته ، حيث يمكنك العثور على المكان الذي يكون فيه الفعل سيئًا ( على سبيل المثال، إنه تصنيف الأفعال ) وإدخال إصلاح فيه.
إن وجود شبكة عصبية معقدة ( مثل جميع الأوراق البحثية المتعلقة بالمواضيع ) من المحتمل أن يكون أفضل، خاصة في العصر الذي نعيش فيه. لكن الشيء العظيم الذي اكتشفته حول هذا النهج، هو أنه بمثابة بوابة لمهندس البرمجيات ، بعقلية هندسة البرمجيات الخاصة به، للدخول في مجال الذكاء الاصطناعي ورؤية نتائج ذات معنى.
أجد هذا الموضوع مثيرًا للاهتمام للغاية وبه الكثير من الإمكانات. ربما سأواصل العمل في هذا المجال.
لقد قمت بالتسجيل في درجة الماجستير في استخراج البيانات ومن المحتمل أن أقوم ببعض المشاريع المماثلة. سأقوم بربط أي شيء مفيد هنا.
لقد خصصت بالفعل المزيد من الوقت لإنهاء المشروع، ولكنني أرغب في تحويله إلى برنامج تعليمي حول الدخول في مجال الذكاء الاصطناعي مع القدرة على توسيعه بسهولة باستخدام ميزات مخصصة جديدة.
التحديث - 29.12.19: أصبح المستودع شائعًا جدًا، لذلك أضفت دفترًا جديدًا ( Demo.ipynb ) يجمع بين جميع الوحدات ويولد أسئلة لأي نص. لقد قمت بإعادة ترتيب دفاتر الملاحظات الأخرى وقمت بتوثيق الكود (أفضل قليلاً).
التحديث - 09.03.21: تمت إضافة ملف require.txt مع تعليمات لتشغيل بيئة افتراضية وإصلاح الخلل باستخدام ValueError: لا يمكن بث المعاملات مع الأشكال (230، 121) (83،)
لقد بدأت أيضًا العمل على أطروحة الماجستير الخاصة بي بموضوع مماثل وهو إنشاء الأسئلة.
التحديث - 27.10.21: لقد قمت بتحميل الكود الخاص بأطروحة الماجستير الخاصة بي في مستودع Question-Generation-Transformers. أنا أشجعك بشدة على التحقق من ذلك.
بالإضافة إلى ذلك، تم قبول النهج الذي يستخدم مصنفًا لاختيار الإجابات المرشحة كورقة للطلاب في مؤتمر RANLP2021. ورقة هنا.