用自然語言從GitHub搜代碼,跳過論壇提問環(huán)節(jié),來自Facebook新研究
Facebook開發(fā)了一種代碼搜索工具,可將自然語言處理(NLP)和信息檢索(IR)技術(shù)直接應(yīng)用于源代碼文本。
曉查 發(fā)自 凹非寺
量子位 報道 | 公眾號 QbitAI
“如何關(guān)閉或隱藏Android軟鍵盤?”
如果你是個Android入門開發(fā)者,去Stack Overflow論壇去尋找上非常熱門的Android開發(fā)問題,很快會有別人貼出一段代碼。
遇到編程問題,程序員恐怕首先想到的是去技術(shù)論壇搜索結(jié)果,然后從回答中尋找代碼。
然而有很多冷門問題,通常并不會在論壇中討論,如果能在廣闊的GitHub代碼庫中快速找到答案就好了。
為此,F(xiàn)acebook開發(fā)了一種代碼搜索工具,可將自然語言處理(NLP)和信息檢索(IR)技術(shù)直接應(yīng)用于源代碼文本。
這套工具稱為神經(jīng)代碼搜索(NCS),它接受自然語言形式的查詢,并直接從GitHub庫中檢索返回相關(guān)代碼片段。
除了NCS之外,另外還有一種用監(jiān)督數(shù)據(jù)提高網(wǎng)絡(luò)性能的UNIF。
小試牛刀
Facebook使用Stack Overflow上Android開發(fā)的問題評估NCS的性能,看看模型是否能夠從GitHub中找到正確的答案。
在Stack Overflow評估數(shù)據(jù)集中的287個問題中,NCS的前10個查詢結(jié)果能夠正確回答175個問題,占整個數(shù)據(jù)集的60%以上。與傳統(tǒng)的信息檢索技術(shù)BM25相比,有了非常大的提升。
我們將NCS和UNIF與Stack Overflow評估數(shù)據(jù)集進(jìn)行比較,證實UNIF改善了大大超過NCS回答的問題數(shù)量。
結(jié)果顯示監(jiān)督技術(shù)在獲得理想的訓(xùn)練語料庫時可以提供的更優(yōu)的搜索性能。
例如,搜索查詢“如何退出應(yīng)用程序并顯示主屏幕”這個問題,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將自然語言查詢和代碼片段表示為向量,然后訓(xùn)練網(wǎng)絡(luò),使得語義相似的代碼片段和查詢的向量表示緊密相連在向量空間。
通過這些模型,可以直接從代碼語料庫中找到代碼片段,有效地回答程序員的問題。
NCS
NCS模型通過使用嵌入來獲取程序語義,在向量空間中語義相似的實體具有彼此接近的期望屬性。在下面的例子里,有兩個不同的代碼,它們都與關(guān)閉或隱藏Android鍵盤有關(guān)。由于它們具有相似的語義含義,即使它們代碼不完全相同,再向量空間中的距離也很近。
Facebook使用這個概念來構(gòu)建NCS模型。在高級別中,模型生成的每個代碼片段以方法級粒度嵌入到向量空間中。構(gòu)建模型后,某個查詢將映射到同一向量空間,向量距離用于估計代碼段與查詢的相關(guān)性。
要生成模型,NCS必須提取單詞,構(gòu)建單詞嵌入,然后構(gòu)建文檔嵌入。
為了生成表示代碼的向量,F(xiàn)acebook將源代碼視為文本,并從以下語法類別中提?。悍椒Q,方法調(diào)用,枚舉,字符串文字和注釋。然后我們根據(jù)標(biāo)準(zhǔn)英語慣例(例如空格,標(biāo)點符號)和與代碼相關(guān)的標(biāo)點符號對其進(jìn)行標(biāo)記。
例如,對于上圖中的方法體“pxToDp”,可以將源代碼視為單詞集合:“將dp px中的px轉(zhuǎn)換為dp獲取資源、獲取顯示指標(biāo)”。
fastText為詞匯語料庫中的所有單詞構(gòu)建單詞嵌入。fastText使用兩層密集神經(jīng)網(wǎng)絡(luò)計算向量表示,該網(wǎng)絡(luò)可以在大型語料庫上無人監(jiān)督地進(jìn)行訓(xùn)練。
而UNIF是NCS的擴(kuò)展,當(dāng)有監(jiān)督數(shù)據(jù)可用于訓(xùn)練時,可以用來提高性能。
在GitHub上挑選26,109個最受歡迎的Android項目,直接在搜索語料庫上訓(xùn)練我們的無監(jiān)督模型NCS。這也成為NCS返回代碼片段的搜索語料庫。
至于UNIF模型,我Facebook提取Stack Overflow論壇中問題標(biāo)題和代碼片段來獲取數(shù)據(jù)集。在使用各種啟發(fā)式過濾問題后,最終得到451,000個訓(xùn)練樣本。
論文地址:
https://arxiv.org/pdf/1905.03813.pdf