基於群體知識的代碼搜索查詢擴展

基於群體知識的代碼搜索查詢擴展

1 引用

Liming Nie and He Jiang and Zhilei Ren and Zeyi Sun and Xiaochen Li. Query Expansion Based on Crowd Knowledge for Code Search. IEEE Transactions on Services Computing, 2016, 9(5):771—783.

2 摘要

由於代碼搜索是軟件開發實踐中經常發生的活動,提高代碼搜索的性能是一項關鍵任務。在基於文本檢索的代碼檢索技術中,術語失配問題是影響檢索效率的關鍵語言問題。通過重新構造查詢,查詢擴展為解決術語不匹配問題提供了有效的方法。本文提出了一種基於群體知識的查詢擴展技術(QECK),以提高代碼搜索算法的性能。QECK 從堆棧溢出時的高質量偽相關反饋問答對中識別特定於軟件的擴展詞,以自動生成擴展查詢。此外,我們將 QECK 引入到經典的 Rocchio 模型中,提出了基於 QECK 的代碼搜索方法 QECKRocchio。我們進行了三個實驗來評估我們的 QECK 技術,並在包含真實代碼片段和問答對集合的大規模語料庫中研究 QECKRocchio。結果表明,QECK 改善了三個代碼搜索算法的性能,在 Precision 上提高了 64%,在 NDCG 上提高了 35%。同時,與目前最新的查詢擴展方法相比,QECKRocchio 的 Precision 提高了 22%,NDCG 提高了 16%。

3 技術

本節介紹了 QECKRocchio 的步驟,我們在研究中使用的問答對集合和代碼片段語料庫的構建。我們還提供了一些有關 PRF 文檔中擴展詞加權的詳細信息。

3.1 QECKRocchio 的步驟

在本研究中,為探究我們的 QECK 技術的有效性,我們將 QECK 納入經典的 Rocchio 模型中,以生成稱為 QECKRocchio 的代碼搜索方法。Rocchio 模型將偽相關反饋納入信息檢索過程。 QECKRocchio 的整體結構包含三個模塊:QA 對搜索引擎,擴展詞選擇器和代碼片段搜索引擎。我們方法的輸入是原始查詢 q,問答對集合和代碼片段語料庫,輸出是排名靠前的代碼段列表。

基於群體知識的代碼搜索查詢擴展

圖 1 基於 QECK 的 Rocchio 模型的整體結構

以下三個步驟顯示了圖 1 中我們的方法的過程。

基於群體知識的代碼搜索查詢擴展

3.2 單詞選擇

在我們的研究中,為了對反饋文檔中的候選單詞進行加權,我們採用了傳統的方法 TF-IDF 加權功能。TF-IDF 通常用於確定單詞對於語料庫中特定文檔的重要性。TF-IDF 在 Lucene 上的權重如下:

基於群體知識的代碼搜索查詢擴展

3.3 代碼段語料庫

我們將候選代碼段存儲在一個語料庫中,並在 Lucene 上對其進行索引。該語料庫包含從 Android 平臺上的 1,538 個開源應用程序項目中提取的 921,713 個代碼段。以下三個步驟顯示了代碼段語料庫的準備工作:

l 抓取開源應用程序項目

我們實驗中的代碼段來自 F-droid [2]上的開源應用程序項目。F-droid 是一個在 Android 平臺上具有免費和開源應用程序的網站。值得注意的是,在多個版本的應用程序項目中,我們選擇了最新版本。

l 在這些應用程序項目中分段 Java 文件

為了收集候選代碼段,在先前的工作之後,我們使用工具 Eclipse 抽象語法樹(AST)來解析 Java 文件。每個 Java 文件都包含一個或多個方法。在解析過程中,每個包含代碼文本和註釋的方法被視為一個代碼片段。

l 在 Lucene 上索引代碼段

像對問答集的文本預處理一樣,我們也首先在 Lucene 上對代碼段進行索引之前對其進行處理。然後,每個代碼段都作為包含多個字段(即代碼段的名稱和單詞)的文檔存儲。

在 QECKRocchio 的第二遍通過檢索中,我們使用擴展查詢和此代碼段之間的 BM25 文本相似性對每個代碼段進行評分,然後根據得分選擇前 k 位代碼段作為最終推薦結果。

4 實驗設置

4.1 研究問題

我們探索以下三個 RQ:

RQ1:QECK 是否可以提高代碼搜索算法的性能?

RQ2:參數如何影響 QECK 的性能?

RQ3:基於 QECK 的 Rocchio 模型,我們的代碼搜索方法是否比最新方法更好?

4.2 數據集收集

在我們的實驗中,我們使用 20 個編程任務來構成原始查詢,這些任務是從 Stack Overflow 中收集的實際編程任務,如圖 2。

基於群體知識的代碼搜索查詢擴展

圖 2 測試用查詢集

5 結果與分析

在第一個和第三個實驗中,為了得出可靠的結論,一個推薦結果是否優於另一個推薦結果,我們進行了統計學檢驗以比較兩個指標(即 Precision 和 NDCG)對於兩個結果的平均值。具體來說,我們在兩個結果之間進行了兩面的 Wilcoxon 符號秩檢驗。當比較每對結果時,主要的零假設是兩個結果之間的性能沒有統計差異。在本節中,我們採用 95%的置信度(即 p 值低於 0.05 被認為是重要的)。

5.1RQ1

進行第一個實驗,以確定 QECK 在提高檢索性能方面的有效性。

圖 3 包含 Precision 和 NDCG 的極值,中值,均值和標準差的詳細信息,還顯示了在應用 QECK 之前和之後三種代碼搜索算法的性能比較。

基於群體知識的代碼搜索查詢擴展

圖 3 應用 QECK 之前和之後的三種代碼搜索算法(IR,PORTFOLIO 和 VF)的統計摘要

圖 4 顯示了三種代碼搜索算法的兩個指標的性能比較的統計摘要。

基於群體知識的代碼搜索查詢擴展

圖 4 應用 QECK 之前和之後三種代碼搜索算法(IR,Portfolio(P),VF)的 Precision(a)和 NDCG(b)的統計結果

回答 RQ1:在使用我們提出的 QECK 技術,基於群體知識的查詢擴展之後,三種代碼搜索算法的性能都得到了改善。

5.2RQ2

我們進行第二個實驗以進一步探索參數變化對 QECK 性能的影響,在第一個實驗之後,我們通過更改 PRF 文檔的數量和擴展詞的數量來比較三種代碼搜索算法的性能趨勢。

圖 5 和圖 6 顯示了當我們固定一個參數並更改另一個參數時,通過兩個度量(Precision@10 和 NDCG@10)應用 QECK 之前和之後的三種代碼搜索算法的趨勢。

基於群體知識的代碼搜索查詢擴展

圖 5 當擴展字數等於不同值且 PRF 文檔數設置為 5 時,Precision(a)和 NDCG(b)的趨勢

基於群體知識的代碼搜索查詢擴展

圖 6 當 PRF 文檔的數量等於不同的值並且擴展字的數量設置為 9 時,Precision(a)和 NDCG(b)的趨勢

回答 RQ2:在確定 PRF 文檔的數量並更改擴展詞的數量時,每種代碼搜索算法都有一個唯一的最佳性能值。擴展詞太多或太少都是不希望的。

5.3RQ3

第三個實驗是將我們的代碼搜索方法 QECKRocchio 與 PWordNet 進行比較。圖 7 列出了 Precision 和 NDCG 的極值,中值,均值和標準差的詳細信息,並給出了兩種方法的性能比較。

基於群體知識的代碼搜索查詢擴展

圖 7 兩種方法的統計總結

圖 8 顯示了兩種方法的兩個指標的性能比較的統計摘要。在圖 7 和圖 8 中,我們可以觀察到 QECKRocchio 的性能優於 PWordNet。

基於群體知識的代碼搜索查詢擴展

圖 8 兩種基於查詢擴展的代碼搜索方法的 Precision(a)和 NDCG(b)的統計結果

回答 RQ3:根據上面的觀察和分析,我們可以證明我們的方法 QECKRocchio 比最新的方法是一種更好的代碼搜索方法。此結果清楚地證明了 QECK 提供有用的擴展詞的能力。

6 本文主要貢獻

本文的主要貢獻如下:

1)我們提出了 QECK,這是一種新穎的技術,它利用 Stack Overflow 上的群體知識來提高代碼搜索算法的性能;

2)我們通過三種代碼搜索算法以及 Precision 和 NDCG 的比較方法來探索 QECK 的性能並確定其有效性;

3)我們從 Stack Overflow 構建了一個問答對集合,並從開源應用程序項目構建一個代碼片斷語料庫。

致謝

感謝國家重點研發計劃課題:基於協同編程現場的智能實時質量提升方法與技術(2018YFB1003901)和國家自然科學基金項目:基於可理解信息融合的人機協同移動應用測試研究(61802171)支持!

本文由南京大學軟件學院 2018 級碩士生韓奇翻譯轉述。


分享到:


相關文章: