








收稿日期:2022-05-14;修回日期:2022-07-06" 基金項目:四川省重點研發資助項目(2020YFG0299)
作者簡介:鄧斯元(1997-),男,四川瀘州人,碩士研究生,主要研究方向為智能服務、大數據;魏樂(1979-),男(通信作者),河南鄭州人,副教授,碩導,碩士,主要研究方向為智能服務、云制造、大數據(weile@cuit.edu.cn);舒紅平(1974-),男,重慶人,教授,博導,博士,主要研究方向為軟件工程、數據挖掘、企業信息化.
摘 要:在當前的軟件開發環境中,海量的低質量、無意義的代碼知識為開發人員進行代碼復用造成了阻礙,大大降低了軟件開發效率。為了快速準確地為開發人員推薦高質量的代碼知識,提出了基于SBERT(sentence-BERT)模型的代碼片段推薦方法CSRSB(code snippets recommendation based on sentence-BERT)。該方法首先獲取海量的高質量數據來構建代碼語料庫,并基于深度學習模型SBERT為代碼片段對應的自然語言描述和用戶輸入的自然語言查詢生成具有豐富語義的句向量,通過比較點積相似度來實現代碼片段的推薦。使用命中率、平均倒數排名和平均準確率這三個常用推薦評估指標與現有相關研究中的方法進行對比來驗證該方法的有效性。實驗結果表明,CSRSB在有效提高代碼片段推薦準確度的同時也能夠做到快速推薦。
關鍵詞:代碼復用;代碼語料庫;深度學習;代碼片段推薦
中圖分類號:TP391"" 文獻標志碼:A
文章編號: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 引言
在開源的軟件生態環境下,開發人員能夠從諸如CSDN、SourceForge、GitHub、StackOverflow這樣的大型開源社區和問答網站上獲取海量的高質量代碼資源,通過代碼復用的方式來進行軟件開發,顯著提高了開發效率。傳統的推薦方式基于信息檢索模型來進行推薦,將代碼推薦問題轉換為代碼(特殊文本)和查詢(普通文本)之間的字符匹配問題,通過關鍵字在代碼庫中找到目標代碼[1]。如Lu等人[2]提出的INQRES和Raghothaman等人[3]提出的SWIM等方法。然而基于信息檢索的方法存在許多缺陷,比較關鍵的是由于自然語言查詢的高層級意圖與代碼的低層級實現細節不匹配[4]。所以傳統的代碼推薦方式容易導致錯誤匹配,使得推薦準確性低,需要人工鑒別。
隨著大數據和深度學習等技術的飛速發展,代碼推薦的方式已經逐漸從傳統的信息檢索模型轉換到深度學習模型。現有的海量代碼資源能夠滿足深度學習模型訓練所需的數據量,訓練好之后的深度學習模型比之傳統的信息檢索模型在準確率上有著很大的提升。如Gu等人[5]在2016年提出的首個基于深度學習模型的推薦方法DeepAPI和Gu等人[6]在2018年提出的DeepCS。
然而現有的研究仍然存在一些問題:
a)代碼語料庫中數據的質量參差不齊,缺乏公認的、統一的、高質量的、規范的大型代碼語料庫。許多現有研究中用到的數據集都是從開源社區上爬取的項目,雖然更接近于實際軟件開發,但是也難以保證代碼的質量,而低質量、不規范的代碼會給神經網絡帶來額外的噪聲,而使用不同編程規范的代碼則會使神經網絡模型在訓練和預測時產生混淆[7]。
b)現有大量研究中所用的諸如CNN(convolutional neural network)、RNN(recurrent neural network)、LSTM(long short-term memory)等模型在代碼推薦領域上的性能已較為落后。而近年來由于深度學習的飛速發展,許多新的技術和模型被提出[8],這些新技術和新模型在部分相關任務中已被證實比現有代碼推薦研究中所用模型的性能更好,所以如果將這些新技術和新模型應用到代碼推薦領域中也許能夠更進一步地提高代碼推薦的準確度。
c)在測量工具性能時,很少評估推薦時間和工具的可擴展性,也沒有考慮其他方面的重要性能,例如代碼多樣性和簡潔性[9]等。
針對上述問題,本文提出一種基于SBERT模型的代碼片段推薦方法。該方法中構建的代碼語料庫不同于尋常通過爬取開源社區和問答網站中的數據構建代碼語料庫,而是通過對國外一些專門構建的代碼數據集(如CodeSearchNet[10]、CONCODE[11]、FunCom[12]、DeepCom[13]等)中的數據進行篩選和清洗工作來構建代碼語料庫。同時本文不同于以往將源代碼和相應的自然語言描述作為數據集來訓練深度學習模型的方法,而是通過SBERT[14]模型將代碼語料庫中代碼片段所對應的自然語言描述與用戶輸入的自然語言查詢映射到同一向量空間中,通過向量之間相似度比較并進行排序為用戶推薦相應的代碼片段。
1 相關工作
1.1 改進和優化深度學習模型
近年來部分研究通過改進和優化各種模型來提高代碼推薦的準確度。如Fang等人[15]提出了自注意力聯合表示學習模型SAN-CS,基于自注意力網絡構建額外的聯合表示網絡,學習代碼上下文表示來捕獲全局語義關系,使得代碼向量可以與查詢向量有更深層次的語義關系,且具有較高的執行效率;Wang等人[16]提出了QueCos,該模型基于強化學習(reinforcement learning)模型進行訓練,可以捕獲用戶給定查詢中的關鍵語義,使得用戶查詢與代碼描述之間的匹配更加準確;Du等人[17]提出了多模型集成學習架構MuCoS,其中包含了幾個單獨的學習器,每個學習器都對應代碼片段的特定視角。然后在包含不同視角的代碼信息的不同數據集上訓練這些學習器,并使用數據增強策略來獲取這些不同的數據集。最后將這些學習器集合起來以捕獲代碼片段的綜合特征,獲得了更好的推薦準確率。
這類方法的缺點和不足在于改進和優化深度學習模型的關鍵是為了解決自然語言描述與代碼之間的語義差問題,然而現在并沒有明確的參數或指標能夠證明研究中的語義差足夠小從而不影響推薦的準確度,因此這類方法雖然能夠提高代碼推薦的準確度,但仍然存在誤差。
1.2 處理自然語言查詢
近年來部分研究通過處理用戶輸入的查詢來提高推薦準確度。如Eberhart等人[18]通過澄清問題(clarifying question)來完善用戶的查詢,提出了一種使用從函數名稱和注釋中提取的信息來生成比較自然的澄清問題的方法,并且證明在綜合研究中優于基于關鍵字的單輪細化方法;Rao等人[19]提出了一種基于弱監督的方法用于檢測C#和Java編程語言搜索查詢中的代碼搜索意圖,將用戶的查詢分類為是否可以用一段代碼充分回答,同時還發布了第一個從Bing網絡搜索引擎中挖掘的大規模真實數據集Search4Code,為之后的研究提供了基礎。
這類方法的缺點和不足在于許多現有研究構建的代碼語料庫數據量比較小,雖然保證了語料庫的高質量,但卻忽略了一個關鍵的問題:用戶希望獲得的真實答案也許并未包含在數據量較小的代碼語料庫中,這樣推薦的結果雖然有參考性但并不一定是正確的,使得推薦的結果沒有說服力。
1.3 提升代碼語料庫質量
近年來部分研究通過提升代碼語料庫中數據的質量來提高代碼推薦的準確度。如Sun等人[20]提出了由基于規則的句法過濾器和基于模型的語義過濾器。兩個后續過濾器組成的數據清洗框架
將代碼語料庫中的數據通過該框架進行清洗可以提高數據集質量,并使代碼語料庫中的描述在語義上更接近真實的用戶查詢。
這類方法的缺點和不足在于用戶的查詢有時并不是明確而具體的,也許用戶只是希望獲取與查詢相關的知識,在這種情況下如果通過完善和改進查詢使其更具體會適得其反,因此分析判斷查詢的真實意圖也是非常有必要的。
前三小節介紹了代碼推薦領域常用的三種推薦方式,每種方式中所介紹的方法均為近1~2年來代碼推薦領域的最新方法。其中無論是通過改進模型、優化查詢還是提升代碼質量的方式來實現代碼推薦,關鍵在于如何高效學習自然語言查詢和代碼中的語法和語義,盡量減小自然語言查詢與代碼之間的語義差。如1.1節中的MuCoS方法同時學習了代碼中的三種重要特征、1.2節中的clarifying question方法生成了澄清問題、1.3節中的方法設計了數據清洗框架。雖然具體實現細節均不同,但核心都是增強查詢和代碼中的語法及語義來提高代碼推薦準確率。
2 代碼片段推薦方法CSRSB
本文提出的代碼片段推薦方法CSRSB主要針對Java中的代碼片段進行推薦,其中每個代碼片段都是由Java語言構造的一個獨立的方法,并且都有一段與之相對應的自然語言描述來解釋其功能。CSRSB主要包含數據收集和清洗、自然語言描述和查詢向量生成模型、用戶線上查詢推薦三個模塊。本文方法的整體架構如圖1所示。
2.1 數據收集和清洗
本文代碼語料庫中的數據來源于現有的CodeSearchNet、DeepCom和CONCODE三個大型代碼—描述并行數據集。
CodeSearchNet中包括了由6種編程語言組成的共210萬條代碼—描述并行數據和640萬個單語代碼數,選取其中基于Java語言的數據并進行數據分析和篩選,最后選出了374 623條Java代碼—描述并行數據。DeepCom是一個專門的數據集研究,其中發布了從9 714個GitHub項目中收集的共588 108個Java方法和文檔對數據集。與CodeSearchNet類似,DeepCom將文檔的第一句話視為方法的摘要,因為文檔的第一句話通常描述Java方法的功能。經過數據分析和篩選后共有317 927條代碼—描述并行數據。CONCODE與DeepCom一樣是專門的數據集研究,通過挖掘近33 000個GitHub項目來收集數據。其發布的數據包含大約210萬個Java方法和小寫的Javadoc樣式的文檔對,通過數據分析和篩選并刪除其中重復的內容,最后篩選出669 275條代碼片段—自然語言描述并行數據。數據的基本格式為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;
}
以上只是對所選的三個數據集進行初步的分析和篩選,目的是希望獲取到格式和內容相對統一的Java代碼片段—描述的并行數據集。雖然這些數據集在原有的研究中已經進行過噪聲消除和數據清洗,但據觀察其中還有許多不符合規范的數據,尤其是CodeSearchNet中仍然有很多冗余數據。本文將設計數據清洗規則對收集到的代碼—描述并行數據集進行過濾,以獲取質量相對更高的代碼語料庫,包括但不限于以下幾點:
a)數據集中的Java代碼不是一個單獨的Java方法。本文推薦的代碼片段的粒度都是一個具體的Java方法,但有些收集到的數據中的Java片段是一個完整的類、兩個或以上的Java方法或者構造函數等內容,與本文數據所需的代碼粒度不符合,因此該類數據會被過濾掉。
b)數據集中的自然語言描述不是英語。本文選取英語作為自然語言描述的基準語種,是因為當今的大部分大型代碼倉庫和問答網站都是英文網站,大量現有研究中的數據都是從這些網站中爬取的,更具有代表性。其他語種的自然語言描述不符合本文要求,因此該類數據會被過濾掉。判斷自然語言描述是否為英語的方法是將該自然語言轉換成對應的字符串,通過調用字符串中相應的API(application programming interface)來判斷該字符串是否全部由英語單詞構成,如果是則保留這條數據,反之則刪除這條數據。
c)數據集中的自然語言描述包含圖片類問題。某些數據中的自然語言描述是針對某張具體的圖片進行處理,對應的Java代碼片段也是針對圖片的處理方法。但這樣的描述不具有普適性,用戶的查詢也無法針對具體的圖片進行有效提問,不符合本文要求,因此該類數據會被過濾掉。
d)數據集中的自然語言描述過長或過短。某些數據中的描述過短,往往只包含一個有效的英語單詞;而某些數據中的描述過長,包含了除代碼功能外的諸如評論或解釋等其他內容,這部分內容較為難以識別,但在分析數據的共有特征后發現大部分代碼描述都會用一段完整的英語句子解釋其功能,并以句號結尾。而帶有評論或者解釋的內容會附加在句號之后,并且往往會包含一些感嘆符號或者其他特殊符號,以此為依據來篩選符合要求的數據,雖然其中可能會將極少的正確數據刪除掉,但在海量數據的情況下影響很小且能保證數據的質量和結構的統一。這兩類描述都不能很好地概括方法的功能,不符合本文要求,因此該類數據會被過濾掉。
e)數據集中的Java代碼包含冗余的內容。本文希望獲取的Java代碼片段應該是一個規范的、完整的、正確的Java方法,能直觀地展示自然語言描述所對應的功能,供用戶使用。因此雖然諸如源代碼中的注釋、非ASCII碼和轉義字符等內容包含了重要的語義,但本文中選用的代碼片段粒度為一個完整的Java方法,其中最為重要的闡述Java方法功能的注釋已作為代碼功能的描述保存下來,而方法內部的某些變量、API、參數等注釋并不能表現方法的功能,對本文所用推薦方法的影響很小,若其中包含不規范、不正確、難以識別的錯誤注釋反而會對開發者產生誤導。因此需要刪除這部分內容對應的數據。
通過對收集的所有數據進行篩選、清洗和過濾操作,最終獲得了來自CodeSearchNet中的189 998條數據、DeepCom中的235 186條數據和CONCODE中的607 744條數據,總計1 032 928條Java代碼—描述對并行數據共同構成了本文的代碼語料庫。數據集的基本信息如表1所示。
2.2 自然語言描述和查詢向量生成模型
本文中使用的自然語言描述和查詢向量生成模型為SBERT,該模型是通過對預訓練模型BERT[21](bidirectional encoder representations from transformers)進行微調而獲得的。
BERT作為雙向特征表示的自編碼預訓練模型,基于Transformer的encoder來構造雙向編碼器,通過聯合調節所有層的上下文,從未標記文本中預訓練深度雙向特征。其預訓練模型是基于自監督學習的,因此不需要預先對文本數據進行特征標注,并且該模型中的參數非常多,需要海量的文本數據進行訓練,會消耗極大的算力。但BERT預訓練模型的優點在于只需要一個額外的輸出層既可以進行微調,從而為各種任務創建最先進的模型,無須對特定的任務架構進行大量修改。
BERT預訓練模型主要包括BERT-base和 BERT-large兩個版本。BERT-base中包含了12-layer、768-hidden、12-heads和1.1億個參數;BERT-large中包含了24-layer、1024-hidden、16-heads和3.4億個參數。海量的參數自然使BERT預訓練模型具有非常優秀的性能。該模型在11個NLP(natural language processing)任務上獲得了SOTA(state of the art)結果,包括將GLUE(general language understanding evaluation)分數提升至80.5%(7.7%的絕對改進)、MultiNLI(the multi-genre natural language inference)準確度提升到86.7%(4.6%的絕對改進),并且在機器閱讀理解頂級水平測試SQuAD 1.1和SQuAD 2.0上表現出了驚人的成績,成為了NLP發展史上具有里程碑意義的模型。其基本架構如圖2所示。
然而BERT模型并不是萬能的。在語義文本相似性(semantic textual similarity)等句子對回歸任務中需要將兩個句子都輸入BERT模型中。雖然其確實能夠提供非常優秀的性能,但也導致了巨大的計算開銷,比如在尋找最相似句子對這樣的任務中需要消耗非常長的時間。因此BERT模型并不適合語義相似性搜索以及聚類等無監督任務。
通過連體網絡架構進行微調的SBERT模型能夠推導出輸入句子的固定大小且具有明確語義的句向量,并可以通過余弦相似度或者歐氏距離等方法進行相似度比較,在保證BERT模型推薦準確度的情況下大幅減少計算開銷,快速完成語義相似性搜索等任務。SBERT模型通過在BERT模型的輸出中添加一個池化層(pool)進行微調,通過計算所有輸出向量的平均值(mean-strategy)的池化策略來獲得固定大小的句向量。
為了使生成的句向量在語義上有意義且可以通過余弦相似度進行比較,創建連體和三元網絡[22]來更新網絡權重,并使用均方誤差損失(mean squared error)作為網絡的回歸目標函數(regression objective function)來計算兩個句向量之間的余弦相似度。
MSE(y,f(x))=1n∑ni=1(yi-f(xi))2(1)
其中:y和f(x)分別表示樣本的真實值和預測值;yi和f(xi)分別表示第i個樣本的真實值和預測值;n表示樣本的個數。均方誤差損失的優點是光滑連續且可導,便于使用梯度下降算法,有利于函數的收斂,即使固定學習因子,函數也能較快取得最小值。最后選擇SNLI[23]和multi-Genre NLI[24]對SBERT模型進行微調,因為通過這兩個數據集訓練模型生成的句向量顯著優于一些其他的先進的句向量生成方法(如InferSent[25]、Universal Sentence Encode[26]等)。微調完成之后即可獲得包含豐富語言的句向量并進行相似度計算。
2.3 代碼片段匹配與推薦
通過SBERT模型可以產生任意句子對應的句向量,從而計算任意兩個句向量之間的余弦相似度。因此可以在用戶輸入的查詢和代碼描述之間進行相似度比較,依據相似度進行排序來推薦與查詢相關的代碼片段。余弦相似度取值是[-1,1],其值若為正且越接近于1則表示兩個向量之間越相似。
cos_score=p·q‖p‖×‖q‖=∑ni=1pi×qi∑ni=1(pi)2×∑ni=1(qi)2(2)
其中:p是用戶輸入的自然語言查詢對應的句向量,q是代碼片段對應的描述的句向量,‖p‖和‖q‖是句向量的模。通過余弦相似度比較既可以找到與查詢最相似的代碼片段。但由于代碼語料庫中的數據量很大且余弦相似度的取值為[-1,1],所以會出現多個結果可能十分接近的情況,從而造成浮點數在計算機中的不精確存儲并導致系統誤差。針對此問題,首先將生成的句向量進行歸一化(normalize)處理。
v^=v‖v‖(3)
其中:v是查詢或者描述的句向量;‖v‖是句向量的模。通過歸一化向量之后,所有句向量的長度都將被固定為1。可以使用點積(dot product)來計算句向量之間的相似度。
dot_score=p·q=∑ni=1pi×qi=‖p‖×‖q‖×cos θ(4)
同樣地,p是用戶輸入的自然語言查詢對應的句向量;q是代碼片段對應的描述的句向量;‖p‖和‖q‖是句向量的模;cos θ代表的是兩個向量之間的夾角。點積的值與向量之間的夾角成反比,點積值為正且越大則說明夾角越小,也代表了向量之間越接近,因此也表示了自然語言查詢與代碼片段描述之間越相似。并且點積的值不局限于某個區間,有效地避免了多個結果之間的接近導致的不精確存儲和系統誤差。
由于代碼語料庫中的數據量很大,所以通過多線程提前為代碼語料庫中的所有代碼片段描述生成相應的句向量,并存儲在同一文件中,之后在進行相似度比較時就可以直接調用文件中的數據,大大節省時間。通過多線程也可以同時生成100個及以上自然語言查詢對應的句向量。然后使用點積公式獲取每個自然語言查詢句向量和代碼片段描述句向量之間的相似度,并且將生成的相似值存儲在同一文件中。通過對文件中的相似值進行排序就能夠獲得任意數量的與查詢最相似的代碼片段的描述,從而推薦最相似的多個代碼片段。基于SBERT模型的自然語言查詢和描述的相似度匹配如算法1所示。
算法1 相似度匹配算法
輸入:自然語言查詢i。
輸出:k個相似度最高的代碼片段csk。
a)通過SBERT模型,將自然語言查詢i轉換成對應的句向量Ei。
b)for i←1 to n //n是代碼語料庫中總的數據量
c)" 通過SBERT模型,將代碼片段對應的自然語言描述di轉換成對應的句向量Edi。
d)將n個Edi與di和對應代碼片段存儲在同一文件中,可重復使用。
e)for j←1 to n
f)" 通過點積公式計算Edi與Ei之間的相似度sim(Ei,Edi)。
g)基于排序算法對所有的sim(Ei,Edi)進行降序排列。
h)根據排列結果與代碼語料庫,推薦前k個相似度最高的代碼片段csk。
3 實驗結果及分析
3.1 實驗環境
本實驗采用的平臺是由Intel Xeon E5-2603 v4 1.7 GHz的處理器、Tesla K80的GPU和32.0 GB 的RAM構成的服務器。其中搭載了Ubuntu 18.04.5 LTS的操作系統,使用JDK1.8版本、Python 3版本并結合PyTorch框架作為數據篩選和清洗以及自然語言描述和查詢向量生成模型的運行環境。
3.2 實驗數據
由于本文構建的代碼語料庫中的百萬條數據均來源于CodeSearchNet、DeepCom和CONCODE這三個數據集,所以若使用這三個數據集中的數據作為本實驗的基準數據會出現本文方法一定能夠推薦出正確結果的情況,在與其他方法進行對比時本文方法就會產生更好的效果,違背了對比實驗的基本要求。為了避免其他因素的干擾而影響實驗結果,本實驗不會采用CodeSearchNet、DeepCom和CONCODE中的數據作為實驗的基準數據。而FunCom與上述三個數據集一樣也是由海量數據專門構建的代碼語料庫,其公布的數據已在一些類似的任務上證實了其真實有效性。因此選取FunCom數據集中經過驗證的500條真實有效的〈Java方法代碼片段—自然語言描述〉鍵值對數據作為本實驗的基準數據。
3.3 評估指標
本實驗采用的評估參數是推薦算法中常用的HR@K(hit ratio)、MRR@K(mean reciprocal rank)和MAP@K(mean average precision)三個評估指標。其中HR@K是一種常用的衡量召回率的指標,反映的是在每次推薦K個結果的條件下所有結果中包含正確答案的情況占總的推薦次數的比例,相應可以表示為推薦的準確率。
HR@K=1N∑Ni=1hit(i)(5)
其中:N表示推薦的次數;hit(i)函數表示是否命中,即正確結果是否出現在推薦結果中,存在則為1,反之則為0。除了推薦的準確度以外,正確答案在推薦結果中出現的位置也是非常重要的。如果能夠保證正確答案總是出現在推薦結果中的前幾名位置上的話,就能夠為開發人員節省篩選正確答案所需的時間。MRR@K表示第一個正確答案在所有推薦結果中的位置順序。
MRR@K=1N∑Ni=11Loc(i)(6)
其中:N表示推薦的次數;Loc(i)函數表示第i次推薦中第一個正確答案在K個結果中的順序位置,其值的范圍是從1到所有推薦結果總數的正整數,但如果推薦結果沒有包含正確答案,則其值為無窮大,其倒數值為0。MRR@K的值越大則表示查詢的正確答案在所有推薦結果中的順序位置越靠前,越能夠更快地被開發人員所采用。
但是MRR@K只能根據第一個正確答案在所有推薦結果中的位置進行評估,實際情況中往往會出現推薦結果中包含一個以上的正確答案。針對這種情況,采用MAP@K進行評估,該指標可以測量所有的正確答案在推薦結果中的位置順序,能夠更好地反映實際推薦過程中可能出現的情況。該指標在信息檢索、目標檢測、多標簽等領域也有應用,是一個應用范圍很廣的評估指標。
MAP@K=1N∑Ni=1APi=1N∑Ni=1∑Kj=1hit(j)×1Loc(j)Ai(7)
其中:N表示推薦的次數;APi表示第i次推薦時的平均精度;Ai表示第i次推薦時正確答案的集合;|Ai|表示第i次推薦時正確答案的數量;K表示每次推薦多少個結果;hit(j)函數表示第j個推薦結果是否正確,若正確則為1,反之則為0;Loc(j)函數表示第j個推薦結果在所有結果中的順序位置,其值是1~K的正整數,但如果hit(j)函數的值為0,則其值為無窮大,其倒數值為0。
3.4 實驗結果
為了測試CSRSB的性能,選取了MuCoS、BM25[27]和DeepCR[28]作為三個基準方法。MuCoS的相關描述已在第1章相關工作部分進行了詳細的解釋;BM25作為傳統的信息檢索方法,通過計算TextRank中的句子相似度獲取對應的評分,并且對所有的句子按照評分降序排列,選擇評分最高的幾個句子作為摘要;DeepCR通過seq2seq模型為每個代碼片段生成相應的自然語言描述,然后比較自然語言描述與查詢之間的相似度來進行代碼片段的推薦。
實驗數據選取了來自FunCom中的500條真實有效的代碼片段—描述并行數據,通過將數據中的自然語言描述轉換成相應的問題并作為自然語言查詢。因此可以對每個方法進行500次的查詢并通過三個評估指標來檢測其性能。
本實驗中設定推薦結果數K的取值為1、3、5和10。首先是因為當K取1時能夠表示正確結果出現在首個位置上的概率,是非常重要的參數。其次K取3、5和10主要是為了考慮正確結果沒有出現在第一個位置上以及出現多個正確結果的情況下推薦方法的性能。而K不取1~10的所有參數是因為相鄰的參數之間實驗數據差異不大,參考價值較小,還會因為設置的參數過多而影響觀察。同時K不取10以上參數的原因在于用戶都希望正確的推薦結果出現在更加靠前的位置,若是正確結果出現在第10個結果之后的推薦結果中的話,間接說明代碼推薦方法存在一定的問題。最后K取1、3和10也是推薦系統中常用的三個參數,許多現有代碼推薦研究中也沿用這三個參數來進行實驗,本實驗中還加入了K=5的參數作為對比。
而當K=1時MRR作為檢測第一個正確答案位置順序的指標以及 MAP 作為檢測多個正確答案及其位置順序的指標都失去其意義,故K只選取3、5和10對這兩個指標進行實驗。
表2列出了本文方法和其他三種基準方法在推薦準確度HR@K上的對比。可以看出CSRSB在HR@K上的性能完全優于BM25和DeepCR,并且也略優于MuCoS。同時在HR@1和HR@3的指標上相比BM25和DeepCR具有更明顯的優勢,說明CSRSB的正確答案會出現在更加靠前的位置,間接證明了CSRSB在MRR@K和MAP@K上的評估指標也會更加優秀。
表3列出了本文方法和其他三種基準方法在評估指標MRR@K上的對比。可以看出CSRSB在MRR@K上的性能略優于MuCoS,這兩種方法并沒有相差太多,但對比BM25和DeepCR都具有更好的性能。由此可見CSRSB能夠更好地將正確結果推薦在更加靠前的位置。
表4列出了本文方法和其他三種基準方法在評估指標MAP@K上的對比。可以看出CSRSB在MAP@K上的數據同樣優于其他三種基準方法。由此可見在同時考慮推薦的準確度和多個正確答案的順序位置情況時CSRSB具有更優秀的性能。
表5列出了部分基準數據在CSRSB中的測試用例,其中包括了問題的編號、自然語言的查詢、正確答案的數量(K=10)和推薦的速度,可以發現針對所有的用戶查詢CSRSB都可以做到立即推薦。
4 結束語
本文提出了一種基于SBERT模型的代碼片段推薦方法CSRSB。首先構建了包含上百萬條數據的大型代碼語料庫,其中的數據經過許多方法的驗證,數據質量較高;然后通過微調BERT生成的SBERT模型為自然語言生成具有豐富語義的句向量,自然語言之間的語義差比代碼與自然語言之間的語義差更容易處理,因此基于SBERT模型進行代碼片段推薦在準確度上優于現有的相關研究。在提升推薦準確度的同時也考慮了推薦速度,能夠立刻為用戶推薦相應的結果。
本文方法雖然獲取了高質量的百萬條數據,但其中仍然存在一些難以識別的冗余數據,并且沒有統一的數據集質量評測指標對本文構建的代碼語料庫進行評估。同時本文方法只應用于特定編程語言的特定代碼粒度,不同的編程語言和代碼粒度在應用該方法時的性能并不確定,不具備廣泛適用性。因此下一步的研究方向首先會將該方法擴展到不同編程語言和代碼粒度上來驗證其有效性,并通過專門的數據清洗框架進一步提升代碼語料庫中數據的質量。
參考文獻:
[1]魏敏,張麗萍.代碼搜索方法研究進展[J].計算機應用研究,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]胡星,李戈,劉芳,等.基于深度學習的程序生成與補全技術研究進展[J].軟件學報,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]李浩,鐘聲,康雁,等.融合領域知識的 API 推薦模型[J].計算機科學,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與文本特征的新聞摘要算法[J].成都信息工程大學學報,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].計算機科學與探索,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.)