陳豪伶 虞慧群 范貴生 李明辰 黃子杰
(華東理工大學(xué)計算機(jī)科學(xué)與工程系 上海 200237)
(hlchen@mail.ecust.edu.cn)
研究表明,在軟件的開發(fā)和維護(hù)的過程中,軟件工程師需要花費59%的時間在程序理解上[1]. 代碼摘要可以幫助軟件開發(fā)人員快速理解代碼. 但是,由于項目工期緊,開發(fā)人員將主要精力花費在編程上,代碼摘要編寫工作往往被忽視. 代碼自動摘要類似于機(jī)器翻譯,可以為源碼自動生成自然語言描述,節(jié)省手工編寫摘要的時間,提高軟件開發(fā)效率. 早期的代碼自動摘要主要采用基于模板[2-7]和基于信息檢索[8-11]的技術(shù). 近年來,基于深度學(xué)習(xí)的方法被應(yīng)用到代碼自動摘要領(lǐng)域,并逐漸取代傳統(tǒng)的方法.
然而,這些基于深度學(xué)習(xí)的代碼自動摘要技術(shù)大都致力于為方法粒度的代碼片段生成摘要[12]. 對面向?qū)ο蟮恼Z言,例如Java 語言,類才是項目的基本組成單元[13]. 與方法相比,類的結(jié)構(gòu)更為復(fù)雜,代碼量也更大. 因此,需要專門針對類摘要生成任務(wù)的深度學(xué)習(xí)模型. Li 等人[14]提出的ClassSum 將深度學(xué)習(xí)的方法應(yīng)用到類摘要生成任務(wù)中,并構(gòu)建了一個包含十幾萬個樣本的類摘要數(shù)據(jù)集. ClassSum 是一個基于多編碼器的類摘要生成模型,使用2 個編碼器分別得到代碼的token 序列和CSBT 序列的向量表征,再使用帶有Switch 網(wǎng)絡(luò)的解碼器在每個解碼時間步動態(tài)地為2 種代碼表征分配權(quán)重,從而融合代碼的語義和結(jié)構(gòu)信息. 類的代碼量較大,將整個類的源碼作為輸入對于編碼器而言是一個極大的挑戰(zhàn). 因此,Li 等人[14]創(chuàng)造性地提出了源代碼精簡策略,只保留類簽名、屬性和方法簽名等關(guān)鍵信息,并使用精簡后的代碼生成CSBT 序列.
盡管ClassSum 融合了類的結(jié)構(gòu)和語義信息,但未充分利用類的層次結(jié)構(gòu). ClassSum 將抽象語法樹(abstract syntax tree,AST)處理為CSBT 序列,為保證編碼效率對CSBT 序列做截斷處理,序列化和截斷的操作一定程度上破壞了抽象語法樹的結(jié)構(gòu),無法保留完整的層次結(jié)構(gòu). ClassSum 的代碼精簡策略可以有效控制類的代碼文本的長度,但是使用單個編碼器編碼精簡后的類,輸入序列的長度依舊很長. 當(dāng)輸入序列過長時,循環(huán)神經(jīng)網(wǎng)絡(luò)很難處理長程依賴問題,從而丟失較早時間步的特征[15]. 此外,使用的語料庫缺乏上下文,而在實際的摘要編寫過程中,開發(fā)人員往往高度依賴程序的上下文信息. 最后,基于深度學(xué)習(xí)的代碼摘要模型由數(shù)據(jù)驅(qū)動,數(shù)據(jù)集的質(zhì)量和規(guī)模將直接影響生成摘要的質(zhì)量. 目前的數(shù)據(jù)集規(guī)模較小,模型在數(shù)據(jù)集上學(xué)習(xí)到的知識有限,一定程度上影響生成摘要的質(zhì)量.
針對這些問題,本文提出了基于分層表示和上下文增強(qiáng)的類摘要生成方法,主要工作內(nèi)容有3 方面.
1)類包含明顯的層次結(jié)構(gòu),可以分為3 個層次:類簽名、屬性和方法. 為了快速理解項目,軟件開發(fā)人員往往只閱讀類簽名、屬性名和方法簽名,很少關(guān)注方法的具體實現(xiàn). 受此代碼閱讀習(xí)慣的啟發(fā),提出一種基于分層的方法來表征類. 該方法首先對語料庫中的源代碼作精簡處理[14],每個類只保留它的簽名、屬性名和方法簽名. 編碼階段,對類的層次結(jié)構(gòu)建模,根據(jù)各層次的特點設(shè)計不同的編碼器得到向量表征. 解碼階段,通過注意力機(jī)制和Switch 網(wǎng)絡(luò)融合每個層次的關(guān)鍵信息生成摘要. 代碼分層表示,一方面能對類的層次結(jié)構(gòu)建模,在編碼—解碼的過程中顯示地利用類的層次結(jié)構(gòu),學(xué)習(xí)對類摘要生成具有重要作用的信息在各層次的分布情況. 另一方面,可以縮短每個編碼器輸入序列的長度,緩解長程依賴問題.
2)在數(shù)據(jù)集構(gòu)造方面,采用從開源網(wǎng)站下載公開代碼倉庫的方法獲得原始數(shù)據(jù),并使用多種靜態(tài)分析工具從代碼倉庫中提取類的源代碼及其摘要.同時,分析類之間的繼承關(guān)系,將父類的簽名及父類的摘要作為類的上下文,最終構(gòu)建了一個包含上下文信息的類摘要數(shù)據(jù)集. 數(shù)據(jù)集共有358 992 個〈Java類,上下文,摘要〉數(shù)據(jù)對.
3)數(shù)據(jù)集中的部分類繼承了父類. 對于這些類,將父類的簽名及父類的摘要作為上下文編碼器的輸入,從而引入類的上下文知識,使得模型可以同時從目標(biāo)類的內(nèi)部和外部獲取信息,進(jìn)一步提高這部分類的摘要生成質(zhì)量. 對于沒有父類的類,使用無實際意義的符號“ 〈pad 〉”填充上下文序列,模型只學(xué)習(xí)類的內(nèi)部知識.
目前,深度學(xué)習(xí)已經(jīng)成為代碼摘要領(lǐng)域最主要的方法,本節(jié)對基于深度學(xué)習(xí)的代碼摘要方法進(jìn)行系統(tǒng)的歸納和闡述,包括基于文本和抽象語法樹的代碼摘要方法、基于層次結(jié)構(gòu)建模的代碼摘要方法、融合上下文信息的代碼摘要方法. 近年來,大語言模型逐漸被應(yīng)用到代碼生成、代碼理解等代碼相關(guān)任務(wù)上,本節(jié)也對相關(guān)的工作進(jìn)行介紹.
此類方法通常將代碼的文本序列或AST 節(jié)點序列輸入到深度學(xué)習(xí)模型中,得到向量表征,再解碼生成摘要.
Iyer 等人[16]率先將深度學(xué)習(xí)的方法引入代碼自動摘要領(lǐng)域,使用帶有注意力機(jī)制的長短期記憶(long short-term memory,LSTM)神經(jīng)網(wǎng)絡(luò),根據(jù)代碼語言的token 序列生成自然語言描述. 之后,基于深度神經(jīng)網(wǎng)絡(luò)的技術(shù)逐漸成為代碼自動摘要生成領(lǐng)域的主流技術(shù). Allamanis 等人[17]使用卷積神經(jīng)網(wǎng)絡(luò)和注意力機(jī)制從源代碼的token 序列中提取局部特征,生成類似函數(shù)名的摘要.
代碼是結(jié)構(gòu)化的語言,其抽象語法樹蘊(yùn)含著豐富的結(jié)構(gòu)信息,對摘要的生成具有重要作用. Hu等人[18]提出了一種基于結(jié)構(gòu)的遍歷(structure-based traversal, SBT),把抽象語法樹扁平化為序列,并將SBT序列作為模型輸入,學(xué)習(xí)程序語言的語義和結(jié)構(gòu)信息.
通過代碼的文本和抽象語法樹可以分別得到語義和結(jié)構(gòu)信息. Leclair 等人[19]使用2 個雙向的GRU編碼器分別編碼源代碼token 序列和AST 節(jié)點序列,得到源代碼的2 種表示,再通過一個帶有注意力機(jī)制的解碼器生成摘要. 研究人員開始思考如何更有效地融合語義和結(jié)構(gòu)信息. Hu 等人[20]提出了一個多編碼器模型Hybrid-DeepCom,從源代碼和抽象語法樹中分別學(xué)習(xí)語義和結(jié)構(gòu)信息,并使用一個混合注意力機(jī)制融合語義和結(jié)構(gòu)信息. Zhou 等人[21]提出的交換網(wǎng)絡(luò)在每個解碼時間步生成一個權(quán)重向量,從而有效地組合源代碼和抽象語法樹的表示.
此外,Ahmad 等人[22]使用Transformer 模型生成摘要. Alon 等人[23]將源代碼表示為AST 中的一組路徑,在解碼時使用注意力機(jī)制選取相應(yīng)的路徑生成摘要. Zhou 等人[24]將圖神經(jīng)網(wǎng)絡(luò)應(yīng)用到代碼摘要生成任務(wù),采用多頭注意力機(jī)制學(xué)習(xí)AST 節(jié)點的特征,并通過為其鄰居節(jié)點分配不同的權(quán)重來聚合特征.張世琨等人[25]將源碼中的簽名和API 調(diào)用作為關(guān)鍵字,在解碼階段使用關(guān)鍵字來優(yōu)化注意力權(quán)重的分配.
總之,基于文本和抽象語法樹的代碼摘要在建模時忽略了代碼的層次結(jié)構(gòu),無法獲得代碼的層次知識.
源代碼及其抽象語法樹都具有明顯的層次特點,基于層次結(jié)構(gòu)建模的代碼摘要方法可以獲取代碼的層次結(jié)構(gòu)知識.
Zhou 等人[26]注意到代碼的分層特點,即token 組成語句,語句組成代碼片段的層次. 為了建模代碼的層次結(jié)構(gòu),將抽象語法樹和代碼片段按照語句的粒度切分. 編碼階段,每個語句先使用token 編碼器和內(nèi)部注意力機(jī)制得到token 層次的代碼表征,再經(jīng)過語句編碼器得到語句層次的向量表征,最后將這2個層次的表征拼接起來. Wang 等人[27]將代碼、控制流圖以及類型增強(qiáng)的AST 作為輸入,采用分層編碼為3 個模態(tài)的輸入建立token 層次和語句層次的代碼表征. Lin 等人[28]提出了一種基于塊的AST 分割方法,根據(jù)代碼控制流圖的支配樹拆分代碼,并為每個代碼塊生成一個AST. 然后,使用Tree-LSTM 建模AST子樹,將根節(jié)點的輸出作為AST 的語法嵌入. 最后,將所有AST 的嵌入向量經(jīng)過一個平均池化層,得到最終的全局向量表示,并將該向量表示與每個token的詞嵌入拼接,作為Transformer 的輸入,解碼生成摘要. Shi 等人[29]以分層的方式拆分代碼的AST,并根據(jù)子樹的特點采用2 階段編碼. 第1 階段使用基于樹的遞歸神經(jīng)網(wǎng)絡(luò)和池化層得到每棵子樹的向量表示,第2 階段使用另一個基于樹的遞歸神經(jīng)網(wǎng)絡(luò)建模子樹之間的層次關(guān)系,然后將抽象語法樹和源碼的表示一起輸入到Transformer 解碼器中生成摘要.
總之,基于層次結(jié)構(gòu)建模的代碼摘要方法利用了代碼的層次結(jié)構(gòu)知識,一定程度上提升了摘要的質(zhì)量,但是僅利用了目標(biāo)代碼的內(nèi)部知識,未充分利用代碼的上下文信息.
目前,大部分的代碼摘要生成模型都在獨立的代碼摘要對上訓(xùn)練. 但在項目中,代碼的功能需要通過項目本身以及它的上下文獲取.
Mcburney 等人[30]使用PageRank 算法,并根據(jù)程序調(diào)用圖確定函數(shù)的上下文,借助軟件詞語用例模型[31]從上下文中提取關(guān)鍵字,然后使用模板生成摘要. Yu 等人[32]使用目標(biāo)函數(shù)的局部和全局信息生成摘要. 首先,使用局部編碼器從函數(shù)中獲取語義信息.然后為了獲得函數(shù)的全局信息,將目標(biāo)函數(shù)與所在類的其他函數(shù)連接起來,構(gòu)成類級別的上下文圖并使用圖注意力網(wǎng)絡(luò)得到目標(biāo)函數(shù)類級別的表示.Wang 等人[33]使用類內(nèi)上下文信息和類間上下文信息豐富函數(shù)的語義信息. 根據(jù)目標(biāo)函數(shù)所在類的類名挖掘函數(shù)與類的關(guān)系,通過UML 類圖得到所屬類與其他類的關(guān)系,最后將這些上下文信息、源碼和AST 一同作為模型的輸入. Haque 等人[34]提出文件上下文的概念,即把同一個文件內(nèi)的其他函數(shù)當(dāng)作上下文,在編碼階段使用文件編碼器獲取函數(shù)的上下文信息. 此外,他們將目標(biāo)方法的方法名作為關(guān)鍵字單獨編碼,并提出了動態(tài)詞表機(jī)制緩解未登錄詞(out of vocabulary,OOV)問題. Bansal 等人[35]抽取目標(biāo)函數(shù)所在項目中的文件作為上下文,采用與Haque等人[34]相似的方式將文件中的方法轉(zhuǎn)化為向量表示,再使用RNN 編碼器得到方法的最終表示,供解碼階段使用.
總之,融合上下文信息的代碼摘要方法能夠從目標(biāo)代碼的外部獲取信息,提高生成摘要的質(zhì)量.
近年來,BERT[36],GPT[37-39]等預(yù)訓(xùn)練語言模型在自然語言處理任務(wù)上取得了極大的成功. 最近的一些工作將預(yù)訓(xùn)練語言模型應(yīng)用到編程語言上. Feng等人[40]提出的CodeBERT 模型使用屏蔽語言建模和替換令牌檢測2 個任務(wù)進(jìn)行預(yù)訓(xùn)練,可以捕獲編程語言和自然語言之間的聯(lián)系,并生成支持編程語言和自然語言理解任務(wù)的通用表示. Wang 等人[41]基于Transformer 構(gòu)建了一個預(yù)訓(xùn)練的編碼器-解碼器模型CodeT5,并提出一種新的標(biāo)識符感知的預(yù)訓(xùn)練任務(wù). Guo 等人[42]考慮到代碼的結(jié)構(gòu)特點提出了模型GraphCodeBERT,該模型引入2 個結(jié)構(gòu)感知的預(yù)訓(xùn)練任務(wù),分別從源碼和數(shù)據(jù)流中學(xué)習(xí)代碼的表示.
由OpenAI 開發(fā)的人工智能內(nèi)容生成模型ChatGPT 在機(jī)器翻譯、文本生成、摘要編寫等語言理解和生成任務(wù)上展現(xiàn)出強(qiáng)大的能力. OpenAI 最新發(fā)布的GPT-4[43]能夠處理文本和圖像的輸入,功能進(jìn)一步增強(qiáng). 近期也出現(xiàn)了一些針對代碼相關(guān)任務(wù)的大模型. Chen 等人[44]使用GitHub 上公開的代碼數(shù)據(jù)微調(diào)了一個基于GPT 的代碼大模型Codex. Meta 發(fā)布的Code Llama[45]是基于Llama 2 的開源大型代碼語言模型,可以執(zhí)行各種代碼相關(guān)任務(wù),例如代碼生成、代碼摘要生成. Code Llama 在代碼生成任務(wù)上的表現(xiàn)逼近GPT-4. WizardLM 推出的WizardCoder[46]在Code Llama的基礎(chǔ)上進(jìn)行指令微調(diào),在4 個廣泛認(rèn)可的數(shù)據(jù)集上表現(xiàn)出優(yōu)秀的代碼生成能力.
編碼器-解碼器框架[47]是NMT 領(lǐng)域的經(jīng)典框架,其包括一個編碼器和一個帶有注意力機(jī)制的解碼器.對于代碼摘要生成任務(wù)而言,編碼器將輸入的代碼序列轉(zhuǎn)換為向量表征,解碼器則根據(jù)這個中間表示解碼生成摘要,具體的執(zhí)行過程有2 個階段:
1)編碼階段. 給定代碼輸入序列,首先經(jīng)過一個詞嵌入層,將輸入序列轉(zhuǎn)換為詞嵌入向量序列x=(x1,x2,…,xn). 再經(jīng)過一個循環(huán)神經(jīng)網(wǎng)絡(luò),將詞嵌入序列的向量表征編碼為一組連續(xù)的表示,得到代碼的語義向量序列h=(h1,h2,…,hn):
其中fenc是一個RNN 編碼器,編碼器的輸出ht由當(dāng)前編碼時間步的輸入xt和上一時刻的輸出ht?1共同決定.
2)解碼階段. 解碼器根據(jù)中間表示h以及之前的解碼結(jié)果預(yù)測目標(biāo)序列下一個token 的概率分布:
其中解碼器通常為單向的RNN,g是一個概率估計函數(shù),st是解碼器時刻t的隱藏狀態(tài). 解碼器使用注意力機(jī)制計算出背景向量ct:
解碼器當(dāng)前狀態(tài)st在編碼器第i個輸出hi上的注意力權(quán)重 αti計算公式為:
其中a是對齊得分函數(shù),用于計算st和hi的匹配程度.
LSTM 神經(jīng)網(wǎng)絡(luò)[48]引入記憶細(xì)胞的結(jié)構(gòu),有效緩解了普通循環(huán)神經(jīng)網(wǎng)絡(luò)難以處理的長程依賴問題.LSTM 通過遺忘門決定上一個細(xì)胞狀態(tài)中需要被遺忘的內(nèi)容,通過輸入門決定當(dāng)前時刻輸入中需要被保留的內(nèi)容,并根據(jù)遺忘門和輸入門更新記憶細(xì)胞狀態(tài). 最后,通過細(xì)胞狀態(tài)和輸出門計算輸出信號.LSTM 的結(jié)構(gòu)如圖1 所示.

Fig. 1 The structure of a LSTM cell圖1 LSTM 單元的結(jié)構(gòu)
具體的計算過程為:
其中,xt是當(dāng)前時刻的輸入,ht?1是上一時刻的輸出,ft、it、ot分別為遺忘門、輸入門和輸出門,ct?1、ct分別為上一時刻和當(dāng)前時刻的細(xì)胞狀態(tài), σ是sigmoid激活函數(shù).
Switch 網(wǎng)絡(luò)由Zhou 等人[21]提出,Switch 網(wǎng)絡(luò)能有效融合代碼的文本和抽象語法樹的向量表征,提高代碼摘要的生成質(zhì)量. 考慮到解碼器可能在每個解碼時間步對不同模態(tài)的代碼表征有偏好,Switch 網(wǎng)絡(luò)學(xué)習(xí)自適應(yīng)權(quán)重向量,為各代碼表征動態(tài)地分配權(quán)重.
其中, δ是激活函數(shù),用于確保p中每個維度的值在[0,1]區(qū)間內(nèi). 最終的背景向量表示ct由和的加權(quán)平均值經(jīng)過一個非線性激活函數(shù)得到:
本節(jié)詳細(xì)介紹基于分層表示和上下文增強(qiáng)的類摘要生成模型的架構(gòu)HRCE(hierarchical representation and context enhancement). HRCE 能有效表征類的代碼文本,提取語義信息和層次結(jié)構(gòu)信息,同時從父類及其相應(yīng)的摘要中獲取類的上下文語義. 利用類的內(nèi)部和外部的知識,解碼得到類功能的自然語言描述.HRCE 的整體架構(gòu)如圖2 所示,它是一個多編碼器-解碼器模型,包括分層編碼器、上下文編碼器和聯(lián)合解碼器3 部分.

Fig. 2 Class summarization generation model HRCE圖2 類摘要生成模型HRCE
模型的輸入為類簽名、屬性名、方法簽名和由父類的簽名及父類摘要組成的上下文,輸出為生成的摘要. HRCE 采用導(dǎo)師驅(qū)動(teacher forcing)的訓(xùn)練方式,在模型訓(xùn)練階段,解碼器的輸入為參考摘要,從而最大化摘要中真實token 的概率,加快模型收斂速度. 測試階段,模型無法看到參考摘要,解碼器的輸入為上一時刻的預(yù)測結(jié)果.
分層編碼器由3 個獨立的子編碼器組成:類簽名編碼器、屬性名編碼器和方法簽名編碼器,分別用于提取類簽名、屬性名和方法簽名中的語義信息,并對類的層次結(jié)構(gòu)建模.
3.1.1 類簽名編碼器
規(guī)范的類簽名能反映一個類的大致功能,是編寫摘要的重要依據(jù)[49]. 然而,以往的工作通常將整個代碼段的token 序列輸入到編碼器中,過長的輸入使得神經(jīng)網(wǎng)絡(luò)難以處理長程依賴,從而遺忘前面輸入的特征. 為了解決這個問題,本文用一個單獨的編碼器編碼類簽名,盡可能多地保留其語義特征.
類簽名編碼器使用一個雙向的LSTM.給定類簽名token 序列的嵌入向量序列xcs=(x1,x2,…,xn). 在每個時刻t編碼一個詞向量xt,得到隱藏狀態(tài):
3.1.2 屬性名編碼器
屬性名編碼器由雙向的LSTM 和內(nèi)部注意力機(jī)制組成. 給定一組屬性名attrs={attr1,attr2,...,attrn},經(jīng)分詞處理后,每個屬性名都被拆分為若干個token,即attri={token1,token2,…,tokenn} .attr經(jīng)過詞嵌入層轉(zhuǎn)換為詞嵌入向量序列=(xi1,xi2,…,xil),再通過LSTM 編碼為隱藏表示序列圖3 展示了屬性名的編碼過程.

Fig. 3 The encoding process of attribute names圖3 屬性名的編碼過程
考慮到每個token 對屬性名的表示貢獻(xiàn)不同,使用一個注意力層提取關(guān)鍵信息,得到屬性名的最終表示. 為了與解碼器的注意力機(jī)制區(qū)分,稱這個注意力為內(nèi)部注意力[26]:
其中,wu和bu分別為參數(shù)矩陣和偏置值, αij是歸一化的權(quán)重.ux是通過聯(lián)合學(xué)習(xí)得到的背景向量,用于選擇token.ki是屬性名最終的表示,一組屬性名的語義向量序列可表示為kattr=(k1,k2,…,kn).
3.1.3 方法簽名編碼器
與類簽名編碼器類似,方法簽名編碼器也是一個雙向的LSTM.給定方法簽名token 序列的詞嵌入向量序列xms=(x1,x2,…,xn). 每個時刻t,編碼一個詞向量xt,得到其隱藏狀態(tài) :
本文將父類的類簽名及父類的摘要作為上下文,挖掘父類的類簽名及父類的摘要中包含的語義信息,上下文編碼器是一個雙向的LSTM.給定上下文符號序列的嵌入向量序列xcnt=(x1,x2,…,xn),經(jīng)神經(jīng)網(wǎng)絡(luò)編碼后得到隱藏表示序列
聯(lián)合解碼器在解碼過程中同時關(guān)注源代碼表示和上下文表示,由單向LSTM、注意力機(jī)制和Switch網(wǎng)絡(luò)[21]組成.
類簽名中包含豐富的語義信息,因此使用類簽名編碼器的語義向量初始化解碼器. 在每一個解碼時間步,計算源代碼的環(huán)境向量(context vector)和上下文的環(huán)境向量.
源代碼經(jīng)分層編碼器編碼后得到類簽名、屬性名和方法簽名的隱藏狀態(tài)序列hcs、kattr、hms. 使用注意力機(jī)制分別從這3 部分中提取關(guān)鍵信息. 公式有:
其中、和的維度不同,通過線性變換將它們轉(zhuǎn)換為相同的維度:
對Switch 網(wǎng)絡(luò)[21]稍做改動,使其能夠為3 個環(huán)境向量生成注意力權(quán)重. 首先,根據(jù)解碼器的隱藏狀態(tài)st計算概率向量pcs∈Rd:
其中pcs是環(huán)境向量的權(quán)重, δ是一個激活函數(shù),確保向量pcs的每一個維度的值都在[0,1]區(qū)間內(nèi).
向量p為環(huán)境向量和的權(quán)重向量之和:
根據(jù)p和st分別計算環(huán)境向量的權(quán)重pattr和環(huán)境向量的權(quán)重pms:
最后,根據(jù)解碼器的隱藏狀態(tài)st和環(huán)境向量ct,計算下一個單詞的概率分布:
從CodeSearchNet 數(shù)據(jù)集中選取在Github 上開源的Java 代碼倉庫地址,成功下載4 188 個項目,采用與Li 等人[14]相似的規(guī)則過濾項目,最終保留3 955個Java 項目. 對于每個Java 項目,使用SrcML 工具抽取項目中的類及其對應(yīng)的Javadoc 注釋.Javadoc 注釋一般分為3 個部分:第1 部分簡要描述類的功能,是一個摘要性的句子;第2 部分用一句或者多句話詳細(xì)描述類的作用;第3 部分是特殊說明,包括版本說明、參數(shù)說明等. 因此,選取Javadoc 的第一句話作為類的摘要. 此外,分析類之間的繼承關(guān)系,將父類及其相應(yīng)的摘要作為類的上下文. 最終得到358 992 個〈Java 類,上下文,摘要〉數(shù)據(jù)對.
對于數(shù)據(jù)集中的每個樣本,刪除類的屬性類型和方法體,只保留類的簽名、屬性名和方法簽名. 具體有3 個步驟:
1)用SrcML 將Java 類轉(zhuǎn)換為XML 文件.
2)以深度優(yōu)先搜索的方式遍歷XML 文件. 當(dāng)遍歷到方法或嵌套類時,根據(jù)〈body 〉標(biāo)簽刪除其內(nèi)部元素. 當(dāng)遍歷到屬性定義時,根據(jù)〈type 〉標(biāo)簽刪除屬性類型.
3)從修改后的XML 文件中獲取類的簽名、屬性名和方法簽名.
圖4 以一個Java 類為例,展示代碼的精簡過程.首先,將類的源碼轉(zhuǎn)換為XML 文件. XML 的結(jié)構(gòu)較為復(fù)雜,為了清楚地展示類的精簡過程,此處不改變XML文件的層級結(jié)構(gòu),但刪減和修改了部分內(nèi)容. 如圖4(b)所示, 〈decl_stmt 〉標(biāo)簽的內(nèi)容是屬性定義,包括屬性的類型和名稱,它根據(jù) 〈type 〉標(biāo)簽刪除屬性類型. 〈function 〉標(biāo)簽內(nèi)是方法的定義,通過〈body 〉標(biāo)簽刪除方法體. 當(dāng)刪除類的所有的屬性類型和方法體后,得到一個新的XML 文件,從此文件生成代碼精簡后的類.

Fig. 4 The process of class code reduction圖4 類代碼精簡過程
統(tǒng)計代碼精簡后的數(shù)據(jù)集中類的屬性名和方法簽名的個數(shù)分布.結(jié)果如表1 和表2 所示,85% 的類的屬性名個數(shù)不超過5,88%的類的方法簽名個數(shù)不超過15. 方法簽名編碼器和屬性名編碼器的輸入序列分別由類的方法簽名和屬性名拼接而成,考慮到編碼效率為屬性名個數(shù)超過5 的類,隨機(jī)保留5 個屬性;為方法簽名個數(shù)超過15 的類,隨機(jī)保留15 個方法簽名. 隨機(jī)保留機(jī)制確保類中的每個屬性名和方法簽名都有同等被選中的概率,是綜合考慮編碼效率和語義保留后采取的方法. 數(shù)據(jù)集中的少量樣本會因為舍棄部分屬性和方法簽名丟失語義信息,但若不對這部分樣本做處理,編碼器同樣會因為輸入序列過長丟失語義信息,導(dǎo)致編碼效率下降. 例如:數(shù)據(jù)集中類最多包含1 787 個方法,而方法簽名的平均長度為8 個token,拼接而成的序列長度近2 萬個token.

Table 1 Statistics on the Number of Attribute表1 屬性名個數(shù)統(tǒng)計

Table 2 Statistics on the Number of Method Signature表2 方法簽名個數(shù)統(tǒng)計
對類各層次的代碼片段以及類摘要作分詞和截斷處理. 根據(jù)駝峰和蛇形命名規(guī)則拆分代碼中的組合詞,并將所有的token 轉(zhuǎn)化為小寫,從而降低未登錄詞的比例. 統(tǒng)計分詞后的類簽名、屬性名、方法簽名和上下文的序列長度,結(jié)果如表3 所示. 考慮到編碼效率,對類各層次的代碼序列作截斷處理,使得類簽名的長度不超過20 個token,每個屬性名的長度不超過5 個token,每個方法簽名的長度不超過15個token. 借助NLTK 對類摘要做分詞處理,根據(jù)表3的長度統(tǒng)計結(jié)果,將長度超過20 個token 的摘要序列截斷.

Table 3 Sequence Length Statistics表3 序列長度統(tǒng)計
對由父類的簽名和摘要拼接而成的上下文序列也做截斷處理,確保上下文序列的長度不超過20 個token.對于沒有父類的類,使用無實際意義的符號〈pad〉填充上下文序列.
將預(yù)處理后的數(shù)據(jù)集按照7∶1∶1∶1 的比例劃分為訓(xùn)練集、驗證集、混項目測試集和跨項目測試集. 首先,隨機(jī)選取一部分項目,使得這些項目包含的樣本量占數(shù)據(jù)總量的10%,并把這部分?jǐn)?shù)據(jù)作為跨項目測試集. 剩余的數(shù)據(jù)按照既定的混項目比例隨機(jī)劃分為訓(xùn)練集、驗證集和混項目測試集. 數(shù)據(jù)集的劃分情況如表4 所示.

Table 4 Splits of Dataset表4 數(shù)據(jù)集劃分
本文選用7 個基準(zhǔn)模型與HRCE 做效果對比. 其中4 個是經(jīng)典的方法摘要生成模型,選用這4 個模型的原因有2 點: 1)這些基準(zhǔn)模型將代碼文本的token序列或抽象語法樹節(jié)點序列輸入到編碼器-解碼器框架,生成代碼的自然語言描述. 類的源碼同樣可以處理為token 序列和抽象語法樹節(jié)點序列,因此這些模型也能生成類摘要. 2)HRCE 致力于學(xué)習(xí)類的語義和結(jié)構(gòu)信息以及緩解長程依賴問題,這些基準(zhǔn)模型的設(shè)計也是為了解決這些問題,可以檢驗HRCE 的有效性. 基準(zhǔn)模型ClassSum 是首個基于深度學(xué)習(xí)的類摘要生成模型. 近年來,大語言模型表現(xiàn)出了優(yōu)秀的代碼理解能力,本文選用CodeBERT 和Code Llama這2 種不同類型的大語言模型來評估它們在類摘要生成任務(wù)上的表現(xiàn). 下面詳細(xì)介紹7 種基準(zhǔn)模型的原理:
1)CodeNN[16]. CodeNN 是一個端到端的數(shù)據(jù)驅(qū)動的代碼摘要生成模型,使用帶有注意力機(jī)制的LSTM 解碼器,直接從源代碼token 序列的詞嵌入向量生成摘要.
2)SBT[18]. SBT 是一種抽象語法樹遍歷方法. 在對抽象語法樹進(jìn)行前序遍歷時,為每個子樹添加一對括號. 該遍歷方式保證可以從SBT 序列恢復(fù)到原始的抽象語法樹,能夠較好地保留代碼的結(jié)構(gòu)信息.
3)AST-attendgru[19]. AST-attengru 是一個基于GRU的編碼器-解碼器模型,該模型使用2 個編碼器分別編碼代碼的token 序列和SBT 序列. 解碼時使用注意力機(jī)制得到token 序列和SBT 序列的上下文向量,并通過拼接操作結(jié)合2 個上下文向量同時學(xué)習(xí)到代碼的語義和結(jié)構(gòu)信息.
4)Transformer[50]. Transformer 是一個基于多頭注意力機(jī)制的模型,該模型能夠有效捕獲長程依賴,因此將它作為本文的一個基準(zhǔn)模型.
5)ClassSum[14]. ClassSum 是首個基于深度學(xué)習(xí)技術(shù)的類摘要生成模型,該模型通過精簡代碼去除類的非關(guān)鍵信息,只保留類簽名、屬性和方法簽名. 從精簡后的代碼以及CSBT 序列中獲取語義和結(jié)構(gòu)信息,解碼時通過門控網(wǎng)絡(luò)融合這2 部分信息,為Java類生成摘要.
6)CodeBERT[40]. CodeBERT 是基于Transformer的預(yù)訓(xùn)練代碼語言模型,該模型使用掩碼語言建模任務(wù)和替換令牌檢測任務(wù)進(jìn)行預(yù)訓(xùn)練,能夠生成文本的通用表示. 經(jīng)過微調(diào)后,在代碼文檔生成等下游任務(wù)上表現(xiàn)出色.
7)Code Llama[45]. Code Llama 是基于Llama 2 的大型代碼語言模型,在代碼生成任務(wù)上的一次通過率超越了ChatGPT,逼近GPT-4.由于Code Llama 在代碼相關(guān)任務(wù)上的能力不遜色于GPT-4,且是一個被廣泛使用的開源免費的模型,因此將其作為本文的基準(zhǔn)模型.
BLEU[51]、METEOR[52]和ROUGE-L[53]是機(jī)器翻譯和代碼摘要領(lǐng)域廣泛使用的自動評估指標(biāo),本文使用這3 種指標(biāo)評估生成的類摘要的質(zhì)量.
1)BLEU. BLEU 根據(jù)n-gram 可以劃分為多個評價指標(biāo). 常見的有BLUE-1、BLUE-2、BLUE-3、BLUE-4,其中的數(shù)字表示連續(xù)單詞的個數(shù). 給定一個候選摘要,BLEU 計算其與參考摘要的n-gram 匹配精度的加權(quán)幾何平均值,并且對短摘要施加懲罰.
2)METEOR. BLEU 是一種基于精確度的評估指標(biāo),METEOR 在BLEU 的基礎(chǔ)上,綜合考慮精確度、召回率和詞序,并進(jìn)行同義詞匹配.
3)ROUGE-L. ROUGE-L 是ROUGE 指標(biāo)的一種,它根據(jù)候選摘要和參考摘要最長公共子序列的長度衡量二者的相似度.
1)HRCE 的參數(shù)設(shè)置為:
①編碼器和解碼器的詞嵌入維度設(shè)置為256. 編碼器采用雙向LSTM,每個方向的維度都為512,層數(shù)設(shè)置為2. 解碼器采用單向LSTM,隱藏層維度設(shè)置為512,層數(shù)設(shè)置為2. 嵌入層和循環(huán)層都采用隨機(jī)失活策略,將失活率設(shè)為0.2.
②代碼和摘要的詞表都未設(shè)置固定大小,而是根據(jù)單詞在數(shù)據(jù)集中出現(xiàn)的頻率決定是否加入詞表.設(shè)置詞頻為2,并將在數(shù)據(jù)集中出現(xiàn)次數(shù)大于等于2的單詞加入詞表.
③模型使用Adam[54]優(yōu)化器訓(xùn)練,初始學(xué)習(xí)率設(shè)為0.001,以最大限度地減少在訓(xùn)練集上的損失. 將批量大小設(shè)置為32.
④為了防止模型過擬合,在訓(xùn)練時采用早停策略,當(dāng)模型的性能連續(xù)4 個epoch 都沒有提升則停止訓(xùn)練. 此外,限定模型訓(xùn)練次數(shù)的上限為100 個epoch.
⑤模型在驗證和測試階段均使用集束搜索[55],并將束寬設(shè)為4.
2)基準(zhǔn)模型的參數(shù)設(shè)置為:
①AST-attendgru、SBT 、ClassSum 和CodeNN 的隱藏層維度都設(shè)置為256.
②Transformer 以及CodeBERT 的參數(shù)配置分別與Vaswani 等人[50]和Feng 等人[40]的工作保持一致.
本節(jié)將從整體性能、消融實驗以及數(shù)據(jù)集劃分方式3 個方面分析HRCE 的效果.
表5 顯示了HRCE 和基準(zhǔn)模型的實驗數(shù)據(jù), 從整體上看,HRCE 在所有的評估指標(biāo)上都優(yōu)于基準(zhǔn)模型.

Table 5 Performance of HRCE and Baseline Models on Hybrid-Projects Test Set and Cross-Projects Test Set表5 HRCE 和基準(zhǔn)模型在混項目測試集和跨項目測試集上的表現(xiàn)
具體來看,專門為類摘要生成任務(wù)設(shè)計的模型ClassSum 相較于其他基準(zhǔn)模型更具競爭力. ClassSum采用代碼精簡策略去除類源碼中的非關(guān)鍵代碼,使用2 個雙向LSTM 編碼器分別編碼精簡后的代碼token 序列和CSBT 節(jié)點序列,解碼時利用門控網(wǎng)絡(luò)動態(tài)地生成權(quán)重向量來融合代碼的語義和結(jié)構(gòu)信息,使得每一個解碼時間步可以對不同模態(tài)的向量表征有偏好. AST-attendgru 使用2 個GRU 編碼器分別編碼代碼的token 序列和SBT 節(jié)點序列,以此學(xué)習(xí)代碼的語義和結(jié)構(gòu)信息. 但是,AST-attendgru 直接編碼原始代碼文本的token 序列,由于類的源碼中包含許多非關(guān)鍵信息,編碼器很難提取到有用特征. 解碼階段,AST-attendgru 通過拼接操作結(jié)合2 個編碼器編碼結(jié)果的注意力向量,導(dǎo)致不同模態(tài)的向量表征在每個解碼時間步的貢獻(xiàn)都相同. 因此,AST-attendgru在各個指標(biāo)上的表現(xiàn)都遠(yuǎn)不及ClassSum.
Transformer 的輸入也是類的源碼,但Transformer是基于多頭注意力機(jī)制的模型,能夠有效捕獲長程依賴. Transformer 與AST-attendgru 的效果差異主要來自于模型的輸入.AST-attendgru 將類源碼的token序列和SBT 節(jié)點序列作為輸入,從中獲取語義和結(jié)構(gòu)信息,而Transformer 的輸入不包含SBT 節(jié)點序列,無法學(xué)習(xí)到類的結(jié)構(gòu)信息,生成的摘要質(zhì)量不高.CodeNN 直接從類源碼token 序列的詞嵌入向量中產(chǎn)生摘要,無法很好地捕獲語義特征,生成的摘要質(zhì)量較差.
SBT 與其他模型的性能差距源于SBT 丟失了語義信息. 相對于結(jié)構(gòu)信息,語義對摘要的生成更為重要. SBT 將源碼轉(zhuǎn)化為抽象語法樹,并將抽象語法樹葉節(jié)點的類型和值通過符號“_”連接起來作為一個token,然后使用基于結(jié)構(gòu)的遍歷方式將抽象語法樹扁平化為序列作為模型的輸入. 這種處理方式能夠很大程度上保留抽象語法樹的結(jié)構(gòu)信息,但是沒有構(gòu)建源碼中組合詞的子詞嵌入表示,丟失了大量的語義信息. 此外,類的抽象語法樹規(guī)模很大,為了保證編碼器效率,需要對抽象語法樹結(jié)點序列做截斷處理,也會丟失部分結(jié)構(gòu)信息. 綜上,對類摘要生成任務(wù)而言,SBT 丟失語義信息也無法完整地保留結(jié)構(gòu)信息,生成的類摘要質(zhì)量較差,在BLEU-4,BLEU-4(s),METEOR 和ROUGE-L 上的值分別為5.01,11.60,10.97,22.61.
微調(diào)后的CodeBERT 在類摘要生成任務(wù)上的表現(xiàn)優(yōu)于大部分的基準(zhǔn)模型,但不及ClassSum 和HRCE.CodeBERT 在6 種編程語言上進(jìn)行預(yù)訓(xùn)練,能夠捕獲自然語言和編程語言之間的聯(lián)系,表現(xiàn)出強(qiáng)大的語義理解能力. 因此即使只輸入類的源碼,CodeBERT的性能也能接近雙模態(tài)輸入的AST-attendgru. 但是,CodeBERT 的預(yù)訓(xùn)練語料都是函數(shù)級的代碼,而類的結(jié)構(gòu)更為復(fù)雜,在語義理解上面臨著更大的挑戰(zhàn). 因此CodeBERT 的性能不及專門為類摘要生成任務(wù)設(shè)計的模型.
Code Llama 根據(jù)提示信息生成摘要,類摘要生成任務(wù)的提示模板如圖5 所示. 設(shè)計2 個提示模板,比較只輸入類的源碼和同時輸入源碼與上下文這2 種情況下,Code Llama 在類摘要生成任務(wù)上的表現(xiàn).結(jié)果如表6 所示,在2 個測試集上,添加上下文信息后生成的摘要在各個衡量指標(biāo)上的表現(xiàn)都優(yōu)于只根據(jù)源碼生成的摘要,表明外部信息對類摘要生成的有用性.

Table 6 Performance of Code Llama on Hybrid-Projects Test Set and Cross-Projects Test Set with and Without Context表6 Code Llama 有無上下文時在混項目測試集和跨項目測試集上的表現(xiàn)

Fig. 5 The prompt template of Code Llama圖5 Code Llama 的提示模板
從表5 的結(jié)果來看,與其他模型相比,Code Llama生成的摘要與參考摘要的相似度最低,主要有2 個原因. 1)Code Llama 沒有在類摘要生成任務(wù)上進(jìn)行微調(diào),無法學(xué)習(xí)類摘要的編寫模式. 如表7 的例1 所示,Code Llama 生成的摘要在形式上與參考摘要存在較大差異. 參考摘要簡潔明了、概括性較強(qiáng),而Code Llama 生成的摘要冗長,包含大量非必要的描述,無法達(dá)到通過摘要快速掌握類的功能的目的. 2)大語言模型雖然能夠執(zhí)行廣泛的文本理解和生成任務(wù),但是也存在一些局限性,例如“幻覺”[56],即生成無意義或不忠實于輸入的文本. Code Llama 在執(zhí)行類摘要生成任務(wù)的過程中,也存在“幻覺”問題. 如表7 的第2 個例子,Code Llama 沒有根據(jù)提示模板的要求生成摘要,而是生成了與模型輸入無關(guān)的代碼. 經(jīng)統(tǒng)計,所有的測試樣本中約五分之一的摘要生成結(jié)果未忠實于輸入. “幻覺”問題以及大量的冗余描述導(dǎo)致Code Llama 在類摘要生成任務(wù)上的表現(xiàn)不佳.

Table 7 Class Summarization Generated by Code Llama表7 Code Llama 生成的類摘要
HRCE 的BLEU-4 得分為30.32、BLEU-4(s) 得分為37.01、METEOR 得分為28.06、ROUGE-L 得分為52.18,與最好的基準(zhǔn)模型ClassSum 相比,分別獲得了7.79%、4.61%、4.55%、2.39% 的性能提升. HRCE與ClassSum 一樣,對類的源碼做精簡處理,只保留類的簽名、屬性名和方法簽名這些關(guān)鍵代碼. 與ClassSum不同的是,HRCE 采用分層表示的方法對類的關(guān)鍵代碼進(jìn)行層次結(jié)構(gòu)建模,能從類的代碼文本中同時學(xué)習(xí)語義和層次結(jié)構(gòu)信息,無需輸入代表結(jié)構(gòu)信息的CSBT 序列. 且分層表示的設(shè)計縮短了每個編碼器輸入序列的長度,有效緩解了模型記憶長序列的挑戰(zhàn).此外,HRCE 考慮到類的繼承關(guān)系,使用上下文編碼器學(xué)習(xí)父類的語義信息,使得有父類的類能夠同時獲取內(nèi)部和外部的信息,進(jìn)一步提高這些類的摘要生成質(zhì)量. HRCE 在所有衡量指標(biāo)上的表現(xiàn),證明分層表示和上下文增強(qiáng)的方法可以為類生成高質(zhì)量的摘要.
為了檢驗HRCE 各模塊的有效性,設(shè)計了一組消融實驗,通過去除模型的某一部分得到3 個變體模型:
1)HRCE-NON-SIG,表示HRCE 去除分層編碼中的類簽名編碼器或方法簽名編碼器. 該模型將類簽名token 序列和方法簽名token 序列拼接起來,輸入到一個雙向LSTM 編碼器. 由于類簽名編碼器和方法簽名編碼器都由雙向LSTM 構(gòu)成,因此該模型可同時表示去除類簽名編碼器或方法簽名編碼器.
2)HRCE-NON-ATTR,是由HRCE 去除屬性編碼器得到的變體. 為了保留屬性名的語義信息,將所有的屬性名拼接為一個token 序列,與方法簽名一同輸入到方法簽名編碼器中. 該處理方式將屬性名視為普通的token 序列,不做特殊的編碼處理,以此檢驗屬性編碼器的有效性.
3)HRCE-NON-INHER,是HRCE 去除上下文編碼器得到的變體. 該模型只對類進(jìn)行分層表示,不添加上下文信息,模型解碼時只能根據(jù)類本身的信息生成摘要而無法獲得外部知識.
表8 給出HRCE 和3 種變體模型在各個評估指標(biāo)上的表現(xiàn). 結(jié)果表明,HRCE-NON-INHER 的表現(xiàn)最差,在各個指標(biāo)上的分?jǐn)?shù)都低于其他變體. 這是因為HRCE-NON-INHER 只利用類的內(nèi)部語義和結(jié)構(gòu)信息生成摘要,而類的作用往往是由其本身以及項目中與它有關(guān)聯(lián)的上下文共同決定的. 換言之,摘要中的內(nèi)容可能并不直接來自類的內(nèi)部代碼,而是出現(xiàn)在類的上下文中. 表8 的結(jié)果證明在類摘要生成模型中添加上下文信息的有用性. 值得注意的是,結(jié)合表5 和表8的實驗結(jié)果,可以看到HRCE-NON-INHER 和ClassSum在BLEU-4 上的分?jǐn)?shù)分別為28.22 和28.13. 這2 個模型都只利用類的內(nèi)部信息生成摘要,區(qū)別在于ClassSum 通過SBT 序列獲取類的結(jié)構(gòu)信息,而HRCENON-INHER 的輸入中并不包含能夠表征代碼結(jié)構(gòu)的SBT 序列,但二者在BLEU 和METEOR 指標(biāo)上的表現(xiàn)幾乎相同. 這一結(jié)果證明對類進(jìn)行分層表示的有效性,不僅能夠獲取類的語義信息,還能夠獲取類的層次結(jié)構(gòu)信息.

Table 8 Ablation Experiment Results on Hybrid-Projects Test Set and Cross-Projects Test Set表8 在混項目測試集和跨項目測試集上的消融實驗結(jié)果
HRCE-NON-SIG 略好于HRCE-NON-INHER,但與完整的模型HRCE 相比,BLEU-4 的分值從30.32 下降到了29.13,這表明為類簽名單獨編碼的必要性. 當(dāng)循環(huán)神經(jīng)網(wǎng)絡(luò)的輸入序列較長時,容易產(chǎn)生長程依賴問題,從而忘記較早編碼時間步的特征. 與類的其他部分相比,類簽名的語義信息更為重要,有時只需閱讀類的簽名就可以了解類的功能. 根據(jù)4.2 節(jié)的統(tǒng)計,類簽名的token 序列往往很短,使用單獨的類簽名編碼器,可以最大程度地保留其語義信息.
HRCE-NON-ATTR 的表現(xiàn)也不及完整的模型HRCE,這表明對每個屬性單獨編碼并使用內(nèi)部注意力機(jī)制得到每個屬性名的向量表示是適合屬性名的編碼方式,可以得到更有利于摘要生成的屬性名向量表征.
表5 和表8 分別展示了HRCE 和基準(zhǔn)模型在混項目測試集和跨項目測試集上的得分. 與混項目測試相比,HRCE 跨項目測試時,在BLEU-4,BLEU-4(s),METEOR 和ROUGE-L 上的性能分別下降了87%,75%,51%和48%.
這是因為同一個項目中通常會存在許多相似代碼和復(fù)用代碼. 數(shù)據(jù)集混項目隨機(jī)劃分時,這些相似或復(fù)用的代碼片段會被劃分到訓(xùn)練集、驗證集和測試集中. 因此,訓(xùn)練集和測試集的樣本差異不會很大,模型在測試集上也能得到與訓(xùn)練集一致的表現(xiàn). 數(shù)據(jù)集跨項目劃分時,測試集中的項目都不會出現(xiàn)在訓(xùn)練集中. 由于缺少相似的代碼片段,訓(xùn)練集和測試集的樣本差異巨大,因此在各個衡量指標(biāo)上的得分都大幅度降低.
值得注意的是,Code Llama 在混項目測試集和跨項目測試集上的表現(xiàn)幾乎一致. 因為Code Llama通過提示生成摘要,無需使用類摘要數(shù)據(jù)從頭訓(xùn)練或微調(diào),所有的測試數(shù)據(jù)對模型而言都是跨項目的數(shù)據(jù).
表9 展示HRCE 和基準(zhǔn)模型生成的摘要,與基準(zhǔn)模型相比,HRCE 生成的摘要與參考摘要最相似.Code Llama 生成的類摘要實例已在6.1 節(jié)中進(jìn)行分析,本節(jié)不再重復(fù)說明.

Table 9 Output Examples of Different Models表9 不同模型的輸出示例
第1 個例子中,摘要的信息主要來自類簽名,包含“constant”“expression”“number”等關(guān)鍵字, HRCE采用分層表示,使用單獨的編碼器編碼類簽名,緩解了長程依賴問題,最大程度地保留了類簽名的語義信息,因此能夠準(zhǔn)確捕獲這些關(guān)鍵字. ClassSum 面臨記憶長序列的挑戰(zhàn),生成的摘要雖然也包含了所有關(guān)鍵字,但后半段摘要“number constant number and num”無法準(zhǔn)確描述類的功能. CodeBERT 只在函數(shù)級的編程語言上進(jìn)行預(yù)訓(xùn)練,在理解內(nèi)容更為復(fù)雜的Java 類上面臨挑戰(zhàn),生成的摘要對類功能描述不夠準(zhǔn)確. AST-attendgru 和Transformer 都未采用代碼精簡策略,難以提取有效特征,因此摘要只包含了部分關(guān)鍵詞. CodeNN 和SBT 都無法很好地學(xué)習(xí)語義信息,生成的摘要與代碼的相關(guān)性較低.
第2 個例子,摘要的信息來自類簽名和方法簽名. HRCE 的分層表示可以提取各層次的特征,Switch 網(wǎng)絡(luò)在每個解碼時間步動態(tài)地選擇并融合各層次的信息,因此可以從類簽名和方法簽名中獲取“class”“generator”“random”“ipv”“address”等關(guān)鍵信息組成摘要. 其他基準(zhǔn)模型由于未能充分表示類的復(fù)雜結(jié)構(gòu),生成的摘要與參考摘要的相似性較低.
第3 個例子,摘要的部分信息來自父類. HRCE使用上下文編碼器引入父類信息,因此生成的摘要中包含了“used”“format”等來自父類的關(guān)鍵字.ClassSum,AST-attendgru 和CodeBERT 能從類的源碼中獲取關(guān)鍵詞生成摘要“implementation of link tar exporter”,但由于遺漏父類信息,此摘要無法完整描述類的功能. Transformer 也能獲取到源碼的關(guān)鍵信息,但是生成了一些無關(guān)的描述. CodeNN 和SBT 只能獲取源碼的部分關(guān)鍵信息,生成的摘要包含大量無關(guān)的單詞.
本文針對類摘要自動生成任務(wù),提出了一種基于分層表示和上下文增強(qiáng)的方法HRCE.實驗結(jié)果表明,HRCE 能夠為類生成高質(zhì)量的注釋,在所有的評估指標(biāo)上超越了最先進(jìn)的基準(zhǔn)模型. 主要原因有2 點:
1)HRCE 根據(jù)類的層次特點,采用分層表示的方法得到類的簽名、屬性名和方法簽名的代碼表征. 分層表示的方法能夠?qū)W習(xí)類的語義信息并對類的層次結(jié)構(gòu)建模以獲取結(jié)構(gòu)信息,同時縮短了編碼器輸入序列的長度,緩解了長程依賴問題.
2)HRCE 將父類的簽名和父類的摘要作為類的上下文,在解碼過程中融合上下文語義信息,進(jìn)一步提高有父類的類的摘要生成質(zhì)量.
此外,本文還構(gòu)建了一個包含上下文信息的類摘要語料庫①https://github.com/Haohaoi123/HRCE,為后續(xù)的類摘要研究提供數(shù)據(jù)基礎(chǔ).
類具有豐富的上下文,而本文只使用了父類的相關(guān)信息,下一步的工作將從項目中提取不同類型的代碼上下文,比較不同上下文對摘要生成的貢獻(xiàn).此外,HRCE 具備跨語言訓(xùn)練的能力,后續(xù)將嘗試使用此模型為其他面向?qū)ο蟮恼Z言生成摘要.
作者貢獻(xiàn)聲明:陳豪伶構(gòu)思和實現(xiàn)模型,完成實驗并撰寫論文;虞慧群和范貴生指導(dǎo)實驗方案并修改論文;李明辰指導(dǎo)實驗和處理數(shù)據(jù);黃子杰指導(dǎo)論文寫作.