曉查 發自 凹非寺
量子位 報道 | 公衆号 QbitAI
“如何關閉或隐藏Android軟鍵盤?”
如果你是個Android入門開發者,去Stack Overflow論壇去尋找上非常熱門的Android開發問題,很快會有别人貼出一段代碼。
遇到編程問題,程序員恐怕首先想到的是去技術論壇搜索結果,然後從回答中尋找代碼。
然而有很多冷門問題,通常并不會在論壇中讨論,如果能在廣闊的GitHub代碼庫中快速找到答案就好了。
為此,Facebook開發了一種代碼搜索工具,可将自然語言處理(NLP)和信息檢索(IR)技術直接應用于源代碼文本。
這套工具稱為神經代碼搜索(NCS),它接受自然語言形式的查詢,并直接從GitHub庫中檢索返回相關代碼片段。
除了NCS之外,另外還有一種用監督數據提高網絡性能的UNIF。
小試牛刀
Facebook使用Stack Overflow上Android開發的問題評估NCS的性能,看看模型是否能夠從GitHub中找到正确的答案。
在Stack Overflow評估數據集中的287個問題中,NCS的前10個查詢結果能夠正确回答175個問題,占整個數據集的60%以上。與傳統的信息檢索技術BM25相比,有了非常大的提升。
我們将NCS和UNIF與Stack Overflow評估數據集進行比較,證實UNIF改善了大大超過NCS回答的問題數量。
結果顯示監督技術在獲得理想的訓練語料庫時可以提供的更優的搜索性能。
例如,搜索查詢“如何退出應用程序并顯示主屏幕”這個問題,NCS返回:
public void showHomeScreenDialog(View view) { intent nextScreen = new Intent(getApplicationContext(), HomeScreenActivity.class); startActivity(nextScreen); }
而UNIF提供了更适合的代碼段:
public void clickExit(MenuItem item) { Intent intent=new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); metr.stop(); startActivity(intent); finish(); }
原理
Facebook利用了開源AI工具fastText、FAISS和PyTorch,NCS和UNIF将自然語言查詢和代碼片段表示為向量,然後訓練網絡,使得語義相似的代碼片段和查詢的向量表示緊密相連在向量空間。
通過這些模型,可以直接從代碼語料庫中找到代碼片段,有效地回答程序員的問題。
NCS
NCS模型通過使用嵌入來獲取程序語義,在向量空間中語義相似的實體具有彼此接近的期望屬性。在下面的例子裡,有兩個不同的代碼,它們都與關閉或隐藏Android鍵盤有關。由于它們具有相似的語義含義,即使它們代碼不完全相同,再向量空間中的距離也很近。
Facebook使用這個概念來構建NCS模型。在高級别中,模型生成的每個代碼片段以方法級粒度嵌入到向量空間中。構建模型後,某個查詢将映射到同一向量空間,向量距離用于估計代碼段與查詢的相關性。
要生成模型,NCS必須提取單詞,構建單詞嵌入,然後構建文檔嵌入。
為了生成表示代碼的向量,Facebook将源代碼視為文本,并從以下語法類别中提取:方法名稱,方法調用,枚舉,字符串文字和注釋。然後我們根據标準英語慣例(例如空格,标點符号)和與代碼相關的标點符号對其進行标記。
例如,對于上圖中的方法體“pxToDp”,可以将源代碼視為單詞集合:“将dp px中的px轉換為dp獲取資源、獲取顯示指标”。
fastText為詞彙語料庫中的所有單詞構建單詞嵌入。fastText使用兩層密集神經網絡計算向量表示,該網絡可以在大型語料庫上無人監督地進行訓練。
而UNIF是NCS的擴展,當有監督數據可用于訓練時,可以用來提高性能。
在GitHub上挑選26,109個最受歡迎的Android項目,直接在搜索語料庫上訓練我們的無監督模型NCS。這也成為NCS返回代碼片段的搜索語料庫。
至于UNIF模型,我Facebook提取Stack Overflow論壇中問題标題和代碼片段來獲取數據集。在使用各種啟發式過濾問題後,最終得到451,000個訓練樣本。
論文地址:
htt
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!