?

一種面向軟件特征定位問題的語義相似度集成方法

2019-02-20 08:34彤,煒,
計算機研究與發展 2019年2期
關鍵詞:源代碼信息檢索語義

何 云 李 彤, 王 煒, 李 響 蘭 微

1(云南大學軟件學院 昆明 650091)2 (云南省軟件工程重點實驗室(云南大學) 昆明 650091)

特征(feature)指軟件系統中可識別的功能屬性.特征定位(feature location)旨在建立特征與源代碼之間的映射關系,是一切軟件演化活動得以順利實施的先決條件之一[1].軟件特征定位是一種面向軟件維護的智能推薦技術,可為開發人員在龐大的源代碼數據中找到軟件維護任務對應的起始位置.Wilde等人[2]于1992年提出了最早的特征定位方法——軟件偵測(software reconnaissance),經過20多年的發展,成為波及效應分析[3]、軟件復用[4]、需求可追蹤性分析[5]等領域的支柱性技術.當前軟件特征定位技術根據輸入數據的不同大致分為4類[6]:靜態方法[7-8](static method)、動態方法[9-10](dynamic method)、文本方法[11-12](textual method)和混合方法[13-14](hybrid method).文本方法由于具有高易用性、強擴展性和低開銷等優點,成為了當前特征定位領域研究的熱點.現有文本特征定位方法可分為3類:基于自然語言處理[12]、基于信息檢索[1,15-16]或基于模式匹配[17]實現.近年來,機器學習特別是深度學習的發展促進了信息檢索研究,同時也使基于信息檢索的特征定位方法成為了當前研究的熱點.

基于信息檢索的特征定位方法有2個難點:

1) 減少代碼語料中噪聲數據.除蘊含功能語義信息的關鍵詞外,源代碼中還存在大量的無語義詞匯噪聲,例如代碼的關鍵詞new,public等.噪聲數據導致經過索引的代碼向量維度高、稀疏性強,使代碼與查詢語句間相似度計算準確率下降,整體影響特征定位的性能.以僅含有531個類的jEdit為例[14],在共計含有10 915個不重復源代碼關鍵詞的情況下,其單個類(class)內含有的關鍵詞僅為幾十至幾百個單詞不等.現有基于信息檢索的特征定位方法通過人為設定停用詞表對源代碼的噪聲數據進行過濾.由于源代碼在預處理階段會產生大量的未在停詞表中定義的無實際語義的關鍵詞,降低了停詞表對關鍵詞的過濾作用.

2) 基于信息檢索的特征定位方法假設“源代碼中的標識符、注釋等關鍵詞蘊含了與軟件功能相關的語義信息”.開發人員使用記錄了功能特征的自然語言作為查詢語句.通過計算查詢語句與源代碼之間的語義相似度,實現特征與源代碼之間的映射關系識別.上述計算需要將代碼和查詢語句轉化為向量.當前研究大多采用信息檢索方法實現源代碼到索引空間內向量的轉化.索引方法可以分為2類:基于“詞袋”模型(bag of word)[18]的索引方法和基于詞嵌入模型(word embedding)[19-20]的索引方法.基于“詞袋”模型的方法優點在于計算簡單、對單獨詞匯信息保持較完整,但其假設源代碼中關鍵詞是獨立同分布的,沒有上下文信息.文獻[16]指出代碼同樣具有上下文信息.詞嵌入模型能夠有效刻畫源代碼關鍵詞的上下文信息,同時能夠有效地選擇關鍵詞.但該方法涉及大規模參數調優,參數取值對該方法的性能優劣起到決定性作用,參數的選擇嚴重依賴于開發人員的領域知識和經驗知識.同時,詞嵌入模型非常強調詞匯上下文關系,但源代碼數據格式的特殊性導致其語法結構并不十分嚴格,因此在特征定位問題中單純依賴詞匯上下文關系刻畫源代碼之間的相似度也是不完備的.現有特征定位方法均是基于單一索引方法實現的,導致性能上各有優劣,均不能精確刻畫源代碼與查詢之間的相似度.

為解決以上2個難點問題,本文提出了一種面向軟件特征定位問題的語義相似度集成方法.本文主要貢獻有3個方面:

1) 提出基于詞性標注的源代碼語料降噪方法.引入詞性過濾對源代碼關鍵詞進行預處理,并討論了源代碼關鍵詞中的詞性問題.通過過濾特定詞性詞匯,在縮減索引空間內向量稀疏性的同時,提高了相似度計算的準確性,提升了特征定位性能.

2) 提出了一種集成“詞袋”模型與詞嵌入模型的語義相似度計算方法.該方法以源代碼自身結構的“內聚度”和“耦合度”作為評價指標,將“詞袋”模型索引方法與詞嵌入模型索引方法所計算出的相似度進行集成,獲得了更為精確的相似性度量.

3) 基于公開的數據集設計了完整的實驗,詳細報告了實驗過程和結果,表明本文方法與現有信息檢索軟件特征定位方法[15-16,21]相比,具有更高的定位性能.

1 相關工作

如圖1所示,現有基于信息檢索的特征定位方法基本流程大致相似,包含3個基本步驟:預處理、索引、獲取結果.

Step1. 預處理.包含提取關鍵詞、分詞、詞根還原和去除停用詞4部分.根據不同的粒度(類、方法等),提取源代碼實體中的關鍵詞,為源代碼中每一個實體建立一個代碼文檔.分詞操作將連續的字符串按照一定的特殊字符(例如駝峰命名法)或規則拆分成若干獨立的單詞.詞根還原將意義相近的同源詞和同一個關鍵詞的不同形態進行歸并,例如:inserting還原成insert.去除停用詞操作刪除代碼中停詞表記錄的詞.例如源代碼中的數字、定冠詞、不定冠詞、單個字母等.預處理的好壞將決定源代碼語料中關鍵詞的多寡,并最終影響索引算法輸出向量維度的大小以及稀疏性等.

Step2. 索引.將經過預處理的語料轉換為索引空間內的數值化向量形式,即將語料轉化為矩陣M,第i個代碼文檔對應矩陣中第i個列向量mi.用戶提交描述特征的查詢語句Q,將預處理后的Q轉化為索引空間內向量q.

Step3. 獲取結果.計算源代碼向量mi與查詢語句向量q之間的相似度,并按照相似度進行降序排列.相似度通常使用距離的形式進行表達.距離越近則相似度越高,認為該源代碼具有查詢語句描述的特征可能性越大.設定閾值h,將與查詢向量q之間相似度大于h的源代碼向量m1,m2,…,mn作為特征定位算法的輸出結果,即檢索結果.

Fig. 1 The basic flow of existing information retrieval feature location methods圖1 現有基于信息檢索的特征定位方法基本流程

1.1 信息檢索特征定位國內外研究綜述

圍繞基于信息檢索的特征定位方法基本步驟,各國學者開了很多研究工作:

預處理大多使用成熟的自然語言處理技術[15-16,22]實現.分詞采用Lucene①Lucene分詞:https:lucene.apache.orgcore5_4_0coreorgapacheluceneanalysisTokenizer.html,NLTK②NLTK分詞:http:www.nltk.orgapinltk.tokenize.html等工具實現;停用詞表大多使用自然語言處理成熟的停詞表,例如NLTK③NLTK停詞表:https:gist.github.comsebleier554280或者Lucene④Lucene停詞表:https:lucene.apache.orgcore6_1_0analyzers-commonorgapacheluceneanalysiscoreStopFilter.html提供的停詞表;詞根還原大多采用Poter Stemmer⑤Poter Stemmer:https:www.drupal.orgprojectporterstemmer,Lovins Stemmer⑥Lovins Stemmer:http:snowball.tartarus.orgalgorithmslovinsstemmer.html,Lancaster Stemmer⑦Lancaster Stemmer:https:github.comwooormlancaster-stemmer.上述工作均假設分詞、詞根還原、去除停用詞3種操作能夠提高特征定位算法的準確性.當前基于信息檢索的特征定位方法通過停用詞表方式過濾噪聲詞匯,均直接引用自然語言處理領域中的停用詞表.但停用詞表對噪聲的過濾性能有限,主要原因在于停用詞表中的詞匯是人為指定的,極易出現誤差,尤其是大規模語料庫中,編制停用詞表時極易造成停用詞匯的遺漏.

語料中關鍵字的多寡將影響后續索引代碼語料和查詢語句向量的維度和稀疏性,維度和稀疏性對特征定位問題中語義相似度的計算具有重要意義.現有特征定位方法直接引用傳統信息檢索領域中的預處理方式,在經過預處理后語料庫仍保留了數量龐大的關鍵詞.例如,文獻[14]對僅有531個類的jEdit4.3進行預處理后的不重復關鍵詞仍多達10 915個.這使得后續索引步驟生成的代碼向量維度和稀疏性都很高.

語料庫及查詢語句的索引是基于信息檢索的特征定位方法中最為關鍵的步驟,同時也是研究成果最為集中的部分.自2004年Marcus等人[21]使用LSI(latent semantic indexing)實現特征定位以來,研究成果相繼涌現.Poshyvanyk等人[23]提出了形式化概念分析方法(formal concept analysis),Cleary等人[24]將錯誤報告(bug issues)、郵件列表(mailing lists)、外部文檔等非代碼數據與代碼數據同時作為輸入,在某些環境下提升了定位的準確性.Biggers等人[15]應用LDA(latent Dirichlet allocation)進行索引,且與基于LSI的特征定位方法進行了比對.

LSI是一種有效的代碼索引工具.由于代碼是一種特殊的自然語言,LSI基于矩陣分解技術,具有識別同義詞和壓縮向量維數的能力.同時,LSI可在不知道代碼的語法規則的前提下實現索引.LDA與LSI具有相似功能,但LDA具有更為復雜的數學模型,其定位性能在部分數據集上略優于LSI.無論LSI還是LDA,均是一種基于“詞袋”模型的索引方法.該類模型的優點在于計算簡單,無需太多領域知識協助.但“詞袋”模型建立于無序性假設(exchange-ability)基礎上,認為源代碼中的關鍵詞是獨立同分布,關鍵詞的上下文對其不產生影響.

2015年Corley等人[16]基于詞嵌入模型,應用深度學習方法Doc2vec進行了特征定位研究,并在實驗中取得了優于LDA的定位效果.基于詞嵌入模型的索引方法,不但壓縮了源代碼向量的維數,并且記錄了關鍵詞之間的上下文關系.該類模型對文本進行索引時,以詞匯共現關系為主要依據,最為經典的例子是可根據詞匯共現關系推測出“king-queen=man-woman”.但此類模型涉及大規模的參數調優問題,如向量維數、訓練窗口數、采樣閾值、學習速率、聚類個數等,均對程序員有較高的領域知識和經驗知識要求.同時,與自然語言文本不同,源代碼文本格式較為特殊,其構成并不遵循嚴格的語法結構,詞匯共現關系并不完全等價于語義上的相似.因此,詞嵌入模型完全依賴詞共現關系刻畫源代碼關鍵詞之間的相似度也是具有其局限性的.

“詞袋”模型等價于一種上下文無關文法,擅長于建模代碼間關鍵詞的差異信息(例如LSI關注于代碼關鍵詞詞頻的差異,LDA關注于代碼主題概率分布的差異);詞嵌入模型等價于一種上下文相關模型,擅長于建模代碼內關鍵詞的上下文信息.這種傾向性導致不同模型對源代碼語料的索引必然存在不同方面的信息損失,且這種損失是存在互補關系的.

基于信息檢索的特征定位方法建立在語義相似度計算基礎之上,當前研究中對相似性計算結果影響較大的2個待解決問題可總結為:噪聲問題和索引方法的選擇問題.

1) 噪聲問題.現有方法預處理步驟雖然可過濾一部分噪聲數據,但這種過濾是不完全的.索引步驟中,LSI借助奇異值分解實現索引,但該方法僅將詞頻矩陣通過坐標變換方法實現空間轉換,當變換空間維數小于原空間維數時,實現降維但無法識別哪些關鍵詞是噪聲;LDA認為代碼是由具有多個主題的概率分布混合而成,同樣不具備識別哪個分布式噪聲的能力;Doc2vec使用深度網絡實現詞頻向量的非線性變換與特征選擇,也不具備噪聲識別的能力.本文第1個研究目的是尋找適合于源代碼數據特性的噪聲過濾方式,進一步提升信息檢索特征定位方法預處理步驟的噪聲過濾性能,間接提高語義相似度計算的精確度,以期獲得更為準確的特征定位結果.

2) 索引方法的選擇問題.當前基于信息檢索的特征定位方法,索引步驟均直接引用了傳統信息檢索領域的索引方法.不同索引方法,在性能上存在其特定優勢與局限性.以單一索引方法為基礎建立起來的相似性度量,必然存在失準問題.本文第2個研究目的是尋找一種語義相似度集成方法.該方法應契合源代碼數據自身特性,可將不同索引方法計算出的語義相似度進行集成,從而實現優勢互補,提高相似性計算的精確度,進一步提高基于信息檢索的特征定位方法性能.

1.2 “詞袋”模型和詞嵌入模型索引算法的互補性

“詞袋”模型索引方法生成形如(1,0,2,0,…,0,0,1)的長稀疏向量,該向量每個維度代表一個單詞的出現頻度.該模型假設每個單詞均為獨立同分布的,只以每個詞匯的出現頻度刻畫源代碼文本,并未記錄任何詞匯間的共現或上下文信息.因此,該模型索引方法可完整記錄每個獨立詞匯信息,卻無任何詞匯上下文信息.

詞嵌入模型生成形如(0.723,0.051,…,0.231,0.321,0.4231,0.448)的短實值向量,其記錄的是映射于低維空間內的詞之間的共現關系,即詞匯的上下文關系.該模型以詞匯間的共現刻畫源代碼文本,由于這種刻畫是通過訓練詞匯間的共現關系并映射于一個低維空間內,映射過程會造成大量獨立詞匯信息的損失.因此,該模型索引方法優勢在于可有效記錄詞匯上下文信息,卻以損失獨立詞匯信息為代價.

綜上,2種模型索引方法之間存在極強的互補關系,因此可通過合理集成實現優勢互補,提高相似性計算的精確度,進一步提高基于信息檢索的特征定位方法性能.

2 面向軟件特征定位的語義相似度集成

在現有基于信息檢索的特征定位方法基礎上,本文主要工作如圖2中深色四邊形所示.預處理步驟,引入詞性過濾,進一步過濾源代碼關鍵詞中的噪聲信息,提高后續相似度計算的準確性.構建語料庫后,索引步驟分別使用基于“詞袋”模型的索引方法和基于詞嵌入模型的索引方法對源代碼進行索引,并在各自索引空間內計算語義相似度.然后,以軟件源代碼內部模塊的“內聚度”和“耦合度”作為評價指標,將2種索引空間內所計算的相似度進行集成,獲取最終語義相似度.最后,以集成的語義相似度作為源代碼與特征之間的相似性度量,生成定位結果.

Fig. 2 Semantic similarity integration method for software feature location problem圖2 面向軟件特征定位問題的語義相似度集成方法

2.1 詞性過濾

在自然語言處理領域,詞性標注有助于充分利用英語詞匯以及句子中所蘊含的語義知識[25].文獻[25]專門討論過源代碼中的詞性問題,認為詞性對源代碼文本相關研究具有重要意義.針對源代碼中噪聲過濾不完整導致的相似度計算困難問題,本文方法在預處理步驟引入詞性過濾,僅保留語料庫中的名詞、名詞性詞組、動詞、動詞性詞組、形容詞、形容詞性詞組、副詞及副詞詞組成分作為關鍵詞,建立基于詞性的關鍵詞篩選方法,降低關鍵詞的數量.

為提高源代碼的可讀性,源代碼的變量名、類名、方法名等均由有意義的實詞充當.這里所指的“有意義”即蘊含“語義知識”的意思.源代碼中語義知識通常是通過名詞、動詞、形容詞和副詞4種詞性的關鍵詞表達的.作為功能實體被執行時,源代碼中的名詞表述了對應的功能實體在執行過程中被調用的“對象”(變量、類、方法等),動詞表述了對這些“對象”執行的“動作”,形容詞表述了這些“對象”有什么樣的“特點”,而副詞表述了“如何”對這些“對象”進行“動作”.因此,這4類詞性詞匯在源代碼關鍵詞中可被認為是源代碼語義知識的主要載體,故在詞性過濾算法中只予以保留這4類詞匯.

假設存在由3個源代碼文本向量所組成的語料庫D={Class1,Class2,Class3},其中每個向量對應于源代碼中的1個類(class).圖3表示了該語料庫在詞性過濾前后進行文本向量化,向量在空間中的分布情況.有色圓代表蘊含功能語義信息的詞性單詞,無底色圓代表不含功能語義信息的詞性詞.向量Class1與向量Class2間的夾角為α,向量Class2與向量Class3間的夾角為β.從圖3(a)中可看出,由于不含功能語義信息詞性單詞的干擾,導致向量重心的偏移,此時α>β,以余弦距離作為向量間相似度定義,則有Sim((Class1,Class2)>Sim(Class2,Class3).對源代碼進行詞性過濾后,其向量化表示如圖3(b)所示,因不含功能語義信息單詞被過濾,向量重心發生變化,從而有Sim(Class1,Class2)

Fig. 3 The vectors distribution in the indexing space before and after POS filtering圖3 詞性過濾前后向量在索引空間中的分布

定義1. 源代碼語料庫.Da是所有源代碼關鍵詞w的集合,即Da={w1,w2,…,wi,…,wn},其中wi代表語料庫中的第i個源代碼關鍵詞,該語料庫共由n個源代碼關鍵詞組成.

定義2. 詞性.詞性是由10個元所組成的集合post={tn,tpron,tadj,tnum,tv,tadv,tart,tprep,tconj,tinterj},其中tn,tpron,tadj,tnum,tv,tadv,tart,tprep,tconj,tinterj分別代表詞性:名詞、代詞、形容詞、數詞、副詞、冠詞、介詞、連詞和感嘆詞.Da與post存在映射關系o′: (w1,w2,…,wn)→t=o′(Da),t為集合post中的元.蘊含語義知識的詞性為集合postin={tn,tadj,tv,tadv}.

算法1詳細描述了詞性過濾的計算過程.

算法1. 詞性過濾算法.

輸入:Da,postin;

輸出:Dc.

①Dc=?,T={tag1,tag2,…,tagn};

② for eachtagi∈T

③tagi=null;

④ end for

⑤ for eachwi∈Da

⑥tagi=posTaging(wi);

⑦ end for

⑧ for eachtagi∈T

⑨ iftagi∈postin

⑩ insertwitoDc;

算法1輸入為所有源代碼關鍵詞集合Da以及蘊含語義知識的詞性集合postin,輸出為過濾掉不蘊含語義知識詞性關鍵詞后的語料庫Dc.行①初始化存儲結果用的集合Dc=?,同時定義另一個集合T={tag1,tag2,…,tagn}用于標記每個關鍵詞的詞性.T中的元素與Da中的元素存在一一對應關系,即Da中關鍵詞wi對應于T中的tagi,由于Da中共有n個源代碼關鍵詞,因此T的元素個數也為n.行②~④先對T中的所有元素進行初始化,將其初始值設為null.行⑤~⑦識別Da中每個源代碼關鍵詞wi的詞性,并將識別的結果存儲于對應的tagi,這里函數posTaging(wi)的返回值為集合post={tn,tpron,tadj,tnum,tv,tadv,tart,tprep,tconj,tinterj}中的1個元素.行⑧~⑨檢查T中的每一個元素tagi,若tagi∈postin={tn,tadj,tv,tadv},則將對應的wi插入到結果集合Dc中.行返回結果Dc.

2.2 語義相似度集成方法

基于信息檢索的特征定位方法,核心在于量化地計算源代碼與查詢間的語義相似性.相似性問題均可通過向量空間內距離的方式進行定義、度量或推導.現有基于信息檢索的特征定位方法在將源代碼語料庫和查詢語句進行向量化索引后,以索引空間內源代碼向量與查詢向量之間的距離作為度量,刻畫兩者的相似度.由于不同模型的索引方法在進行向量轉化時,具有其特定優勢和局限性,在此基礎上計算出的向量間距離并不能充分刻畫向量間的相似度.至此,比較自然的想法是將不同索引空間內的相似度(即距離)進行集成,充分利用不同索引方法的優勢特性,獲得更為精確的相似度計算結果.關鍵問題在于:如何將不同索引空間內的距離信息在適當尺度內進行合理有效集成.

文獻[26-27]已經證明若干距離的線性組合依然是一個距離,因此針對任意一對源代碼向量mi和查詢語句向量q,兩者間相似度可以描述成為不同索引空間中距離的線性組合,即

其中dk(mi,q)表示第k種距離計算方法.該問題的核心是尋找參數ωk,使相似性刻畫最優.顯然直接計算最優參數ωk是困難的,因此本文方法將距離計算中的參數設置問題轉化為求源代碼結構最優問題.具體來說,由于代碼中的每一個類是按照“高內聚低耦合”的原則進行組織,即位于同一個類(class)中的各個方法(method)間具有高內聚度,而功能模塊間具有較低耦合度.故而,最優的距離計算方法一定是最能反映源代碼“高內聚低耦合”屬性的計算方法.

定義3. 模塊類簇.在按“高內聚低耦合”方式構建的軟件系統內,是指具有相似或相關功能的源代碼被放置在同一個模塊內,每個模塊稱為一個模塊類簇.一個軟件系統是由多個模塊類簇組成的.

例如,在面向對象軟件系統中,一個類(class)是由其內部的多個方法(method)組成的模塊類簇.在結構化軟件系統中,一個源代碼文件可以理解為是由一群函數(function)組成的模塊類簇.

假設有一個軟件系統,該軟件系統由2個源代碼模塊類簇內的多個源代碼組成.軟件系統結構上的模塊類簇分布應為圖4(a)所示,實心圓點代表模塊類簇1中的源代碼,十字符號代表模塊類簇2中的源代碼.不同模塊的源代碼根據“高內聚低耦合”原則,被規整地置于2個模塊類簇中.分別使用2種不同的索引方法對圖4(a)中源代碼進行索引,其向量在相應索引空間內的分布分別如圖4(b)和圖4(c)所示.對比圖4(b)與圖4(c)可發現,圖4(b)索引空間1內源代碼向量分布更接近于圖4(a)源代碼原始結構上的分布,其內所有源代碼均被明顯地分隔于2個模塊類簇內.而圖4(c)索引空間2內的源代碼則分布相對較為混沌,2個模塊類簇內源代碼分布出現了較大重疊區域.此時,可認為索引方法1對于源代碼的轉換更為貼近源代碼本身結構,則其所計算出的相似度(距離)更為合理,在線性組合集成時應予以較高權值.而索引方法2則反之.基于這種思想,本文認為可以用模塊類簇的外距和內距對不同索引方法生成的向量空間進行合理性度量,從而計算出優化的距離加權參數ωk.

在此基礎之上,本文提出了一種面向特征定位問題的語義相似度集成方法,該方法能夠將不同索引空間內的相似度(距離)進行線性組合集成,根據索引空間內向量分布與源代碼本身結構的一致性程度,計算出集成時的加權參數,從而獲得能夠充分刻畫源代碼與特征之間相似度的距離表達.下面將對本文方法進行詳細介紹:

定義4. 內距.若某軟件源代碼是由m個模塊類簇構成的,分別計算位于同一個模塊類簇內所有源代碼間距離的均值,將計算出的m個均值相加即為該軟件源代碼的內距interDis.內距interDis的計算公式為

Fig. 4 Source code module clusters distribution in different index space圖4 源代碼模塊模塊類簇在不同向量空間內的分布

圖5示例了一個由2個模塊類簇組成的軟件系統,圖5中圓點和十字符號分別代表2個模塊類簇內的源代碼數據點.每個數據點對應于1個方法(method),每個多邊形框內所有的數據點構成1個模塊類簇,這樣的1個模塊類簇可以是1個類(class),也可以是1個文件夾.模塊類簇2中虛線標示了模塊類簇內2個源代碼之間的距離.分別計算出所有位于模塊類簇2內源代碼間的距離,然后取均值,再以同樣方式求出模塊類簇1內所有源代碼間的距離均值,這2個均值相加即為該軟件系統的內距;實心三角和實心正方形分別代表了2個模塊類簇的重心,其間的距離即為軟件系統的外距.

Fig. 5 Distance definitions about module cluster圖5 與模塊類簇相關距離定義

在此基礎之上,本文提出相似性算法的詳細計算過程如下:

算法2. 語義相似度集成方法.

輸入:Sim1,Sim2,D1,D2;

輸出:查詢語句與各源代碼的相似度集合Simint.

④ end for

⑥interDis2=interDis2+calculateInter-

⑦ end for

⑩ end for

interDis1)+(exterDis1interDis1)),

ω2=(exterDis2interDis2)((exterDis2

interDis2)+(exterDis2interDis2));

算法2行①對本中所使用變量進行初始化.行②~⑦分別計算2種索引空間內軟件源代碼的內距,行⑧~分別計算2種索引空間內軟件源代碼的外距.行分別計算距離進行線性組合時所用參數ω1和ω2.行~使用參數對2個索引空間內計算出的相似度距離進行線性組合,并求出最終相似度.行返回結果.

3 實 驗

為驗證本文方法的性能,詞性過濾步驟將最新基于詞嵌入模型Doc2vec的信息檢索特征定位方法[16]作為基線方法,相似度集成步驟將LSI[21],LDA[15],Doc2vec[16]作為基線方法,通過公開基準數據集進行對比實驗測試.本文實驗,主要圍繞以下研究問題(research questions)展開:

研究問題1. 詞性過濾步驟是否能夠在現有方法基礎上提升特征定位性能?能夠提升多少性能?

研究問題2. 本文提出的語義相似度集成算法是否能夠在現有方法基礎上提升定位性能?能夠提升多少性能?

本文方法的有效性建立在“軟件的源代碼是高質量的”基礎上,高質量的源代碼有2個標準:語料庫內的關鍵詞有意義和源代碼以“高內聚低耦合”結構進行組織.語料庫內關鍵詞的質量,可通過統計無意義詞匯在源代碼中的占比進行評估,具體將在3.1節討論.源代碼是否以“高內聚低耦合”結構組織,則可通過以下方式驗證:若源代碼的結構是“高內聚低耦合”的,則通過索引方法的外距與內距之商可以有效評估出相應索引方法的特征定位性能.將A和B這2種索引方法進行相似度集成,假如軟件系統源代碼組織是“高內聚低耦合”的,當通過A方法計算出的源代碼外距與內距之商(即加權時的權值)高于B方法時,可認為A方法更符合源代碼的分布.此時,單獨使用A方法進行定位,定位性能應高于單獨使用B方法.反之,則B方法的定位性能應高于A方法.通過驗證這種一致性,可以驗證軟件系統的源代碼是否具有“高內聚低耦合”特性.因此,本文實驗部分還需驗證以下問題:

研究問題3. 索引方法對源代碼內聚耦合性的符合程度是否與索引方法定位性能的分布一致?

3.1 實驗數據

為保證實驗的客觀性,選擇已有的基準數據集(benckmark)進行實驗.實驗的核心目的在于對比本文方法與基線方法性能差異,基準數據集能夠為整個對比過程提供無偏差數據和評價基礎,從而保證實驗的客觀性.

本文選擇Dit等人[6]公布的軟件維護任務測試數據集進行實驗.該數據集共由5款開源軟件的源代碼和特征數據組成,具體數據規模如表1所示:

Table 1 Data Sets表1 本文實驗數據集

數據集內所有特征均為相應軟件的官方問題追蹤系統(issue tracking system)內真實存在的數據.每個特征以ID作為標識,由2部分組成:

1) Description[ID].問題描述,關于特征的文本描述,本文實驗將該文件作為查詢語句(query)使用.

2) GoldSet[ID].正確答案集,記錄了與特征真正相關的源代碼,用于驗證特征定位的結果.

數據集中的5款軟件均為較成熟的開源軟件,源代碼的維護及更新均有其獨立的問題追蹤系統,并由專門的團隊進行管理,保證了數據集內軟件源代碼的質量.同時,本文統計了數據集內所有軟件源代碼中無意義詞匯的數量及其占比,如表1所示.這里指的無意義詞匯是指用單個字母命名的變量,以及形如“c2”,“m2”等的非常規詞匯,在統計時以前者居多.從表1中可以看出,無意義詞匯在5個軟件源代碼中的占比在4.56%~7.43%之間.即對于該數據集而言,源代碼中的關鍵詞逾90%以上都是有意義的詞匯.從該角度可認為數據集內的軟件源代碼是屬于高質量源代碼范疇的.

3.2 評價標準

對本文方法性能進行定量評估,需使用一定度量標準對實驗結果進行度量和對比.軟件特征定位本質上是信息檢索問題,因此適用于信息檢索的度量標準.度量特征定位方法的性能,應衡量第1個與特征真正相關的源代碼在結果列表(ranking list)中出現的位置,越靠前則定位性能越高[16,22,28-29].因此,特征定位研究[16,22,28-29]多使用平均排序倒數(mean reciprocal rank,MRR)作為度量標準,本文實驗也采用該標準.MRR的具體計算公式如下:

其中,Q為實驗中所使用所有查詢語句(query)的集合;|Q|代表Q中查詢個數;ei為在第i個查詢中,第1個與查詢語句正確相關的源代碼位于結果列表中的排名.MRR數值越大,代表特征定位性能越好.

3.3 實驗過程

3.3.1 預處理

提取源代碼中的關鍵詞,以方法(method)為粒度,建立語料庫,提取出源代碼關鍵詞數量見表1.然后,依次進行分詞、詞根還原及去停用詞處理.去停用詞步驟,本文選取2個不同的停用詞表進行實驗,停用詞表1由自然語言處理領域公開的3個常用英文停用詞表(含SMART停用詞表)合并而成,共有887個詞條;停用詞表2來源于Wikipedia,共有119個詞條①https:en.wikipedia.orgwikiStop_words.使用Python環境下自然語言處理包NLTK對語料進行詞性標注,標注后對詞性為名詞、動詞、形容詞和副詞外的其他單詞及詞組進行過濾.分別測試預處理步驟僅使用詞性過濾、僅使用停用詞、既使用停用詞又使用詞性過濾情況下的定位性能,具體結果將在3.4節進行討論.

3.3.2 源代碼語料索引

為單獨分別討論本文方法提出的2個步驟對于特征定位問題的改進意義,驗證本文提出的相似度集成方法時,索引步驟使用的為未進行詞性過濾的語料庫.索引步驟選擇了2種索引方法:基于“詞袋”模型的索引方法TF-IDF(term frequency-inverse document frequency)和基于詞嵌入模型的索引方法Doc2vec.TF-IDF是最為基礎的 “詞袋”模型索引方法,使用長稀疏向量對文本進行索引,LSI和LDA均是在TF-IDF基礎上建立的.由于TF-IDF生成的向量未做任何降維處理,最大程度地保留了語料庫中的詞匯信息,故本文實驗中選擇其作為“詞袋”模型代表進行集成.Doc2vec是新興的一種文本索引方法,該方法基于詞嵌入模型和深度學習技術,以短實值向量對文本進行索引,該方法是當前自然語言處理和信息檢索領域最熱的文本索引方法.

分別使用TF-IDF和Doc2vec,將語料庫轉化為向量表示,生成的向量集分用Dtfidf和Dd2v表示.本文實驗中,使用Python環境下Gensim②http:radimrehurek.comgensim庫對源代碼語料進行索引.

3.3.3 查詢語句索引

查詢語句同樣需要分別轉化為TF-IDF和Doc2vec索引空間內的向量表示.在TF-IDF索引空間內,查詢語句直接進行轉化即可.由于Doc2vec基于多層神經網絡實現,可劃分為詞向量層和文本向量層.該模型首先訓練生成詞向量,在詞向量的基礎上訓練生成文本向量.2種方式將查詢語句轉化為向量:1)將查詢語句視為文本,與源代碼文本共同進行訓練,將生成的文本向量作為查詢向量;2)計算查詢語句中每個單詞的詞向量,取平均向量作為查詢向量.文獻[16]對2種方式生成的查詢語句進行了實驗討論,結論認為方式2)定位性能在普遍情況下明顯優于方式1).因此,本文實驗中采用方式2)計算查詢向量.

定義6. Doc2vec索引空間查詢向量.用戶提交查詢語句為Q,Q是由m個單詞w組成的集合Q={w1,w2,…,wm}.對于任意wi∈Q,通過模型M對wi進行訓練,生成wi所對應的詞向量wvi.則對于用戶所提交的查詢語句Q,其相應的Doc2vec索引方式生成的查詢向量qd2v為

分別在TF-IDF和Doc2vec的索引空間中使用余弦相似度計算源代碼向量與查詢向量間的相似度,生成2個索引空間內的相似度(距離)集合,分別用Simtfidf和Simd2v表示.

3.3.4 獲取結果

至此共計生成2種索引方法的語料庫向量集和相似度集合:Dtfidf,Dd2v,Simtfidf,Simd2v.劃分每個軟件系統中的源代碼.位于同一個類(class)中的所有方法(method)被劃分為同一個模塊類簇,模塊類簇數量見表1,以此模塊類簇為依據計算代碼間的內距與外距.

使用2.2節介紹的相似度計算方法,將TFIDF與Doc2vec索引空間內的相似度集合進行加權集成,生成最終的相似度集合Simint.最后,將源代碼中所有的方法(method)以Simint中對應的相似度大小為依據進行降序排列.從排列好的源代碼隊列頂端開始逐個檢查源代碼,記錄特征對應的GoldSet在隊列中出現的首個位置,該位置即為定位結果性能ei.

分別計算數據集內所有特征的定位結果性能ei.至此,實驗結束,統計結果.

3.4 實驗結果

3.4.1 研究問題1討論

詞性過濾步驟是否能夠在現有方法基礎上提升特征定位性能?能夠提升多少性能?

Fig. 6 Location performance with POS filtering圖6 詞性過濾前后定位性能對比

圖6記錄了應用深度學習模型Doc2vec作為索引方法進行詞性過濾實驗的結果.All source code為未做去停用詞,也未進行詞性過濾的結果,POS tagging為只進行詞性標注的結果,Stop word1和Stop word2分別為只使用停用詞表1和停用詞表2的結果.SW 1 & POS tagging為在停用詞表1的基礎上進行詞性過濾的結果,SW 2 & POS tagging為在停用詞表2的基礎上進行詞性過濾的結果.從圖6可以看出,只進行詞性過濾或只進行去停用詞,性能均無法達到最優.性能最優的定位結果均出現于既進行去停用詞,又進行詞性過濾時.對于實驗中的5個數據集,詞性標注在停用詞表1基礎上可獲得平均34.21%的性能提升,在停用詞表2基礎上可以獲得平均27.55%的定位性能提升.綜合詞性過濾在實驗中5個數據集2個停用詞表上的表現,可回答研究問題1:本文提出的詞性過濾步驟可有效提升信息檢索特征定位方法的性能,詞性過濾步驟在實驗中為文本特征定位方法平均帶來了30.88%的定位性能提升.由于Eclipse具有最大規模的源代碼語料庫,因此從圖6(e)中可以看出詞性過濾對于Eclipse軟件系統的定位性能提升是最為明顯的.

Table 2 Location Performance and Integration Weight Distribution表2 定位性能與權值分布

Fig. 7 MRR performance with different similarity calculation method圖7 不同相似度計算方法定位結果MRR性能

3.4.2 研究問題2討論

本文提出的語義相似度集成算法是否能夠在現有方法基礎上提升定位性能?能夠提升多少性能?

圖7記錄了使用不同相似度計算方法定位時的MRR性能.其中,LSI為文獻[21]方法,LDA為文獻[15]方法,Doc2vec為文獻[16]方法.從圖7可以看出,這3種方法在不同數據集上定位性能不盡相同,但本文方法在所有數據集上均能保持定位性能最優.JabRef數據集上,本文方法比次優的TFIDF方法定位性能提高了12.03%;jEdit數據集上,本文方法比次優的TFIDF方法提高了7.56%;muCommander數據集上,本文方法比次優的TFIDF方法提高了5.64%;ArgoUML數據集上,本文方法比次優的LSI方法提高了8.36%;Eclipse數據集上,本文方法比次優的Doc2vec方法提高了17.80%.綜上,可以回答研究問題2:本文提出的相似度集成方法可以有效提高信息檢索特征定位方法的性能.在實驗中,相似度集成步驟為信息檢索特征定位方法平均帶來了10.28%的定位性能提升.

3.4.3 研究問題3討論

索引方法對源代碼內聚耦合性的符合程度是否與索引方法定位性能的分布一致?

實驗中集成的2種索引方法定位性能及其相應的加權權值分布如表2所示.表2中所示定位性能為圖7中相應定位方法的性能,加權權值也為圖7中本文方法計算相似度時的權值.從表2中可以看出:在JabRef,jEdit,muCommander,ArgoUML這4個軟件數據集上,TFIDF的定位性能優于Doc2vec方法.此時,通過本文方法計算出的權值(即外距與內距比)TFIDF要高于Doc2vec;然而在Eclipse數據集上,Doc2vec方法定位性能要高于TFIDF.此時,本文方法計算出的加權權值Doc2vec高于TFIDF.至此,可回答研究問題3:索引方法對源代碼內聚耦合性的符合程度與索引方法定位性能分布是一致的.從該角度可以證明:對于本文方法中使用的數據集,源代碼的內聚耦合程度有助于評估索引方法對源代碼刻畫的合理性.

因此,可以得出結論,本文方法的加權不是偶然獲得的結果.本文方法基于2個前提條件:1)軟件的源代碼是按照“高內聚低耦合”進行組織;2)源代碼向量的內聚耦合性可用于評估出相應索引方法的特征定位性能.表2的數據證明了在實驗的5個數據集中,本文方法的前提是成立的,否則不會保持內聚耦合程度與定位性能分布的一致性.

4 本方法適用性

本文研究是詞性過濾與語義相似度集成在特征特征定位領域的初步探索,其實際應用勢必會存在一些問題.本文研究還存在以下適用前提:

1) 本文實驗是建立在面向對象語言Java所編寫的軟件數據集上的,故本文方法對其他語言編寫的軟件特征定位問題適用性還有待驗證.

2) 本文未討論參數問題,所有參數使用的均是Gensim的默認參數.這是由于參數調優問題涉及大量的領域知識支撐,且較為復雜,有專門的相關研究進行討論.限于文章篇幅,本文中只討論與軟件工程相關的問題.

3) 本文方法是建立在軟件源代碼本身是高質量代碼基礎上的,即變量名的命名是規范且有語義的,同時源代碼以較為嚴格的“高內聚低耦合”標準進行結構組織.

5 總 結

基于信息檢索的軟件特征定位方法,一直是軟件特征定位領域研究的熱點.針對現有方法中的噪聲和索引模型選擇導致的語義相似度計算失準問題,本文提出了一種面向軟件特征定位問題的語義相似度集成方法,并開發出了一整套本文方法所使用的定位工具.通過對5款開源軟件組成的基準數據集進行實驗,驗證了本文方法的有效性.

基于信息檢索的軟件特征定位方法,本質是將信息檢索技術應用于源代碼,既有傳統信息檢索技術的通用特性,又具有因源代碼格式導致的特殊性.本文方法基于源代碼數據自身特性,通過語義相似度集成的方式計算源代碼與特征之間的相似性,提高了基于信息檢索的特征定位方法性能.通過實驗驗證了本文方法的有效性,但也存在一些有待探討的問題,這些問題為將來的研究指出了方向.為進一步驗證本文方法的有效性,也為提高本文方法的普適性,將對本文方法在更多的項目上進行驗證,并繼續研究本文方法是否能夠應用于信息檢索或計算機其他研究領域.

猜你喜歡
源代碼信息檢索語義
高校圖書館信息檢索課程教學改革分析
真實場景水下語義分割方法及數據集
基于TXL的源代碼插樁技術研究
計算機信息檢索技術的發展及問題研究
保護好自己的“源代碼”
解密別克安全“源代碼”
“吃+NP”的語義生成機制研究
情感形容詞‘うっとうしい’、‘わずらわしい’、‘めんどうくさい’的語義分析
漢語依憑介詞的語義范疇
公共圖書館信息檢索服務的實踐探索——以上海浦東圖書館為例
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合