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