?

融合圖嵌入和注意力機制的代碼搜索

2022-04-13 02:40黃思遠趙宇海梁燚銘
計算機與生活 2022年4期
關鍵詞:源代碼語句代碼

黃思遠,趙宇海,梁燚銘

東北大學 計算機科學與工程學院,沈陽110169

隨著人們對軟件的需求越來越多樣化和復雜化,程序開發人員往往要實現很多復雜的功能來滿足用戶的要求。然而在程序的開發過程當中會發現許多功能在以往的開發過程當中都被實現過,因此如何利用現有的源代碼來實現新的功能對于軟件開發是至關重要的,在一定程度上影響著整個項目的開發進度。據相關調查表明,程序開發人員在互聯網上搜索相關問題解決辦法的時間大約占整個開發過程的1/5。程序開發人員在網絡上搜索相關代碼的動機主要包括對現存在的開源代碼的重復使用、代碼的漏洞修復與檢測以及相關代碼片段的理解。與此同時,隨著計算機的不斷發展,在互聯網中積累了越來越多的開源代碼庫,為軟件工程的研究提供了大量可依靠的數據。根據Github 在2018 年的年度報告顯示,Github 中開源的項目數量已達到9 600 萬,與2017 年相比增加40%。大規模且快速增長的開源代碼庫為代碼檢索任務提供了大量可復用的高質量代碼,使代碼檢索任務有了很好的數據支撐。

代碼檢索是指將自然語言作為查詢語句,在代碼倉庫中搜索滿足查詢要求的相關代碼片段來實現代碼的復用。在軟件工程領域,一個高效的代碼檢索工具可以極大地提高軟件的開發效率,從而來達到滿足用戶日益增長的需求的目的。與此同時,無論是程序初學者,還是經驗熟練的軟件開發者,都希望可以利用現有的開源代碼來實現重復的功能,從而節省自己在程序開發過程中在網上查找相關解決方案所浪費的時間。為了方便理解代碼檢索任務的流程,圖1 詳細地描述了代碼檢索任務的框架結構。代碼檢索框架結構主要包括線下數據處理和模型訓練,以及線上用戶查詢等相關過程。

圖1 代碼檢索任務框架Fig.1 Code retrieval task framework

代碼搜索對于提高程序員編碼效率有著顯著性的提高,因為直接搜索符合要求的代碼片段比閱讀各種開源應用程序接口(application programming interface,API)的原始說明文檔要有效得多。甚至很多開發人員可能甚至不知道要查找哪些API,只需要以自然語言的形式進行查詢即可找到符合要求的代碼片段。在軟件開發過程中,程序員會遇到各種各樣的問題,例如“如何解析純文本數據”。在遇到問題的時候大多數程序員都會選擇在百度上去查找相關問題的答案,但是百度的檢索結果主要是依賴關鍵詞匹配等信息檢索技術。如果查詢語句中不存在與代碼相關的關鍵詞信息,則百度檢索返回的結果是十分糟糕的。另一個受歡迎的程序問答網站是Stack Overflow,它主要以問答的形式來呈現各種問題的解決答案。當某人在網站上以自然語言的形式提出一個編程相關問題,會有很多人在提問下方提供各種各樣的解決方案,并且利用投票機制對解決方案進行排序來將大多數人認同的答案呈現在頂部,它為軟件開發人員和初學者提供了很大的便利。當程序開發人員想在Stack Overflow 查找“如何解析純文本數據”這一問題的解決辦法,可能在Stack Overflow 上已經有人問過和回答過同樣的問題,程序員分析和理解其他人對這個問題的解決辦法來完成自己的任務。盡管Stack Overflow 資源豐富,但它并不包含每個問題的答案。與此同時,Stack Overflow中不討論特定于某個公司專有代碼和API 的問題,針對特定領域或者公司的內部相關編程問題,無法提供相應解決辦法。

傳統的基于信息檢索的源代碼檢索算法,不能充分理解自然語言查詢語句的語義信息。因此,構建一個充分理解自然語言查詢語義的源代碼檢索算法來獲取相關代碼片段,實現代碼的復用對軟件的開發是十分有意義的。針對上述存在的問題,本文提出融合圖嵌入與注意力機制的代碼檢索算法GraphCS。GraphCS 算法的創新在于不僅考慮代碼片段的純文本語義信息,也考慮代碼片段復雜邏輯結構信息,將語義特征與結構特征相融合作為代碼片段特征表示。為了更好地捕捉代碼片段中包含的信息,融入注意力機制來更好地學習代碼片段表示。與CODEnn算法相比,GraphCS 算法在Frank、MRR、Precision@1/5/10 以及SuccessRate@1/5/10 指標上有一定提升。

1 相關工作

1.1 基于信息檢索的代碼檢索算法

在軟件工程領域,針對代碼檢索的相關研究還處于初級階段,現階段的研究主要基于信息檢索和自然語言處理相關技術。Krugle(http://www.krugle.com/)和Ohloh(https://code.ohloh.net/)采用基于關鍵字匹配的信息檢索方法,在商業中被廣泛應用,但是算法的檢索結果大多情況下不符合程序開發人員的要求。Lucene(https://lucene.apache.org/)是一個傳統的文本搜索引擎,而Sourcerer是基于Lucene 實現的代碼檢索工具,將代碼屬性和代碼的受歡迎程度相結合作為評價推薦代碼質量的評估指標來檢索相關代碼片段。Reiss提出基于源代碼語義和語法相結合的源代碼檢索算法,它要求用戶不僅要提供自然語言查詢語句,還要提供其他規范約束,但不考慮自然語言查詢語句的語義信息。如果缺少對相關代碼語義和語法信息的理解,則檢索結果的準確性會降低,對于初學者和大多數程序員來說存在一定的困難。SNIFF分析相關代碼片段的API 文檔信息,并為代碼片段添加注釋信息,并建立相關索引,來進行代碼檢索。Portfolio給定一個自然語言查詢語句,根據自然語言查詢語句來查找用戶與任務相匹配的函數定義與相關用法。Reformu以WordNet 生成的同義詞來擴展查詢語句中的單詞使其與源代碼中具有類似語義的單詞相同,從而提高代碼搜索結果的準確性。INQRES考慮源代碼中單詞之間的關系,交互式地重新構造搜索查詢,以優化查詢質量。SWIM算法對給定API 的自然語言查詢語句進行分析,利用從開源代碼庫中學習到程序編碼模式來合成相關的代碼片段。CodeHow算法提取與用戶查詢相關的潛在API,并使用檢索到的API 信息來增強原始查詢語句,使用集成擴展的布爾模型來實現精確的代碼檢索結果。

1.2 基于深度學習的代碼檢索算法

基于信息檢索和自然語言技術的代碼檢索不能充分理解自然語言查詢語句的語義信息,當代碼庫中沒有與查詢語句中的關鍵詞相關的代碼片段時,會嚴重影響代碼的檢索結果。最近提出的基于深度學習的語義代碼檢索算法,以自然語言的形式來查找符合查詢語句語義信息的代碼片段。NCS以無監督的方式在大規模語料庫上訓練,獲取代碼片段和自然語言注釋部分的固定長度的嵌入向量表示。在自然語言查詢部分以向量均值來表示,而代碼片段部分則以TF-IDF 權重的方式獲取相應的均值表示,以余弦相似度來判斷兩個向量的相似程度。UNIF以注意力機制來組合代碼片段中每個令牌的嵌入,并生成嵌入整個代碼片段的嵌入向量表示。自然語言查詢語句嵌入是通過對查詢嵌入以詞嵌入相加求均值向量進行表示。以NCS 中學習的嵌入矩陣為初始值,并在訓練期間以高質量的有監督數據進一步微調。SCS基于代碼到自然語言注釋序列的網絡的部分編碼器來嵌入代碼令牌序列。并以一個語言模型來嵌入查詢標記序列。在推理和學習過程中將代碼片段部分嵌入轉換為查詢嵌入。CODEnn以一個端到端的方式訓練一個代碼檢索模型。從代碼片段中提取方法名序列、API序列和令牌來表示代碼片段的特征。以雙向長短期記憶單元(bi-directional long short-term memory,Bi-LSTM)模型來提取API序列、方法名序列和自然語言注釋部分特征來獲取相應的向量表示,以余弦相似度的方法來判斷代碼片段特征向量和自然語言特征向量的相似性程度。CoaCor利用代碼總結模型的方式來生成代碼檢索任務的自然語言注釋,并且以一個代碼檢索模型來查詢相關代碼片段。

2 融合圖嵌入和注意力機制代碼搜索算法

2.1 數據提取

本文提出的融合圖嵌入和注意力機制的代碼搜索算法(GraphCS)在代碼純文本信息基礎上考慮代碼片段的邏輯圖結構信息,雖然CODEnn 算法提供了千萬級別的代碼片段和注釋數據對,但是數據都是經過預處理的,并不能從已處理的數據集中提取代碼片段的邏輯圖結構信息。因此,為了從源程序中提取可用于圖嵌入的數據,從開源代碼庫中爬取2016—2019 年的Java 開源項目,并對數據集進行清洗操作。首先,移除包含非英文的代碼注釋數據對;其次,移除注釋為非Javadoc格式代碼注釋數據對;然后,移除行數小于指定閾值和超過指定閾值的代碼注釋數據對;最后,移除類的構造方法以及類中其他相應的初始化方法。表1 詳細地對源代碼檢索任務的數據集規模以及格式進行相關概述。原始數據集由3 564 213 條方法體和注釋數據對組成,經過清洗后的數據為2 141 921條方法體和注釋數據對。為了模擬真實的代碼檢索,從開源代碼倉庫上提取1 569 525條只包含方法體的代碼片段作為代碼檢索數據庫。

表1 數據集介紹Table 1 Dataset introduction

為了學習程序語言豐富的語義和語法信息,從不同的角度來提取代碼片段的特征。代碼片段特征提取部分是以方法體為單位來做特征提取,它不僅包含豐富的文本語義信息,同時也包含復雜的邏輯結構信息。因此,從代碼片段中提取文本語義特征包括方法名序列和令牌信息,而提取的邏輯圖結構特征為方法體對應的程序依賴圖(program dependency graph,PDG)信息。自然語言部分則為方法體對應的注釋序列信息。其中,代碼檢索任務數據提取流程如圖2 所示。

圖2 數據處理Fig.2 Data processing

方法名提?。禾崛∶總€Java 方法片段的函數名,并以駝峰規則將函數名拆分成多個詞語的組合。例如,方法名readXmlFiles 將會被拆分為read、xml 以及files。

令牌提?。簽榱颂崛×钆菩畔?,提取數據集中每個Java 方法體內部的全部令牌信息,并以駝峰規則對每個令牌進行單詞拆分,以此作為相應的分詞方法。針對分詞后的語料,移除令牌數據中重復單詞、常用的停用詞以及Java關鍵字。

自然語言提?。和ㄟ^Eclipse JDT 工具將Java 方法轉換為抽象語法樹,并從抽象語法樹中提取JavaDoc注釋部分第一行語句作為自然語言描述。

程序圖嵌入提?。簽榱颂崛≡创a中每一個方法體的邏輯圖結構信息,首先,提取Java 代碼片段的控制流圖,在控制流圖的基礎上引入圖中節點之間的數據依賴關系類以及控制依賴關系,從而為代碼片段構建出更加復雜的程序依賴圖。其次,以WL(Weisfeiler-Lehman)重標簽算法為程序依賴圖中的每個節點進行重標簽,并提取每個程序依賴圖中的子圖結構信息。最終,以Doc2Vec 的思想將子圖結構作為上下文信息從而來獲取每個方法體對應的程序依賴圖的向量嵌入表示。程序依賴圖特征向量提取過程如圖3 所示。

圖3 PDG 向量提取過程Fig.3 PDG vector extraction process

2.2 WL 重標簽算法提取子圖信息

假設給定圖,并設定圖4 中每個節點的初始化標簽為{1,1,2,3,1}??紤]迭代一次時,WL 算法聚合每個中心節點的鄰域節點的標簽。例如,圖中節點的鄰域節點為和,則聚合鄰域之后的標簽為1-1,2。根據新的標簽對標簽進行排序和壓縮,壓縮后的標簽代表對應的子樹模式。假設圖4 中標簽為7 的節點,則存在一個高度為1 的子樹模式,其中根節點標簽1,它的鄰居有標簽1 和3。以WL 算法來提取子圖信息的算法流程如算法1 所示。

圖4 G 上的WL 重標簽Fig.4 WL relabeling for graph G

WLSubGraph(,,)

2.3 GraphCS 模型

自然語言與代碼片段從詞的分布的角度來考慮是不同的,因此二者是異構數據。源代碼檢索任務考慮將代碼片段和自然語言兩個異構數據嵌入到同一個向量空間,從而使語義相似的代碼片段和自然語言在向量空間距離較近。

源代碼片段中不僅包含大量純文本語義信息,也包含豐富的邏輯結構信息。因此基于圖嵌入算法在提取代碼片段的特征時,不僅考慮代碼的純文本語義信息(方法名和令牌),也考慮了代碼的邏輯結構信息(程序依賴圖信息)。

為了更深層次捕捉代碼序列的語義信息,以雙向LSTM 來學習序列的相關特征表示。其中,LSTM網絡結構如圖5 所示。

圖5 LSTM 網絡結構Fig.5 LSTM network structure

LSTM 是為了解決RNN 中存在的梯度爆炸和梯度消失的問題而提出來的更高效的序列語義特征提取模型。LSTM 主要引入遺忘門、輸入門以及輸出門來達到門控的目的,并以高速網絡的方式充分保留上一時刻的細胞狀態來更好地捕捉序列的語義表示。LSTM 神經網絡的迭代公式如下:

為了更好地提取語句的特征向量表示,引入雙向LSTM 時序網絡模型。雙向LSTM 考慮正反兩個方向上下文信息,將正反兩個方向的特征向量進行拼接,從而達到更好捕捉語義信息的目的。

方法名序列,,…,name為以駝峰規則對方法名進行分詞獲取的長度為的方法名序列,以雙向LSTM 來提取方法名序列的各個時刻隱藏層的特征表示。

為了更深層次地學習方法名的語義特征表示,將正反LSTM 的隱藏層向量進行拼接,并以最大池化方法來對各個隱藏層的狀態進行壓縮,并作為方法名序列特征的最終向量表示。

令牌信息,,…,token為對方法體內的代碼片段以駝峰規則拆分代碼語句后,并移除重復項、常用停用詞以及Java 關鍵字獲取到的長度為的代碼片段。在提取令牌特征時,并未考慮代碼的語序關系,故以多層感知機(multi-layer perceptron,MLP)方式來學習令牌的特征向量表示。

式中,emdtk是令牌中在位置處單詞的初始化嵌入向量表示,而W是全連接層中的參數矩陣。,,…,htoken為學習后令牌的嵌入向量表示,并以最大池化方法對全部令牌的向量表示進行壓縮,作為令牌片段特征的最終向量表示。

在提取程序依賴圖特征時,提取Java 代碼片段的控制流圖,在控制流圖的基礎上引入數據依賴關系類以及控制依賴關系,從而構建出代碼片段的程序依賴圖。以WL 算法從程序依賴圖中提取每個節點對應的子圖集合作為每個圖的上下文信息,并以Skip-Gram 的方式學習圖的向量表示。在GraphCS算法中以多個卷積核的方式對圖特征向量以一維卷積來提取不同的子特征,獲取程序依賴圖的最終向量表示。

在特征融合部分,以注意力的方式為方法名特征向量、令牌特征向量以及程序依賴圖特征向量分配不同的權重系數。代碼片段的不同特征以不同的權重進行融合,來學習最終的代碼片段向量表示。

為了與自然語言特征向量表示維度一致,會以全連接的方式將代碼片段的特征向量映射到與自然語言片段特征向量相等的維度。在自然語言描述部分,通過雙向時序神經網絡來學習自然語言描述中所包含的語義特征表示??紤]自然語言注釋序列,,…,desc是存在語序關系的,故以雙向LSTM 來提取各個時刻隱藏層的特征表示。

為了更深層次地學習自然語言的語義特征表示,將正反LSTM 的隱藏層向量進行拼接,并以最大池化方法將LSTM 的各個隱藏狀態向量表示壓縮成一個固定維度的向量作為自然語言片段特征的最終向量表示。

通過代碼嵌入網絡和自然語言網絡將代碼片段特征和自然語言描述分別映射成相等維度的向量表示和。將代碼片段向量表示和自然語言部分向量表示映射到同一個向量空間,并以余弦相似度的方式衡量兩個向量的相似程度。

在同一個向量空間中,代碼片段向量與自然語言向量的余弦相似度的值越高,則代碼片段和自然語言描述之間的語義越相近。如果代碼片段與自然語言描述語義很相近,它們在向量空間距離較近。自然語言與代碼片段在同一向量空間的映射如圖6所示。

圖6 向量空間映射Fig.6 Vector space mapping

圖6 中的自然語言查詢語句為append text to an existing file,在代碼庫中檢索到的相似度較高的代碼片段為方法名為append 的函數。自然語言與代碼片段在語義上相似性較高,因此在特征空間中二者距離較近。

假設給定代碼片段C,以及代碼片段對應的自然語言描述,為每個代碼片段隨機分配一個負樣本。在訓練網絡模型時,構建<,>和<,>訓練語料,并考慮最小化排名損失。

式中,為網絡模型參數,在訓練過程中被設置為0.398 6。排名損失會促使代碼片段與其正確描述之間的余弦相似度上升,而代碼片段與錯誤描述之間的余弦相似度下降。

根據代碼片段和自然語言片段的特征提取方法,構建基于GraphCS 的代碼檢索算法模型網絡結構如圖7 所示。

圖7 GraphCS 模型網絡結構Fig.7 GraphCS model network structure

3 實驗

3.1 性能指標

本文采用源代碼檢索任務中公認的評估指標Frank、SuccessRate@、Precision@以及MRR 來驗證代碼檢索的有效性。

Frank 是指在指定大?。?10)的返回結果列表中第一次出現的符合要求的結果。Frank 指標的結果符合瀏覽信息從上而下的準則,較小的Frank 意味著為找到所需結果所需的檢查工作量較小。Frank 值越小,則說明檢索結果越靠前。因此Frank 可以衡量單個代碼搜索查詢的有效性。

MRR 表示每一個自然語言查詢語句query 檢索返回結果中指定大?。?10)的Frank 值的倒數的累加和,并對求和結果進行均值化,在很大程度上可以衡量檢索結果的好壞。MRR 值越高,則說明檢索性能越優越。MRR 值越低,則說明檢索性能越差。

其中,||代表查詢語句的數量,代表查詢語句集合中的每個查詢語句,Frank代表查詢語句對應的Frank 值。

SuccessRate@(=1,5,10)衡量在返回的相似度排名的結果中排在前的結果中可能存在多個正確結果的查詢的百分比。

其中,函數定義為當判斷語句為真時返回結果1,否則返回0。SuccessRate@評估指標對于檢索任務來說至關重要,因為性能優越的代碼檢索應允許從較少的返回結果來發現所需的代碼。并且Success-Rate@度量值越高,則代碼搜索性能好。

Precision@(=1,5,10)指標用來衡量每個自然語言查詢返回的結果中的排在前的相關結果的百分比。

Precision@可以反映查詢結果中于目標相符合的結果的個數,可以很好地提供不同用法的多種結果以學習,可以降低不相關結果出現的次數。因此Precision@度量值越高,則代表代碼搜索性能越好。

3.2 實驗參數

為了對模型進行訓練,將訓練數據進行隨機打亂并將批次大小設置為64。統計各個特征語料,構建相應的詞匯表。將詞匯表的大小設置正10 000 的時候,對語料庫的單詞覆蓋率達到95%以上,可以有效地學習詞匯的語義表示。針對不同的代碼特征,設置相應的最大長度。當序列的長度大于最大長度時,對序列進行截斷。當序列的長度小于最大長度時,以數值0 進行填充。在特征提取部分將LSTM 和嵌入向量維度設置成256,而將MLP 部分的嵌入向量維度設置成512。為了使模型有更好的泛化能力,在模型中添加Dropout 機制,將參數設置為0.25。詳細參數設置如表2 所示。

表2 參數介紹Table 2 Parameter introduction

3.3 實驗結果

CODEnn 算法是第一個基于深度學習的學習自然語言查詢語句語義信息的代碼檢索算法,在一定程度上取得了不錯的效果。但是CODEnn 算法只考慮源代碼的純文本信息,而忽略了代碼中存在的邏輯結構信息,不能充分理解程序語言豐富的語義和語法信息。GraphCS 算法不僅考慮代碼的純文本信息,還考慮了代碼中的邏輯結構信息,并且融入注意力機制來更深層次地進行代碼片段語義和語法特征的融合。為了驗證GraphCS算法的有效性,與CODEnn算法進行對比。為了更直觀地展現檢索效果的高效性,以Frank 作為評估標準,GraphCS 算法和CODEnn算法檢索的Frank 值如表3 所示。

表3 在Frank 上的評估結果Table 3 Evaluation results on Frank

GraphCS 不僅考慮代碼結構特征中豐富的文本信息,也考慮代碼片段的邏輯結構信息。CODEnn 中未檢索到結果個數為17個,而GraphCS中未檢索到結果個數為13 個,GraphCS 成功檢索到相關代碼片段明顯高于CODEnn。GraphCS算法返回的檢索結果中在Top 1 處為符合要求的代碼片段個數比CODEnn返回的結果有一定的提升。并且從整體上分析,GraphCS算法大多數檢索的結果的Frank 值比CODEnn 靠前,Frank 的值越小,說明返回結果越靠前,符合自上而下的檢索方式。例如,考慮查詢語句check if file exists。從表3 知GraphCS 算法的Frank 值為3,則意味著在返回結果列表中第3 個代碼片段符合查詢要求;而CODEnn 算法的Frank 值為6,則意味著在返回結果列表中第6 個代碼片段符合查詢要求。大多數人在搜索問題的過程中,都只會關注靠前的內容,后面的結果關注較少。綜上所述,從Frank 評估指標結果分析可知GraphCS 與CODEnn 相比有較好的提升,可以提供更加符合查詢要求的代碼片段。

本文不僅在Frank 上驗證GraphCS 算法的有效性,還在SuccessRate@、Precision@、MRR 指標以及時間性能上對GraphCS 和CODEnn 進行系統評估。其中,SuccessRate@、Precision@、MRR 統計結果如表4 所示,時間性能對比結果如表5 所示。

表4 性能對比Table 4 Performance comparison

表5 檢索結果統計Table 5 Retrieval result statistics

GraphCS 算法在SuccessRate@5 值為0.56,則意味著存在56%的查詢,可以在前5 個返回結果中找到相關的代碼段。CODEnn 算法在MRR 上的值為0.31,其中Recall@1/5/10=0.20/0.42/0.66,Precision@1/5/10=0.20/0.24/0.23。相比之下,GraphCS 算法在MRR 上的值為0.39。其中Recall@1/5/10=0.28/0.56/0.74 和Precision@1/5/10=0.28/0.35/0.36。實驗結果表明,GraphCS 算法與CODEnn 算法相比,GraphCS在MRR 上提高了25.8%,在Recall@1/5/10 上提高了40.0%/33.3%/12.1%,在Precision@1/5/10 上提高了40.0%/45.8%/56.5%。在時間性能對比分析中可知,CODEnn 算法在CPU 上訓練和檢索所花費時間分別為49.3 h 和157 s;GraphCS算法在CPU上訓練和檢索所花費時間分別為67.4 h 和164 s。從CPU 上的時間性能分析可知二者差距不大,當在GPU 中訓練CODEnn 算法模型和GraphCS 算法模型時可以極大縮短訓練和檢索所花費的時間。因此,檢索精度的提升可以忽略時間性能的不足。綜上所述,可以證明引入邏輯圖結構信息可以彌補純文本信息的不足,在訓練和檢索時間性能差距不大的情況下可以在一定程度上提高代碼檢索的準確率。從實驗數據中可知GraphCS 算法在上述4 個評估指標上獲得更好的精度,比CODEnn 算法獲取更多符合查詢語義信息的代碼片段。

大多數情況下,一個方法的方法名可以很直觀地體現一個代碼片段的功能。例如,一個函數方法的方法名為readXmlFiles,從方法名上可以很明顯地確認方法所包含的功能為解析Xml 文件。為了驗證GraphCS 算法檢索結果的有效性,分別統計語義相關代碼片段個數和方法名相關的代碼片段個數,統計數據如表6 所示。GraphCS 算法檢索結果中,語義相關的代碼片段個數為37,其中24 個代碼片段是方法名相關的。而CODEnn 算法檢索結果中,語義相關的代碼片段個數為33,其中18 個代碼片段是方法名相關的。GraphCS 算法中方法名相關與語義相關的比值為0.649,而CODEnn 算法中方法名相關與語義相關的比值為0.545。相比之下GraphCS 檢索的結果在語義和語法上都有較好的體現,且方法名相關得較多。例如,查詢語句append text to an existing file 在GraphCS算法中的返回結果如圖8所示,而在CODEnn算法中返回的結果如圖9 所示。從返回結果可知,GraphCS 返回結果考慮得更加全面嚴謹且在方法名上更加相關,而CODEnn 返回的結果相對比較簡略。

圖8 GraphCS 檢索結果Fig.8 GraphCS retrieval result

圖9 CODEnn 檢索結果Fig.9 CODEnn retrieval result

表6 檢索結果統計Table 6 Retrieval result statistics

本文主要與CODEnn 算法進行了詳細的對比,為了證明GraphCS 算法的有效性,與基于RNN 和NeuralBOW 的代碼檢索算法進行簡單對比。其中,RNN和NeuralBOW 是代碼檢索任務中兩個常用的基線模型,二者都是只對代碼片段的文本信息進行編碼,然后以余弦相似度的方式來計算代碼片段與自然語言注釋的語義相似度。在MRR、SuccessRate@指標上的實驗結果如表7 所示。

表7 實驗結果統計Table 7 Experimental result statistics

4 結束語

源代碼的純文本語句包含大量語義信息,但是不能充分地體現代碼的邏輯結構信息。本文提出一種基于圖嵌入的代碼檢索算法GraphCS。除了考慮源代碼的純文本信息之外,還考慮代碼的邏輯結構特性,可以更深層次地學習源代碼的語義表示。與CODEnn 對比,檢索到更多符合語義的代碼片段。

在未來的工作中,會考慮其他不同語言的數據集(C#或Python)進行全面的實驗。為了克服代碼的圖結構大小不均衡而導致的圖嵌入效果提升不明顯問題,對代碼圖特征提取過程做進一步優化。

猜你喜歡
源代碼語句代碼
基于TXL的源代碼插樁技術研究
神秘的代碼
保護好自己的“源代碼”
一周機構凈增(減)倉股前20名
解密別克安全“源代碼”
一行代碼玩完19億元衛星
近期連續上漲7天以上的股
我喜歡
冠詞缺失與中介語句法損傷研究
作文語句實錄
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合