03 · 2024
نظام ذكي لتوصية الكورسات
مشروع تخرج جامعي يوصي بأنسب كورس على منصة Coursera انطلاقًا من وصف نصي حر لما يعرفه المتعلم، مدرَّب بالكامل على بيانات جمعتها ونظّفتها بنفسي مع الفريق.
- Python
- TensorFlow / Keras
- Gensim (Word2Vec)
- NLTK
- BeautifulSoup
- MySQL
- SQLAlchemy
- Django
- Keras-Tuner
المشكلة
الكم الهائل من المحتوى التعليمي على الإنترنت يجعل من الصعب على المتعلم إيجاد الكورس الذي يناسب فعلًا مستواه وأهدافه، دون الغرق بمحتوى إما مكرر أو أعلى من مستواه. لم تكن هناك أي مجموعة بيانات جاهزة تناسب هذه المهمة — لا على Kaggle ولا في أي مكان آخر، وحتى Coursera نفسها لا توفر واحدة.
ما الذي بنيته
محرك توصية قائم على التعلم العميق، يأخذ وصفًا نصيًا حرًا لما يعرفه المتعلم أو يريد تعلّمه، ويتنبأ بعنوان أنسب كورس تالٍ له، مدرَّب على نحو 7,400 كورس إنجليزي من Coursera قام الفريق بجمعها وتنظيفها وتخزينها بأنفسهم، ومُقدَّم عبر تطبيق ويب مبني بـ Django.
كيف يعمل
- جمع بيانات Coursera مباشرة عبر Python (requests و BeautifulSoup) بالمرور على تصنيفات المنصة (domains/topics)، بعد أن تبيّن عدم وجود أي مجموعة بيانات جاهزة صالحة للاستخدام — جُمع لكل كورس العنوان والوصف والمستوى والمدة والمنهاج والمدرّسين والمهارات المكتسبة وغيرها.
- تصميم قاعدة بيانات MySQL منظمة (كورسات، مدرّسون، مهارات، مجالات، مواضيع، وحدات، مناهج، والعلاقات المتعددة بينها)، وتحميل البيانات المجموعة إليها عبر SQLAlchemy.
- تنظيف النصوص المجموعة: تصحيح يدوي للأخطاء الإملائية، إزالة الرموز غير المرغوبة، توحيد الروابط، وتصفية اللغة (عبر langdetect إضافة لمعيار مخصص) وصولًا إلى 7,400 كورس إنجليزي صالح للاستخدام.
- تدريب تمثيل Word2Vec من الصفر على مجموعة نصوص الكورسات عبر مكتبة Gensim، بدل استخدام تمثيل مُدرَّب مسبقًا.
- تبيّن أن الحشو الصفري المعتاد (zero-padding) يشوّه إشارة النص المُمثَّل، فتمت معالجة كل تسلسل تمثيلي كصورة واستُخدمت دالة تغيير الحجم (resize) من مكتبة PIL لتوحيد طول التسلسلات — حل أنظف بكثير من الحشو التقليدي.
- بناء ومقارنة نموذجين تسلسليين: LSTM بمعمارية ترميز-فك ترميز (وصف الكورس → عنوانه) مضبوط بالبحث العشوائي عبر Keras-Tuner، ونموذج آخر يغذّي مخرجات LSTM إلى معمارية Transformer كاملة (ترميز وفك ترميز).
- بناء موقع الويب (Django + MySQL) الذي يتفاعل معه المستخدم: مربع إدخال نصي حر، وصفحة نتائج تعرض الكورسات والتخصصات (Specializations) والمشاريع المقترحة مع التقييم والمستوى والمدة والروابط.
كيف تم اختباره
تقييم كل نموذج عبر مقاييس MAE loss وR² والتشابه الجيبي (cosine similarity) على بيانات لم يرها النموذج أثناء التدريب، إضافة إلى اختبار المسار الكامل بأسئلة نصية حرة فعلية.
النتائج
- كان نموذج LSTM بمعمارية ترميز-فك ترميز الأقوى: بمعامل تحديد R² يتراوح تقريبًا بين 0.94 و0.99، وتشابه جيبي بين 0.96 و0.98 بين عناوين الكورسات المتنبأ بها والفعلية.
- نموذج LSTM-Transformer أظهر إفراطًا واضحًا بالتخصيص (overfitting): استمر خطأ التدريب بالانخفاض بينما ارتفع خطأ التحقق بعد نحو 20 حقبة تدريب — لذلك كان اعتماد معمارية LSTM الأبسط الخيار الأفضل.
- استعلام حي مثل "أريد مقدمة في البرمجة بلغة Python" أعاد بشكل صحيح كورسًا تمهيديًا في Python، ما أثبت عمل مسار (النص الحر → الكورس المقترح) من طرف إلى طرف.
ما تعلمته
- نموذج Transformer بدا أكثر تطورًا على الورق، لكنه عمّم بشكل أسوأ من نموذج LSTM الأبسط — درس بأهمية التحقق من النموذج الأبسط أولًا قبل اللجوء لنموذج أكبر.
- الجزء الأكبر من الجهد الهندسي الحقيقي ذهب نحو البيانات: إيجاد مصدر لها، وجمعها، وتنظيفها، قبل تدريب أي نموذج على الإطلاق.
- معاملة تسلسل التمثيل كصورة وتغيير حجمه، بدل الحشو الصفري، كانت فكرة بسيطة لكنها حسّنت التدريب بشكل ملموس مقارنة بالأسلوب التقليدي.
دوري
قائد الفريق؛ تحليل النظام مع الفريق؛ جمع بيانات Coursera والمساهمة بتنظيفها؛ المساهمة بتدريب الشبكة العصبية.