優化一個基於搜索的代碼推薦系統

優化一個基於搜索的代碼推薦系統

引用

Naoya Murakami and Hidehiko Masuhara. Optimizing a Search-Based Code Recommendation System. In Proceedings of the 3rd International Workshop on Recommendation Systems for Software Engineering, 2012, 68-72.

摘要

具有大型代碼倉庫的基於搜索的代碼推薦系統可以為程序員提供示例代碼片段,這些代碼片段不僅提供了不同庫和框架下的應用程序編程接口名稱,還提供了這些接口的實際使用步驟。然而,優化這樣的系統並不容易,因為推薦代碼的有用性是間接且難以衡量的。對此我們提出了一種機械式的有用性評估方法,並用它評估我們的推薦系統 Selene。通過使用該方法,我們調整了 Selene 中的幾個搜索和用戶界面參數以獲得更好的召回因子,並學習了這些參數的特性。

Selene 簡介

圖 1 展示了 Selene 作為 Eclipse 插件的屏幕截圖。左側的窗口是一個標準的程序編輯器,用於程序員編寫程序。右側垂直排列的三個小窗口顯示了 Selene 推薦的代碼片段。

Selene 的代碼推薦過程主要由關聯搜索與計算局部相似性得分構成。在推薦開始時,Selene 將編輯器窗口的整段文本全部發送給搜索服務器,該服務器負責在代碼倉庫中進行關聯搜索,並返回與給定文本相似度最高的文件。接著 Selene 為每個返回文件的每一行計算局部相似性得分。這一得分體現了編輯器中游標位置周圍的文本與返回文本中每一行周圍文本的相似度。最終,Selene 會在右側顯示相似度得分最高的那行及其周圍的文本。

優化一個基於搜索的代碼推薦系統

在關聯搜索階段,Selene 使用 GETA 算法以及包含兩百萬個開源項目的代碼倉庫。GETA 算法是基於詞頻矩陣相似度的,其矩陣權重通過與遊標位置的距離以及 TF-IDF 進行賦值。為了計算局部相似度得分,Selene 實現了兩種不同的算法:公共記號頻率與雙序列比對,前者簡單地計算兩個文本間共同出現的記號的出現率,後者是比較雙序列相似度的標準技術,常用於核苷酸鹼基序列的比對。

研究問題

Selene 中的很多參數都是根據作者自己的經驗進行調整的,例如:記號權重和窗口大小(關乎要比較的代碼行數)。但是,為了得到正確的參數需要解決很多問題:

意義:雖然不同的參數會導致不同的結果,但是這些差異的產生並不是偶然,卻難以總結出哪個參數會導致哪些差異。因此,需要了解結果中這些差異的統計學意義。

關聯搜索的局部性:Selene 的關聯搜索能夠賦予接近遊標位置的記號更高的權重,或是將所有記號的權重設為相同值。前者將使獲得的文件與當前編輯行具有更高的相似度,而後者獲得的文件將與整個編輯文件擁有相似的上下文。

上下文的語序敏感度:兩種計算局部相似性得分的算法在對記號順序的敏感度上有所區別:關聯搜索能夠找到包含相似記號集的上下文,並且無視這些記號的順序;而雙序列比對算法找到的是具有相似記號順序的上下文。儘管雙序列比對得出的結果更加精確,但卻不一定能得到更好的結果,例如:對象域的初始化記號序列並不存在嚴格的順序。

展示註釋的影響:現版本的 Selene 將代碼片段原封不動地展示出來,其中包括了推薦代碼的註釋。如果在展示代碼前將註釋移除,是否會改善其有用性?例如可以通過移除註釋使代碼獲得更多的展示空間。

片段數量與大小的權衡:初步實驗結果表明,更多的代碼片段可以改善結果的有用性,但是,由於可展示空間是一定的,想要展示更多的代碼片段只能減少每個片段的行數。

評估方法

為了回答以上問題並優化 Selene 的參數,作者開發了一種機械式評估方法,它通過評估召回率來計算有用性得分。

該方法首先從現有程序集中產生一個問題集。一個問題由查詢文本和回答記號組成,這兩部分可以通過將一個程序文本從隨機行一分為二獲得。劃分出的上半部分作為查詢文本,它表示部分完成的程序;下半部分前幾行(稱為回答窗口)中的非平凡記號(未在上半部分出現過的記號)將被作為回答記號集,它表示那些程序員可能不知道或是想不起來的記號名,需要系統進行推薦。如列表 1 所示,一個程序文本從 60 和 61 行間被分開,上半部分(1…60)用作查詢文本,假設回答窗口為 5 行,那麼回答集就有在方框中或有下劃線的記號組成。值得注意的是,例如 buttonDimension 之類的記號不在回答集中,因為它們已經在上半部分出現過了。

優化一個基於搜索的代碼推薦系統

優化一個基於搜索的代碼推薦系統

優化一個基於搜索的代碼推薦系統

實驗及發現

實驗設置:

實驗中從 60 個文件中產生了 1164 個問題,每一個文件都是從 60 個用於記號識別的開源項目中隨機獲取的。從每個文件中產生的問題數量與文件行數成正比,平均每 10 行產生一個問題。在每個文件中,問題的選取範圍為從類聲明以下(去除 import 和著作聲明)的 1~5 行開始到文件底部之間的內容。如果 Selene 的代碼倉庫中存在其中某個項目,實驗中將會把該項目中的文件從關聯搜索的結果中去除,防止推薦結果為問題來源文件(這會使召回率趨近於 1)。實驗過程中通過改動以下參數來評估召回率:局部相似度得分的算法、計算局部相似度得分時是否涉及註釋、推薦代碼片段數、每個代碼片段顯示行數、代碼片段首行與最相似行的距離(通過參數# prior lines shown 體現)、是否在推薦片段中顯示註釋。

實驗結果:

統計學意義:實驗中在比較兩個參數集下的召回率值時進行採用 t 檢驗,發現實驗結果的差異的確具有統計學意義,且 α 值為 0.05。這說明本文提出的方法可以用於優化 Selene 的參數。

優化參數:對給定的初始參數集,實驗中使用爬山算法來尋找能夠優化召回率的參數集。對於每一個參數,賦予其不同的值,並尋找能優化召回率的下一個值。圖 2 展現了僅在代碼片段數量不同(相應地每一片段代碼行數也不同)時對應的召回率.這一過程重複了三次直到所有參數都得到優化,結果如表 1 所示。

優化一個基於搜索的代碼推薦系統

優化一個基於搜索的代碼推薦系統

討論:實驗中還發現了一些有趣的現象:1)遊標距離權重的優化表明關聯搜索應該多使用全局信息,也就是說與當前編輯文件在上下文上相似度更高的代碼片段比在局部相似度上更高的片段更加有用;2)優化後的代碼片段數量為 6,這超出了作者根據以往工作經驗的做出的預期,因為更少的代碼行數意味著用戶需要上下滑動代碼片段窗口進行查看;3)參數 # prior lines shown 為 1 表明推薦片段中最重要的部分位於與當前編輯行的最相似行之後的 18 行內,它們比最相似行之前的片段更加有用。4)當不使用爬山算法(該算法難以脫離註釋進行,需要更改公式)來評估代碼片段中註釋的影響時,發現召回率得到了改善。

致謝

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

本文由南京大學軟件學院 2020 級碩士生孫昱翻譯轉述。


分享到:


相關文章: