ความท้าทาย CodeSearchNet ได้รับการสรุป
เราขอขอบคุณผู้เข้าร่วมทุกคนสำหรับการส่งของพวกเขาและเราหวังว่าความท้าทายนี้จะให้ข้อมูลเชิงลึกแก่ผู้ปฏิบัติงานและนักวิจัยเกี่ยวกับความท้าทายในการค้นหารหัสความหมายและกระตุ้นการวิจัยใหม่ เราต้องการสนับสนุนให้ทุกคนใช้ชุดข้อมูลและการประเมินของมนุษย์ต่อไปซึ่งตอนนี้เราให้บริการต่อสาธารณะ โปรดดูรายละเอียดด้านล่างโดยเฉพาะส่วนการประเมินผล
จะไม่มีการส่งผลงานใหม่ไปสู่ความท้าทาย
สารบัญ
หากนี่เป็นครั้งแรกที่คุณอ่านสิ่งนี้เราขอแนะนำให้ข้ามส่วนนี้และอ่านส่วนต่อไปนี้ คำสั่งด้านล่างถือว่าคุณมี Docker และ Nvidia-Docker รวมถึง GPU ที่รองรับ 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ในที่สุดคุณสามารถส่งการวิ่งไปยังเกณฑ์มาตรฐานชุมชนโดยทำตามคำแนะนำเหล่านี้
CodeSearchNet เป็นชุดข้อมูลและมาตรฐานที่สำรวจปัญหาการดึงรหัสโดยใช้ภาษาธรรมชาติ การวิจัยนี้เป็นความต่อเนื่องของแนวคิดบางอย่างที่นำเสนอในโพสต์บล็อกนี้และเป็นความร่วมมือร่วมกันระหว่าง GitHub และกลุ่มทำความเข้าใจโปรแกรมลึกที่ 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}
}
ชุดข้อมูลหลักประกอบด้วยคู่ ( comment , code ) 2 ล้านคู่จากไลบรารีโอเพนซอร์ส comment เป็นรูปธรรมเป็นฟังก์ชันระดับบนสุดหรือวิธีการแสดงความคิดเห็น (เช่นเอกสารใน Python) และ code เป็นฟังก์ชั่นหรือวิธีการทั้งหมด ปัจจุบันชุดข้อมูลมี Python, JavaScript, Ruby, GO, Java และ PHP ตลอดการซื้อคืนนี้เราอ้างถึงคำศัพท์และการสืบค้นแทนกัน เราแบ่งพาร์ติชันข้อมูลเป็นรถไฟการตรวจสอบและการทดสอบการแยกเช่นรหัสนั้นจากที่เก็บเดียวกันสามารถมีอยู่ในพาร์ติชันเดียวเท่านั้น ปัจจุบันนี่เป็นชุดข้อมูลเดียวที่เราฝึกอบรมแบบจำลองของเรา สถิติสรุปเกี่ยวกับชุดข้อมูลนี้สามารถพบได้ในสมุดบันทึกนี้
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีรับข้อมูลดูส่วนนี้
ตัวชี้วัดที่เราใช้สำหรับการประเมินผลคือการลดราคาตามปกติ โปรดอ้างอิงบทความนี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการประเมินแบบจำลอง สคริปต์การประเมินสามารถพบได้ที่นี่
เรามีคำอธิบายประกอบการดึงคำอธิบายประกอบด้วยตนเองสำหรับหกภาษาจากการสอบถามทั่วไป 99 ครั้ง ชุดข้อมูลนี้ใช้เป็นข้อมูลภาคพื้นดินสำหรับการประเมิน เท่านั้น โปรดดูบทความนี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับกระบวนการคำอธิบายประกอบ คำอธิบายประกอบเหล่านี้ใช้ในการคำนวณคะแนนในลีดเดอร์บอร์ด ตอนนี้การแข่งขันได้รับการสรุปแล้วคุณสามารถค้นหาคำอธิบายประกอบพร้อมกับความคิดเห็น Annotator ได้ที่นี่
คุณควรทำตามขั้นตอนการตั้งค่าเพียงครั้งเดียวเพื่อดาวน์โหลดข้อมูลและเตรียมสภาพแวดล้อม
เนื่องจากความซับซ้อนของการติดตั้งการพึ่งพาทั้งหมดเราจึงเตรียมคอนเทนเนอร์ Docker เพื่อเรียกใช้รหัสนี้ คุณสามารถค้นหาคำแนะนำเกี่ยวกับวิธีการติดตั้ง Docker ในเอกสารอย่างเป็นทางการ นอกจากนี้คุณต้องติดตั้ง Nvidia-Docker เพื่อตอบสนองการพึ่งพาที่เกี่ยวข้องกับ GPU สำหรับผู้ที่ยังใหม่กับ Docker โพสต์บล็อกนี้ให้การแนะนำที่อ่อนโยนมุ่งเน้นไปที่วิทยาศาสตร์ข้อมูล
หลังจากติดตั้ง Docker คุณต้องดาวน์โหลดชุดข้อมูลที่ประมวลผลล่วงหน้าซึ่งโฮสต์บน S3 คุณสามารถทำได้โดยเรียกใช้ script/setup
script/setup
สิ่งนี้จะสร้างคอนเทนเนอร์ Docker และดาวน์โหลดชุดข้อมูล โดยค่าเริ่มต้นข้อมูลจะถูกดาวน์โหลดลงใน resources/data/ โฟลเดอร์ภายในที่เก็บนี้โดยมีโครงสร้างไดเรกทอรีที่อธิบายไว้ที่นี่
ชุดข้อมูลที่คุณจะดาวน์โหลด (ส่วนใหญ่บีบอัด) มีขนาดรวมเพียง ~ 3.5 GB เท่านั้น
script/console : script/console
/src คุณสามารถแยกออกจาก/แนบไปยังคอนเทนเนอร์นี้เพื่อหยุด/ทำงานต่อสำหรับข้อมูลเพิ่มเติมเกี่ยวกับข้อมูลดูรายละเอียดข้อมูลด้านล่างรวมถึงสมุดบันทึกนี้
หากคุณเรียกใช้ขั้นตอนการตั้งค่าด้านบนคุณจะมีข้อมูลอยู่แล้วและไม่จำเป็นต้องทำอะไรอีกแล้ว ข้อมูลจะมีอยู่ใน /resources/data ของที่เก็บนี้ด้วยโครงสร้างไดเรกทอรีนี้
ข้อมูลจะถูกเก็บไว้ในรูปแบบ jsonlines แต่ละบรรทัดในไฟล์ที่ไม่ได้บีบอัดแสดงถึงตัวอย่างหนึ่ง (โดยปกติจะเป็นฟังก์ชันที่มีความคิดเห็นที่เกี่ยวข้อง) ตัวอย่างที่สวยงามของหนึ่งแถวแสดงไว้ด้านล่าง
original_string นั่นคือรหัสcode รุ่นโทเค็นdocstring เวอร์ชันโทเค็นรหัสความคิดเห็นและเอกสารถูกสกัดในลักษณะเฉพาะภาษาลบสิ่งประดิษฐ์ของภาษานั้น
{
'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 จะดาวน์โหลดไฟล์เหล่านี้ลงในไดเรกทอรี /resources/data โดยอัตโนมัติ นี่คือลิงค์ไปยังไฟล์ที่เกี่ยวข้องสำหรับการมองเห็น:
ลิงก์ S3 เป็นไปตามรูปแบบนี้:
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/ {python,java,go,php,javascript,ruby}.zip
ตัวอย่างเช่นลิงก์สำหรับ java คือ:
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/java.zip
ขนาดของชุดข้อมูลอยู่ที่ประมาณ 20 GB มีการอธิบายไฟล์ต่าง ๆ และโครงสร้างไดเรกทอรีที่นี่
ในการฝึกอบรมแบบจำลองระบบประสาทด้วยชุดข้อมูลขนาดใหญ่เราใช้ความคิดเห็นของเอกสาร (เช่นเอกสาร) เป็นพร็อกซี สำหรับการประเมินผล (และลีดเดอร์บอร์ด) เราได้รวบรวมการตัดสินความเกี่ยวข้องของมนุษย์ของคู่ของการสืบค้นภาษาธรรมชาติที่ดูสมจริงและรหัสตัวอย่าง ตอนนี้ความท้าทายได้รับการสรุปแล้วเราให้ข้อมูลที่นี่เป็น .csv พร้อมฟิลด์ต่อไปนี้:
URL ในข้อมูล (ดูที่นี่)เราขอแนะนำให้คุณทำซ้ำและขยายโมเดลเหล่านี้แม้ว่าตัวแปรส่วนใหญ่ใช้เวลาหลายชั่วโมงในการฝึกอบรม (และใช้เวลามากกว่า 24 ชั่วโมงในอินสแตนซ์ AWS P3-V100)
โมเดลพื้นฐานของเรานำเข้าสู่คลังข้อมูลคู่ขนานของ ( comments code ) และเรียนรู้ที่จะดึงข้อมูลโค้ดให้กับแบบสอบถามภาษาธรรมชาติ โดยเฉพาะ comments คือฟังก์ชั่นระดับบนสุดและวิธีการความคิดเห็น (เช่นเอกสารใน Python) และ code เป็นฟังก์ชั่นหรือวิธีการทั้งหมด ตลอดการซื้อคืนนี้เราอ้างถึงคำศัพท์และการสืบค้นแทนกัน
แบบสอบถามมีตัวเข้ารหัสเดียวในขณะที่แต่ละภาษาการเขียนโปรแกรมมีตัวเข้ารหัสของตัวเอง ตัวเข้ารหัสที่มีอยู่คือ neural-bag-of-words, RNN, 1D-CNN, การแทรกแซงตนเอง (BERT) และไฮบริด 1D-CNN+ด้วยตนเอง
แผนภาพด้านล่างแสดงสถาปัตยกรรมทั่วไปของรุ่นพื้นฐานของเรา:

ขั้นตอนนี้ถือว่าคุณมี Nvidia-GPU ที่เหมาะสมพร้อม CUDA V9.0 ที่ติดตั้ง เราใช้อินสแตนซ์ AWS P3-V100 ( p3.2xlarge เพียงพอ)
เริ่มสภาพแวดล้อมการเรียกใช้แบบจำลองโดยใช้ script/console :
script/console
สิ่งนี้จะทำให้คุณเข้าไปในเชลล์ของคอนเทนเนอร์ Docker พร้อมกับการพึ่งพาที่จำเป็นทั้งหมดที่ติดตั้งรวมถึงรหัสในที่เก็บนี้พร้อมกับข้อมูลที่คุณดาวน์โหลดก่อนหน้านี้ โดยค่าเริ่มต้นคุณจะถูกวางไว้ใน src/ โฟลเดอร์ของที่เก็บ 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
Hyperparameters มีความเฉพาะเจาะจงกับคลาสโมเดล/ตัวเข้ารหัสที่เกี่ยวข้อง เคล็ดลับง่ายๆในการค้นพบพวกเขาคือการเริ่มต้นการวิ่งโดยไม่ระบุตัวเลือกไฮเปอร์พารามิเตอร์เนื่องจากจะพิมพ์รายการของพารามิเตอร์ที่ใช้ทั้งหมดที่ใช้ทั้งหมดด้วยค่าเริ่มต้น (ในรูปแบบ JSON)
เราใช้มาตรฐานชุมชนสำหรับโครงการนี้เพื่อส่งเสริมการทำงานร่วมกันและปรับปรุงการทำซ้ำ มันโฮสต์โดยน้ำหนักและอคติ (W&B) ซึ่งฟรีสำหรับโครงการโอเพนซอร์ส รายการของเราในการเชื่อมโยงมาตรฐานไปยังบันทึกรายละเอียดของตัวชี้วัดการฝึกอบรมและการประเมินผลของเรารวมถึงสิ่งประดิษฐ์แบบจำลองและเราสนับสนุนให้ผู้เข้าร่วมคนอื่น ๆ ให้รายละเอียดมากที่สุด
เราขอเชิญชวนชุมชนให้ส่งการวิ่งไปยังเกณฑ์มาตรฐานนี้เพื่ออำนวยความสะดวกให้เกิดความโปร่งใสโดยทำตามคำแนะนำเหล่านี้
เราคาดหวังว่าชุมชนจะออกแบบสถาปัตยกรรมที่กำหนดเองและใช้เฟรมเวิร์กอื่นนอกเหนือจาก TensorFlow นอกจากนี้เราคาดหวังว่าชุดข้อมูลเพิ่มเติมจะมีประโยชน์ ไม่ใช่ความตั้งใจของเราที่จะรวมโมเดลวิธีการและชุดข้อมูลเหล่านี้เข้ากับที่เก็บนี้เป็นแนวคิดที่มีอยู่ทั้งหมด แต่เราตั้งใจที่จะรักษาโมเดลพื้นฐานและเชื่อมโยงไปยังข้อมูลในที่เก็บนี้เป็นสถานที่สำคัญของการอ้างอิง เรากำลังรับ PRS ที่อัปเดตเอกสารลิงก์ไปยังโครงการของคุณด้วยการปรับปรุงเกณฑ์มาตรฐานแก้ไขข้อบกพร่องหรือทำการปรับปรุงเล็กน้อยในรหัส นี่คือแนวทางที่เฉพาะเจาะจงมากขึ้นสำหรับการมีส่วนร่วมในที่เก็บนี้ หมายเหตุโดยเฉพาะอย่างยิ่งจรรยาบรรณของเรา โปรดเปิดปัญหาหากคุณไม่แน่ใจในแนวทางปฏิบัติที่ดีที่สุด
เพื่อเริ่มต้น w & b:
นำทางไปยังไดเรกทอรี /src ในที่เก็บนี้
หากเป็นครั้งแรกที่คุณใช้ W&B บนเครื่องคุณจะต้องเข้าสู่ระบบ:
$ wandb login
คุณจะถูกถามถึงคีย์ API ของคุณซึ่งจะปรากฏในหน้าการตั้งค่าโปรไฟล์ W&B ของคุณ
ใบอนุญาตสำหรับซอร์สโค้ดที่ใช้เป็นข้อมูลสำหรับโครงการนี้มีการดาวน์โหลดข้อมูลสำหรับแต่ละภาษาในไฟล์ _licenses.pkl
รหัสและเอกสารนี้สำหรับโครงการนี้จะถูกเผยแพร่ภายใต้ใบอนุญาต MIT