黃 城,徐克輝 ,鄭 尚, 于化龍*
(1. 江蘇科技大學(xué) 計(jì)算機(jī)學(xué)院, 鎮(zhèn)江 212100)(2. 中國艦船研究所,北京 100101)
技術(shù)債(technical debt,TD)[1-2]是經(jīng)濟(jì)學(xué)反映技術(shù)折中的一種隱喻說法.該隱喻被引入軟件開發(fā)過程中,開發(fā)者為了追求項(xiàng)目短期利益,可能會(huì)有意選擇捷徑盡快完成代碼實(shí)現(xiàn).然而,過多的TD會(huì)對(duì)軟件長期的健康發(fā)展造成不可預(yù)知的影響.隨著軟件系統(tǒng)越來越復(fù)雜,技術(shù)債受到了工業(yè)界和學(xué)術(shù)界的重點(diǎn)關(guān)注.
為了防止累積的技術(shù)債對(duì)軟件質(zhì)量造成損害,近年來,學(xué)術(shù)界展開了技術(shù)債的識(shí)別研究,通過靜態(tài)源代碼分析來檢測技術(shù)債.文獻(xiàn)[3]提出自承認(rèn)技術(shù)債(self-admitted technical debt,SATD)的概念,指出開發(fā)人員清楚當(dāng)前實(shí)現(xiàn)不是最優(yōu)方法,并通過代碼注釋標(biāo)識(shí).例如,通過打開開源項(xiàng)目“JEdit”,能夠發(fā)現(xiàn)某些評(píng)論描述“Need some format checking here”,這表明相應(yīng)的代碼有缺陷,需要捕獲格式異常.文獻(xiàn)[4]指出盡管項(xiàng)目中SATD的數(shù)量不多,但它仍將對(duì)軟件復(fù)雜性產(chǎn)生負(fù)面影響.因此,文獻(xiàn)[5]基于文本挖掘的方法來自動(dòng)識(shí)別代碼注釋中的SATD,通過構(gòu)建多個(gè)分類器,預(yù)測目標(biāo)項(xiàng)目的SATD.
針對(duì)SATD識(shí)別,由于代碼注釋中SATD數(shù)量較少,數(shù)據(jù)集明顯出現(xiàn)類不平衡問題,將嚴(yán)重影響分類器性能,但現(xiàn)有方法并沒有考慮上述問題對(duì)識(shí)別結(jié)果的影響.因此,文中針對(duì)文本數(shù)據(jù)的特點(diǎn),提出一種基于交叉過采樣的方法,將源代碼的SATD評(píng)論切成短詞樣本,并通過交叉組合生成新的SATD,繼而擴(kuò)展SATD樣本數(shù)量,緩解數(shù)據(jù)集的類別不平衡問題,同時(shí)利用特征選擇方法構(gòu)建多個(gè)多項(xiàng)式樸素貝葉斯(naive Bayes multinomial, NBM)分類器,并對(duì)多個(gè)分類器結(jié)果進(jìn)行集成投票決策,從而提高了SATD識(shí)別的準(zhǔn)確率.
類別不平衡問題,是指當(dāng)數(shù)據(jù)集中某一類或某幾類的樣本數(shù)遠(yuǎn)多于或遠(yuǎn)少于其他類的樣本數(shù),進(jìn)而導(dǎo)致所建立的預(yù)測模型忽略少數(shù)類性能的問題.
常用的類別不平衡學(xué)習(xí)策略主要包括:樣本采樣方法[6]、代價(jià)敏感學(xué)習(xí)算法[7-8]、閾值策略[9-10]及集成學(xué)習(xí)算法[11-12]等.其中,樣本采樣方法以其簡單性及與分類器無關(guān)的特性而備受研究者青睞.因此,文中采用樣本采樣的方法來解決不平衡的SATD識(shí)別問題.
樣本采樣是通過增加少數(shù)類或減少多數(shù)類樣本的方式使訓(xùn)練樣本集在類分布上趨于平衡,其中,增加少數(shù)類樣本的策略被稱為過采樣,而減少多數(shù)類樣本的策略則被稱為降采樣.最簡單的采樣策略是隨機(jī)降采樣(random undersampling,RUS)和隨機(jī)過采樣(random oversampling,ROS),前者隨機(jī)刪除多數(shù)類樣本,后者則對(duì)少數(shù)類樣本進(jìn)行隨機(jī)拷貝,來增加其規(guī)模.研究發(fā)現(xiàn)RUS易導(dǎo)致大量信息損失,尤其在不平衡比率較高時(shí),其性能將完全無法得到保證,而ROS則會(huì)易于使分類器陷入過適應(yīng),從而影響到其泛化性能.為了解決ROS的缺陷問題,文獻(xiàn)[6]提出一種經(jīng)典的改進(jìn)算法,即少數(shù)類合成過采樣技術(shù)(synthetic minority oversampling technology,SMOTE)算法,該算法通過在臨近少數(shù)類樣本間的連線上隨機(jī)生成偽樣本的方式,大幅提升了少數(shù)類樣本集的多樣性,并降低了訓(xùn)練出過適應(yīng)模型的風(fēng)險(xiǎn).
近年來,新的過采樣算法層出不窮,但一直沒有脫離出SMOTE算法的思想范疇.然而,此類算法有一個(gè)基本的限制條件,即樣本的特征空間必須在實(shí)數(shù)域上可度量,其對(duì)于軟件代碼評(píng)論這樣的文本數(shù)據(jù)并不適用.因此,對(duì)于SATD識(shí)別這類人物,就需要從全新的角度入手,設(shè)計(jì)具有高適應(yīng)度的過采樣算法.
2.1總體設(shè)計(jì)框架
圖1為文中方法的整體框架,圖中可以看出,SATD識(shí)別系統(tǒng)主要由3個(gè)模塊順序組成,分別為數(shù)據(jù)預(yù)處理模塊、特征構(gòu)建與選擇模塊以及決策模型構(gòu)建模塊.這3個(gè)模塊順序執(zhí)行,共同完成SATD樣本的識(shí)別工作.
上述模型的主體繼承了文獻(xiàn)[5]提出的框架.唯一的不同之處在于文中考慮到了樣本分布不平衡的影響,故增加了切分短文本、構(gòu)建文本池與交叉過采樣的步驟.
2.2交叉過采樣策略
文中基于文本數(shù)據(jù)特點(diǎn),借鑒了遺傳算法中交叉算子的構(gòu)造思想[13],設(shè)計(jì)一種交叉過采樣算法,用以生成大量虛擬的SATD偽樣本,同時(shí)在最大限度上避免后期建模中過適應(yīng)現(xiàn)象的出現(xiàn).
假設(shè)有兩條完整的文本段A和B,其中A由兩個(gè)短文本A1,A2順序組成,B則有B1,B2順序組成,則其可表示為:
A=A1A2
B=B1B2
所謂交叉過采樣,即是將A,B之間后半段的短文本進(jìn)行互換,組成新的完整文本段,即:
AB=A1B2
BA=B1A2
式中:AB與BA為新生成的文本樣本.
在實(shí)際應(yīng)用中,考慮到代碼評(píng)論的文本結(jié)構(gòu)更繁雜,有的評(píng)論可能只包括一個(gè)短文本,而有的則由多個(gè)短文本組成,故上述策略可能會(huì)受到文本樣本這一構(gòu)造特點(diǎn)的影響.為此,文中通過構(gòu)建短樣本池,將所有的SATD樣本均切分為短樣本,并置于池中,再從中隨機(jī)進(jìn)行選取,來生成虛擬的偽樣本.
圖1 總體設(shè)計(jì)框架Fig.1 Framework of the method proposed in this article
舉例來講,對(duì)于一條SATD評(píng)論:“TODO:Do we really need to do this? Carried over from old behavior”,在切分短文本時(shí),其會(huì)被分割為“TODO:Do we really need to do this?”和“Carried over from old behavior”兩個(gè)短文本,而對(duì)于另一條SATD評(píng)論“Need some format checking here”,則其不用切分,直接可以看做是一條短文本,當(dāng)將它們均置于短文本池中時(shí),若采用交叉過采樣策略,則可能會(huì)生成類似于“TODO:Do we really need to do this? Need some format checking here”以及“Need some format checking here, Carried over from old behavior”這樣的虛擬偽樣本,盡管可能其在上下文語義上未必能解釋,但卻切實(shí)地提升了樣本多樣性,降低了后期建模出現(xiàn)過擬合的風(fēng)險(xiǎn).
在采樣過程中,還需定義一個(gè)重要參數(shù),即采樣率SR,其取值通常在[0,1]之間,并直接決定了需要生成的偽樣本個(gè)數(shù).其對(duì)應(yīng)的計(jì)算公式為:
(1)
2.3文本預(yù)處理
預(yù)處理文本數(shù)據(jù),可以為后續(xù)的特征構(gòu)建提供幫助.文中采用了3個(gè)步驟來對(duì)文本樣本進(jìn)行預(yù)處理操作.
(1) 切詞:將文本分解為單詞、短語、符號(hào)或切分為其他有意義的元素的過程.文中的切詞選擇以單詞為基本元素,即將每一個(gè)單詞均切分出來,同時(shí)為了保證單詞表示的唯一性,將所有切分出的單詞中的大寫字母作小寫化處理.
(2) 停用詞處理:停用詞表示那些難以用于區(qū)分不同類別樣本的詞匯,通常這些詞匯沒有具體的實(shí)際意義,如介詞等.文中已最大限度地篩選出停用詞,同時(shí)對(duì)于少于兩個(gè)字母或多于20個(gè)字母的詞匯,視為停用詞作刪除處理.
(3) 詞干提取:將變形詞提取或者還原到詞干、詞基或詞根形式的過程.文中也調(diào)用了詞干提取的工具包,對(duì)所有評(píng)論數(shù)據(jù)進(jìn)行了處理.
2.4特征構(gòu)建、選擇與基分類器構(gòu)建
文中繼承了文獻(xiàn)[5]中所采用的特征構(gòu)建特征、特征選擇以及基分類器構(gòu)造等方法.其中,采用詞向量空間模型(vector space model,VSM)[14]表示每條評(píng)論.在VSM中,每個(gè)詞對(duì)應(yīng)于一個(gè)特征,由于評(píng)論中出現(xiàn)的詞量較大,故導(dǎo)致特征空間的維度也較高,可能會(huì)造成“維數(shù)災(zāi)難”的問題,故需進(jìn)一步采用特征選擇方法來對(duì)其進(jìn)行降維處理.文中繼承了文獻(xiàn)[5]中的方法,采用信息增益的特征選擇方法[15]來篩選那些比較重要的特征.
在經(jīng)過特征選擇后的特征空間上,文中采用多項(xiàng)式樸素貝葉斯分類器[16]作為建模工具,來區(qū)分SATD與Non-SATD樣本.選用NBM的原因在于它將每一維特征單獨(dú)拆分開進(jìn)行處理,可以有效地節(jié)省建模時(shí)間開銷,同時(shí)前人工作也已發(fā)現(xiàn),在處理文本數(shù)據(jù)時(shí),NBM比傳統(tǒng)的樸素貝葉斯(naive Bayes, NB)分類器的識(shí)別率也更高[17].
2.5集成分類器構(gòu)建
SATD評(píng)論數(shù)據(jù)往往由多個(gè)不同的項(xiàng)目組成,每個(gè)項(xiàng)目都是一個(gè)獨(dú)立的數(shù)據(jù)集,故應(yīng)采用集成學(xué)習(xí)的框架來構(gòu)造最終的決策模型,其中,每一個(gè)項(xiàng)目應(yīng)單獨(dú)訓(xùn)練一個(gè)基分類器.
文中采用了Bagging集成學(xué)習(xí)的框架來構(gòu)造SATD預(yù)測模型,對(duì)于每一個(gè)源項(xiàng)目,均獨(dú)立執(zhí)行交叉過采樣、文本預(yù)處理、特征構(gòu)建與選擇的過程,并為其單獨(dú)訓(xùn)練一個(gè)NBM分類器.最后,采用多數(shù)投票的方式來構(gòu)造集成決策模型.
2.6算法描述
文中算法流程與實(shí)施步驟描述如下:
輸入:n個(gè)源項(xiàng)目集,采樣率SR
輸出:集成預(yù)測模型C
步驟:
(1) Fori=1:n
(2) 針對(duì)第i個(gè)源項(xiàng)目,對(duì)其SATD樣本與Non-SATD樣本進(jìn)行劃分;
(3) 將SATD數(shù)據(jù)分割為短文本,構(gòu)造短文本池;
(4) 根據(jù)預(yù)設(shè)的SR,采用交叉過采樣策略生成對(duì)應(yīng)數(shù)量的SATD偽樣本;
(5) 將新生成的SATD偽樣本加入源項(xiàng)目中;
(6) 使用文本預(yù)處理技術(shù)進(jìn)行切詞、處理停用詞并提取詞干;
(7) 采用VSM模型構(gòu)造詞向量空間;
(8) 采用信息增益算法進(jìn)行降維;
(9) 在降維后的數(shù)據(jù)上訓(xùn)練得到一個(gè)分類器,記為NBMi;
(10) End For
(11) 構(gòu)造集成分類器C={NBM1, NBM2,…, NBMi}
在決策時(shí),目標(biāo)項(xiàng)目中的評(píng)論也需經(jīng)過文本預(yù)處理,并轉(zhuǎn)化進(jìn)入詞向量空間,保留與各基分類器相對(duì)應(yīng)的特征,最終再由集成決策模型C給出對(duì)應(yīng)的預(yù)測結(jié)果.至于交叉過采樣策略,只需在訓(xùn)練時(shí)執(zhí)行,在決策時(shí)則無需執(zhí)行.
實(shí)驗(yàn)采用與文獻(xiàn)[5]完全相同的8個(gè)SATD評(píng)論數(shù)據(jù)集(表1).這些數(shù)據(jù)集雖然所采用編程工具的版本號(hào)不同,包含的評(píng)論數(shù)與SATD的數(shù)量也不同,但存在一個(gè)共同特點(diǎn),即SATD評(píng)論在所有評(píng)論中的占比均較小,這是典型的類別不平衡問題.
表1 所用數(shù)據(jù)集Table 1 Data sets used
從表1可以看出,在每個(gè)數(shù)據(jù)集中,其樣本數(shù)在2 492~5 426不等,SATD數(shù)在101~969不等,而SATD樣本在所有樣本中的占比最高只有17.8%,在某幾個(gè)數(shù)據(jù)集上,占比甚至低于5%.
為了驗(yàn)證文中算法的有效性與優(yōu)越性,與文獻(xiàn)[5]的基線方法以及隨機(jī)過采樣ROS算法進(jìn)行實(shí)驗(yàn)比較.特別需要指出的是,在實(shí)驗(yàn)中,ROS算法及文中算法的采樣率SR均根據(jù)經(jīng)驗(yàn)預(yù)設(shè)為0.5,而其他算法步驟中的參數(shù)設(shè)置均與文獻(xiàn)[5]中的設(shè)置保持一致,保證了實(shí)驗(yàn)結(jié)果比較的公正性.
與文獻(xiàn)[5]一致,文中也采用查準(zhǔn)率(Precision)、召回率(Recall)及F1分?jǐn)?shù)(F1-score)這3個(gè)度量測度對(duì)各類算法的性能來進(jìn)行評(píng)價(jià),其實(shí)際含義與計(jì)算公式如下.
查準(zhǔn)率 表示在預(yù)測為SATD的評(píng)論中真實(shí)的SATD評(píng)論的比例為:
Precision=TP/(TP+FP)
(2)
召回率 表示在真實(shí)的SATD評(píng)論中被預(yù)測為SATD評(píng)論的比例為:
Recall=TP/(TP+FN)
(3)
F1分?jǐn)?shù) 表示查準(zhǔn)率和召回率之間的調(diào)和比例為:
(4)
式中:TP、FP及FN等評(píng)價(jià)指標(biāo)的含義如表2.
表2 混淆矩陣Table 2 Confusion matrix
3.3實(shí)驗(yàn)結(jié)果比較
表3給出了文中方法與基線方法和ROS算法在3個(gè)不同性能度量測度上的比較結(jié)果.基于表3中的實(shí)驗(yàn)結(jié)果,可以得出結(jié)論:
(1) 相比于基線方法,文中提出的交叉過采樣算法可以提升分類的查準(zhǔn)率,特別是在類別不平衡比率較高的數(shù)據(jù)集上,如Columba、JEdit、JFreeChart、JMeter及SQuirrel等,查準(zhǔn)率相比于基線方法,均有較大幅度提升.此外,文中算法在8個(gè)數(shù)據(jù)集上平均的查準(zhǔn)率(0.756)相較于基準(zhǔn)算法(0.841),提升了11.24%.
(2) 在召回率測度上,文中方法的性能不但低于基準(zhǔn)方法,而且相較于ROS算法,也有較大差距,特別是在那些不平衡比率較高的樣本集上,這一現(xiàn)象更為突出.不過這是可以接受的結(jié)果,因?yàn)椴闇?zhǔn)率與召回率是兩個(gè)相對(duì)矛盾的度量測度,其中一個(gè)提升,幾乎必然伴隨著另一個(gè)的下降[18].
(3) 在F1分?jǐn)?shù)這一度量測度上,文中方法獲得了最高的平均結(jié)果.相較于基準(zhǔn)方法的0.737,文中方法獲得了0.756的F1分?jǐn)?shù)測度值.特別值得注意的是,在大部分高度不平衡的數(shù)據(jù)集上,如Columba、JEdit、JFreeChart、JMeter,文中方法均得到了最高的F1分?jǐn)?shù)測度值.這一結(jié)果表明:文中所提出的交叉過采樣策略有助于調(diào)節(jié)查準(zhǔn)率與召回率之間的關(guān)系,使之更為平衡.同時(shí),自承認(rèn)技術(shù)債的識(shí)別確實(shí)會(huì)受到樣本分布不平衡的影響,而采用有效的類別不平衡學(xué)習(xí)技術(shù)可以切實(shí)提升其性能.
(4) 相比于ROS算法,文中算法無論在查準(zhǔn)率還是F1分?jǐn)?shù)測度上均顯示出了明顯的優(yōu)勢,進(jìn)而表明交叉過采樣策略可有效地避免建模時(shí)過適應(yīng)現(xiàn)象出現(xiàn).事實(shí)上,ROS在各評(píng)價(jià)測度上的表現(xiàn)甚至均低于基準(zhǔn)算法,這也再一次地證明隨機(jī)過采樣會(huì)導(dǎo)致模型過擬合,進(jìn)而降低其泛化性能.
總而言之,通過對(duì)表3中的實(shí)驗(yàn)結(jié)果進(jìn)行分析,可以發(fā)現(xiàn)文中提出的交叉過采樣策略是有效的、可行的,以及優(yōu)越的.
表3 各類算法的性能比較Table 3 Performance comparison of various algorithms
文中通過實(shí)驗(yàn)研究采樣率取值變化對(duì)算法性能的影響及影響規(guī)律.圖2為3種不同性能測度值隨采樣率變化而變化的曲線.特別地,采樣率的取值范圍為[0.1, 1.0],每次調(diào)整的補(bǔ)償為0.1.
從圖2可以觀察到,3種性能測度值隨采樣率變化的規(guī)律幾乎是一致的.當(dāng)采樣率較低時(shí),由于補(bǔ)充的偽SATD樣本不夠充足,因而各種性能測度值均較低.隨著采樣率提升,各種測度值均會(huì)快速提升,直至采樣率到達(dá)0.5,繼續(xù)增加采樣率,性能提升將會(huì)逐漸放緩.當(dāng)采樣率達(dá)到0.9時(shí),各種性能測度值均會(huì)達(dá)到峰值.在這一時(shí)刻,若進(jìn)一步增加采樣率,性能不但不會(huì)得到提升,反而會(huì)有一定程度下降.根據(jù)實(shí)驗(yàn)結(jié)果的反饋,用戶在實(shí)際應(yīng)用中不宜將采樣率設(shè)置過大或過小,取一個(gè)居中值較合理.
圖2 不同采樣率下的分類性能Fig.2 Classification performance atdifferent sampling rates
對(duì)軟件技術(shù)債進(jìn)行精確識(shí)別對(duì)于代碼重構(gòu)以及系統(tǒng)的長期維護(hù)和二次開發(fā)都具有重要意義,是軟件工程中重要研究課題之一.文中關(guān)注到軟件技術(shù)債數(shù)據(jù)中所存在的樣本分布不平衡問題可能會(huì)對(duì)所建立的預(yù)測模型產(chǎn)生較大的負(fù)面影響.進(jìn)而,結(jié)合文本數(shù)據(jù)自身的特點(diǎn),提出了一種交叉過采樣策略,并將其融入現(xiàn)有的識(shí)別算法中,提升了預(yù)測的準(zhǔn)確率以及算法泛化性能.實(shí)驗(yàn)結(jié)果證明了該算法的有效性、可行性以及優(yōu)越性.