林澤琦 , 鄒艷珍,3 , 趙俊峰,3 , 曹英魁 , 謝 冰
1(高可信軟件技術(shù)教育部重點(diǎn)實(shí)驗(yàn)室(北京大學(xué)),北京 100871)
2(北京大學(xué) 信息科學(xué)技術(shù)學(xué)院,北京 100871)
3(北京大學(xué)(天津?yàn)I海)新一代信息技術(shù)研究院,天津 300450)
軟件復(fù)用是在軟件開(kāi)發(fā)中避免重復(fù)勞動(dòng)的解決方案,可以提高軟件開(kāi)發(fā)的效率與質(zhì)量[1].近年來(lái),隨著開(kāi)源軟件的快速發(fā)展,互聯(lián)網(wǎng)上匯聚了大量可復(fù)用的軟件項(xiàng)目,例如Apache Lucene、Apache POI、JFreeChart等.這些軟件項(xiàng)目除了有源代碼之外,往往還包含數(shù)量龐大、類型各異的自然語(yǔ)言文本形式的文檔資源,例如用戶手冊(cè)、郵件歸檔、缺陷報(bào)告、用戶論壇討論等.這些文檔中蘊(yùn)含著豐富的知識(shí),能夠幫助軟件開(kāi)發(fā)者學(xué)習(xí)與理解該軟件項(xiàng)目,從而更有效地對(duì)其進(jìn)行復(fù)用.當(dāng)軟件開(kāi)發(fā)人員在復(fù)用一個(gè)軟件項(xiàng)目的過(guò)程中遇到問(wèn)題,例如不知道一個(gè)功能的實(shí)現(xiàn)原理,或者是不知道一個(gè)需求應(yīng)該被如何實(shí)現(xiàn)時(shí),往往會(huì)在這些軟件文檔中進(jìn)行搜索,以期找到一些相關(guān)的文本段落,其中包含可以用來(lái)回答該問(wèn)題的信息.近年來(lái),為項(xiàng)目?jī)?nèi)的文檔資源提供搜索服務(wù)已經(jīng)成為開(kāi)源軟件項(xiàng)目中最基本的輔助服務(wù)之一.如何提高軟件文檔搜索的準(zhǔn)確率,已經(jīng)成為軟件復(fù)用領(lǐng)域的重要研究話題[2].
最基本也是最常見(jiàn)的軟件文檔搜索方法是基于關(guān)鍵詞匹配的,這種方法將軟件開(kāi)發(fā)者輸入的自然語(yǔ)言形式的問(wèn)題與各個(gè)文檔進(jìn)行關(guān)鍵詞匹配,并將關(guān)鍵詞匹配程度最高的文檔作為搜索結(jié)果.這種方法沒(méi)有考慮到不同的詞之間是具有語(yǔ)義關(guān)聯(lián)的,因此搜索效果往往不夠理想.在信息檢索領(lǐng)域中,為了解決這一問(wèn)題,相關(guān)研究工作主要分為兩類:其一是基于統(tǒng)計(jì)分析的方法,如潛在語(yǔ)義分析(latent semantic analysis,簡(jiǎn)稱LSA)[3]、潛在狄利克雷分析(latent Dirichlet allocation)[4]、基于神經(jīng)語(yǔ)言模型的詞表示學(xué)習(xí)技術(shù)[5]等,此類方法依賴于訓(xùn)練所用的語(yǔ)料庫(kù),受數(shù)據(jù)稀疏和實(shí)際噪聲的干擾較大;其二是基于概念知識(shí)的方法[6?12],使用概念實(shí)體來(lái)表示自然語(yǔ)言文本的語(yǔ)義,并以概念實(shí)體之間的結(jié)構(gòu)關(guān)聯(lián)關(guān)系來(lái)度量文本之間的語(yǔ)義相關(guān)度,此類方法直觀、有效,但需要用到互聯(lián)網(wǎng)上大型的通用概念知識(shí)庫(kù)(如WordNet、DBpedia、Freebase、Yago等).然而,這些通用概念知識(shí)庫(kù)中又往往不包含軟件項(xiàng)目中領(lǐng)域特定的概念知識(shí).總的來(lái)看,軟件文檔中的數(shù)據(jù)稀疏現(xiàn)象較為明顯,這導(dǎo)致了基于統(tǒng)計(jì)分析的方法對(duì)搜索效果的改進(jìn)是有限的.我們希望通過(guò)基于概念知識(shí)的方法來(lái)提升搜索效果,但其中亟待解決的問(wèn)題是如何獲取軟件項(xiàng)目中領(lǐng)域特定的概念知識(shí).
我們?cè)谘芯恐邪l(fā)現(xiàn),軟件項(xiàng)目中涉及的領(lǐng)域特定的概念實(shí)體大多都在這個(gè)軟件的開(kāi)發(fā)過(guò)程中被定義成了諸如類、接口等的代碼元素,因此軟件項(xiàng)目的代碼結(jié)構(gòu)圖在一定程度上表達(dá)了領(lǐng)域特定的概念知識(shí),可以用來(lái)幫助機(jī)器理解自然語(yǔ)言文本的語(yǔ)義.基于這種思路,本文提出了一種基于代碼結(jié)構(gòu)知識(shí)的軟件文檔語(yǔ)義搜索方法.更具體地:(1) 我們將這些代碼元素抽取出來(lái)用于表示領(lǐng)域特定的概念實(shí)體;(2) 抽取這些代碼元素之間的結(jié)構(gòu)依賴關(guān)系(例如繼承關(guān)系、調(diào)用關(guān)系)可以體現(xiàn)出相應(yīng)的概念實(shí)體之間的語(yǔ)義關(guān)聯(lián)關(guān)系,并利用它們來(lái)推理出文本之間的語(yǔ)義相關(guān)度.
與現(xiàn)有工作相比,本文的主要貢獻(xiàn)是:
(1) 提出一種基于代碼結(jié)構(gòu)知識(shí)的文本語(yǔ)義表示方法,將文本的語(yǔ)義表示為代碼結(jié)構(gòu)圖上的一個(gè)帶權(quán)子圖,從而實(shí)現(xiàn)了利用軟件項(xiàng)目源代碼中蘊(yùn)含的概念知識(shí)來(lái)“解釋”文本的語(yǔ)義;
(2) 提出一種基于代碼結(jié)構(gòu)知識(shí)的軟件文檔語(yǔ)義搜索方法,基于多關(guān)聯(lián)數(shù)據(jù)的表示學(xué)習(xí)技術(shù),利用代碼元素間的結(jié)構(gòu)依賴關(guān)系推理出文本間的語(yǔ)義相關(guān)度,從而解決了信息檢索技術(shù)未能考慮不同的詞之間的語(yǔ)義關(guān)聯(lián)的問(wèn)題;
(3) 在StackOverflow數(shù)據(jù)集上對(duì)該方法進(jìn)行了驗(yàn)證,與其他多種信息檢索方法(包括向量空間模型、潛在主題建模、神經(jīng)語(yǔ)言模型等) 相比,本方法在平均準(zhǔn)確率(mean average precision,簡(jiǎn)稱MAP)指標(biāo)上可以取得至少13.77%的效果提升.
本文第1節(jié)概述文本的研究目標(biāo)與方法框架.第2節(jié)具體描述基于代碼結(jié)構(gòu)知識(shí)的軟件文檔語(yǔ)義搜索方法的實(shí)現(xiàn)細(xì)節(jié),包括代碼結(jié)構(gòu)圖提取、文檔語(yǔ)義表示、文檔語(yǔ)義相關(guān)度度量3個(gè)步驟.第3節(jié)介紹本文的實(shí)證研究,包括實(shí)驗(yàn)設(shè)計(jì)、采用的評(píng)測(cè)數(shù)據(jù)集及評(píng)價(jià)指標(biāo)以及實(shí)驗(yàn)結(jié)果分析等.第4節(jié)與相關(guān)工作進(jìn)行比較.第5節(jié)總結(jié)全文并對(duì)未來(lái)研究工作進(jìn)行展望.
本節(jié)首先通過(guò)一個(gè)實(shí)際例子來(lái)更為直觀地說(shuō)明本文的目標(biāo)與基本方法,之后給出基于代碼結(jié)構(gòu)知識(shí)的軟件文檔語(yǔ)義搜索方法的總體框架.
文檔A和文檔B都是在線問(wèn)答社區(qū)StackOverflow上的問(wèn)題,它們都與開(kāi)源軟件項(xiàng)目Apache Lucene有關(guān).表1給出了這兩個(gè)問(wèn)題的標(biāo)題以及詳細(xì)描述.文檔A的答案中指出,文檔B所對(duì)應(yīng)的問(wèn)答對(duì)可以用于回答文檔A中所提出的問(wèn)題.因此,我們認(rèn)為文檔A和文檔B是高度語(yǔ)義相關(guān)的.然而文檔A和文檔B中所包含的詞匯的匹配程度并不高,因此在StackOverflow提供的基于詞匹配的信息檢索系統(tǒng)中,文檔B被排在了檢索結(jié)果中較為靠后的位置.
Table 1 Two sample documents selected from StackOverflow表1 從StackOverflow中選取的兩個(gè)示例文檔
為了解決這一問(wèn)題,我們利用Apache Lucene項(xiàng)目源代碼中的概念知識(shí)作為橋梁來(lái)建立文檔A和文檔B間的語(yǔ)義關(guān)聯(lián)關(guān)系.這一想法主要分為兩個(gè)步驟:首先建立起文本中的詞匯與源代碼中的代碼元素之間的對(duì)應(yīng)關(guān)系,從而能夠用源代碼中的概念知識(shí)來(lái)“解釋”文本的語(yǔ)義;之后,利用代碼元素在源代碼中的結(jié)構(gòu)依賴關(guān)系,度量文本之間的語(yǔ)義相關(guān)度.以文檔A中的句子:“My problem is how to parse wildcard queries with Lucene that the query term is passed through a TokenFilter …”為例.該句中直接提及了Apache Lucene項(xiàng)目中的類TokenFilter.同時(shí),該句中還包含關(guān)鍵詞:parse,wildcard,query和term.根據(jù)這些關(guān)鍵詞,我們可以合理地猜測(cè)出這個(gè)句子的語(yǔ)義與Apache Lucene項(xiàng)目中的類WildcardQuery、類QueryParser和類Term等代碼元素有關(guān).基于這一思想,這個(gè)句子的語(yǔ)義可以用這些代碼元素的集合來(lái)表示.類似地,我們可以將文檔B的語(yǔ)義表示為由類Token、類TokenStream、方法TokenStream.incrementToken(?)、類AttributeSource等代碼元素構(gòu)成的集合.我們基于TF-IDF技術(shù)[13]為這些代碼元素賦上權(quán)值,則每個(gè)文檔的語(yǔ)義就可以分別被表示為代碼結(jié)構(gòu)圖上的一個(gè)帶權(quán)子圖.
圖1解釋了我們?nèi)绾卫迷创a中的概念知識(shí)作為橋梁來(lái)建立文檔A和文檔B之間的語(yǔ)義關(guān)聯(lián)關(guān)系.圖中展示了Apache Lucene項(xiàng)目的代碼結(jié)構(gòu)圖的一小部分.在代碼結(jié)構(gòu)圖中,每個(gè)結(jié)點(diǎn)代表一個(gè)代碼元素,而不同類型的有向邊則代表代碼元素間各種類型的結(jié)構(gòu)依賴關(guān)系.與文檔A相關(guān)的代碼元素在圖中以網(wǎng)格線標(biāo)記,而與文檔B相關(guān)的代碼元素則在圖中以淺灰色標(biāo)記.由于在Apache Lucene項(xiàng)目的整個(gè)代碼結(jié)構(gòu)圖中,兩類結(jié)點(diǎn)是很接近的,因此,即使文檔A和文檔B中所包含的詞匯的匹配程度并不高,我們也能根據(jù)代碼結(jié)構(gòu)圖上的結(jié)構(gòu)依賴關(guān)系來(lái)推理出文檔A和文檔B具有很高的語(yǔ)義相關(guān)度.
Fig.1 A brief illustration of how we can use conceptual knowledge in source code to capture the semantic relatedness between two documents圖1 如何利用軟件項(xiàng)目源代碼中的概念知識(shí)來(lái)度量文檔間的語(yǔ)義相似度的一個(gè)示例說(shuō)明
綜上,為了實(shí)現(xiàn)基于代碼結(jié)構(gòu)知識(shí)的軟件文檔語(yǔ)義搜索,需要解決兩個(gè)方面的關(guān)鍵問(wèn)題:一是如何準(zhǔn)確地將文本的語(yǔ)義表示為代碼結(jié)構(gòu)圖上的一個(gè)帶權(quán)子圖;二是如何利用這些子圖在代碼結(jié)構(gòu)圖上的結(jié)構(gòu)依賴關(guān)系來(lái)計(jì)算文本的語(yǔ)義相關(guān)度.
本文提出了一種基于代碼結(jié)構(gòu)知識(shí)的軟件文檔語(yǔ)義搜索方法.圖2給出了該方法的整體流程.該方法主要由3部分構(gòu)成.
(1) 代碼結(jié)構(gòu)圖提取:這一部分用于從軟件項(xiàng)目的源代碼中提取出一個(gè)代碼結(jié)構(gòu)圖.一個(gè)代碼結(jié)構(gòu)圖由代碼元素(例如類、接口、方法等)以及這些代碼元素之間的結(jié)構(gòu)依賴關(guān)聯(lián)(例如調(diào)用、繼承等)組成.在我們的方法中,代碼結(jié)構(gòu)圖被作為軟件項(xiàng)目特定的概念知識(shí)庫(kù)來(lái)使用.
(2) 文檔語(yǔ)義表示:這一部分用于將文檔的語(yǔ)義表示為代碼結(jié)構(gòu)圖上的一個(gè)帶權(quán)子圖.更具體地,我們基于詞匹配和文本上下文分析建立文檔中的詞匯與代碼結(jié)構(gòu)圖中的代碼元素之間的關(guān)聯(lián)關(guān)系,并基于TF-IDF技術(shù)為這些代碼元素賦上權(quán)值.
(3) 文檔語(yǔ)義相關(guān)度度量:這一部分用于度量2個(gè)文檔之間的語(yǔ)義相關(guān)度.首先,我們基于多關(guān)聯(lián)數(shù)據(jù)的表示學(xué)習(xí)技術(shù),利用代碼元素之間的結(jié)構(gòu)依賴關(guān)聯(lián),計(jì)算不同的代碼元素在結(jié)構(gòu)上的相似度;隨后,我們利用代碼元素在結(jié)構(gòu)上的相似度來(lái)計(jì)算代碼結(jié)構(gòu)圖上的2個(gè)帶權(quán)子圖在結(jié)構(gòu)上的相似度,從而用這一相似度來(lái)度量2個(gè)文檔之間的語(yǔ)義相關(guān)度.在軟件文檔檢索系統(tǒng)中,我們使用得到的文檔語(yǔ)義相關(guān)度來(lái)對(duì)檢索結(jié)果進(jìn)行重排序:如果一個(gè)文檔和查詢語(yǔ)句之間具有較高的語(yǔ)義相關(guān)度,則該文檔在檢索結(jié)果中應(yīng)該被排在更加靠前的位置.
Fig.2 Workflow of the software text semantic search approach based on code structure knowledge圖2 基于代碼結(jié)構(gòu)知識(shí)的軟件文檔語(yǔ)義搜索方法整體流程
本節(jié)具體描述基于代碼結(jié)構(gòu)知識(shí)的軟件文檔語(yǔ)義搜索方法的實(shí)現(xiàn)細(xì)節(jié),包括代碼結(jié)構(gòu)圖提取、文檔語(yǔ)義表示、文檔語(yǔ)義相關(guān)度度量這3個(gè)步驟.
我們使用抽象語(yǔ)法樹(shù)解析器org.eclipse.jdt.core.ASTParser,從Java軟件項(xiàng)目的源代碼中提取代碼結(jié)構(gòu)圖.在一個(gè)代碼結(jié)構(gòu)圖中,結(jié)點(diǎn)代表源代碼中的代碼元素,結(jié)點(diǎn)間不同類型的有向邊代表這些代碼元素之間不同類型的結(jié)構(gòu)依賴關(guān)系.在本方法中,我們考慮了4種類型的代碼元素:類、接口、方法和域.我們考慮了這些類型的代碼元素之間的11種類型的結(jié)構(gòu)依賴關(guān)系,見(jiàn)表2.
Table 2 Eleven different edge types in code structure graphs表2 代碼結(jié)構(gòu)圖中的11種結(jié)構(gòu)依賴關(guān)系類型
文檔語(yǔ)義表示用于將文檔的自然語(yǔ)言文本表示為代碼結(jié)構(gòu)圖上的一個(gè)帶權(quán)子圖.在這里,“文檔”并不限于軟件文檔中的一個(gè)文本段落,還包括軟件開(kāi)發(fā)者輸入的文本形式的查詢語(yǔ)句.文檔語(yǔ)義表示的實(shí)現(xiàn)分為2個(gè)步驟:代碼元素識(shí)別與代碼元素權(quán)重度量.
2.2.1 代碼元素識(shí)別
文檔語(yǔ)義表示中,最關(guān)鍵的部分是識(shí)別出該文檔的語(yǔ)義該由該軟件項(xiàng)目中的哪些代碼元素來(lái)表示:首先,我們使用開(kāi)源工具Recodoc[14]來(lái)識(shí)別出文檔中直接提及的代碼元素;其次,我們基于詞匹配對(duì)代碼元素進(jìn)行擴(kuò)充.
Recodoc是一個(gè)基于文本上下文分析的用于識(shí)別出文檔中直接提及的代碼元素的工具.例如,對(duì)于句子“My problem is how to parse wildcard queries with Lucene that the query term is passed through a TokenFilter …”,Recodoc能夠從中識(shí)別出類TokenFilter.然而,僅靠類TokenFilter是不足以表達(dá)這個(gè)例句的語(yǔ)義的.例如,由于句子中出現(xiàn)了 wildcard和 query這兩個(gè)關(guān)鍵詞,因此我們可以合理地猜測(cè),這個(gè)句子和類WildcardQuery也是相關(guān)的.類似地,根據(jù)句子中的query,parser,term等關(guān)鍵詞,我們還可以識(shí)別出類QueryParser和類Term等代碼元素.盡管這些代碼元素并未在句子中被顯式地提及,但它們能夠體現(xiàn)出潛藏在句子的關(guān)鍵詞中的語(yǔ)義信息,因此它們也應(yīng)該被加入到這個(gè)句子的語(yǔ)義表示中去.基于這一思想,我們采用了基于詞匹配的方法對(duì)代碼元素進(jìn)行擴(kuò)充.
首先,我們對(duì)每個(gè)文檔進(jìn)行詞法預(yù)處理.我們使用空白字符與標(biāo)點(diǎn)符號(hào)將文檔切分為詞袋,并使用停用詞表將其中的停用詞過(guò)濾掉.我們使用Porter詞根化算法(https://tartarus.org/martin/PorterStemmer/)對(duì)剩下的詞進(jìn)行詞根化處理,最終得到了每個(gè)文檔的關(guān)鍵詞集合.
對(duì)于一個(gè)文檔中的每一個(gè)關(guān)鍵詞,我們從軟件項(xiàng)目的源代碼中找到所有標(biāo)識(shí)符中包含這個(gè)關(guān)鍵詞的代碼元素,并將這些代碼元素的集合稱為這個(gè)關(guān)鍵詞的候選代碼元素集合.一個(gè)候選代碼元素集合可能會(huì)包含大量的候選代碼元素.例如,對(duì)于關(guān)鍵詞english,其候選代碼元素集合包含55個(gè)代碼元素,包括類EnglishStemmer、類EnglishAnalyzer、類EnglishPossessiveFilterFactory,等等.如果我們直接將這樣一個(gè)候選代碼元素集合用于文檔的語(yǔ)義表示,則計(jì)算代價(jià)巨大,且其中包含的大量噪音也會(huì)極大地影響計(jì)算效果.因此,基于對(duì)候選代碼元素集合的觀察,我們提出了3條啟發(fā)式規(guī)則,以對(duì)集合中的候選代碼元素進(jìn)行過(guò)濾.
(1) 基于關(guān)鍵詞對(duì)候選代碼元素進(jìn)行過(guò)濾.提出這一啟發(fā)式規(guī)則所基于的假設(shè)是:若一個(gè)代碼元素能夠匹配上更多的關(guān)鍵詞,則說(shuō)明這個(gè)代碼元素更可能與這個(gè)文檔是語(yǔ)義相關(guān)的.例如,filter是一個(gè)文檔中的一個(gè)關(guān)鍵詞,類TokenFilter和類StopFilter是這個(gè)關(guān)鍵詞的2個(gè)候選代碼元素.該文檔還包含關(guān)鍵詞token,但不包含關(guān)鍵詞stop.類TokenFilter的標(biāo)識(shí)符中的關(guān)鍵詞比率高于類StopFiler,這說(shuō)明文檔中的關(guān)鍵詞 filter更有可能是指類TokenFilter,而不是類 StopFiler.因此在這種情況下,我們過(guò)濾掉類StopFilter,而留下類TokenFilter.
(2) 基于代碼元素類型對(duì)候選代碼元素進(jìn)行過(guò)濾.我們認(rèn)為,在軟件的源代碼中,軟件項(xiàng)目特定的概念知識(shí)主要是以類/接口的形式定義在項(xiàng)目的源代碼中的,而方法/域則主要用于描述這些概念中的具體細(xì)節(jié)與動(dòng)作.因此,如果一個(gè)關(guān)鍵詞的候選代碼元素集合中既包含類/接口,也包含方法/域,則我們會(huì)過(guò)濾掉所有方法/域,留下所有類/接口.
(3) 基于代碼元素標(biāo)識(shí)符長(zhǎng)度對(duì)候選代碼元素進(jìn)行過(guò)濾.提出這一啟發(fā)式規(guī)則所基于的假設(shè)是:若一個(gè)代碼元素的標(biāo)識(shí)符中包含的無(wú)法與文檔中的關(guān)鍵詞相匹配的信息越多,則可以認(rèn)為該代碼元素與這個(gè)文檔的語(yǔ)義相似度越低.例如,english是一個(gè)文檔中的一個(gè)關(guān)鍵詞,類 EnglishAnalyzer和類EnglishMinimalStemFilterFactory是這個(gè)關(guān)鍵詞的兩個(gè)候選代碼元素.在這種情況下,由于類EnglishMinimalStemFilterFactory的標(biāo)識(shí)符的長(zhǎng)度遠(yuǎn)大于類 EnglishAnalyzer,我們會(huì)過(guò)濾掉類EnglishMinimalStemFilterFactory而留下類EnglishAnalyzer.在本方法中,我們將“長(zhǎng)度遠(yuǎn)大于”定義為超過(guò)5個(gè)字母或是超過(guò)1倍.
對(duì)于每個(gè)文檔,我們對(duì)其中的每個(gè)關(guān)鍵詞的候選代碼元素集合應(yīng)用上述3條啟發(fā)式規(guī)則進(jìn)行過(guò)濾,所得到的代碼元素集合即是用于表示該文檔的語(yǔ)義的子圖.
2.2.2 代碼元素權(quán)重度量我們基于TF-IDF技術(shù)為從文檔中識(shí)別出的代碼元素進(jìn)行權(quán)重度量,從而將文檔的語(yǔ)義表示為代碼結(jié)構(gòu)圖上的一個(gè)帶權(quán)子圖.首先,我們使用TF-IDF技術(shù)度量出文檔中的各個(gè)關(guān)鍵詞的權(quán)重;隨后,我們將該權(quán)重重新分配給這些關(guān)鍵詞所對(duì)應(yīng)的代碼元素,如公式(1)與公式(2)所示.
在公式(1)和公式(2)中,wc表示代碼元素c的權(quán)重,C表示在文檔中識(shí)別到的所有代碼元素的集合,Tc表示與代碼元素c對(duì)應(yīng)的所有關(guān)鍵詞的集合,Ct表示與關(guān)鍵詞t對(duì)應(yīng)的所有代碼元素的集合.
經(jīng)過(guò)代碼元素識(shí)別與代碼元素權(quán)重度量,我們?yōu)槊總€(gè)文檔生成了代碼結(jié)構(gòu)圖上的一個(gè)帶權(quán)子圖.我們使用這個(gè)帶權(quán)子圖來(lái)表示文檔的語(yǔ)義.
文檔語(yǔ)義相關(guān)度度量部分通過(guò)計(jì)算文檔所對(duì)應(yīng)的帶權(quán)子圖在代碼結(jié)構(gòu)圖上的結(jié)構(gòu)相關(guān)度來(lái)度量文檔之間的語(yǔ)義相關(guān)度,從而能夠?qū)ξ谋緳z索的結(jié)果進(jìn)行重排序.具體分兩步:代碼元素表示學(xué)習(xí)和子圖相關(guān)度度量.
2.3.1 代碼元素表示學(xué)習(xí)
代碼元素表示學(xué)習(xí)用于計(jì)算不同的代碼元素之間的相似度,這一步驟是在線下完成的.
在本方法中,我們將代碼元素間的相似度定義為:在代碼結(jié)構(gòu)圖上,兩個(gè)代碼元素的上下文的相似度.這里的“上下文”是指代碼元素以何種類型的結(jié)構(gòu)依賴關(guān)系關(guān)聯(lián)到哪個(gè)其他的代碼元素.例如,如果類A和類B都是類C的子類,則我們認(rèn)為類A和類B比較相似;如果類A和類B還共同作為方法m的輸入?yún)?shù),則我們認(rèn)為類A和類B應(yīng)該具有更高的相似度.此外,我們認(rèn)為代碼元素間的相似度是具有傳遞性的.例如,假設(shè)類A和類B具有很高的相似度,方法x和方法y分別用到了類A和類B,則我們認(rèn)為方法x和方法y也具有較高的相似度.
我們使用多關(guān)聯(lián)數(shù)據(jù)表示學(xué)習(xí)算法TransR[15]來(lái)計(jì)算不同的代碼元素之間的相似性,其基本思想是:通過(guò)機(jī)器學(xué)習(xí)的方法,將代碼結(jié)構(gòu)圖中的每個(gè)代碼元素表示為一個(gè)低維、實(shí)值的向量,兩個(gè)向量之間的距離越近,則說(shuō)明這兩個(gè)向量所對(duì)應(yīng)的代碼元素的相似度越高.TransR的基本假設(shè)是:存在一個(gè)K0維的向量空間,使得代碼結(jié)構(gòu)圖中的每一個(gè)結(jié)點(diǎn)都可以表示為該空間中的一個(gè)向量.兩個(gè)向量之間的距離越近,則說(shuō)明這兩個(gè)向量所對(duì)應(yīng)的代碼元素的相似度越高.我們稱這個(gè)向量空間為主向量空間.同時(shí),對(duì)于每種類型的結(jié)構(gòu)依賴關(guān)系r,都存在一個(gè)與之對(duì)應(yīng)的K1維的向量空間,我們稱其為面向關(guān)系類型r的向量空間.對(duì)于代碼結(jié)構(gòu)圖中的任意一個(gè)結(jié)點(diǎn)e,我們將它在主向量空間中對(duì)應(yīng)的向量記為e.我們使用3元組〈h,r,t〉來(lái)表示一條始于結(jié)點(diǎn)h、指向結(jié)點(diǎn)t、類型為r的邊.對(duì)于這樣一條邊,TransR算法首先將其首尾兩個(gè)結(jié)點(diǎn)通過(guò)一個(gè)與r有關(guān)的線性變換Mr映射到面向關(guān)系類型r的向量空間中去.
隨后,TransR算法在面向關(guān)系類型r的向量空間中對(duì)結(jié)點(diǎn)h與結(jié)點(diǎn)t所對(duì)應(yīng)的向量進(jìn)行線性約束,即
其中,r是一個(gè)與r有關(guān)的平移變換.fr(h,t)是用于進(jìn)行學(xué)習(xí)的似然函數(shù),即如果3元組〈h,r,t〉存在于代碼結(jié)構(gòu)圖中,則fr(h,t)應(yīng)該盡可能地小;否則,fr(h,t)應(yīng)該盡可能地大.綜合考慮所有可能的3元組的fr(h,t),就得到了總體的最小似然優(yōu)化函數(shù):
我們使用隨機(jī)批量梯度下降法,以L為目標(biāo)進(jìn)行最小似然優(yōu)化,從而訓(xùn)練出模型參數(shù).這些參數(shù)包括每個(gè)結(jié)點(diǎn)對(duì)應(yīng)的一個(gè)K0維的向量以及每種類型的結(jié)構(gòu)依賴關(guān)系r所對(duì)應(yīng)的一個(gè)K0×K1的線性變換Mr和一個(gè)K1維的平移變換r.在訓(xùn)練過(guò)程中,我們限制所有向量的長(zhǎng)度不超過(guò)1.
圖3對(duì)TransR的基本思想進(jìn)行了簡(jiǎn)單解釋.在圖3中,我們考慮方法m1以及被方法m1所調(diào)用的3種方法m2,m3和m4.如圖所示:對(duì)于這種情況,在面向關(guān)系類型methodInvocation的向量空間中,TransR傾向于將方法m2,m3和m4所對(duì)應(yīng)的向量約束在一個(gè)以m1Mr+r為中心的小鄰域內(nèi),即m2Mr≈m3Mr≈m4Mr≈m1Mr+r.相應(yīng)地,在主向量空間中,方法m2,m3和m4所對(duì)應(yīng)的向量就被約束在同一個(gè)流型附近.因此,兩個(gè)結(jié)點(diǎn)在代碼結(jié)構(gòu)圖中的上下文越相似,則用來(lái)約束它們的流型越多,它們的位置也就會(huì)越傾向于靠近.通過(guò)以L為最小似然函數(shù)的整體優(yōu)化,即可生成每一個(gè)結(jié)點(diǎn)在主向量空間中所對(duì)應(yīng)的向量.兩個(gè)向量之間的距離越近,說(shuō)明這兩個(gè)向量所對(duì)應(yīng)的代碼元素的相似度越高.我們將兩個(gè)代碼元素a和b之間的相似度定義為1?|a?b|.
Fig.3 A brief illustration of TransR圖3 對(duì)TransR的簡(jiǎn)單解釋
2.3.2 子圖相關(guān)度度量
在之前的文檔語(yǔ)義表示步驟中,我們將每個(gè)文檔的語(yǔ)義表示成為了代碼結(jié)構(gòu)圖上的一個(gè)帶權(quán)子圖.在子圖相關(guān)度度量步驟中,我們將在代碼結(jié)構(gòu)圖上計(jì)算兩個(gè)不同帶權(quán)子圖的相關(guān)度,以此來(lái)度量?jī)蓚€(gè)文檔間的語(yǔ)義相關(guān)度.
首先,我們將代碼元素c到一個(gè)帶權(quán)子圖C的相似度定義為代碼元素c到C中的各個(gè)代碼元素的相似度的最大值,如公式(7)所示.
記Cq為查詢語(yǔ)句所對(duì)應(yīng)的帶權(quán)子圖,Cd為一個(gè)候選文檔所對(duì)應(yīng)的帶權(quán)子圖,我們定義Cq相對(duì)于Cd的相似度為
類似地,我們可以定義Cd相對(duì)于Cq的相似度sim(Cd→Cq):把公式(8)中的Cq和Cd進(jìn)行交換即可.
之后,我們將Cq和Cd之間的相似度定義為
我們使用sim(Cq,Cd)來(lái)度量查詢語(yǔ)句q和候選文檔d之間的語(yǔ)義相關(guān)度,并使用它來(lái)對(duì)文本檢索系統(tǒng)的檢索結(jié)果進(jìn)行重排序,從而實(shí)現(xiàn)語(yǔ)義搜索的效果,如公式(10)所示.
在公式(10)中,α是一個(gè)取值范圍在[0,1]區(qū)間上的實(shí)值超參數(shù);S0(d)表示文本檢索系統(tǒng)對(duì)文檔d的原始評(píng)分,一般而言,這一評(píng)分是基于該文檔與查詢語(yǔ)句的表層文本相似度的.通過(guò)正則化操作,我們將S0(d)的取值范圍限定在[0,1]區(qū)間上.sim(Cq,Cd)的取值范圍也是[0,1].之后,我們將S0(d)與sim(Cq,Cd)通過(guò)超參數(shù)α進(jìn)行凸組合,從而實(shí)現(xiàn)對(duì)文本檢索系統(tǒng)的語(yǔ)義化重排序.
為了驗(yàn)證本文所提出的方法的有效性,我們基于StackOverflow數(shù)據(jù)集設(shè)計(jì)了一系列實(shí)驗(yàn).這些實(shí)驗(yàn)用于回答下列研究問(wèn)題.
· 研究問(wèn)題1:本文所提出的方法是否能夠有效地改進(jìn)軟件文檔檢索的效果?
我們關(guān)心本文所提出的方法在對(duì)文本檢索系統(tǒng)的檢索結(jié)果進(jìn)行重排序后,是否能夠?qū)⒂袃r(jià)值的文檔排在更靠前的位置.為了驗(yàn)證這一點(diǎn),首先,我們研究本方法中的超參數(shù)的選取;隨后,我們將本方法與多種已有的文本檢索方法進(jìn)行對(duì)比.
· 研究問(wèn)題2:本文中所使用的文本語(yǔ)義表示方法的有效性如何?
在本文所提出的方法中,我們將每個(gè)文檔的語(yǔ)義表示為代碼結(jié)構(gòu)圖上的一個(gè)帶權(quán)子圖.我們關(guān)心這樣的一個(gè)帶權(quán)子圖是否能夠有效地表達(dá)文本內(nèi)容中蘊(yùn)含的語(yǔ)義信息,從而改進(jìn)軟件文檔檢索的效果.因此,我們?cè)O(shè)計(jì)了相應(yīng)的實(shí)驗(yàn),將本文所使用的文本語(yǔ)義表示方法與若干變種方法進(jìn)行對(duì)比,以驗(yàn)證文中所述的方法的有效性.
· 研究問(wèn)題3:本文中所使用的文本語(yǔ)義相關(guān)度度量方法的有效性如何?
在本文所提出的方法中,我們將代碼結(jié)構(gòu)圖中的所有代碼元素映射到同一個(gè)低維、實(shí)值的向量表示空間中,再通過(guò)這些代碼元素的表示向量之間的距離作為橋梁來(lái)度量不同的文本之間的語(yǔ)義相關(guān)度.其中,我們將不同的代碼元素之間的相似度定義為在代碼結(jié)構(gòu)圖上,兩個(gè)代碼元素的上下文的相似度.我們關(guān)心這樣的定義方式在文檔的語(yǔ)義搜索任務(wù)中是否有效.因此,我們?cè)O(shè)計(jì)了相應(yīng)的實(shí)驗(yàn),將文本所使用的基于多關(guān)聯(lián)數(shù)據(jù)表示學(xué)習(xí)技術(shù)的代碼元素相似度計(jì)算方法與若干其他代碼元素相似度計(jì)算方法進(jìn)行對(duì)比,以驗(yàn)證本文中的文本語(yǔ)義相關(guān)度度量部分的有效性.
我們使用3個(gè)著名的Java開(kāi)源軟件項(xiàng)目:Apache Lucene、Apache POI和JFreeChart作為我們的實(shí)驗(yàn)對(duì)象.實(shí)驗(yàn)任務(wù)為軟件文檔檢索,是在這3個(gè)項(xiàng)目上分別完成的.實(shí)驗(yàn)設(shè)計(jì)的細(xì)節(jié)列舉如下.
3.1.1 文檔集
StackOverflow是一個(gè)著名的面向軟件開(kāi)發(fā)者的在線問(wèn)答社區(qū),其上積累了大量與軟件開(kāi)發(fā)有關(guān)的問(wèn)答形式的文檔.因此,我們從StackOverflow數(shù)據(jù)集中抽取出我們的實(shí)驗(yàn)驗(yàn)證所需的文檔集.對(duì)于上述的兩個(gè)用于實(shí)驗(yàn)的開(kāi)源軟件項(xiàng)目中的每一個(gè)項(xiàng)目,我們從StackOverflow上下載標(biāo)簽中包含該項(xiàng)目名稱的所有相關(guān)的問(wèn)答對(duì),并將每個(gè)問(wèn)題以及它所對(duì)應(yīng)的被采納的答案定義為一個(gè)文檔.若一個(gè)問(wèn)題沒(méi)有被采納的答案,則這個(gè)問(wèn)題并不會(huì)被收錄到我們的文檔集中.這一做法是為了對(duì)文檔集中的文檔質(zhì)量進(jìn)行保證.這樣,就分別為這3個(gè)軟件項(xiàng)目構(gòu)造了一個(gè)文檔集.這3個(gè)文檔集的一些基本統(tǒng)計(jì)數(shù)據(jù),包括文檔數(shù)量、平均關(guān)鍵詞數(shù)量等,可在表3中找到.
Table 3 Various statistics from our dataset表3 實(shí)驗(yàn)驗(yàn)證數(shù)據(jù)集基本統(tǒng)計(jì)信息
3.1.2 代碼結(jié)構(gòu)圖
對(duì)于每個(gè)軟件項(xiàng)目,我們的方法從它的源代碼中提取出了一個(gè)代碼結(jié)構(gòu)子圖.一個(gè)軟件項(xiàng)目往往會(huì)有很多個(gè)不同的版本,我們選取其中最新的版本進(jìn)行代碼結(jié)構(gòu)圖的提取.與代碼結(jié)構(gòu)圖相關(guān)的統(tǒng)計(jì)信息也在表3中進(jìn)行了展示,包括源代碼版本、代碼元素?cái)?shù)量、關(guān)聯(lián)關(guān)系數(shù)量.在一臺(tái)配置了3.40GHz雙核處理器的服務(wù)器上,解析生成3個(gè)項(xiàng)目的代碼結(jié)構(gòu)圖的時(shí)間開(kāi)銷分別為18min、31min和12min.
在我們的方法中,我們將每個(gè)文檔的語(yǔ)義表示為代碼結(jié)構(gòu)圖上的一個(gè)帶權(quán)子圖.表3中的“文檔平均關(guān)聯(lián)到的代碼元素?cái)?shù)量”這一列給出了這些帶權(quán)子圖中的平均結(jié)點(diǎn)數(shù)量.例如,“85.96(7.48)”是指,平均而言,每個(gè)文檔會(huì)被關(guān)聯(lián)到85.96個(gè)代碼元素,其中,有7.48個(gè)代碼元素是在文檔中被直接提及的.
3.1.3 測(cè)試集
為了驗(yàn)證我們方法的有效性,對(duì)于每個(gè)軟件項(xiàng)目,我們從文檔集中隨機(jī)抽取出100個(gè)問(wèn)題作為測(cè)試輸入.在被抽中后,這些問(wèn)題所對(duì)應(yīng)的文檔被我們從文檔集中刪去.我們的實(shí)驗(yàn)任務(wù)是:對(duì)于每個(gè)問(wèn)題,在文檔集中尋找可以用于回答該問(wèn)題的文檔.
我們使用基于TF-IDF的向量空間模型實(shí)現(xiàn)了一個(gè)經(jīng)典的文本檢索系統(tǒng).我們對(duì)每個(gè)測(cè)試用的問(wèn)題進(jìn)行關(guān)鍵詞提取,形成查詢語(yǔ)句輸入到該文本檢索系統(tǒng)中,從而得到與各個(gè)問(wèn)題在表層文本上具有較高相似度的文檔.對(duì)于每個(gè)問(wèn)題,我們選取檢索結(jié)果中的前20個(gè)文檔作為候選文檔.我們的目標(biāo)是對(duì)這20個(gè)文檔進(jìn)行重排序,使得有價(jià)值的文檔能夠被重排序到更靠前的位置.為了得到測(cè)試集,我們讓3位計(jì)算機(jī)專業(yè)的高年級(jí)本科生對(duì)這些候選文檔進(jìn)行標(biāo)注.這些標(biāo)注人員都有1年以上的Java編程經(jīng)驗(yàn),且都有過(guò)復(fù)用這3個(gè)開(kāi)源軟件項(xiàng)目的經(jīng)歷.對(duì)于每個(gè)測(cè)試問(wèn)題,我們將該問(wèn)題以及這個(gè)問(wèn)題的被采納的答案顯示給標(biāo)注者.隨后,對(duì)于20個(gè)候選文檔,標(biāo)注者分別將它們與已有的被采納的答案進(jìn)行對(duì)比,以判斷這些文檔是否對(duì)解決該問(wèn)題有價(jià)值.對(duì)于一個(gè)問(wèn)題-文檔對(duì),標(biāo)注者可以對(duì)其標(biāo)注“是”或者“否”.若3個(gè)標(biāo)注者都將一個(gè)文檔標(biāo)注為“是”,則我們認(rèn)為該問(wèn)題-文檔對(duì)是一個(gè)正樣本;否則,我們認(rèn)為這個(gè)問(wèn)題-文檔對(duì)是一個(gè)負(fù)樣本.圖4給出了各個(gè)問(wèn)題所擁有的正樣本的數(shù)量分布.平均而言,對(duì)于每個(gè)問(wèn)題,會(huì)有2.76個(gè)文檔被認(rèn)為是對(duì)解決該問(wèn)題有幫助的.
Fig.4 Distribution of the number of ground truth related documents圖4 各個(gè)問(wèn)題所擁有的正樣本的數(shù)量分布
3.1.4 比較對(duì)象
我們將我們的方法記為CK(conceptual knowledge).我們將該方法與如下4個(gè)文本檢索方法進(jìn)行對(duì)比.
(1) TF-IDF.這一文本檢索方法首先將每個(gè)文檔表示為詞向量空間中的一個(gè)TF-IDF向量,之后使用兩個(gè)向量之間的余弦相似度來(lái)度量文檔之間的相似度[13].
(2) Okapi BM25.這一文本檢索方法是TF-IDF方法的概率化改進(jìn),在信息檢索領(lǐng)域有著廣泛的應(yīng)用[16].我們使用Apache Lucene中提供的Okapi BM25模塊來(lái)實(shí)現(xiàn)這一方法.
(3) LDA.LDA是一種在文本處理領(lǐng)域被廣泛使用的潛在主題生成模型,這一方法將每個(gè)文檔表示為若干個(gè)潛在主題上的一個(gè)分布[4].我們使用開(kāi)源軟件項(xiàng)目mallet中提供的LDA模塊來(lái)計(jì)算每個(gè)文檔的主題分布(經(jīng)過(guò)手工調(diào)優(yōu),我們將LDA模型中的各個(gè)超參數(shù)的取值設(shè)置如下:主題個(gè)數(shù)k=100,α=0.5,β=0.01).之后,我們將每個(gè)主題分布視為一個(gè)向量,并使用KL距離來(lái)度量?jī)蓚€(gè)文檔之間的相似度.
(4) Word2vec.Word2vec是一種在文本處理領(lǐng)域被廣泛使用的神經(jīng)語(yǔ)言模型,這一方法能夠從文本語(yǔ)料庫(kù)中的上下文信息中對(duì)各個(gè)單詞的語(yǔ)義進(jìn)行表示學(xué)習(xí),從而將各個(gè)單詞映射為一個(gè)低維、實(shí)值的向量表示空間中的詞向量[17].不同詞向量之間的距離越近,意味著所對(duì)應(yīng)的兩個(gè)單詞之間的語(yǔ)義相似度越高.我們采用Ye等人提出的方法[18],以word2vec詞向量作為基本單元來(lái)計(jì)算兩個(gè)文檔間的相似度.
3.1.5 評(píng)測(cè)指標(biāo)
我們使用信息檢索領(lǐng)域中一個(gè)被廣泛使用的評(píng)測(cè)指標(biāo),即平均準(zhǔn)確率(MAP)來(lái)驗(yàn)證我們的方法的有效性.簡(jiǎn)單來(lái)說(shuō),對(duì)于多個(gè)測(cè)試點(diǎn),平均準(zhǔn)確率是指方法在每個(gè)測(cè)試點(diǎn)上的準(zhǔn)確率的平均值.更具體地,公式(11)和公式(12)給出了平均準(zhǔn)確率的定義.
其中,
·k是指檢索結(jié)果列表中的名次.
·P(k)是指在檢索結(jié)果的前k名中,正樣本所占的比例.
·rel(k)的取值為0或1.當(dāng)其取值為1時(shí),說(shuō)明排在第k位的文檔是一個(gè)正樣本;否則,其取值為0.
例如,考慮一個(gè)查詢語(yǔ)句,有兩個(gè)文檔與其相關(guān),它們分別被排在檢索結(jié)果中的第2位和第5位.在這種情況下,平均準(zhǔn)確率為
本節(jié)主要分析研究問(wèn)題1:本文所提出的方法是否能夠有效地改進(jìn)軟件文檔檢索的效果?
在我們的方法中,我們將文檔和代碼之間的表層文本相似度和代碼結(jié)構(gòu)上的語(yǔ)義相關(guān)度進(jìn)行了線性結(jié)合,從而對(duì)文本檢索的結(jié)果進(jìn)行重排序.α是一個(gè)超參數(shù),代表表層文本相似度在其中的占比.若α=0,則說(shuō)明我們只考慮代碼結(jié)構(gòu)上的語(yǔ)義相關(guān)度,而不考慮表層文本相似度;若α=1,則我們的方法退化為原始的文本檢索方法(即TF-IDF方法).圖5對(duì)于我們所選取的3個(gè)實(shí)驗(yàn)用的軟件項(xiàng)目分別給出了不同的α取值對(duì)平均準(zhǔn)確率的影響.
從圖5中可以看出,我們方法的效果明顯好于TF-IDF方法.這一提升是顯著且普遍的,以Apache Lucene項(xiàng)目為例,當(dāng)α=0.7時(shí),我們的方法達(dá)到了最高的平均準(zhǔn)確率,為0.314;而TF-IDF方法的平均準(zhǔn)確率為0.245(α=1).
此外,圖5還說(shuō)明了將文檔和代碼之間的表層文本相似度和代碼結(jié)構(gòu)上的語(yǔ)義相關(guān)度進(jìn)行線性結(jié)合是有必要的.如果我們只考慮代碼結(jié)構(gòu)上的語(yǔ)義相關(guān)度,而不考慮表層文本相似度(α=0),平均準(zhǔn)確率就會(huì)明顯降低.
Fig.5 Effect of varying α on the MAP of our approach圖5 調(diào)整本方法中的超參數(shù)α對(duì)平均準(zhǔn)確率MAP的影響
對(duì)于3個(gè)軟件項(xiàng)目,α的最佳取值分別為0.7,0.5和0.6.在下文中,我們保持這樣的取值.
在我們的方法中,代碼元素表示學(xué)習(xí)的步驟上還有兩個(gè)超參數(shù):K0和K1,代表向量空間的維度.我們?cè)趯?shí)驗(yàn)過(guò)程中對(duì)這兩個(gè)超參數(shù)在100~500的范圍內(nèi)進(jìn)行調(diào)整,發(fā)現(xiàn)它們對(duì)實(shí)驗(yàn)結(jié)果的影響是很有限的.因此,我們?cè)趯?shí)驗(yàn)的全過(guò)程中統(tǒng)一將它們?cè)O(shè)置為200.
圖6以平均準(zhǔn)確率為指標(biāo),將我們的方法與TF-IDF方法、Okapi BM25方法、LDA方法和word2vec方法進(jìn)行了對(duì)比.
Fig.6 Comparison of our approach and four other text retrieval approaches圖6 本方法與其他4種文本檢索方法的平均準(zhǔn)確率效果對(duì)比
表4給出了各種方法在這3個(gè)項(xiàng)目上的平均MAP得分,以及它們相對(duì)TF-IDF方法的提升比率.
Table 4 Average MAP results across all the three software projects表4 各種方法在3個(gè)項(xiàng)目上平均MAP值
從圖6和表4中可以看出,我們的方法相對(duì)于TF-IDF方法能夠取得22.2%的效果提升,而表現(xiàn)第2好的word2vec方法的提升率僅為7.4%.因此,與其他文本檢索方法相比,我們提出的基于代碼結(jié)構(gòu)知識(shí)的軟件文檔語(yǔ)義搜索方法的有效性是顯著的.
本節(jié)主要分析研究問(wèn)題2:本文中所使用的文本語(yǔ)義表示方法的有效性如何?
為了驗(yàn)證本文所使用的文本語(yǔ)義表示方法的有效性,將我們的方法與如下兩種方法進(jìn)行對(duì)比.
(1) CK-RecodocOnly.這一方法在我們方法的基礎(chǔ)上,對(duì)文本語(yǔ)義表示步驟進(jìn)行了修改:用于表示文本語(yǔ)義的子圖中僅僅包含由Recodoc識(shí)別出的在文本中直接被提及的代碼元素,而不再包含基于詞匹配識(shí)別出的其他代碼元素.將我們的方法與這一方法進(jìn)行比較分析的目的是驗(yàn)證基于詞匹配對(duì)代碼元素進(jìn)行擴(kuò)充是有必要的.
(2) CK-UnWeighted.這一方法在我們方法的基礎(chǔ)上,對(duì)文本語(yǔ)義表示步驟進(jìn)行了修改:不再為子圖中的代碼元素計(jì)算權(quán)重.將我們的方法與這一方法進(jìn)行比較分析的目的是驗(yàn)證代碼元素權(quán)重度量是有必要的.
圖7給出了我們的方法與這兩種方法的比較結(jié)果.可以看到,我們的方法達(dá)到的平均準(zhǔn)確率顯著高于這兩種方法.例如,在 Apache Lucene項(xiàng)目中,我們的方法在α=0.7時(shí)達(dá)到了最高的平均準(zhǔn)確率 0.314;對(duì)于CK-RecodocOnly方法,其最高準(zhǔn)確率為0.257(α=0.9);對(duì)于CK-UnWeighted方法,其最高準(zhǔn)確率為0.279(α=0.8).
Fig.7 Comparison between different conceptual document representation strategies圖7 文本語(yǔ)義表示方法比較分析結(jié)果
這一結(jié)果說(shuō)明:
(1) 使用Recodoc識(shí)別出的文檔中直接被提及的代碼元素不足以用來(lái)表達(dá)文檔的語(yǔ)義.因此,基于詞匹配對(duì)代碼元素進(jìn)行擴(kuò)充是有必要的.
(2) 基于TF-IDF技術(shù)對(duì)子圖中的代碼元素進(jìn)行權(quán)重度量能夠很好地提升文本語(yǔ)義表示的有效性.
本節(jié)主要分析研究問(wèn)題3:本文中所使用的文本語(yǔ)義相關(guān)度度量方法的有效性如何?
為了驗(yàn)證本文所使用的文本語(yǔ)義相關(guān)度度量方法的有效性,將我們的方法與如下兩種方法進(jìn)行對(duì)比.
(1) CK-Coupling.這一方法在我們的方法的基礎(chǔ)上,對(duì)文本語(yǔ)義相關(guān)度度量步驟進(jìn)行了修改:在計(jì)算兩個(gè)代碼元素之間的相似度時(shí),使用由Briand等人提出的基于耦合度的算法[19],而不是我們的方法中提出的基于多關(guān)聯(lián)數(shù)據(jù)表示學(xué)習(xí)的算法.
(2) CK-ShortestPath.這一方法在我們的方法的基礎(chǔ)上,對(duì)文本語(yǔ)義相關(guān)度度量步驟進(jìn)行了修改:在計(jì)算兩個(gè)代碼元素之間的相關(guān)度時(shí),在代碼結(jié)構(gòu)圖上使用基于Dijkstra最短路徑長(zhǎng)度的算法,而不是我們的方法中提出的基于多關(guān)聯(lián)數(shù)據(jù)表示學(xué)習(xí)的算法.
圖8給出了我們的方法與這兩種方法的比較結(jié)果,可以看到,我們的方法達(dá)到的平均準(zhǔn)確率顯著高于這兩種方法.例如,在Apache Lucene項(xiàng)目中,CK-ShortestPath方法在α=0.8時(shí)達(dá)到了最高的平均準(zhǔn)確率0.248,而這一結(jié)果只是略微高于TF-IDF方法;而對(duì)于CK-Coupling方法,達(dá)到最高平均準(zhǔn)確率的α值為1,這意味著其效果是低于TF-IDF方法的.這一實(shí)驗(yàn)結(jié)果表明,我們將代碼元素之間的相似度定義為它們?cè)诖a結(jié)構(gòu)圖上的上下文相似度的做法是適合于文本語(yǔ)義相關(guān)度度量這一任務(wù)的.與我們的做法相比,其他代碼元素相似度的計(jì)算方法并不適合文本語(yǔ)義相關(guān)度度量任務(wù).
Fig.8 Comparison between different code element pairwise similarity calculation strategies圖8 文本語(yǔ)義相關(guān)度度量方法比較分析結(jié)果
本文的相關(guān)研究工作可分為兩類:(1) 軟件文檔檢索技術(shù);(2) 基于概念知識(shí)的語(yǔ)義搜索技術(shù).
在軟件工程領(lǐng)域中,信息檢索技術(shù)已被成功應(yīng)用在各種類型的軟件文檔上,包括源代碼文件[20?25]、軟件文檔[26?29]、缺陷報(bào)告[30,31]、在線問(wèn)答社區(qū)[32,33]等.
如何挖掘不同的詞之間的語(yǔ)義相關(guān)度,并用其來(lái)改進(jìn)檢索效果,是信息檢索領(lǐng)域中的重要問(wèn)題.在軟件工程中,從軟件文檔中挖掘不同的詞之間的語(yǔ)義相關(guān)度的代表性工作包括:Tian等人[34]基于點(diǎn)互信息PPMI對(duì)StackOverflow上的問(wèn)答文檔進(jìn)行挖掘,從而生成軟件項(xiàng)目特定的詞匯相似度數(shù)據(jù)庫(kù);Ye等人[18]使用神經(jīng)語(yǔ)言模型對(duì)軟件項(xiàng)目的相關(guān)文檔進(jìn)行分析,生成各個(gè)詞匯的低維實(shí)值詞向量,從而能夠度量不同的詞匯之間的相似度;Howard等人[35]和Yang等人[36]通過(guò)分析源代碼中的上下文來(lái)挖掘不同的詞匯之間的相似度;Wang等人[37]則通過(guò)分析FreeCode代碼庫(kù)中的標(biāo)簽信息來(lái)挖掘不同的詞匯之間的相似度;Haiduc等人[2]提出了一種基于有監(jiān)督的機(jī)器學(xué)習(xí)的自動(dòng)查詢重構(gòu)方法Refoqus,以對(duì)查詢語(yǔ)句進(jìn)行擴(kuò)充;Panichella等人[38]提出了一種結(jié)合潛在主題建模技術(shù)和遺傳算法的軟件文檔檢索方法;等等.然而,上述方法都是基于對(duì)軟件文檔語(yǔ)料庫(kù)的統(tǒng)計(jì)分析的,其改進(jìn)效果依賴于詞匯的特定模式在語(yǔ)料庫(kù)中的頻繁出現(xiàn).對(duì)于在語(yǔ)料庫(kù)中出現(xiàn)次數(shù)并不夠多的詞匯而言,這些方法難以挖掘出它們與其他詞匯的相似度.
此外,研究者們提出了多種基于非文本特征的軟件文檔檢索方法.例如,Ponzanelli等人[32]提出了一種面向StackOverflow問(wèn)答文檔的檢索方法,在該方法中,問(wèn)題評(píng)分、答案評(píng)分、用戶等級(jí)、問(wèn)題標(biāo)簽等非文本特征是檢索結(jié)果重排序的重要因素;Ye等人[25]提出了一種面向缺陷報(bào)告的源代碼文件檢索方法,該方法考慮了最近缺陷修復(fù)日期、缺陷修復(fù)頻率等非文本特征;Zou等人[39]提出了一種面向問(wèn)題的軟件文檔檢索方法,該方法考慮了查詢語(yǔ)句中的疑問(wèn)詞(例如“how”“why”,which”,等等)對(duì)檢索策略的影響.這些方法在特定的文本檢索任務(wù)中能夠有效地提升檢索效果,但這些特定的非文本特征不具有在各種類型的文檔中的可擴(kuò)展性.例如,問(wèn)題評(píng)分、答案評(píng)分、用戶等級(jí)、問(wèn)題標(biāo)簽等非文本特征能夠很好地改進(jìn)針對(duì)StackOverflow問(wèn)答文檔的檢索效果,但其他類型的文檔(如需求/設(shè)計(jì)文檔、缺陷報(bào)告、郵件歸檔等)并不具有這些特征,無(wú)法使用這些特征.
近年來(lái),隨著互聯(lián)網(wǎng)上大規(guī)模的通用概念知識(shí)庫(kù)(例如WordNet、DBpedia、Freebase、谷歌知識(shí)圖譜、Yago等)的飛速發(fā)展,研究者們提出了多種基于概念知識(shí)的語(yǔ)義搜索方法[6?12],以在信息檢索中發(fā)現(xiàn)并利用不同詞之間的語(yǔ)義相關(guān)度.在這里,概念知識(shí)是指現(xiàn)實(shí)世界中存在的各種實(shí)體以及這些實(shí)體之間的各種語(yǔ)義關(guān)聯(lián)關(guān)系.概念知識(shí)一般被表示為3元組,例如〈Michael_Jackson,publish_song,Billi_Jean〉,〈Barack_Obama,born_in,Honolulu〉等.基于概念知識(shí)的語(yǔ)義搜索的基本過(guò)程是:首先,識(shí)別出文檔中提及的實(shí)體;其次,利用實(shí)體之間的關(guān)聯(lián)關(guān)系來(lái)度量文檔之間的語(yǔ)義相關(guān)度;最后,利用得到的語(yǔ)義相關(guān)度對(duì)文本檢索的結(jié)果進(jìn)行重排序.這些研究工作證明了引入額外的概念知識(shí)來(lái)幫助機(jī)器理解文本的語(yǔ)義能夠有效地解決詞匯間隙問(wèn)題,改進(jìn)文本檢索的效果.受到這些工作的啟發(fā),我們希望基于概念知識(shí)來(lái)實(shí)現(xiàn)軟件文檔的語(yǔ)義搜索.然而,軟件文檔中往往涉及到大量的軟件項(xiàng)目特定的概念知識(shí),而互聯(lián)網(wǎng)上常用的大型通用知識(shí)庫(kù)中卻往往并不包含這些知識(shí).因此,在軟件文檔上直接使用互聯(lián)網(wǎng)上常用的大型通用知識(shí)庫(kù)進(jìn)行語(yǔ)義搜索所能達(dá)到的效果提升是非常有限的,我們需要尋找該軟件項(xiàng)目特定的概念知識(shí)來(lái)源.一些研究工作將專家構(gòu)造的本體作為軟件項(xiàng)目特定的概念知識(shí)來(lái)源,以解決文本檢索中的詞匯間隙問(wèn)題.然而,由專家構(gòu)造本體的成本過(guò)高,這導(dǎo)致了此類方法的可用性不足.
本文提出,軟件項(xiàng)目特定的概念知識(shí)可以從該軟件項(xiàng)目的源代碼中抽取得到,并用于實(shí)現(xiàn)軟件文檔的語(yǔ)義搜索.在軟件工程的研究社區(qū)中,軟件源代碼中的結(jié)構(gòu)依賴信息已經(jīng)被廣泛地應(yīng)用在了多種自動(dòng)軟件工程任務(wù)中[40?46],以幫助軟件開(kāi)發(fā)人員在軟件的開(kāi)發(fā)、維護(hù)和復(fù)用過(guò)程中對(duì)軟件項(xiàng)目進(jìn)行學(xué)習(xí)與理解.McMillan等人[41]和Panichella等人[45]研究了如何將軟件源代碼中的結(jié)構(gòu)依賴信息用作軟件項(xiàng)目特定的概念知識(shí),從而在文本檢索任務(wù)中對(duì)查詢語(yǔ)句進(jìn)行語(yǔ)義擴(kuò)充.本文進(jìn)一步研究如何利用從軟件項(xiàng)目源代碼中抽取出的軟件項(xiàng)目特定的概念知識(shí)來(lái)度量文檔之間的語(yǔ)義相關(guān)度,從而在語(yǔ)義層面上對(duì)文本檢索的結(jié)果進(jìn)行重排序.
本文提出了一種基于代碼結(jié)構(gòu)知識(shí)的軟件文檔語(yǔ)義搜索方法.在該方法中,我們的基本思想是:從軟件項(xiàng)目的源代碼中提取出代碼結(jié)構(gòu)圖,以此作為先驗(yàn)知識(shí)來(lái)幫助機(jī)器理解無(wú)結(jié)構(gòu)的自然語(yǔ)言文本.更具體地,我們將每個(gè)文檔的語(yǔ)義表示為該代碼結(jié)構(gòu)圖上的一個(gè)帶權(quán)子圖,并通過(guò)計(jì)算帶權(quán)子圖在代碼結(jié)構(gòu)圖上的相似度來(lái)度量文檔之間的語(yǔ)義相關(guān)度.我們利用語(yǔ)義相關(guān)度對(duì)文本檢索系統(tǒng)返回的檢索結(jié)果進(jìn)行重排序,從而實(shí)現(xiàn)了語(yǔ)義搜索.我們?cè)赟tackOverflow數(shù)據(jù)集上對(duì)本方法的有效性進(jìn)行了驗(yàn)證.以平均準(zhǔn)確率(MAP)作為評(píng)測(cè)指標(biāo),結(jié)果表明,本方法相對(duì)于其他文本檢索方法可以取得至少13.77%的效果提升.
我們下一步的工作計(jì)劃包括:研究如何改進(jìn)本方法中的文本語(yǔ)義表示步驟,獲取能夠更準(zhǔn)確地表示文本語(yǔ)義的帶權(quán)子圖;在更多類型的軟件文檔上驗(yàn)證本方法的通用性和有效性,例如缺陷報(bào)告、需求文檔、設(shè)計(jì)文檔、郵件歸檔等等.