








收稿日期:2022-05-14;修回日期:2022-07-06" 基金項(xiàng)目:四川省重點(diǎn)研發(fā)資助項(xiàng)目(2020YFG0299)
作者簡(jiǎn)介:鄧斯元(1997-),男,四川瀘州人,碩士研究生,主要研究方向?yàn)橹悄芊?wù)、大數(shù)據(jù);魏樂(lè)(1979-),男(通信作者),河南鄭州人,副教授,碩導(dǎo),碩士,主要研究方向?yàn)橹悄芊?wù)、云制造、大數(shù)據(jù)(weile@cuit.edu.cn);舒紅平(1974-),男,重慶人,教授,博導(dǎo),博士,主要研究方向?yàn)檐浖こ獭?shù)據(jù)挖掘、企業(yè)信息化.
摘 要:在當(dāng)前的軟件開(kāi)發(fā)環(huán)境中,海量的低質(zhì)量、無(wú)意義的代碼知識(shí)為開(kāi)發(fā)人員進(jìn)行代碼復(fù)用造成了阻礙,大大降低了軟件開(kāi)發(fā)效率。為了快速準(zhǔn)確地為開(kāi)發(fā)人員推薦高質(zhì)量的代碼知識(shí),提出了基于SBERT(sentence-BERT)模型的代碼片段推薦方法CSRSB(code snippets recommendation based on sentence-BERT)。該方法首先獲取海量的高質(zhì)量數(shù)據(jù)來(lái)構(gòu)建代碼語(yǔ)料庫(kù),并基于深度學(xué)習(xí)模型SBERT為代碼片段對(duì)應(yīng)的自然語(yǔ)言描述和用戶(hù)輸入的自然語(yǔ)言查詢(xún)生成具有豐富語(yǔ)義的句向量,通過(guò)比較點(diǎn)積相似度來(lái)實(shí)現(xiàn)代碼片段的推薦。使用命中率、平均倒數(shù)排名和平均準(zhǔn)確率這三個(gè)常用推薦評(píng)估指標(biāo)與現(xiàn)有相關(guān)研究中的方法進(jìn)行對(duì)比來(lái)驗(yàn)證該方法的有效性。實(shí)驗(yàn)結(jié)果表明,CSRSB在有效提高代碼片段推薦準(zhǔn)確度的同時(shí)也能夠做到快速推薦。
關(guān)鍵詞:代碼復(fù)用;代碼語(yǔ)料庫(kù);深度學(xué)習(xí);代碼片段推薦
中圖分類(lèi)號(hào):TP391"" 文獻(xiàn)標(biāo)志碼:A
文章編號(hào):1001-3695(2022)12-032-3730-06
doi:10.19734/j.issn.1001-3695.2022.05.0242
Code snippets recommendation based on SBERT model
Deng Siyuan1,Wei Le1,2,Shu Hongping2
(1.School of Software Engineering,Chengdu University of Information Technology,Chengdu 610225,China;2.Automatic Software Generation amp; Intelligence Service Key Laboratory of Sichuan Province,Chengdu 610225,China)
Abstract:In the current software development environment,a large amount of low-quality and meaningless code knowledge hinders developers from code reuse,which greatly reduces the efficiency of software empolder.In order to quickly and accurately recommend high-quality code knowledge for developers,this paper proposed a code snippets recommendation method CSRSB based on SBERT model.Firstly,the method obtained massive high-quality data to build a code corpus.It also generated sentence vectors with rich semantics for the natural language description corresponding to the code snippets and the natural language query input by the user based on the deep learning model SBERT.Then,it implemented code snippets recommendations by comparing the dot product similarity.It verified the effectiveness of the method by comparing the three commonly used re-commendation evaluation metrics,hit ratio,mean reciprocal rank and mean average precision,with the methods in existing related research.The experimental results show that CSRSB can effectively improve the accuracy of code snippets recommendation and achieve fast recommendations.
Key words:code reuse;code corpus;deep learning;code snippets recommendation
0 引言
在開(kāi)源的軟件生態(tài)環(huán)境下,開(kāi)發(fā)人員能夠從諸如CSDN、SourceForge、GitHub、StackOverflow這樣的大型開(kāi)源社區(qū)和問(wèn)答網(wǎng)站上獲取海量的高質(zhì)量代碼資源,通過(guò)代碼復(fù)用的方式來(lái)進(jìn)行軟件開(kāi)發(fā),顯著提高了開(kāi)發(fā)效率。傳統(tǒng)的推薦方式基于信息檢索模型來(lái)進(jìn)行推薦,將代碼推薦問(wèn)題轉(zhuǎn)換為代碼(特殊文本)和查詢(xún)(普通文本)之間的字符匹配問(wèn)題,通過(guò)關(guān)鍵字在代碼庫(kù)中找到目標(biāo)代碼[1]。如Lu等人[2]提出的INQRES和Raghothaman等人[3]提出的SWIM等方法。然而基于信息檢索的方法存在許多缺陷,比較關(guān)鍵的是由于自然語(yǔ)言查詢(xún)的高層級(jí)意圖與代碼的低層級(jí)實(shí)現(xiàn)細(xì)節(jié)不匹配[4]。所以傳統(tǒng)的代碼推薦方式容易導(dǎo)致錯(cuò)誤匹配,使得推薦準(zhǔn)確性低,需要人工鑒別。
隨著大數(shù)據(jù)和深度學(xué)習(xí)等技術(shù)的飛速發(fā)展,代碼推薦的方式已經(jīng)逐漸從傳統(tǒng)的信息檢索模型轉(zhuǎn)換到深度學(xué)習(xí)模型。現(xiàn)有的海量代碼資源能夠滿(mǎn)足深度學(xué)習(xí)模型訓(xùn)練所需的數(shù)據(jù)量,訓(xùn)練好之后的深度學(xué)習(xí)模型比之傳統(tǒng)的信息檢索模型在準(zhǔn)確率上有著很大的提升。如Gu等人[5]在2016年提出的首個(gè)基于深度學(xué)習(xí)模型的推薦方法DeepAPI和Gu等人[6]在2018年提出的DeepCS。
然而現(xiàn)有的研究仍然存在一些問(wèn)題:
a)代碼語(yǔ)料庫(kù)中數(shù)據(jù)的質(zhì)量參差不齊,缺乏公認(rèn)的、統(tǒng)一的、高質(zhì)量的、規(guī)范的大型代碼語(yǔ)料庫(kù)。許多現(xiàn)有研究中用到的數(shù)據(jù)集都是從開(kāi)源社區(qū)上爬取的項(xiàng)目,雖然更接近于實(shí)際軟件開(kāi)發(fā),但是也難以保證代碼的質(zhì)量,而低質(zhì)量、不規(guī)范的代碼會(huì)給神經(jīng)網(wǎng)絡(luò)帶來(lái)額外的噪聲,而使用不同編程規(guī)范的代碼則會(huì)使神經(jīng)網(wǎng)絡(luò)模型在訓(xùn)練和預(yù)測(cè)時(shí)產(chǎn)生混淆[7]。
b)現(xiàn)有大量研究中所用的諸如CNN(convolutional neural network)、RNN(recurrent neural network)、LSTM(long short-term memory)等模型在代碼推薦領(lǐng)域上的性能已較為落后。而近年來(lái)由于深度學(xué)習(xí)的飛速發(fā)展,許多新的技術(shù)和模型被提出[8],這些新技術(shù)和新模型在部分相關(guān)任務(wù)中已被證實(shí)比現(xiàn)有代碼推薦研究中所用模型的性能更好,所以如果將這些新技術(shù)和新模型應(yīng)用到代碼推薦領(lǐng)域中也許能夠更進(jìn)一步地提高代碼推薦的準(zhǔn)確度。
c)在測(cè)量工具性能時(shí),很少評(píng)估推薦時(shí)間和工具的可擴(kuò)展性,也沒(méi)有考慮其他方面的重要性能,例如代碼多樣性和簡(jiǎn)潔性[9]等。
針對(duì)上述問(wèn)題,本文提出一種基于SBERT模型的代碼片段推薦方法。該方法中構(gòu)建的代碼語(yǔ)料庫(kù)不同于尋常通過(guò)爬取開(kāi)源社區(qū)和問(wèn)答網(wǎng)站中的數(shù)據(jù)構(gòu)建代碼語(yǔ)料庫(kù),而是通過(guò)對(duì)國(guó)外一些專(zhuān)門(mén)構(gòu)建的代碼數(shù)據(jù)集(如CodeSearchNet[10]、CONCODE[11]、FunCom[12]、DeepCom[13]等)中的數(shù)據(jù)進(jìn)行篩選和清洗工作來(lái)構(gòu)建代碼語(yǔ)料庫(kù)。同時(shí)本文不同于以往將源代碼和相應(yīng)的自然語(yǔ)言描述作為數(shù)據(jù)集來(lái)訓(xùn)練深度學(xué)習(xí)模型的方法,而是通過(guò)SBERT[14]模型將代碼語(yǔ)料庫(kù)中代碼片段所對(duì)應(yīng)的自然語(yǔ)言描述與用戶(hù)輸入的自然語(yǔ)言查詢(xún)映射到同一向量空間中,通過(guò)向量之間相似度比較并進(jìn)行排序?yàn)橛脩?hù)推薦相應(yīng)的代碼片段。
1 相關(guān)工作
1.1 改進(jìn)和優(yōu)化深度學(xué)習(xí)模型
近年來(lái)部分研究通過(guò)改進(jìn)和優(yōu)化各種模型來(lái)提高代碼推薦的準(zhǔn)確度。如Fang等人[15]提出了自注意力聯(lián)合表示學(xué)習(xí)模型SAN-CS,基于自注意力網(wǎng)絡(luò)構(gòu)建額外的聯(lián)合表示網(wǎng)絡(luò),學(xué)習(xí)代碼上下文表示來(lái)捕獲全局語(yǔ)義關(guān)系,使得代碼向量可以與查詢(xún)向量有更深層次的語(yǔ)義關(guān)系,且具有較高的執(zhí)行效率;Wang等人[16]提出了QueCos,該模型基于強(qiáng)化學(xué)習(xí)(reinforcement learning)模型進(jìn)行訓(xùn)練,可以捕獲用戶(hù)給定查詢(xún)中的關(guān)鍵語(yǔ)義,使得用戶(hù)查詢(xún)與代碼描述之間的匹配更加準(zhǔn)確;Du等人[17]提出了多模型集成學(xué)習(xí)架構(gòu)MuCoS,其中包含了幾個(gè)單獨(dú)的學(xué)習(xí)器,每個(gè)學(xué)習(xí)器都對(duì)應(yīng)代碼片段的特定視角。然后在包含不同視角的代碼信息的不同數(shù)據(jù)集上訓(xùn)練這些學(xué)習(xí)器,并使用數(shù)據(jù)增強(qiáng)策略來(lái)獲取這些不同的數(shù)據(jù)集。最后將這些學(xué)習(xí)器集合起來(lái)以捕獲代碼片段的綜合特征,獲得了更好的推薦準(zhǔn)確率。
這類(lèi)方法的缺點(diǎn)和不足在于改進(jìn)和優(yōu)化深度學(xué)習(xí)模型的關(guān)鍵是為了解決自然語(yǔ)言描述與代碼之間的語(yǔ)義差問(wèn)題,然而現(xiàn)在并沒(méi)有明確的參數(shù)或指標(biāo)能夠證明研究中的語(yǔ)義差足夠小從而不影響推薦的準(zhǔn)確度,因此這類(lèi)方法雖然能夠提高代碼推薦的準(zhǔn)確度,但仍然存在誤差。
1.2 處理自然語(yǔ)言查詢(xún)
近年來(lái)部分研究通過(guò)處理用戶(hù)輸入的查詢(xún)來(lái)提高推薦準(zhǔn)確度。如Eberhart等人[18]通過(guò)澄清問(wèn)題(clarifying question)來(lái)完善用戶(hù)的查詢(xún),提出了一種使用從函數(shù)名稱(chēng)和注釋中提取的信息來(lái)生成比較自然的澄清問(wèn)題的方法,并且證明在綜合研究中優(yōu)于基于關(guān)鍵字的單輪細(xì)化方法;Rao等人[19]提出了一種基于弱監(jiān)督的方法用于檢測(cè)C#和Java編程語(yǔ)言搜索查詢(xún)中的代碼搜索意圖,將用戶(hù)的查詢(xún)分類(lèi)為是否可以用一段代碼充分回答,同時(shí)還發(fā)布了第一個(gè)從Bing網(wǎng)絡(luò)搜索引擎中挖掘的大規(guī)模真實(shí)數(shù)據(jù)集Search4Code,為之后的研究提供了基礎(chǔ)。
這類(lèi)方法的缺點(diǎn)和不足在于許多現(xiàn)有研究構(gòu)建的代碼語(yǔ)料庫(kù)數(shù)據(jù)量比較小,雖然保證了語(yǔ)料庫(kù)的高質(zhì)量,但卻忽略了一個(gè)關(guān)鍵的問(wèn)題:用戶(hù)希望獲得的真實(shí)答案也許并未包含在數(shù)據(jù)量較小的代碼語(yǔ)料庫(kù)中,這樣推薦的結(jié)果雖然有參考性但并不一定是正確的,使得推薦的結(jié)果沒(méi)有說(shuō)服力。
1.3 提升代碼語(yǔ)料庫(kù)質(zhì)量
近年來(lái)部分研究通過(guò)提升代碼語(yǔ)料庫(kù)中數(shù)據(jù)的質(zhì)量來(lái)提高代碼推薦的準(zhǔn)確度。如Sun等人[20]提出了由基于規(guī)則的句法過(guò)濾器和基于模型的語(yǔ)義過(guò)濾器。兩個(gè)后續(xù)過(guò)濾器組成的數(shù)據(jù)清洗框架
將代碼語(yǔ)料庫(kù)中的數(shù)據(jù)通過(guò)該框架進(jìn)行清洗可以提高數(shù)據(jù)集質(zhì)量,并使代碼語(yǔ)料庫(kù)中的描述在語(yǔ)義上更接近真實(shí)的用戶(hù)查詢(xún)。
這類(lèi)方法的缺點(diǎn)和不足在于用戶(hù)的查詢(xún)有時(shí)并不是明確而具體的,也許用戶(hù)只是希望獲取與查詢(xún)相關(guān)的知識(shí),在這種情況下如果通過(guò)完善和改進(jìn)查詢(xún)使其更具體會(huì)適得其反,因此分析判斷查詢(xún)的真實(shí)意圖也是非常有必要的。
前三小節(jié)介紹了代碼推薦領(lǐng)域常用的三種推薦方式,每種方式中所介紹的方法均為近1~2年來(lái)代碼推薦領(lǐng)域的最新方法。其中無(wú)論是通過(guò)改進(jìn)模型、優(yōu)化查詢(xún)還是提升代碼質(zhì)量的方式來(lái)實(shí)現(xiàn)代碼推薦,關(guān)鍵在于如何高效學(xué)習(xí)自然語(yǔ)言查詢(xún)和代碼中的語(yǔ)法和語(yǔ)義,盡量減小自然語(yǔ)言查詢(xún)與代碼之間的語(yǔ)義差。如1.1節(jié)中的MuCoS方法同時(shí)學(xué)習(xí)了代碼中的三種重要特征、1.2節(jié)中的clarifying question方法生成了澄清問(wèn)題、1.3節(jié)中的方法設(shè)計(jì)了數(shù)據(jù)清洗框架。雖然具體實(shí)現(xiàn)細(xì)節(jié)均不同,但核心都是增強(qiáng)查詢(xún)和代碼中的語(yǔ)法及語(yǔ)義來(lái)提高代碼推薦準(zhǔn)確率。
2 代碼片段推薦方法CSRSB
本文提出的代碼片段推薦方法CSRSB主要針對(duì)Java中的代碼片段進(jìn)行推薦,其中每個(gè)代碼片段都是由Java語(yǔ)言構(gòu)造的一個(gè)獨(dú)立的方法,并且都有一段與之相對(duì)應(yīng)的自然語(yǔ)言描述來(lái)解釋其功能。CSRSB主要包含數(shù)據(jù)收集和清洗、自然語(yǔ)言描述和查詢(xún)向量生成模型、用戶(hù)線(xiàn)上查詢(xún)推薦三個(gè)模塊。本文方法的整體架構(gòu)如圖1所示。
2.1 數(shù)據(jù)收集和清洗
本文代碼語(yǔ)料庫(kù)中的數(shù)據(jù)來(lái)源于現(xiàn)有的CodeSearchNet、DeepCom和CONCODE三個(gè)大型代碼—描述并行數(shù)據(jù)集。
CodeSearchNet中包括了由6種編程語(yǔ)言組成的共210萬(wàn)條代碼—描述并行數(shù)據(jù)和640萬(wàn)個(gè)單語(yǔ)代碼數(shù),選取其中基于Java語(yǔ)言的數(shù)據(jù)并進(jìn)行數(shù)據(jù)分析和篩選,最后選出了374 623條Java代碼—描述并行數(shù)據(jù)。DeepCom是一個(gè)專(zhuān)門(mén)的數(shù)據(jù)集研究,其中發(fā)布了從9 714個(gè)GitHub項(xiàng)目中收集的共588 108個(gè)Java方法和文檔對(duì)數(shù)據(jù)集。與CodeSearchNet類(lèi)似,DeepCom將文檔的第一句話(huà)視為方法的摘要,因?yàn)槲臋n的第一句話(huà)通常描述Java方法的功能。經(jīng)過(guò)數(shù)據(jù)分析和篩選后共有317 927條代碼—描述并行數(shù)據(jù)。CONCODE與DeepCom一樣是專(zhuān)門(mén)的數(shù)據(jù)集研究,通過(guò)挖掘近33 000個(gè)GitHub項(xiàng)目來(lái)收集數(shù)據(jù)。其發(fā)布的數(shù)據(jù)包含大約210萬(wàn)個(gè)Java方法和小寫(xiě)的Javadoc樣式的文檔對(duì),通過(guò)數(shù)據(jù)分析和篩選并刪除其中重復(fù)的內(nèi)容,最后篩選出669 275條代碼片段—自然語(yǔ)言描述并行數(shù)據(jù)。數(shù)據(jù)的基本格式為CD=(id,nl,src,code),其示例如下所示。
id:362966
nl:find the appropriate cluster for a given feature
src:DeepCom
code:private int clusterForFeature(Histogram f)
{double distance=clusters[0].getDistance(f);
double tmp;
int result=0;
for (int i=1;ilt;clusters.length;i++)
{tmp=clusters[i].getDistance(f);
if (tmplt;distance)
{distance=tmp;
result=i;
}
}
return result;
}
以上只是對(duì)所選的三個(gè)數(shù)據(jù)集進(jìn)行初步的分析和篩選,目的是希望獲取到格式和內(nèi)容相對(duì)統(tǒng)一的Java代碼片段—描述的并行數(shù)據(jù)集。雖然這些數(shù)據(jù)集在原有的研究中已經(jīng)進(jìn)行過(guò)噪聲消除和數(shù)據(jù)清洗,但據(jù)觀察其中還有許多不符合規(guī)范的數(shù)據(jù),尤其是CodeSearchNet中仍然有很多冗余數(shù)據(jù)。本文將設(shè)計(jì)數(shù)據(jù)清洗規(guī)則對(duì)收集到的代碼—描述并行數(shù)據(jù)集進(jìn)行過(guò)濾,以獲取質(zhì)量相對(duì)更高的代碼語(yǔ)料庫(kù),包括但不限于以下幾點(diǎn):
a)數(shù)據(jù)集中的Java代碼不是一個(gè)單獨(dú)的Java方法。本文推薦的代碼片段的粒度都是一個(gè)具體的Java方法,但有些收集到的數(shù)據(jù)中的Java片段是一個(gè)完整的類(lèi)、兩個(gè)或以上的Java方法或者構(gòu)造函數(shù)等內(nèi)容,與本文數(shù)據(jù)所需的代碼粒度不符合,因此該類(lèi)數(shù)據(jù)會(huì)被過(guò)濾掉。
b)數(shù)據(jù)集中的自然語(yǔ)言描述不是英語(yǔ)。本文選取英語(yǔ)作為自然語(yǔ)言描述的基準(zhǔn)語(yǔ)種,是因?yàn)楫?dāng)今的大部分大型代碼倉(cāng)庫(kù)和問(wèn)答網(wǎng)站都是英文網(wǎng)站,大量現(xiàn)有研究中的數(shù)據(jù)都是從這些網(wǎng)站中爬取的,更具有代表性。其他語(yǔ)種的自然語(yǔ)言描述不符合本文要求,因此該類(lèi)數(shù)據(jù)會(huì)被過(guò)濾掉。判斷自然語(yǔ)言描述是否為英語(yǔ)的方法是將該自然語(yǔ)言轉(zhuǎn)換成對(duì)應(yīng)的字符串,通過(guò)調(diào)用字符串中相應(yīng)的API(application programming interface)來(lái)判斷該字符串是否全部由英語(yǔ)單詞構(gòu)成,如果是則保留這條數(shù)據(jù),反之則刪除這條數(shù)據(jù)。
c)數(shù)據(jù)集中的自然語(yǔ)言描述包含圖片類(lèi)問(wèn)題。某些數(shù)據(jù)中的自然語(yǔ)言描述是針對(duì)某張具體的圖片進(jìn)行處理,對(duì)應(yīng)的Java代碼片段也是針對(duì)圖片的處理方法。但這樣的描述不具有普適性,用戶(hù)的查詢(xún)也無(wú)法針對(duì)具體的圖片進(jìn)行有效提問(wèn),不符合本文要求,因此該類(lèi)數(shù)據(jù)會(huì)被過(guò)濾掉。
d)數(shù)據(jù)集中的自然語(yǔ)言描述過(guò)長(zhǎng)或過(guò)短。某些數(shù)據(jù)中的描述過(guò)短,往往只包含一個(gè)有效的英語(yǔ)單詞;而某些數(shù)據(jù)中的描述過(guò)長(zhǎng),包含了除代碼功能外的諸如評(píng)論或解釋等其他內(nèi)容,這部分內(nèi)容較為難以識(shí)別,但在分析數(shù)據(jù)的共有特征后發(fā)現(xiàn)大部分代碼描述都會(huì)用一段完整的英語(yǔ)句子解釋其功能,并以句號(hào)結(jié)尾。而帶有評(píng)論或者解釋的內(nèi)容會(huì)附加在句號(hào)之后,并且往往會(huì)包含一些感嘆符號(hào)或者其他特殊符號(hào),以此為依據(jù)來(lái)篩選符合要求的數(shù)據(jù),雖然其中可能會(huì)將極少的正確數(shù)據(jù)刪除掉,但在海量數(shù)據(jù)的情況下影響很小且能保證數(shù)據(jù)的質(zhì)量和結(jié)構(gòu)的統(tǒng)一。這兩類(lèi)描述都不能很好地概括方法的功能,不符合本文要求,因此該類(lèi)數(shù)據(jù)會(huì)被過(guò)濾掉。
e)數(shù)據(jù)集中的Java代碼包含冗余的內(nèi)容。本文希望獲取的Java代碼片段應(yīng)該是一個(gè)規(guī)范的、完整的、正確的Java方法,能直觀地展示自然語(yǔ)言描述所對(duì)應(yīng)的功能,供用戶(hù)使用。因此雖然諸如源代碼中的注釋、非ASCII碼和轉(zhuǎn)義字符等內(nèi)容包含了重要的語(yǔ)義,但本文中選用的代碼片段粒度為一個(gè)完整的Java方法,其中最為重要的闡述Java方法功能的注釋已作為代碼功能的描述保存下來(lái),而方法內(nèi)部的某些變量、API、參數(shù)等注釋并不能表現(xiàn)方法的功能,對(duì)本文所用推薦方法的影響很小,若其中包含不規(guī)范、不正確、難以識(shí)別的錯(cuò)誤注釋反而會(huì)對(duì)開(kāi)發(fā)者產(chǎn)生誤導(dǎo)。因此需要?jiǎng)h除這部分內(nèi)容對(duì)應(yīng)的數(shù)據(jù)。
通過(guò)對(duì)收集的所有數(shù)據(jù)進(jìn)行篩選、清洗和過(guò)濾操作,最終獲得了來(lái)自CodeSearchNet中的189 998條數(shù)據(jù)、DeepCom中的235 186條數(shù)據(jù)和CONCODE中的607 744條數(shù)據(jù),總計(jì)1 032 928條Java代碼—描述對(duì)并行數(shù)據(jù)共同構(gòu)成了本文的代碼語(yǔ)料庫(kù)。數(shù)據(jù)集的基本信息如表1所示。
2.2 自然語(yǔ)言描述和查詢(xún)向量生成模型
本文中使用的自然語(yǔ)言描述和查詢(xún)向量生成模型為SBERT,該模型是通過(guò)對(duì)預(yù)訓(xùn)練模型BERT[21](bidirectional encoder representations from transformers)進(jìn)行微調(diào)而獲得的。
BERT作為雙向特征表示的自編碼預(yù)訓(xùn)練模型,基于Transformer的encoder來(lái)構(gòu)造雙向編碼器,通過(guò)聯(lián)合調(diào)節(jié)所有層的上下文,從未標(biāo)記文本中預(yù)訓(xùn)練深度雙向特征。其預(yù)訓(xùn)練模型是基于自監(jiān)督學(xué)習(xí)的,因此不需要預(yù)先對(duì)文本數(shù)據(jù)進(jìn)行特征標(biāo)注,并且該模型中的參數(shù)非常多,需要海量的文本數(shù)據(jù)進(jìn)行訓(xùn)練,會(huì)消耗極大的算力。但BERT預(yù)訓(xùn)練模型的優(yōu)點(diǎn)在于只需要一個(gè)額外的輸出層既可以進(jìn)行微調(diào),從而為各種任務(wù)創(chuàng)建最先進(jìn)的模型,無(wú)須對(duì)特定的任務(wù)架構(gòu)進(jìn)行大量修改。
BERT預(yù)訓(xùn)練模型主要包括BERT-base和 BERT-large兩個(gè)版本。BERT-base中包含了12-layer、768-hidden、12-heads和1.1億個(gè)參數(shù);BERT-large中包含了24-layer、1024-hidden、16-heads和3.4億個(gè)參數(shù)。海量的參數(shù)自然使BERT預(yù)訓(xùn)練模型具有非常優(yōu)秀的性能。該模型在11個(gè)NLP(natural language processing)任務(wù)上獲得了SOTA(state of the art)結(jié)果,包括將GLUE(general language understanding evaluation)分?jǐn)?shù)提升至80.5%(7.7%的絕對(duì)改進(jìn))、MultiNLI(the multi-genre natural language inference)準(zhǔn)確度提升到86.7%(4.6%的絕對(duì)改進(jìn)),并且在機(jī)器閱讀理解頂級(jí)水平測(cè)試SQuAD 1.1和SQuAD 2.0上表現(xiàn)出了驚人的成績(jī),成為了NLP發(fā)展史上具有里程碑意義的模型。其基本架構(gòu)如圖2所示。
然而B(niǎo)ERT模型并不是萬(wàn)能的。在語(yǔ)義文本相似性(semantic textual similarity)等句子對(duì)回歸任務(wù)中需要將兩個(gè)句子都輸入BERT模型中。雖然其確實(shí)能夠提供非常優(yōu)秀的性能,但也導(dǎo)致了巨大的計(jì)算開(kāi)銷(xiāo),比如在尋找最相似句子對(duì)這樣的任務(wù)中需要消耗非常長(zhǎng)的時(shí)間。因此BERT模型并不適合語(yǔ)義相似性搜索以及聚類(lèi)等無(wú)監(jiān)督任務(wù)。
通過(guò)連體網(wǎng)絡(luò)架構(gòu)進(jìn)行微調(diào)的SBERT模型能夠推導(dǎo)出輸入句子的固定大小且具有明確語(yǔ)義的句向量,并可以通過(guò)余弦相似度或者歐氏距離等方法進(jìn)行相似度比較,在保證BERT模型推薦準(zhǔn)確度的情況下大幅減少計(jì)算開(kāi)銷(xiāo),快速完成語(yǔ)義相似性搜索等任務(wù)。SBERT模型通過(guò)在BERT模型的輸出中添加一個(gè)池化層(pool)進(jìn)行微調(diào),通過(guò)計(jì)算所有輸出向量的平均值(mean-strategy)的池化策略來(lái)獲得固定大小的句向量。
為了使生成的句向量在語(yǔ)義上有意義且可以通過(guò)余弦相似度進(jìn)行比較,創(chuàng)建連體和三元網(wǎng)絡(luò)[22]來(lái)更新網(wǎng)絡(luò)權(quán)重,并使用均方誤差損失(mean squared error)作為網(wǎng)絡(luò)的回歸目標(biāo)函數(shù)(regression objective function)來(lái)計(jì)算兩個(gè)句向量之間的余弦相似度。
MSE(y,f(x))=1n∑ni=1(yi-f(xi))2(1)
其中:y和f(x)分別表示樣本的真實(shí)值和預(yù)測(cè)值;yi和f(xi)分別表示第i個(gè)樣本的真實(shí)值和預(yù)測(cè)值;n表示樣本的個(gè)數(shù)。均方誤差損失的優(yōu)點(diǎn)是光滑連續(xù)且可導(dǎo),便于使用梯度下降算法,有利于函數(shù)的收斂,即使固定學(xué)習(xí)因子,函數(shù)也能較快取得最小值。最后選擇SNLI[23]和multi-Genre NLI[24]對(duì)SBERT模型進(jìn)行微調(diào),因?yàn)橥ㄟ^(guò)這兩個(gè)數(shù)據(jù)集訓(xùn)練模型生成的句向量顯著優(yōu)于一些其他的先進(jìn)的句向量生成方法(如InferSent[25]、Universal Sentence Encode[26]等)。微調(diào)完成之后即可獲得包含豐富語(yǔ)言的句向量并進(jìn)行相似度計(jì)算。
2.3 代碼片段匹配與推薦
通過(guò)SBERT模型可以產(chǎn)生任意句子對(duì)應(yīng)的句向量,從而計(jì)算任意兩個(gè)句向量之間的余弦相似度。因此可以在用戶(hù)輸入的查詢(xún)和代碼描述之間進(jìn)行相似度比較,依據(jù)相似度進(jìn)行排序來(lái)推薦與查詢(xún)相關(guān)的代碼片段。余弦相似度取值是[-1,1],其值若為正且越接近于1則表示兩個(gè)向量之間越相似。
cos_score=p·q‖p‖×‖q‖=∑ni=1pi×qi∑ni=1(pi)2×∑ni=1(qi)2(2)
其中:p是用戶(hù)輸入的自然語(yǔ)言查詢(xún)對(duì)應(yīng)的句向量,q是代碼片段對(duì)應(yīng)的描述的句向量,‖p‖和‖q‖是句向量的模。通過(guò)余弦相似度比較既可以找到與查詢(xún)最相似的代碼片段。但由于代碼語(yǔ)料庫(kù)中的數(shù)據(jù)量很大且余弦相似度的取值為[-1,1],所以會(huì)出現(xiàn)多個(gè)結(jié)果可能十分接近的情況,從而造成浮點(diǎn)數(shù)在計(jì)算機(jī)中的不精確存儲(chǔ)并導(dǎo)致系統(tǒng)誤差。針對(duì)此問(wèn)題,首先將生成的句向量進(jìn)行歸一化(normalize)處理。
v^=v‖v‖(3)
其中:v是查詢(xún)或者描述的句向量;‖v‖是句向量的模。通過(guò)歸一化向量之后,所有句向量的長(zhǎng)度都將被固定為1。可以使用點(diǎn)積(dot product)來(lái)計(jì)算句向量之間的相似度。
dot_score=p·q=∑ni=1pi×qi=‖p‖×‖q‖×cos θ(4)
同樣地,p是用戶(hù)輸入的自然語(yǔ)言查詢(xún)對(duì)應(yīng)的句向量;q是代碼片段對(duì)應(yīng)的描述的句向量;‖p‖和‖q‖是句向量的模;cos θ代表的是兩個(gè)向量之間的夾角。點(diǎn)積的值與向量之間的夾角成反比,點(diǎn)積值為正且越大則說(shuō)明夾角越小,也代表了向量之間越接近,因此也表示了自然語(yǔ)言查詢(xún)與代碼片段描述之間越相似。并且點(diǎn)積的值不局限于某個(gè)區(qū)間,有效地避免了多個(gè)結(jié)果之間的接近導(dǎo)致的不精確存儲(chǔ)和系統(tǒng)誤差。
由于代碼語(yǔ)料庫(kù)中的數(shù)據(jù)量很大,所以通過(guò)多線(xiàn)程提前為代碼語(yǔ)料庫(kù)中的所有代碼片段描述生成相應(yīng)的句向量,并存儲(chǔ)在同一文件中,之后在進(jìn)行相似度比較時(shí)就可以直接調(diào)用文件中的數(shù)據(jù),大大節(jié)省時(shí)間。通過(guò)多線(xiàn)程也可以同時(shí)生成100個(gè)及以上自然語(yǔ)言查詢(xún)對(duì)應(yīng)的句向量。然后使用點(diǎn)積公式獲取每個(gè)自然語(yǔ)言查詢(xún)句向量和代碼片段描述句向量之間的相似度,并且將生成的相似值存儲(chǔ)在同一文件中。通過(guò)對(duì)文件中的相似值進(jìn)行排序就能夠獲得任意數(shù)量的與查詢(xún)最相似的代碼片段的描述,從而推薦最相似的多個(gè)代碼片段。基于SBERT模型的自然語(yǔ)言查詢(xún)和描述的相似度匹配如算法1所示。
算法1 相似度匹配算法
輸入:自然語(yǔ)言查詢(xún)i。
輸出:k個(gè)相似度最高的代碼片段csk。
a)通過(guò)SBERT模型,將自然語(yǔ)言查詢(xún)i轉(zhuǎn)換成對(duì)應(yīng)的句向量Ei。
b)for i←1 to n //n是代碼語(yǔ)料庫(kù)中總的數(shù)據(jù)量
c)" 通過(guò)SBERT模型,將代碼片段對(duì)應(yīng)的自然語(yǔ)言描述di轉(zhuǎn)換成對(duì)應(yīng)的句向量Edi。
d)將n個(gè)Edi與di和對(duì)應(yīng)代碼片段存儲(chǔ)在同一文件中,可重復(fù)使用。
e)for j←1 to n
f)" 通過(guò)點(diǎn)積公式計(jì)算Edi與Ei之間的相似度sim(Ei,Edi)。
g)基于排序算法對(duì)所有的sim(Ei,Edi)進(jìn)行降序排列。
h)根據(jù)排列結(jié)果與代碼語(yǔ)料庫(kù),推薦前k個(gè)相似度最高的代碼片段csk。
3 實(shí)驗(yàn)結(jié)果及分析
3.1 實(shí)驗(yàn)環(huán)境
本實(shí)驗(yàn)采用的平臺(tái)是由Intel Xeon E5-2603 v4 1.7 GHz的處理器、Tesla K80的GPU和32.0 GB 的RAM構(gòu)成的服務(wù)器。其中搭載了Ubuntu 18.04.5 LTS的操作系統(tǒng),使用JDK1.8版本、Python 3版本并結(jié)合PyTorch框架作為數(shù)據(jù)篩選和清洗以及自然語(yǔ)言描述和查詢(xún)向量生成模型的運(yùn)行環(huán)境。
3.2 實(shí)驗(yàn)數(shù)據(jù)
由于本文構(gòu)建的代碼語(yǔ)料庫(kù)中的百萬(wàn)條數(shù)據(jù)均來(lái)源于CodeSearchNet、DeepCom和CONCODE這三個(gè)數(shù)據(jù)集,所以若使用這三個(gè)數(shù)據(jù)集中的數(shù)據(jù)作為本實(shí)驗(yàn)的基準(zhǔn)數(shù)據(jù)會(huì)出現(xiàn)本文方法一定能夠推薦出正確結(jié)果的情況,在與其他方法進(jìn)行對(duì)比時(shí)本文方法就會(huì)產(chǎn)生更好的效果,違背了對(duì)比實(shí)驗(yàn)的基本要求。為了避免其他因素的干擾而影響實(shí)驗(yàn)結(jié)果,本實(shí)驗(yàn)不會(huì)采用CodeSearchNet、DeepCom和CONCODE中的數(shù)據(jù)作為實(shí)驗(yàn)的基準(zhǔn)數(shù)據(jù)。而FunCom與上述三個(gè)數(shù)據(jù)集一樣也是由海量數(shù)據(jù)專(zhuān)門(mén)構(gòu)建的代碼語(yǔ)料庫(kù),其公布的數(shù)據(jù)已在一些類(lèi)似的任務(wù)上證實(shí)了其真實(shí)有效性。因此選取FunCom數(shù)據(jù)集中經(jīng)過(guò)驗(yàn)證的500條真實(shí)有效的〈Java方法代碼片段—自然語(yǔ)言描述〉鍵值對(duì)數(shù)據(jù)作為本實(shí)驗(yàn)的基準(zhǔn)數(shù)據(jù)。
3.3 評(píng)估指標(biāo)
本實(shí)驗(yàn)采用的評(píng)估參數(shù)是推薦算法中常用的HR@K(hit ratio)、MRR@K(mean reciprocal rank)和MAP@K(mean average precision)三個(gè)評(píng)估指標(biāo)。其中HR@K是一種常用的衡量召回率的指標(biāo),反映的是在每次推薦K個(gè)結(jié)果的條件下所有結(jié)果中包含正確答案的情況占總的推薦次數(shù)的比例,相應(yīng)可以表示為推薦的準(zhǔn)確率。
HR@K=1N∑Ni=1hit(i)(5)
其中:N表示推薦的次數(shù);hit(i)函數(shù)表示是否命中,即正確結(jié)果是否出現(xiàn)在推薦結(jié)果中,存在則為1,反之則為0。除了推薦的準(zhǔn)確度以外,正確答案在推薦結(jié)果中出現(xiàn)的位置也是非常重要的。如果能夠保證正確答案總是出現(xiàn)在推薦結(jié)果中的前幾名位置上的話(huà),就能夠?yàn)殚_(kāi)發(fā)人員節(jié)省篩選正確答案所需的時(shí)間。MRR@K表示第一個(gè)正確答案在所有推薦結(jié)果中的位置順序。
MRR@K=1N∑Ni=11Loc(i)(6)
其中:N表示推薦的次數(shù);Loc(i)函數(shù)表示第i次推薦中第一個(gè)正確答案在K個(gè)結(jié)果中的順序位置,其值的范圍是從1到所有推薦結(jié)果總數(shù)的正整數(shù),但如果推薦結(jié)果沒(méi)有包含正確答案,則其值為無(wú)窮大,其倒數(shù)值為0。MRR@K的值越大則表示查詢(xún)的正確答案在所有推薦結(jié)果中的順序位置越靠前,越能夠更快地被開(kāi)發(fā)人員所采用。
但是MRR@K只能根據(jù)第一個(gè)正確答案在所有推薦結(jié)果中的位置進(jìn)行評(píng)估,實(shí)際情況中往往會(huì)出現(xiàn)推薦結(jié)果中包含一個(gè)以上的正確答案。針對(duì)這種情況,采用MAP@K進(jìn)行評(píng)估,該指標(biāo)可以測(cè)量所有的正確答案在推薦結(jié)果中的位置順序,能夠更好地反映實(shí)際推薦過(guò)程中可能出現(xiàn)的情況。該指標(biāo)在信息檢索、目標(biāo)檢測(cè)、多標(biāo)簽等領(lǐng)域也有應(yīng)用,是一個(gè)應(yīng)用范圍很廣的評(píng)估指標(biāo)。
MAP@K=1N∑Ni=1APi=1N∑Ni=1∑Kj=1hit(j)×1Loc(j)Ai(7)
其中:N表示推薦的次數(shù);APi表示第i次推薦時(shí)的平均精度;Ai表示第i次推薦時(shí)正確答案的集合;|Ai|表示第i次推薦時(shí)正確答案的數(shù)量;K表示每次推薦多少個(gè)結(jié)果;hit(j)函數(shù)表示第j個(gè)推薦結(jié)果是否正確,若正確則為1,反之則為0;Loc(j)函數(shù)表示第j個(gè)推薦結(jié)果在所有結(jié)果中的順序位置,其值是1~K的正整數(shù),但如果hit(j)函數(shù)的值為0,則其值為無(wú)窮大,其倒數(shù)值為0。
3.4 實(shí)驗(yàn)結(jié)果
為了測(cè)試CSRSB的性能,選取了MuCoS、BM25[27]和DeepCR[28]作為三個(gè)基準(zhǔn)方法。MuCoS的相關(guān)描述已在第1章相關(guān)工作部分進(jìn)行了詳細(xì)的解釋?zhuān)籅M25作為傳統(tǒng)的信息檢索方法,通過(guò)計(jì)算TextRank中的句子相似度獲取對(duì)應(yīng)的評(píng)分,并且對(duì)所有的句子按照評(píng)分降序排列,選擇評(píng)分最高的幾個(gè)句子作為摘要;DeepCR通過(guò)seq2seq模型為每個(gè)代碼片段生成相應(yīng)的自然語(yǔ)言描述,然后比較自然語(yǔ)言描述與查詢(xún)之間的相似度來(lái)進(jìn)行代碼片段的推薦。
實(shí)驗(yàn)數(shù)據(jù)選取了來(lái)自FunCom中的500條真實(shí)有效的代碼片段—描述并行數(shù)據(jù),通過(guò)將數(shù)據(jù)中的自然語(yǔ)言描述轉(zhuǎn)換成相應(yīng)的問(wèn)題并作為自然語(yǔ)言查詢(xún)。因此可以對(duì)每個(gè)方法進(jìn)行500次的查詢(xún)并通過(guò)三個(gè)評(píng)估指標(biāo)來(lái)檢測(cè)其性能。
本實(shí)驗(yàn)中設(shè)定推薦結(jié)果數(shù)K的取值為1、3、5和10。首先是因?yàn)楫?dāng)K取1時(shí)能夠表示正確結(jié)果出現(xiàn)在首個(gè)位置上的概率,是非常重要的參數(shù)。其次K取3、5和10主要是為了考慮正確結(jié)果沒(méi)有出現(xiàn)在第一個(gè)位置上以及出現(xiàn)多個(gè)正確結(jié)果的情況下推薦方法的性能。而K不取1~10的所有參數(shù)是因?yàn)橄噜彽膮?shù)之間實(shí)驗(yàn)數(shù)據(jù)差異不大,參考價(jià)值較小,還會(huì)因?yàn)樵O(shè)置的參數(shù)過(guò)多而影響觀察。同時(shí)K不取10以上參數(shù)的原因在于用戶(hù)都希望正確的推薦結(jié)果出現(xiàn)在更加靠前的位置,若是正確結(jié)果出現(xiàn)在第10個(gè)結(jié)果之后的推薦結(jié)果中的話(huà),間接說(shuō)明代碼推薦方法存在一定的問(wèn)題。最后K取1、3和10也是推薦系統(tǒng)中常用的三個(gè)參數(shù),許多現(xiàn)有代碼推薦研究中也沿用這三個(gè)參數(shù)來(lái)進(jìn)行實(shí)驗(yàn),本實(shí)驗(yàn)中還加入了K=5的參數(shù)作為對(duì)比。
而當(dāng)K=1時(shí)MRR作為檢測(cè)第一個(gè)正確答案位置順序的指標(biāo)以及 MAP 作為檢測(cè)多個(gè)正確答案及其位置順序的指標(biāo)都失去其意義,故K只選取3、5和10對(duì)這兩個(gè)指標(biāo)進(jìn)行實(shí)驗(yàn)。
表2列出了本文方法和其他三種基準(zhǔn)方法在推薦準(zhǔn)確度HR@K上的對(duì)比。可以看出CSRSB在HR@K上的性能完全優(yōu)于BM25和DeepCR,并且也略?xún)?yōu)于MuCoS。同時(shí)在HR@1和HR@3的指標(biāo)上相比BM25和DeepCR具有更明顯的優(yōu)勢(shì),說(shuō)明CSRSB的正確答案會(huì)出現(xiàn)在更加靠前的位置,間接證明了CSRSB在MRR@K和MAP@K上的評(píng)估指標(biāo)也會(huì)更加優(yōu)秀。
表3列出了本文方法和其他三種基準(zhǔn)方法在評(píng)估指標(biāo)MRR@K上的對(duì)比。可以看出CSRSB在MRR@K上的性能略?xún)?yōu)于MuCoS,這兩種方法并沒(méi)有相差太多,但對(duì)比BM25和DeepCR都具有更好的性能。由此可見(jiàn)CSRSB能夠更好地將正確結(jié)果推薦在更加靠前的位置。
表4列出了本文方法和其他三種基準(zhǔn)方法在評(píng)估指標(biāo)MAP@K上的對(duì)比。可以看出CSRSB在MAP@K上的數(shù)據(jù)同樣優(yōu)于其他三種基準(zhǔn)方法。由此可見(jiàn)在同時(shí)考慮推薦的準(zhǔn)確度和多個(gè)正確答案的順序位置情況時(shí)CSRSB具有更優(yōu)秀的性能。
表5列出了部分基準(zhǔn)數(shù)據(jù)在CSRSB中的測(cè)試用例,其中包括了問(wèn)題的編號(hào)、自然語(yǔ)言的查詢(xún)、正確答案的數(shù)量(K=10)和推薦的速度,可以發(fā)現(xiàn)針對(duì)所有的用戶(hù)查詢(xún)CSRSB都可以做到立即推薦。
4 結(jié)束語(yǔ)
本文提出了一種基于SBERT模型的代碼片段推薦方法CSRSB。首先構(gòu)建了包含上百萬(wàn)條數(shù)據(jù)的大型代碼語(yǔ)料庫(kù),其中的數(shù)據(jù)經(jīng)過(guò)許多方法的驗(yàn)證,數(shù)據(jù)質(zhì)量較高;然后通過(guò)微調(diào)BERT生成的SBERT模型為自然語(yǔ)言生成具有豐富語(yǔ)義的句向量,自然語(yǔ)言之間的語(yǔ)義差比代碼與自然語(yǔ)言之間的語(yǔ)義差更容易處理,因此基于SBERT模型進(jìn)行代碼片段推薦在準(zhǔn)確度上優(yōu)于現(xiàn)有的相關(guān)研究。在提升推薦準(zhǔn)確度的同時(shí)也考慮了推薦速度,能夠立刻為用戶(hù)推薦相應(yīng)的結(jié)果。
本文方法雖然獲取了高質(zhì)量的百萬(wàn)條數(shù)據(jù),但其中仍然存在一些難以識(shí)別的冗余數(shù)據(jù),并且沒(méi)有統(tǒng)一的數(shù)據(jù)集質(zhì)量評(píng)測(cè)指標(biāo)對(duì)本文構(gòu)建的代碼語(yǔ)料庫(kù)進(jìn)行評(píng)估。同時(shí)本文方法只應(yīng)用于特定編程語(yǔ)言的特定代碼粒度,不同的編程語(yǔ)言和代碼粒度在應(yīng)用該方法時(shí)的性能并不確定,不具備廣泛適用性。因此下一步的研究方向首先會(huì)將該方法擴(kuò)展到不同編程語(yǔ)言和代碼粒度上來(lái)驗(yàn)證其有效性,并通過(guò)專(zhuān)門(mén)的數(shù)據(jù)清洗框架進(jìn)一步提升代碼語(yǔ)料庫(kù)中數(shù)據(jù)的質(zhì)量。
參考文獻(xiàn):
[1]魏敏,張麗萍.代碼搜索方法研究進(jìn)展[J].計(jì)算機(jī)應(yīng)用研究,2021,38(11):3215-3221,3230.(Wei Min,Zhang Liping.Research progress of code search methods[J].Application Research of Computers,2021,38(11):3215-3221,3230.)
[2]Lu Jinting,Wei Ying,Sun Xiaobing,et al.Interactive query reformulation for source code search with word relations[J].IEEE Access,2018,6:75660-75668.
[3]Raghothaman M,Wei Yi,Hamadi Y.SWIM:synthesizing what I mean-code search and idiomatic snippet[C]//Proc of the 38th International Conference on Software Engineering.Piscataway,NJ:IEEE Press,2016:357-367.
[4]Biggerstaff T J,Mitbander B G,Webster D E.The concept assignment problem in program understanding[C]//Proc of the 15th International Conference on Software Engineering.New York:ACM Press,1993:482-498.
[5]Gu Xiaodong,Zhang Hongyu,Zhang Dongmei,et al.Deep API lear-ning[C]//Proc of the 24th International Symposium on Foundations of Software Engineering.New York:ACM Press,2016:631-642.
[6]Gu Xiaodong,Zhang Hongyu,Kim S.Deep code search[C]//Proc of the 40th International Conference on Software Engineering.New York:ACM Press,2018:933-944.
[7]胡星,李戈,劉芳,等.基于深度學(xué)習(xí)的程序生成與補(bǔ)全技術(shù)研究進(jìn)展[J].軟件學(xué)報(bào),2019,30(5):1206-1223.(Hu Xing,Li Ge,Liu Fang,et al.Program generation and code completion techniques based on deep learning:literature review[J].Journal of Software,2019,30(5):1206-1223.)
[8]李浩,鐘聲,康雁,等.融合領(lǐng)域知識(shí)的 API 推薦模型[J].計(jì)算機(jī)科學(xué),47(S2):544-548.(Li Hao,Zhong Sheng,Kang Yan,et al.API recommendation model with fusion domain knowledge[J].Computer Science,47(S2):544-548.)
[9]Liu Chao,Xia Xin,Lo D,et al.Opportunities and challenges in code search tools[J].ACM Computing Surveys,2022,54(9):1-40.
[10]Husain H,Wu H H,Gazit T,et al.CodeSearchNet challenge:evaluating the state of semantic code search[EB/OL].(2019-09-24)[2022-02-21].http://arxiv.org/abs/1909.09436.
[11]Iyer S,Konstas I,Cheung A,et al.Mapping language to code in programmatic context[C]//Proc of Conference on Empirical Methods in Natural Language Processing.Stroudsburg,PA:Association for Computational Linguistics,2018:1643-1652.
[12]LeClair A,McMillan C.Recommendations for datasets for source code summarization[C]//Proc of Conference of the North American Chapter of the Association for Computational Linguistics:Human Language Technologies.Stroudsburg,PA:Association for Computational Linguistics,2019:3931-3937.
[13]Hu Xing,Li Ge,Xia Xin,et al.Deep code comment generation[C]//Proc of the 26th Conference on Program Comprehension.New York:ACM Press,2018:200-210.
[14]Reimers N,Gurevych I.Sentence-BERT:sentence embeddings using siamese BERT-networks[C]//Proc of Conference on Empirical Me-thods in Natural Language Processing and the 9th International Joint Conference on Natural Language Processing.Stroudsburg,PA:Association for Computational Linguistics,2019:3980-3990.
[15]Fang Sen,Tan Youshuai,Zhang Tao,et al.Self-attention networks for code search[J].Information and Software Technology,2021,134:106542.
[16]Wang Chaozheng,Nong Zhenhao,Gao Cuiyun,et al.Enriching query semantics for code search with reinforcement learning[J].Neural Networks,2022,145:22-32.
[17]Du Lun,Shi Xiaozhou,Wang Yanlin,et al.Is a single model enough? MuCoS:a multi-model ensemble learning for semantic code search[C]//Proc of the 30th ACM International Conference on Information and Knowledge Management.New York:ACM Press,2021:2994-2998.
[18]Eberhart Z,McMillan C.Generating clarifying questions for query refinement in source code search[EB/OL].(2022-02-01)[2022-02-21].https://arxiv.org/abs/2201.09974.
[19]Rao N,Bansal C,Guan J.Search4Code:code search intent classification using weak supervision[C]//Proc of the 18th International Conference on Mining Software Repositories.Piscataway,NJ:IEEE Press,2021:575-579.
[20]Sun Zhensu,Li Li,Liu Yan,et al.On the importance of building high-quality training datasets for neural code search[C]//Proc of the 44th International Conference on Software Engineering.Piscataway,NJ:IEEE Press,2022:1609-1620.
[21]Devlin J,Chang Mingwei,Lee K,et al.BERT:pre-training of deep bidirectional transformers for language understanding[C]//Proc of Conference of the North American Chapter of the Association for Computational Linguistics:Human Language Technologies.Stroudsburg,PA:Association for Computational Linguistics,2019:4171-4186.
[22]Schroff F,Kalenichenko D,Philbin J.FaceNet:a unified embedding for face recognition and clustering[C]//Proc of IEEE Conference on Computer Vision and Pattern Recognition.Piscataway,NJ:IEEE Press,2015:815-823.
[23]Bowman S R,Angeli G,Potts C,et al.A large annotated corpus for learning natural language inference[C]//Proc of Conference on Empirical Methods in Natural Language Processing.Stroudsburg,PA:Association for Computational Linguistics,2015:632-642.
[24]Williams A,Nangia N,Bowman S R.A broad-coverage challenge corpus for sentence understanding through inference[C]//Proc of Conference of the North American Chapter of the Association for Computational Linguistics:Human Language Technologies.Stroudsburg,PA:Association for Computational Linguistics,2018:1112-1122.
[25]Conneau A,Kiela D,Schwenk H,et al.Supervised learning of universal sentence representations from natural language inference data[C]//Proc of Conference on Empirical Methods in Natural Language Processing.Stroudsburg,PA:Association for Computational Linguistics,2017:670-680.
[26]Cer D,Yang Yinfei,Kong Shengyi,et al.Universal sentence encoder[C]//Proc of Conference on Empirical Methods in Natural Language Processing.Stroudsburg,PA:Association for Computational Linguistics,2018:169-174.
[27]李楠,陶宏才.一種新的融合BM25與文本特征的新聞?wù)惴ǎ跩].成都信息工程大學(xué)學(xué)報(bào),2018,33(2):113-118.(Li Nan,Tao Hongcai.A novel news summary algorithm combining BM25 and text features[J].Journal of Chengdu University of Information Technology,2018,33(2):113-118.)
[28]閆鑫,周宇,黃志球.基于序列到序列模型的代碼片段推薦[J].計(jì)算機(jī)科學(xué)與探索,2019,14(5):731-739.(Yan Xin,Zhou Yu,Huang Zhiqiu.Code snippets recommendation based on sequence to sequence model[J].Journal of Frontiers of Computer Science and Technology,2019,14(5):731-739.)