C # أو جافا؟ TypeScript أو جافا سكريبت؟ تصنيف لغات البرمجة على أساس التعلم الآلي

يحتوي GitHub على أكثر من 300 لغة برمجة ، تتراوح من اللغات المعروفة مثل Python و Java و Javascript إلى اللغات الباطنية مثل Befunge ، والمعروفة فقط بمجموعات صغيرة من الناس.

أفضل 10 لغات برمجية مستضافة من قبل GitHub حسب عدد المستودعات

إحدى المشكلات التي يواجهها GitHub هي التعرف على لغات البرمجة المختلفة. عندما يتم وضع بعض الأكواد في المستودع ، يكون التعرف على نوعه مهمًا جدًا. يعد ذلك ضروريًا لأسباب البحث ، وتنبيهات الثغرات الأمنية ، وتسليط الضوء على بناء الجملة ، وكذلك التمثيل الهيكلي لمحتوى المستودع للمستخدمين.

للوهلة الأولى ، يعتبر التعرف على اللغة مهمة بسيطة ، ولكنها ليست كذلك. Linguist هي الأداة التي نستخدمها حاليًا لتحديد لغة برمجة على GitHub. Linguist هو تطبيق Ruby يستخدم مجموعة متنوعة من استراتيجيات التعرف على اللغة ، بما في ذلك معلومات الاسم وملحقات الملفات. بالإضافة إلى ذلك ، فإنه يأخذ بعين الاعتبار نماذج Vim أو Emacs ، بالإضافة إلى المحتويات الموجودة في أعلى الملف (shebang). يقوم اللغوي بمعالجة الغموض اللغوي بشكل استرشادي ، وإذا لم ينجح ذلك ، فإنه يستخدم مصنّف بايزي ساذج تم تدريبه على عينة صغيرة من البيانات.

على الرغم من أن Linguist يتنبأ بشكل جيد بمستوى الملف (دقة 84 ٪) ، فإن كل شيء ينهار عندما يتم تسمية الملفات بطريقة غريبة ، وحتى أكثر من ذلك عندما لا تحتوي الملفات على ملحقات. هذا يجعل Linguist عديم الفائدة لمحتوى مثل GitHub Gists أو مقتطفات الكود في README والأخطاء وسحب الطلبات.

لجعل تعريف اللغة أكثر وضوحًا على المدى الطويل ، قمنا بتطوير مصنف تعليمي آلي يسمى OctoLingua. يعتمد على بنية الشبكة العصبية الاصطناعية (ANN) ، والتي يمكنها التعامل مع التنبؤ باللغة في السيناريوهات غير التافهة. يمكن أن يقوم الإصدار الحالي من النموذج بعمل تنبؤات لأفضل 50 لغة برمجة على GitHub ويتجاوز Linguist بدقة.

مزيد من التفاصيل حول OctoLingua


تمت كتابة OctoLingua من البداية في Python ، Keras مع الواجهة الخلفية TensorFlow - تم إنشاؤها لتكون دقيقة وموثوقة وسهلة الصيانة. في هذا الجزء ، سنتحدث عن مصادر البيانات الخاصة بنا وهندسة النماذج واختبارات أداء OctoLingua. سنتحدث أيضًا عن عملية إضافة القدرة على التعرف على لغة جديدة.

مصادر البيانات


تم تدريب الإصدار الحالي من OctoLingua على الملفات التي تم الحصول عليها من Rosetta Code ومن مجموعة من مستودعات المصادر العامة الداخلية. لقد حصرنا مجموعتنا من اللغات في 50 لغة الأكثر شعبية على جيثب.

كانت Rosetta Code مجموعة بيانات ممتازة ، لأنها تحتوي على شفرة مصدر مكتوبة لأداء نفس المهمة ، ولكن بلغات البرمجة المختلفة. على سبيل المثال ، تم تقديم رمز إنشاء أرقام فيبوناتشي في C و C ++ و CoffeeScript و D و Java و Julia وغيرها. ومع ذلك ، كانت تغطية اللغات غير متجانسة: بالنسبة لبعض لغات البرمجة ، لم يكن هناك سوى عدد قليل من الملفات مع الكود ، وبالنسبة للآخرين ، كانت الملفات تحتوي على كود بسيط للغاية. لذلك ، كان من الضروري استكمال مجموعة البيانات التدريبية الخاصة بنا ببعض المصادر الإضافية وبالتالي تحسين تغطية اللغات وفعالية النموذج النهائي بشكل كبير.

عملية إضافة لغة جديدة ليست آلية بالكامل. نحن نجمع برمجيًا شفرة المصدر من المستودعات العامة على جيثب. نختار فقط تلك المستودعات التي تفي بمعايير التأهيل الدنيا ، مثل الحد الأدنى لعدد الشوكات التي تغطي اللغة المستهدفة وتغطي امتدادات ملفات محددة. في هذه المرحلة من جمع البيانات ، نحدد اللغة الرئيسية للمستودع باستخدام التصنيف من Linguist.

الأعراض: بناء على المعرفة السابقة


تقليديا ، يتم استخدام البنى القائمة على الذاكرة مثل الشبكات العصبية المتكررة (RNN) وشبكات الذاكرة طويلة المدى (LSTM) لحل مشاكل تصنيف النص باستخدام الشبكات العصبية. ومع ذلك ، فإن الاختلافات في لغات البرمجة في المفردات ، وإضافات الملفات ، والبنية ، وأسلوب استيراد المكتبات وغيرها من التفاصيل ، أرغمتنا على التوصل إلى نهج مختلف يستخدم كل هذه المعلومات ، واستخراج بعض العلامات في شكل جدول لتدريب المصنف لدينا. يتم استرداد السمات كما يلي:

  1. أعلى 5 أحرف خاصة في ملف
  2. أفضل 20 حرفًا في الملف
  3. امتداد الملف
  4. وجود أحرف خاصة محددة يتم استخدامها في الكود المصدري للملفات ، مثل القولون ، الأقواس المتعرجة ، الفاصلة المنقوطة

الشبكة العصبية الاصطناعية النموذجية (ANN)


نستخدم العوامل المذكورة أعلاه كمدخلات لشبكة عصبية من طبقتين مبنية باستخدام Keras مع خلفية Tensorflow.

يوضح الرسم البياني أدناه أن خطوة استخراج الميزة تنشئ إدخالًا بجدول n الأبعاد لمصنفنا. عندما تنتقل المعلومات عبر طبقات شبكتنا ، يتم ترتيبها عن طريق التسرب ، والنتيجة هي إخراج ذي أبعاد 51 ، مما يمثل احتمال كتابة هذا الرمز في كل من أفضل 50 لغة على GitHub. كما يوضح احتمال عدم كتابة الكود بأي من اللغات الخمسين.


بنية ANN للنموذج المصدر (50 لغة + 1 لـ "الآخر")

استخدمنا 90 ٪ من قاعدة البيانات المصدر لدينا للتدريب. أيضًا ، في خطوة التدريب الخاصة بالنموذج ، تمت إزالة جزء من امتدادات الملفات حتى يتسنى للنموذج أن يتعلم تمامًا من مفردات الملفات ، وليس من امتداداتها ، التي تتنبأ بلغة البرمجة جيدًا.

اختبار الأداء


أوكتولينجوا ضد لغوي


في الجدول أدناه ، نعرض درجة F1 (متوسط ​​متناسق بين الدقة والاكتمال) لأوكولينجوا ولغويست محسوبة على نفس مجموعة الاختبار (10٪ من حجم مصدر البيانات الأصلي).

وتظهر ثلاثة اختبارات هنا. في الاختبار الأول ، لم يتم لمس مجموعة البيانات على الإطلاق ؛ في الثانية ، تم حذف ملحقات الملفات ؛ في الثالث ، تم خلط امتدادات الملفات من أجل إرباك المصنف (على سبيل المثال ، يمكن أن يكون لملف Java الملحق ".txt" ، ويمكن أن يكون لملف Python الامتداد ".java".

يتمثل الحدس وراء خلط أو حذف امتدادات الملفات في مجموعة الاختبار الخاصة بنا في تقييم موثوقية OctoLingua في تصنيف الملفات عند حذف علامة مفتاح أو مضللة. سيكون المصنف الذي لا يعتمد بشكل كبير على الامتداد مفيدًا للغاية لتصنيف السجلات ومقتطفات الشفرة ، لأنه في هذه الحالات لا يقدم الأشخاص عادة معلومات دقيقة حول الامتداد (على سبيل المثال ، العديد من السجلات المرتبطة بالكود لها ملحق txt.)

يوضح الجدول أدناه كيف أن أداء OctoLingua جيد في ظل ظروف مختلفة ، عندما افترضنا أن النموذج يتعلم بشكل أساسي من مفردات التعليمات البرمجية ، وليس من معلومات التعريف (على سبيل المثال ، امتداد الملف). في الوقت نفسه ، يحدد Linguist اللغة عن طريق الخطأ ، بمجرد فقدان معلومات ملحق الملف الصحيح.

أداء OctoLingua مقابل Linguist على نفس مجموعة الاختبار

تأثير إزالة امتدادات الملفات عند تدريب نموذج


كما ذكرنا سابقًا ، خلال التدريب ، أزلنا نسبة معينة من امتدادات الملفات من البيانات لجعل النموذج يتعلم من مفردات الملفات. يوضح الجدول أدناه أداء نموذجنا بنسب مختلفة من امتدادات الملفات المحذوفة أثناء التدريب.


أداء OctoLingua مع نسبة مختلفة من ملحقات الملفات المحذوفة

يرجى ملاحظة أن النموذج المدرب على الملفات ذات الامتدادات يكون أقل فعالية بكثير في ملفات الاختبار دون ملحقات أو مع ملحقات مختلطة مقارنة ببيانات الاختبار العادية. من ناحية أخرى ، عندما يتم تدريب أحد النماذج على مجموعة بيانات يتم فيها إزالة جزء من امتدادات الملفات ، فإن أداء النموذج لا يقل كثيرًا عن مجموعة الاختبار المعدلة. هذا يؤكد أن إزالة الملحقات من جزء من الملفات أثناء التدريب يدفع المصنف الخاص بنا إلى معرفة المزيد من مفردات التعليمات البرمجية. كما يوضح أن امتداد الملف يميل إلى الهيمنة ومنع الترجيح من المحتوى المميز.

دعم لغوي جديد


تعد إضافة لغة جديدة إلى OctoLingua عملية بسيطة إلى حد ما. تبدأ عمليات البحث والحصول على عدد كبير من الملفات بلغة جديدة (يمكننا القيام بذلك برمجيًا ، كما هو موضح في قسم "مصادر البيانات"). تنقسم هذه الملفات إلى مجموعات تدريب واختبار ، ثم تمر عبر معالجنا المسبق ومستخرج الميزات. تتم إضافة مجموعة بيانات جديدة إلى التجمع الموجود. تسمح لنا مجموعة الاختبار بالتأكد من أن دقة نموذجنا تظل مقبولة.


إضافة لغة جديدة إلى OctoLingua

خططنا


إن OctoLingua حاليًا في "مرحلة النماذج المتقدمة". آلية تصنيف اللغة لدينا موثوقة بالفعل ، لكنها لا تدعم حتى الآن جميع لغات البرمجة المتاحة على جيثب. بالإضافة إلى توسيع نطاق الدعم اللغوي ، وهو أمر غير صعب للغاية ، فإننا نسعى جاهدين لتوفير الكشف عن اللغة مع مستويات مختلفة من التفاصيل رمز. إن تنفيذنا الحالي يتيح لنا بالفعل ، مع تعديل بسيط لآلية التعلم الآلي لدينا ، تصنيف أجزاء التعليمات البرمجية. أيضًا ، لا يبدو من الصعب نقل النموذج إلى المرحلة التي يمكنه من خلالها اكتشاف اللغات المضمنة وتصنيفها بشكل موثوق.

نحن نفكر أيضًا في نشر شفرة المصدر لنموذجنا ، لكننا نحتاج إلى طلب من المجتمع.

استنتاج


هدفنا في تطوير OctoLingua هو إنشاء خدمة توفر تعريفًا موثوقًا للغة من خلال الكود المصدري بمستويات مختلفة من التفاصيل: من مستوى الملفات أو أجزاء الكود إلى التعريف والتصنيف المحتمل للغة على مستوى الخط. يهدف كل عملنا على هذه الخدمة إلى دعم المطورين في أعمال التطوير اليومية ، وكذلك تهيئة الظروف لكتابة كود عالي الجودة.

إذا كنت مهتمًا بالمساهمة في عملنا ، فلا تتردد في الاتصال بنا على Twittergithub !

Source: https://habr.com/ru/post/ar459104/


All Articles