CodesearchNet挑戰已得出結論
我們要感謝所有參與者的意見,我們希望這一挑戰為從業者和研究人員就語義代碼搜索和激勵新研究的挑戰提供了見解。我們想鼓勵每個人繼續使用數據集和人類評估,我們現在公開提供。請,請參閱下面的詳細信息,特別是評估部分。
不會接受對挑戰的新提交。
目錄
如果這是您第一次閱讀本文,我們建議跳過本節並閱讀以下各節。下面的命令假定您有Docker和Nvidia-Docker,以及支持CUDA 9.0或更高版本的GPU。注意:您只需要運行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的Github與Deep Program Gealpt Group之間的共同合作。我們旨在通過以下內容提供一個關於語義代碼搜索的社區研究平台:
我們希望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}
}
主要數據集由開源庫中的200萬( comment , code )對組成。具體而言, comment是頂級函數或方法註釋(例如Python中的DocStrings), 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 GB。
script/console : script/console
/src目錄開始,這將使您進入Docker容器。您可以脫離/附加到此容器中以暫停/繼續工作。有關數據的更多信息,請參見下面的數據詳細信息以及此筆記本。
如果您已經在上方運行了設置步驟,則將已經擁有數據,而無需完成。數據將在此存儲庫的/resources/data文件夾中可用,並具有此目錄結構。
數據以JSONLINE格式存儲。未壓縮文件中的每一行都代表一個示例(通常具有關聯註釋的函數)。下面說明了一個排列的一行示例。
original_string的一部分是代碼code的令牌版本docstring的令牌版本代碼,評論和docstrings以特定語言的方式提取,以刪除該語言的文物。
{
'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'
}
摘要統計數據,例如行計數和令牌長度直方圖,可以在此筆記本中找到
Shell腳本/script/setup將自動將這些文件下載到/resources/data目錄中。這是有關可見性的相關文件的鏈接:
S3鏈接遵循以下模式:
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/ {python ,,
例如, java的鏈接是:
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/java.zip
數據集的大小約為20 GB。這裡說明了各種文件和目錄結構。
為了使用大型數據集訓練神經模型,我們將文檔註釋(例如DocStrings)作為代理。為了進行評估(和排行榜),我們收集了人類的相關性判斷,這些判斷是成對現實的自然語言查詢和代碼片段。既然挑戰已經得出結論,我們在此提供了一個.csv ,並具有以下字段:
URL鍵(請參見此處)。我們鼓勵您複製和擴展這些模型,儘管大多數變體需要幾個小時才能訓練(有些變體在AWS P3-V100實例上需要24小時以上)。
我們的基線模型攝入了( comments , code )的平行語料庫,並學會在自然語言查詢中檢索代碼段。具體而言, comments是頂級功能和方法註釋(例如Python中的DocStrings), code是整個函數或方法。在整個倉庫中,我們會互換術語docstring和查詢。
查詢具有單個編碼器,而每個編程語言都有自己的編碼器。可用的編碼器是神經袋,RNN,1D-CNN,自我注意力(BERT)和1D-CNN+自我注意力集合。
下圖說明了我們基線模型的一般體系結構:

此步驟假設您安裝了CUDA v9.0合適的NVIDIA-GPU。我們使用了AWS P3-V100實例( p3.2xlarge就足夠了)。
通過運行script/console開始模型運行環境:
script/console
這將使您進入Docker容器的外殼,並安裝了所有必要的依賴項,包括該存儲庫中的代碼以及您之前下載的數據。默認情況下,您將放置在此GitHub存儲庫的src/文件夾中。從這裡,您可以執行命令運行模型。
如果您想在社區基准上分享您的結果,請根據以下說明設置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 data_dirs_ {train,valid,test} .txt中指定。這些文件每個都包含一個路徑列表,其中存在相應分區的數據。如果指定了多個路徑(由newline隔開),則所有路徑的數據將被串聯在一起。例如,這是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文件夾中。
僅在Python數據上培訓1D-CNN模型:
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默認位置,還覆蓋了火車,驗證和測試集的來源。
附加說明:
當前在src/model_restore_helper.get_model_class_from_name中列出了--model的選項。
超參數特定於相應的模型/編碼類類。發現它們的一個簡單技巧是在不指定超參數選擇的情況下啟動運行,因為這將打印所有使用其默認值(以JSON格式)的所有使用過的超參數的列表。
我們正在為該項目使用社區基準,以鼓勵協作並提高可重複性。它是由重量和偏見(W&B)託管的,這是免費的開源項目。我們在基準測試中的條目鏈接到我們培訓和評估指標的詳細日誌以及模型工件,我們鼓勵其他參與者提供盡可能多的細節。
我們邀請社區通過按照以下說明提高透明度,以促進透明度。
我們預計社區將設計自定義體系結構,並使用TensorFlow以外的其他框架。此外,我們預計其他數據集將有用。我們並不是要將這些模型,方法和數據集集成到該存儲庫中,以作為所有可用想法的超集。相反,我們打算維護基線模型,並鏈接到該存儲庫中的數據,作為中心參考地點。我們正在接受更新文檔,通過改進基準的項目鏈接到您的項目的PR,修復錯誤或對代碼進行較小的改進。以下是為該存儲庫做出貢獻的更具體的指南;特別注意我們的行為準則。如果您不確定最佳的行動方案,請打開一個問題。
初始化W&B:
導航到此存儲庫中的/src目錄。
如果是您第一次在機器上使用W&B,則需要登錄:
$ wandb login
將要求您提供您的API密鑰,其中顯示在W&B配置文件設置頁面上。
_licenses.pkl文件中的每種語言下載的數據下載提供了用於該項目數據的源代碼的許可。
該項目的此代碼和文檔是根據MIT許可發布的。