تم الانتهاء من تحدي codesearchnet
نود أن نشكر جميع المشاركين على عروضهم ونأمل أن يوفر هذا التحدي رؤى للممارسين والباحثين حول التحديات في البحث عن التعليمات البرمجية الدلالية وبحوث جديدة. نود أن نشجع الجميع على مواصلة استخدام مجموعة البيانات والتقييمات البشرية ، والتي نقدمها الآن علنًا. من فضلك ، انظر أدناه للحصول على التفاصيل ، وتحديدا قسم التقييم.
لن يتم قبول أي طلبات جديدة للتحدي.
جدول المحتويات
إذا كانت هذه هي المرة الأولى التي تقرأ فيها هذا ، نوصي بتخطي هذا القسم وقراءة الأقسام التالية. تفترض الأوامر أدناه أن لديك Docker و Nvidia-Docker ، بالإضافة إلى وحدة معالجة الرسومات التي تدعم CUDA 9.0 أو أكثر. ملاحظة: يجب عليك فقط تشغيل script/setup مرة واحدة لتنزيل البيانات.
# clone this repository
git clone https://github.com/github/CodeSearchNet.git
cd CodeSearchNet/
# download data (~3.5GB) from S3; build and run the Docker container
script/setup
# this will drop you into the shell inside a Docker container
script/console
# optional: log in to W&B to see your training metrics,
# track your experiments, and submit your models to the benchmark
wandb login
# verify your setup by training a tiny model
python train.py --testrun
# see other command line options, try a full training run with default values,
# and explore other model variants by extending this baseline script
python train.py --help
python train.py
# generate predictions for model evaluation
python predict.py -r github/CodeSearchNet/0123456 # this is the org/project_name/run_idأخيرًا ، يمكنك إرسال تشغيلك إلى معيار المجتمع باتباع هذه التعليمات.
CODESERCHNET هي مجموعة من مجموعات البيانات والمعايير التي تستكشف مشكلة استرجاع التعليمات البرمجية باستخدام اللغة الطبيعية. هذا البحث هو استمرار لبعض الأفكار المقدمة في منشور المدونة هذا وهو تعاون مشترك بين Github ومجموعة Deep Program Founder في Microsoft Research - Cambridge. نهدف إلى توفير منصة للبحث المجتمعي حول البحث عن الكود الدلالي عبر ما يلي:
نأمل أن يكون CodeSearchNet خطوة نحو التعامل مع التعلم الآلي الأوسع ومجتمع NLP فيما يتعلق بالعلاقة بين التعليمات البرمجية المصدر واللغة الطبيعية. وصفنا مهمة محددة هنا ، لكننا نتوقع ونرحب بالاستخدامات الأخرى لمجموعة البيانات الخاصة بنا.
المزيد من السياق فيما يتعلق بالتحفيز لهذه المشكلة هو في هذا التقرير الفني. من فضلك ، استشهد بمجموعة البيانات والتحدي
@article{husain2019codesearchnet,
title={{CodeSearchNet} challenge: Evaluating the state of semantic code search},
author={Husain, Hamel and Wu, Ho-Hsiang and Gazit, Tiferet and Allamanis, Miltiadis and Brockschmidt, Marc},
journal={arXiv preprint arXiv:1909.09436},
year={2019}
}
تتكون مجموعة البيانات الأساسية من 2 مليون ( comment ، code ) من مكتبات مفتوحة المصدر. بشكل ملموس ، comment هو وظيفة أو طريقة من المستوى الأعلى (مثل docstrings في Python) ، code هو وظيفة أو طريقة كاملة. حاليًا ، تحتوي مجموعة البيانات على Python و JavaScript و Ruby و Go و Java و PHP. خلال هذا الريبو ، نشير إلى الشروط docstring والاستعلام بالتبادل. نقوم بتقسيم البيانات إلى تقسيم القطار والتحقق من الصحة والاختبار مثل أن الرمز من نفس المستودع يمكن أن يوجد فقط في قسم واحد. حاليًا هذه هي مجموعة البيانات الوحيدة التي نقوم بتدريبها على نموذجنا. يمكن العثور على إحصائيات موجزة حول مجموعة البيانات هذه في دفتر الملاحظات
لمزيد من المعلومات حول كيفية الحصول على البيانات ، راجع هذا القسم.
المقياس الذي نستخدمه للتقييم هو مكسب تراكمي مخفض. يرجى الرجوع إلى هذه الورقة لمزيد من التفاصيل حول تقييم النموذج. يمكن العثور على البرنامج النصي للتقييم هنا.
قمنا بشرح نتائج الاسترجاع يدويًا لللغات الست من 99 استفسارًا عامًا. يتم استخدام مجموعة البيانات هذه كبيانات جروز للتقييم فقط . يرجى الرجوع إلى هذه الورقة لمزيد من التفاصيل حول عملية التعليقات التوضيحية. تم استخدام هذه التعليقات التوضيحية لحساب الدرجات في المتصدرين. الآن وقد انتهت المسابقة ، يمكنك العثور على التعليقات التوضيحية ، إلى جانب تعليقات التعليقات هنا.
يجب عليك فقط تنفيذ خطوات الإعداد مرة واحدة لتنزيل البيانات وإعداد البيئة.
نظرًا لتعقيد تثبيت جميع التبعيات ، قمنا بإعداد حاويات Docker لتشغيل هذا الرمز. يمكنك العثور على تعليمات حول كيفية تثبيت Docker في المستندات الرسمية. بالإضافة إلى ذلك ، يجب عليك تثبيت Nvidia-Docker لتلبية التبعيات ذات الصلة بحساب GPU. بالنسبة لأولئك الجدد في Docker ، يوفر منشور المدونة هذا مقدمة لطيفة تركز على علم البيانات.
بعد تثبيت Docker ، تحتاج إلى تنزيل مجموعات البيانات المعالجة مسبقًا ، والتي يتم استضافتها على S3. يمكنك القيام بذلك عن طريق تشغيل script/setup .
script/setup
سيؤدي ذلك إلى إنشاء حاويات Docker وتنزيل مجموعات البيانات. بشكل افتراضي ، يتم تنزيل البيانات في resources/data/ المجلد داخل هذا المستودع ، مع موصوف بنية الدليل هنا.
تبلغ حجم مجموعات البيانات التي ستقوم بتنزيلها (معظمها مضغوطًا) حجمًا مشتركًا فقط ~ 3.5 جيجابايت.
script/console : script/console
/src . يمكنك الانفصال من/إرفاق هذه الحاوية لإيقاف/متابعة عملك.لمزيد من المعلومات حول البيانات ، راجع تفاصيل البيانات أدناه ، وكذلك دفتر الملاحظات.
إذا قمت بتشغيل خطوات الإعداد أعلاه ، فستكون لديك بالفعل البيانات ، ولا يجب القيام بأي شيء. ستكون البيانات متاحة في مجلد /resources/data هذا المستودع ، مع بنية الدليل هذا.
يتم تخزين البيانات بتنسيق jsonlines. يمثل كل سطر في الملف غير المضغوط مثالًا واحدًا (عادةً ما يكون هناك وظيفة مع تعليق مرتبط). تم توضيح مثال مستجيب لصف واحد أدناه.
original_string هو الكودcodedocstringيتم استخراج التعليمات البرمجية والتعليقات والمستندات بطريقة خاصة باللغة ، مما يؤدي إلى إزالة القطع الأثرية من تلك اللغة.
{
'code': 'def get_vid_from_url(url):n'
' """Extracts video ID from URL.n'
' """n'
" return match1(url, r'youtu\.be/([^?/]+)') or \n"
" match1(url, r'youtube\.com/embed/([^/?]+)') or \n"
" match1(url, r'youtube\.com/v/([^/?]+)') or \n"
" match1(url, r'youtube\.com/watch/([^/?]+)') or \n"
" parse_query_param(url, 'v') or \n"
" parse_query_param(parse_query_param(url, 'u'), 'v')",
'code_tokens': ['def',
'get_vid_from_url',
'(',
'url',
')',
':',
'return',
'match1',
'(',
'url',
',',
"r'youtu\.be/([^?/]+)'",
')',
'or',
'match1',
'(',
'url',
',',
"r'youtube\.com/embed/([^/?]+)'",
')',
'or',
'match1',
'(',
'url',
',',
"r'youtube\.com/v/([^/?]+)'",
')',
'or',
'match1',
'(',
'url',
',',
"r'youtube\.com/watch/([^/?]+)'",
')',
'or',
'parse_query_param',
'(',
'url',
',',
"'v'",
')',
'or',
'parse_query_param',
'(',
'parse_query_param',
'(',
'url',
',',
"'u'",
')',
',',
"'v'",
')'],
'docstring': 'Extracts video ID from URL.',
'docstring_tokens': ['Extracts', 'video', 'ID', 'from', 'URL', '.'],
'func_name': 'YouTube.get_vid_from_url',
'language': 'python',
'original_string': 'def get_vid_from_url(url):n'
' """Extracts video ID from URL.n'
' """n'
" return match1(url, r'youtu\.be/([^?/]+)') or \n"
" match1(url, r'youtube\.com/embed/([^/?]+)') or "
'\n'
" match1(url, r'youtube\.com/v/([^/?]+)') or \n"
" match1(url, r'youtube\.com/watch/([^/?]+)') or "
'\n'
" parse_query_param(url, 'v') or \n"
" parse_query_param(parse_query_param(url, 'u'), "
"'v')",
'partition': 'test',
'path': 'src/you_get/extractors/youtube.py',
'repo': 'soimort/you-get',
'sha': 'b746ac01c9f39de94cac2d56f665285b0523b974',
'url': 'https://github.com/soimort/you-get/blob/b746ac01c9f39de94cac2d56f665285b0523b974/src/you_get/extractors/youtube.py#L135-L143'
}
يمكن العثور على إحصائيات موجزة مثل تعداد الصفوف والرسم البياني لطول الرمز المميز في دفتر الملاحظات هذا
سيقوم البرنامج النصي /script/setup Shell تلقائيًا بتنزيل هذه الملفات في دليل /resources/data . فيما يلي الروابط إلى الملفات ذات الصلة للرؤية:
تتبع روابط S3 هذا النمط:
https://s3.amazonaws.com/code-search-net/codeSearchNet/v2/ {propethon،java،go،php،javascript،ruby ).zip
على سبيل المثال ، رابط java هو:
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/java.zip
حجم مجموعة البيانات حوالي 20 جيجابايت. يتم شرح الملفات المختلفة وهيكل الدليل هنا.
لتدريب النماذج العصبية مع مجموعة بيانات كبيرة ، نستخدم تعليقات الوثائق (مثل docstrings) كبديل. للتقييم (والمتصدرين) ، قمنا بجمع أحكام ذات صلة بشرية بأزواج من استفسارات اللغة الطبيعية ذات المظهر الواقعي ومقتطفات الكود. الآن وقد تم الانتهاء من التحدي ، فإننا نقدم البيانات هنا على أنها .csv ، مع الحقول التالية:
URL في البيانات (انظر هنا).نحن نشجعك على إعادة إنتاج هذه النماذج وتوسيعها ، على الرغم من أن معظم المتغيرات تستغرق عدة ساعات للتدريب (ويستغرق البعض أكثر من 24 ساعة على مثيل AWS P3-V100).
نماذج خط الأساس لدينا تستهلك مجموعة موازية ( comments code ) وتعلم استرداد مقتطف رمز مع استفسار اللغة الطبيعية. على وجه التحديد ، comments هي وظيفة المستوى الأعلى وتعليقات الطريقة (مثل docstrings في Python) ، code هو وظيفة أو طريقة كاملة. خلال هذا الريبو ، نشير إلى الشروط docstring والاستعلام بالتبادل.
يحتوي الاستعلام على تشفير واحد ، في حين أن كل لغة برمجة لها تشفير خاص بها. المشفرات المتاحة هي حقيبة الكلمات العصبية ، RNN ، 1D-CNN ، الالتحاق الذاتي (BERT) ، وهجينة 1D-CNN+المصاحب الذاتي.
يوضح الرسم البياني أدناه الهندسة المعمارية العامة لنماذج خط الأساس لدينا:

تفترض هذه الخطوة أن لديك NVIDIA-GPU مناسب مع تثبيت CUDA V9.0. استخدمنا مثيلات AWS P3-V100 (A p3.2xlarge كافية).
ابدأ بيئة تشغيل النموذج عن طريق تشغيل script/console :
script/console
سيؤدي ذلك إلى إسقاطك في قذيفة حاوية Docker مع تثبيت جميع التبعيات اللازمة ، بما في ذلك الكود في هذا المستودع ، إلى جانب البيانات التي قمت بتنزيلها مسبقًا. بشكل افتراضي ، سيتم وضعك في src/ Folder من مستودع GitHub. من هنا يمكنك تنفيذ الأوامر لتشغيل النموذج.
قم بإعداد W&B (مجانًا للمشاريع المفتوحة المصدر) وفقًا للإرشادات أدناه إذا كنت ترغب في مشاركة نتائجك على معيار المجتمع. هذا اختياري ولكن الموصى به للغاية.
نقطة الدخول إلى هذا النموذج هي src/train.py . يمكنك رؤية خيارات مختلفة عن طريق تنفيذ الأمر التالي:
python train.py --help
لاختبار ما إذا كان كل شيء يعمل على مجموعة بيانات صغيرة ، يمكنك تشغيل الأمر التالي:
python train.py --testrun
أنت الآن مستعد لتشغيل التدريب الكامل. أوامر مثال لبدء تشغيل التدريب:
تدريب نموذج العجلة العصبية على جميع اللغات
python train.py --model neuralbow
سوف يفترض الأمر أعلاه القيم الافتراضية لموقع (مواقع) بيانات التدريب والوجهة التي ترغب في حفظ نموذج الإخراج. يتم تحديد الموقع الافتراضي لبيانات التدريب في /src/data_dirs_{train,valid,test}.txt train ، valid،test ).txt. تحتوي كل هذه الملفات على قائمة بالمسارات حيث توجد بيانات للقسم المقابل. إذا كان أكثر من مسار محدد (مفصولة بواسطة سطر جديد) ، فسيتم تسلسل البيانات من جميع المسارات معًا. على سبيل المثال ، هذا هو محتوى src/data_dirs_train.txt :
$ cat data_dirs_train.txt
../resources/data/python/final/jsonl/train
../resources/data/javascript/final/jsonl/train
../resources/data/java/final/jsonl/train
../resources/data/php/final/jsonl/train
../resources/data/ruby/final/jsonl/train
../resources/data/go/final/jsonl/train
بشكل افتراضي ، يتم حفظ النماذج في مجلد resources/saved_models في هذا المستودع.
تدريب نموذج 1D-CNN على بيانات Python فقط:
python train.py --model 1dcnn /trained_models ../resources/data/python/final/jsonl/train ../resources/data/python/final/jsonl/valid ../resources/data/python/final/jsonl/test
يتجاوز الأمر أعلاه المواقع الافتراضية لتوفير النموذج إلى trained_models ويتجاوز أيضًا مصدر مجموعات القطار والتحقق من الصحة والاختبار.
ملاحظات إضافية:
يتم سرد خيارات --model حاليًا في src/model_restore_helper.get_model_class_from_name .
تعتبر المقاييس المفرطة الخاصة بفئات النموذج/التشفير المعنية. هناك خدعة بسيطة لاكتشافها هي بدء تشغيل دون تحديد خيارات القياس المفرط ، حيث من شأنه أن يطبع قائمة بجميع أجهزة البارامات المستخدمة مع قيمها الافتراضية (بتنسيق JSON).
نحن نستخدم معيارًا للمجتمع لهذا المشروع لتشجيع التعاون وتحسين الاستنساخ. يتم استضافته بواسطة Owns & Biases (W & B) ، وهو مجاني للمشاريع المفتوحة المصدر. إدخالاتنا في الرابط القياسي لسجلات مفصلة لمقاييس التدريب والتقييم لدينا ، وكذلك القطع الأثرية النموذجية ، ونشجع المشاركين الآخرين على توفير أكبر قدر ممكن من التفاصيل.
ندعو المجتمع إلى تقديم أشواطهم إلى هذا المعيار لتسهيل الشفافية من خلال اتباع هذه التعليمات.
نتوقع أن يقوم المجتمع بتصميم بنيات مخصصة ويستخدم أطراف غير TensorFlow. علاوة على ذلك ، نتوقع أن تكون مجموعات البيانات الإضافية مفيدة. ليس نيتنا في دمج هذه النماذج ، والمناهج ، ومجموعات البيانات في هذا المستودع باعتباره مجموعة كبيرة من جميع الأفكار المتاحة. بدلاً من ذلك ، نعتزم الحفاظ على النماذج الأساسية والروابط للبيانات في هذا المستودع كمكان مرجعي مركزي. نحن نقبل PRS التي تقوم بتحديث الوثائق أو الارتباط بمشروعك (المشروع) مع معايير محسّنة أو إصلاح الأخطاء أو إجراء تحسينات بسيطة على الرمز. فيما يلي إرشادات أكثر تحديدًا للمساهمة في هذا المستودع ؛ لاحظ بشكل خاص مدونة قواعد السلوك الخاصة بنا. يرجى فتح مشكلة إذا كنت غير متأكد من أفضل مسار للعمل.
لتهيئة W & B:
انتقل إلى دليل /src في هذا المستودع.
إذا كانت هذه هي المرة الأولى التي تستخدم فيها W&B على جهاز ، فستحتاج إلى تسجيل الدخول:
$ wandb login
سيُطلب منك مفتاح API الخاص بك ، والذي يظهر على صفحة إعدادات ملف تعريف W&B الخاص بك.
يتم توفير تراخيص التعليمات البرمجية المصدر المستخدم كبيانات لهذا المشروع بتنزيل البيانات لكل لغة في ملفات _licenses.pkl .
يتم إصدار هذا الرمز والوثائق لهذا المشروع بموجب ترخيص MIT.