曾 杰,賁可榮,張 獻(xiàn),徐永士
(海軍工程大學(xué)電子工程學(xué)院,湖北 武漢 430033)
大部分軟件使用缺陷管理系統(tǒng)(如Bugzilla)來(lái)追蹤和記錄發(fā)生的缺陷。對(duì)于同一缺陷,使用軟件的不同用戶或者軟件維護(hù)人員可能在不同時(shí)間提交多份缺陷報(bào)告,這樣會(huì)增加修復(fù)成本。所以,對(duì)于每一份新提交的缺陷報(bào)告,先判斷其是否是歷史缺陷報(bào)告的重復(fù),然后再行處理。在歷史缺陷報(bào)告數(shù)龐大的情況下,人工查找是不現(xiàn)實(shí)的。而據(jù)有關(guān)統(tǒng)計(jì)[1]顯示收集的關(guān)于Mozilla項(xiàng)目的768 335個(gè)缺陷報(bào)告中,重復(fù)報(bào)告的占比高達(dá)23%。由此可見(jiàn),重復(fù)缺陷報(bào)告檢測(cè)對(duì)于降低缺陷追蹤管理系統(tǒng)的人力成本具有重要意義。
現(xiàn)有研究主要針對(duì)缺陷報(bào)告的非結(jié)構(gòu)化屬性和結(jié)構(gòu)化屬性2部分內(nèi)容分別抽取特征,再利用機(jī)器學(xué)習(xí)算法構(gòu)建分類(lèi)模型。結(jié)構(gòu)化屬性只能從指定選項(xiàng)中選取,非結(jié)構(gòu)化屬性則由缺陷報(bào)告的提交者依據(jù)個(gè)人表述習(xí)慣利用自然語(yǔ)言進(jìn)行描述,主要包括缺陷摘要和缺陷描述。部分缺陷報(bào)告在缺陷描述中會(huì)附上程序執(zhí)行步驟和屏幕截圖等其它信息。Lazar等人[2]提出的D_TS(Detection using Text Similarity)方法,抽取了25種特征,采用支持向量機(jī)SVM(Support Vector Machine)和隨機(jī)森林等機(jī)器學(xué)習(xí)算法訓(xùn)練分類(lèi)器,在重復(fù)缺陷報(bào)告檢測(cè)方面取得了良好效果。為了進(jìn)一步提升檢測(cè)的準(zhǔn)確性,在該方法的基礎(chǔ)上,本文提出一種融合文本分布式表示的檢測(cè)方法,利用大規(guī)模數(shù)據(jù)集挖掘缺陷報(bào)告在摘要和描述上的深層次語(yǔ)義信息,抽取缺陷報(bào)告的分布式表示,將該特征與其它特征進(jìn)行融合后共同用于任務(wù)檢測(cè)。文本分布式表示利用文檔嵌入模型Doc2Vec[3]進(jìn)行訓(xùn)練和抽取。在公開(kāi)的大規(guī)模重復(fù)缺陷報(bào)告數(shù)據(jù)集[1]上進(jìn)行評(píng)測(cè),并將本文所提方法與D_TS[2]進(jìn)行比較,證實(shí)了本文方法的有效性。為了保證實(shí)驗(yàn)可再現(xiàn),全部代碼和數(shù)據(jù)已開(kāi)源(https://github.com/zyj183247166/BugReportDeduplicate)。
重復(fù)缺陷報(bào)告檢測(cè)的核心過(guò)程是比較2份缺陷報(bào)告不同字段內(nèi)容的相似性,主要方法分為4種:
(1)信息檢索方法。
早期的工作主要利用信息檢索方法中的詞袋模型進(jìn)行分析。詞袋模型首先計(jì)算單詞權(quán)重,再將缺陷報(bào)告表示為這些權(quán)重的向量,最后通過(guò)比較向量距離來(lái)判定文本相似性。比如,DupFinder[4]使用詞頻計(jì)算單詞權(quán)重;Hiew[5]則結(jié)合詞頻和逆向文檔頻率TF-IDF(Term Frequency-Inverse Document Frequency)計(jì)算單詞權(quán)重。李寧等人[6]基于n-gram方法構(gòu)建檢測(cè)模型,將n元詞組看作一個(gè)新的單詞,再應(yīng)用詞袋模型。但是,語(yǔ)義相近的單詞,如“StringIndexOutOfBoundsException”與“StringIndexOutOfBounds”,在字面上并不相同。這2個(gè)單詞描述的均是數(shù)組越界錯(cuò)誤,而詞袋模型無(wú)法將它們有效關(guān)聯(lián)。為此,Sureka等人[7]在字符粒度上利用n-gram方法構(gòu)建信息檢索模型。盡管如此,對(duì)于不具有共同前(后)綴的不同字面單詞,如“error”和“bug”,詞袋模型仍無(wú)法建立聯(lián)系。
(2)機(jī)器學(xué)習(xí)與主題模型。
為了提高檢測(cè)的準(zhǔn)確性,Sun等人[8]利用SVM訓(xùn)練出一個(gè)判別式二分類(lèi)器,但其抽取的特征僅僅來(lái)源于缺陷摘要和描述,過(guò)于局限。因此,Sun等人[9]后續(xù)又基于包括優(yōu)先級(jí)、產(chǎn)品版本等多個(gè)域在內(nèi)的信息利用改進(jìn)的BM25F(Best Match 25 models with Fields)算法[10]來(lái)判別缺陷報(bào)告的相似性。改進(jìn)的BM25F算法中,其參數(shù)并非先驗(yàn)設(shè)定,而是在訓(xùn)練數(shù)據(jù)上進(jìn)行學(xué)習(xí)和優(yōu)化得到。Lazar等人[2]則從包括缺陷編號(hào)和缺陷類(lèi)型在內(nèi)的9個(gè)信息域中提取出共計(jì)25種特征來(lái)訓(xùn)練機(jī)器學(xué)習(xí)分類(lèi)模型。
單純分析不同缺陷報(bào)告在字面上的相似性,不夠充分。Nguyen等人[11]采取潛在狄利克雷分布LDA(Latent Dirichlet Allocation)模型對(duì)缺陷報(bào)告進(jìn)行主題建模,比較不同缺陷報(bào)告的主題分布之間的相似性。Alipour等人[12]則構(gòu)建多個(gè)主題詞表。比如,將與可維護(hù)性主題有關(guān)的單詞組合在一起形成列表。接著,基于BM25F算法判定缺陷報(bào)告與多個(gè)主題詞表之間的相似程度,形成一個(gè)向量。對(duì)2份缺陷報(bào)告的這類(lèi)向量計(jì)算余弦距離形成新的特征,稱(chēng)之為語(yǔ)境特征(Contextual Features),將其作為一種新的特征構(gòu)建分類(lèi)模型。Klein等人[13]則將不同缺陷報(bào)告的主題分布之間的海林格距離作為新的特征構(gòu)建分類(lèi)模型。范道遠(yuǎn)等人[14]融合缺陷報(bào)告中非結(jié)構(gòu)化屬性的文本信息與結(jié)構(gòu)化屬性的分類(lèi)信息構(gòu)建檢測(cè)模型,在處理文本信息時(shí)使用了主題模型中的潛在語(yǔ)義索引LSI(Latent Semantic Indexing)算法。LSI算法利用奇異值分解SVD(Singular Value Decomposition)方法將高維矩陣映射到低維空間并抽取出主題信息,相較于LDA模型而言,其計(jì)算簡(jiǎn)單快速,但無(wú)法應(yīng)用于詞和文本非常多的大規(guī)模數(shù)據(jù)庫(kù)。董美含[15]則提出一種基于動(dòng)賓短語(yǔ)和主題模型的相似缺陷報(bào)告識(shí)別方法,通過(guò)抽取動(dòng)賓短語(yǔ)過(guò)濾掉相對(duì)不重要的文本信息,同時(shí)使用LDA模型構(gòu)建描述主題分布的特征向量。蔣欣志[16]則對(duì)比了向量空間模型與LDA主題模型,證實(shí)了主題模型應(yīng)用于重復(fù)缺陷報(bào)告檢測(cè)具有更高的準(zhǔn)確率。
(3)利用附加信息輔助分析。
上述方法或者關(guān)注于缺陷報(bào)告自身,或者抽象出缺陷報(bào)告的主題,但是信息根源仍是缺陷報(bào)告各個(gè)域內(nèi)的字面信息。Wang等人[17]則進(jìn)一步關(guān)注于缺陷發(fā)生時(shí)所記錄的程序執(zhí)行信息,通過(guò)抽取程序執(zhí)行過(guò)程所調(diào)用的方法名稱(chēng),將程序執(zhí)行信息具體化為方法名稱(chēng)的序列并轉(zhuǎn)化為文本表示。然后,程序執(zhí)行信息之間的相似性就可以利用文本相似性分析方法判定。由于部分程序執(zhí)行過(guò)程調(diào)用的方法過(guò)多,會(huì)導(dǎo)致相似性分析過(guò)程的時(shí)間開(kāi)銷(xiāo)較大,Sabor等人[18]先將執(zhí)行序列變?yōu)閚-gram詞組的列表,再轉(zhuǎn)化為固定長(zhǎng)度的稀疏特征向量,最后通過(guò)向量比較完成程序執(zhí)行信息的相似性分析。 除了程序執(zhí)行信息以外,提交缺陷報(bào)告時(shí)附加的屏幕截圖等信息也被用于識(shí)別重復(fù)缺陷報(bào)告[19]。陳俊潔等人[20]則結(jié)合程序特征和文本特征查找編譯器測(cè)試過(guò)程出現(xiàn)的重復(fù)缺陷報(bào)告,程序特征來(lái)源于測(cè)試程序,即能夠?qū)е戮幾g器無(wú)法正常運(yùn)行的被編譯程序。總的來(lái)說(shuō),這些方法的應(yīng)用場(chǎng)景是受限的。對(duì)于不存在附加信息的缺陷報(bào)告,需要對(duì)每個(gè)缺陷進(jìn)行一次重現(xiàn),在操作上復(fù)雜性很高,很難適用于大規(guī)模缺陷庫(kù)。
(4)嵌入表示和深度學(xué)習(xí)模型。
前述方法常用的BM25F算法的前提假設(shè)是文檔中出現(xiàn)的單詞之間沒(méi)有任何關(guān)聯(lián)。顯然,這種假設(shè)與事實(shí)不符。為了分析單詞的上下文信息,Yang等人[21]將由詞嵌入模型word2vec[22]學(xué)習(xí)到的詞嵌入表示(Word Embedding)融入到信息檢索模型中,用于識(shí)別重復(fù)缺陷報(bào)告。樊田田等人[23]先分別用word2vec模型和TF-IDF模型將缺陷報(bào)告表征為稠密向量,再進(jìn)一步計(jì)算查詢(xún)?nèi)毕輬?bào)告與歷史缺陷報(bào)告的相似程度。Budhiraja等人[24]則詳細(xì)對(duì)比了詞嵌入模型、LDA模型和BM25F算法,再次證實(shí)了詞嵌入模型用于識(shí)別相似缺陷報(bào)告的優(yōu)越性。與word2vec不同,文獻(xiàn)[25,26]基于文檔嵌入模型Doc2Vec[3]識(shí)別相似缺陷報(bào)告,相較于word2vec模型取得了準(zhǔn)確率的提升。本文方法同樣使用文檔嵌入模型Doc2Vec,但與文獻(xiàn)[25,26]的方法不同。本文方法將2份缺陷報(bào)告的分布式表示之間的相似度作為一個(gè)新的特征,再將其與重復(fù)缺陷報(bào)告檢測(cè)過(guò)程常用的傳統(tǒng)特征進(jìn)行融合,共同構(gòu)建基于機(jī)器學(xué)習(xí)算法的二元分類(lèi)模型。
后續(xù)研究中,Budhiraja等人[27,28]又針對(duì)基于詞嵌入模型的檢測(cè)方法提出2種優(yōu)化方案。第1種是將單詞的詞嵌入表示結(jié)合單詞的序列共同輸入到全連接深度神經(jīng)網(wǎng)絡(luò)中,通過(guò)自動(dòng)化學(xué)習(xí)缺陷報(bào)告的深度特征,訓(xùn)練出一個(gè)能夠識(shí)別缺陷報(bào)告相似性的二分類(lèi)器[27]。第2種則是先利用LDA模型進(jìn)行初步篩選,縮小候選相似報(bào)告的范圍,再由詞嵌入模型分析候選相似報(bào)告的相似性[28]。喻維[29]則提出一種基于卷積神經(jīng)網(wǎng)絡(luò)的檢測(cè)方法,先使用詞嵌入來(lái)表示每個(gè)單詞,再將向量拼接送入卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練。Deshmukh等人[30]針對(duì)缺陷報(bào)告的元屬性、缺陷摘要和詳細(xì)描述等3方面信息分別使用單層全連接、雙向長(zhǎng)短時(shí)記憶和卷積神經(jīng)網(wǎng)絡(luò)等3種網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行建模和特征提取,并將3個(gè)特征向量拼接起來(lái)得到缺陷報(bào)告的最終向量表示。進(jìn)一步,基于學(xué)習(xí)到的向量表示分別建立檢索模型和分類(lèi)模型:檢索模型基于余弦距離度量2個(gè)報(bào)告的相似性,而分類(lèi)模型則搭建Softmax層完成最終的二分類(lèi)任務(wù)。
本文研究Bugzilla缺陷報(bào)告庫(kù),包括Eclipse、Open Office和NetBeans等開(kāi)源項(xiàng)目的缺陷報(bào)告。針對(duì)存在的重復(fù)缺陷報(bào)告問(wèn)題,本文提出一種融合文本分布式表示的檢測(cè)方法。整體流程包括4個(gè)步驟:數(shù)據(jù)預(yù)處理、文本分布式表示抽取、特征抽取和二元分類(lèi)模型訓(xùn)練與使用。在抽取特征以后,為了避免單一機(jī)器學(xué)習(xí)算法對(duì)本文方法的結(jié)果造成偏差,并充分驗(yàn)證新特征用于重復(fù)缺陷報(bào)告檢測(cè)過(guò)程的有效性,本文使用多種機(jī)器學(xué)習(xí)算法[31]構(gòu)建二元分類(lèi)模型,包括線性支持向量機(jī)(Linear SVM)、核函數(shù)支持向量機(jī)RBF SVM(Radial Basis Function SVM)、K近鄰、決策樹(shù)、隨機(jī)森林和樸素貝葉斯。下面將詳細(xì)介紹另外3個(gè)步驟。
該階段主要針對(duì)缺陷報(bào)告的摘要和描述這2部分非結(jié)構(gòu)化文本,采用常用的自然語(yǔ)言處理方法進(jìn)行數(shù)據(jù)預(yù)處理,包括3步:
(1)分詞:英文語(yǔ)句使用空格將單詞進(jìn)行分隔,據(jù)此將長(zhǎng)文本拆分成單詞和標(biāo)點(diǎn)符號(hào)的列表,并且去除空格和換行等字符。
(2)去除標(biāo)點(diǎn)符號(hào)和停止詞:英文中有許多停止詞和標(biāo)點(diǎn)符號(hào),諸如“to”“the”“.”和“!”等,它們包含很少的信息,而且頻繁出現(xiàn)。為了避免這些無(wú)關(guān)信息對(duì)重復(fù)缺陷報(bào)告檢測(cè)造成影響,本文利用正則表達(dá)式匹配方法去除 “?”和“!”等英文標(biāo)點(diǎn)符號(hào),并根據(jù)英文常用停止詞表去除停止詞。
(3)詞干提?。涸~干是沒(méi)有任何后綴的詞,比如“commander”的詞干是“command”,“raining”的詞干是“rain”。有相同詞干,但是不同表示的詞,在語(yǔ)義上是相近的。本文利用Porter方法(https://tartarus.org/martin/PorterStemmer/)進(jìn)行詞干提取并將各個(gè)詞進(jìn)行簡(jiǎn)化。
經(jīng)過(guò)數(shù)據(jù)預(yù)處理以后,下一步將從處理后的數(shù)據(jù)中抽取文本的分布式表示。
基于詞袋模型的重復(fù)缺陷報(bào)告檢測(cè)方法將缺陷報(bào)告建模為稀疏離散向量,丟失了文本語(yǔ)序信息。為此,本文基于文檔嵌入模型Doc2Vec[3]挖掘文本序列中蘊(yùn)含的深層次語(yǔ)義信息,抽取缺陷報(bào)告的分布式表示。如圖1所示,對(duì)于數(shù)據(jù)預(yù)處理后的缺陷報(bào)告庫(kù),將每份缺陷報(bào)告的摘要和描述拼接成一段文本,形成文本的集合并利用該集合訓(xùn)練Doc2Vec模型,最終將每份缺陷報(bào)告建模為稠密連續(xù)向量,而向量之間的相似度就可以用來(lái)表示缺陷報(bào)告在文本語(yǔ)義上的相似性。
Figure 1 Extracting distributed representations of bug reports using the Doc2Vec model圖1 Doc2Vec模型抽取缺陷報(bào)告的分布式表示
Doc2Vec基于word2vec[22]擴(kuò)展而來(lái)。word2vec是一個(gè)淺層神經(jīng)網(wǎng)絡(luò),包括輸入層、隱藏層和輸出層共3層結(jié)構(gòu),具體包括2種訓(xùn)練模型:連續(xù)詞袋CBOW(Continuous Bag Of Words)模型和Skip-gram模型。前者基于上下文單詞預(yù)測(cè)中心詞,后者則基于中心詞預(yù)測(cè)上下文單詞。word2vec基于給定的輸入單詞,利用初始化參數(shù)的神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)輸出單詞的概率,并與語(yǔ)料庫(kù)中輸入單詞附近真實(shí)出現(xiàn)的單詞進(jìn)行比較,計(jì)算損失值。以降低損失值為目標(biāo)優(yōu)化神經(jīng)網(wǎng)絡(luò)參數(shù),最終學(xué)習(xí)到的詞嵌入表示能夠反映訓(xùn)練語(yǔ)料庫(kù)中單詞出現(xiàn)的統(tǒng)計(jì)規(guī)律,而不同字面單詞的語(yǔ)義相似性便可以用詞嵌入表示之間的向量距離進(jìn)行度量。
為了抽取段落或文檔等長(zhǎng)文本的分布式表示,Doc2Vec在word2vec的基礎(chǔ)上,增加了一個(gè)與詞嵌入向量長(zhǎng)度相等的段落嵌入向量,即結(jié)合段落向量和詞向量共同預(yù)測(cè)目標(biāo)詞的概率分布。Doc2Vec基于Skip-gram模型擴(kuò)展得到分布式詞袋DBOW(Distributed Bag Of Words)模型,基于CBOW模型擴(kuò)展得到分布式記憶DM(Distributed Memory)模型。DM模型較DBOW模型而言,計(jì)算更快速并且更適合于大規(guī)模缺陷報(bào)告庫(kù),所以本文采用此模型。設(shè)定缺陷報(bào)告文本集合的詞典為V,規(guī)模為n,滑動(dòng)窗口為5,某個(gè)中心詞w的上下文單詞集合為C={c1,c2,c3,c4},則CBOW模型與DM模型的結(jié)構(gòu)如圖2所示。
Figure 2 Diagram of the CBOW and DM models圖2 CBOW模型與DM模型示意圖
DM模型初始化詞嵌入矩陣W和段落嵌入矩陣D,然后根據(jù)上下文單詞集合C中的單詞編號(hào)從W中索引出對(duì)應(yīng)的詞嵌入向量,同時(shí)根據(jù)段落編號(hào)從D中索引出段落嵌入向量。將這些向量求和平均后,再與參數(shù)矩陣U進(jìn)行計(jì)算,得到n個(gè)輸出值構(gòu)成的一維向量y。最后經(jīng)過(guò)Softmax層計(jì)算,可以得出當(dāng)前單詞為w的概率:
(1)
其中,yw表示向量y中單詞w對(duì)應(yīng)位置的輸出值。
對(duì)于大規(guī)模缺陷報(bào)告庫(kù),詞典V的規(guī)模n會(huì)很大,會(huì)導(dǎo)致求和平均后向量與矩陣U之間無(wú)法進(jìn)行矩陣乘法運(yùn)算。為此,本文使用負(fù)例采樣方法[32],按照高頻率詞匯有高概率被抽中的原則,從V中抽取部分詞匯并且計(jì)算它們?cè)趛中對(duì)應(yīng)位置的輸出值,然后將輸出值求和后作為式(1)的分母。這樣做的好處是,向量與U的矩陣乘法運(yùn)算,簡(jiǎn)化為了向量與U中部分列向量進(jìn)行點(diǎn)乘運(yùn)算。最后,設(shè)缺陷報(bào)告庫(kù)形成的文本語(yǔ)料為T(mén),在T上用滑動(dòng)窗口不斷取出新的w和C,則DM模型的優(yōu)化目標(biāo)就是最小化損失值:
loss=∑(w,C)∈T-lnp(w|C)
(2)
DM模型在訓(xùn)練過(guò)程中要學(xué)習(xí)到的參數(shù)為矩陣W、D和U。訓(xùn)練結(jié)束后,依據(jù)段落編號(hào)即可從D中抽取出該段落的分布式表示。這里的每個(gè)段落對(duì)應(yīng)每一份缺陷報(bào)告經(jīng)過(guò)數(shù)據(jù)預(yù)處理后的文本內(nèi)容。
Lazer等人[2]將Sun等人[9]提出的缺陷報(bào)告分類(lèi)屬性比對(duì)特征和aric等人[33]提出的文本比對(duì)特征進(jìn)行融合,再構(gòu)建重復(fù)缺陷報(bào)告檢測(cè)模型。本文則在Lazer等人工作的基礎(chǔ)上,將2份缺陷報(bào)告分布式表示的相似度作為一個(gè)新的特征,同已有特征進(jìn)行再一次融合。給定2份缺陷報(bào)告br1和br2,本文用于判定兩者是否重復(fù)所使用的全部特征如表1所示。Lazer等人[2]使用了特征1~特征25,本文融合的新特征編號(hào)為26。
Table 1 Features used for duplicate bug report detection
表1中,WordNet[34]是一個(gè)大規(guī)模的英語(yǔ)詞匯語(yǔ)義網(wǎng),該網(wǎng)絡(luò)將不同單詞基于各種關(guān)系連接起來(lái);詞形還原是指把一個(gè)任何形式的單詞還原為一般形式,同時(shí)保留完整語(yǔ)義,比如將“is”還原為“be”;abs是計(jì)算絕對(duì)值的數(shù)學(xué)函數(shù);版本號(hào)version為“x.y.z”形式時(shí),取數(shù)值x.y作為版本號(hào)的具體值;優(yōu)先級(jí)為“PxNormal”形式時(shí),取數(shù)值x作為優(yōu)先級(jí)的具體值。由于不同特征的值不處于同一量綱,會(huì)影響分類(lèi)模型的準(zhǔn)確性,本文對(duì)抽取后的特征數(shù)據(jù)進(jìn)行歸一化,將所有特征值的范圍縮小到[0,1]。
本節(jié)介紹實(shí)驗(yàn)的數(shù)據(jù)集與實(shí)驗(yàn)過(guò)程。
本文方法在大規(guī)模真實(shí)缺陷報(bào)告數(shù)據(jù)集[1]上進(jìn)行評(píng)測(cè)。該數(shù)據(jù)集來(lái)源于Bugzilla缺陷庫(kù),包括Eclipse、Open Office、NetBeans和Mozilla共4個(gè)項(xiàng)目的缺陷報(bào)告。學(xué)者依據(jù)缺陷報(bào)告的重復(fù)(duplicates)屬性中所記錄的ID號(hào)來(lái)識(shí)別與其存在重復(fù)關(guān)系的其它缺陷報(bào)告,構(gòu)建了重復(fù)缺陷報(bào)告數(shù)據(jù)集(http://alazar.people.ysu.edu/msr14data/)。但是,它只針對(duì)前3個(gè)項(xiàng)目構(gòu)建了重復(fù)缺陷報(bào)告數(shù)據(jù)集,對(duì)Mozilla項(xiàng)目則只提供了原始缺陷報(bào)告。重復(fù)缺陷報(bào)告數(shù)據(jù)集是三元組的集合,每個(gè)三元組記錄一對(duì)缺陷報(bào)告的ID號(hào)和它們之間的重復(fù)關(guān)系(重復(fù)或者不重復(fù))。
經(jīng)過(guò)實(shí)驗(yàn)發(fā)現(xiàn),該數(shù)據(jù)集中存在一定程度的數(shù)據(jù)噪聲。比如,Open Office項(xiàng)目中ID分別為13060和39496的2份重復(fù)缺陷報(bào)告所形成的三元組(13060,39496,1),在數(shù)據(jù)集中共計(jì)出現(xiàn)了6次。除此之外,還有許多三元組在交換2個(gè)ID的順序之后所形成的新元組也在數(shù)據(jù)集中重復(fù)出現(xiàn)。顯然,這些噪聲勢(shì)必影響最后的準(zhǔn)確性評(píng)測(cè)過(guò)程。本文對(duì)這些噪聲進(jìn)行去除,最終用于評(píng)測(cè)的重復(fù)缺陷報(bào)告數(shù)據(jù)集概要見(jiàn)表2。
Table 2 Summary of duplicate bug report datasets for evaluation
在評(píng)測(cè)指標(biāo)方面,本文用4個(gè)指標(biāo)評(píng)價(jià)方法的效果:準(zhǔn)確率(Accuracy)、召回率(Recall)、查準(zhǔn)率(Precision)和調(diào)和平均數(shù)F1。調(diào)和平均數(shù)能夠?qū)φ倩芈屎筒闇?zhǔn)率更接近的模型給予更高的分?jǐn)?shù),而兩者相差很大的模型,往往在實(shí)際應(yīng)用中沒(méi)有足夠的價(jià)值。在Recall、Precision和F1的計(jì)算上,本文更關(guān)注分類(lèi)模型對(duì)重復(fù)類(lèi)別的預(yù)測(cè)能力。4種指標(biāo)的計(jì)算公式分別如式(3)~式(6)所示:
(3)
(4)
(5)
(6)
其中,TP表示重復(fù)缺陷報(bào)告對(duì)被檢測(cè)為重復(fù)關(guān)系的個(gè)數(shù),F(xiàn)P表示非重復(fù)缺陷報(bào)告對(duì)被錯(cuò)判為重復(fù)關(guān)系的個(gè)數(shù),TN表示非重復(fù)缺陷報(bào)告對(duì)被檢測(cè)為非重復(fù)關(guān)系的個(gè)數(shù),F(xiàn)N表示重復(fù)缺陷報(bào)告對(duì)被錯(cuò)判為非重復(fù)關(guān)系的個(gè)數(shù)。
實(shí)驗(yàn)的對(duì)照方法是2014年MSR(Mining Software Repositories)會(huì)議上由Lazer等人[2]提出的方法,該方法在規(guī)模為10 000左右的小型數(shù)據(jù)集上達(dá)到了99%的準(zhǔn)確率。在實(shí)驗(yàn)數(shù)據(jù)集劃分方面,本文采用的方法與Lazer等人[2]的方法保持一致,即針對(duì)Eclipse等3個(gè)項(xiàng)目隨機(jī)抽取5 000個(gè)缺陷報(bào)告對(duì)作為訓(xùn)練集(重復(fù)與非重復(fù)標(biāo)簽數(shù)據(jù)的比例為1∶4),將其余數(shù)據(jù)作為測(cè)試集,并且面向3個(gè)項(xiàng)目分別進(jìn)行模型的訓(xùn)練和測(cè)試。為了保證性能評(píng)測(cè)的穩(wěn)定性,本文采取10次隨機(jī)實(shí)驗(yàn)取平均值的方式,計(jì)算各項(xiàng)評(píng)測(cè)指標(biāo)。在模型參數(shù)的設(shè)置方面,也同Lazer等人的方法保持一致:即利用網(wǎng)格搜索方法確定線性支持向量機(jī)與核函數(shù)支持向量機(jī)RBF SVM在訓(xùn)練集上的最佳參數(shù);至于隨機(jī)森林等其它機(jī)器學(xué)習(xí)模型,則直接使用scikit-learn工具箱的默認(rèn)配置參數(shù)。這樣做主要是為了避免主觀因素對(duì)重復(fù)缺陷報(bào)告檢測(cè)方法的評(píng)測(cè)過(guò)程帶來(lái)偏差。
10次隨機(jī)實(shí)驗(yàn)的某一次實(shí)驗(yàn)中,網(wǎng)格搜索方法確定的支持向量機(jī)模型在訓(xùn)練集上的最佳參數(shù)如表3所示。表3中,P是懲罰系數(shù),即對(duì)誤差的寬容度。P越大,表示越不能容忍誤差,模型容易過(guò)擬合;P越小,表示越容易欠擬合。Gamma是核函數(shù)支持向量機(jī)的一個(gè)參數(shù),決定了數(shù)據(jù)映射到新的特征空間分布后支持向量的個(gè)數(shù)。Gamma越大,支持向量越少;反之,支持向量越多。支持向量的個(gè)數(shù)影響模型的訓(xùn)練速度和準(zhǔn)確率。網(wǎng)格搜索過(guò)程首先為P和Gamma設(shè)定范圍和變化步長(zhǎng),再沿著步長(zhǎng)不斷變化參數(shù)值并在訓(xùn)練集上訓(xùn)練(采取五折交叉驗(yàn)證方式),最后會(huì)根據(jù)五折交叉驗(yàn)證平均準(zhǔn)確率的高低來(lái)確定最優(yōu)參數(shù)的取值。
Table 3 Best parameters for SVM models determined by the grid search
本文基于Python語(yǔ)言進(jìn)行編程和實(shí)驗(yàn),主要步驟包括:
(1)數(shù)據(jù)預(yù)處理。
利用NLTK(Natural Language ToolKit)(http://www.nltk.org)完成分詞、去除標(biāo)點(diǎn)符號(hào)和停止詞,以及詞干抽取等步驟。NLTK是Python解釋器環(huán)境下專(zhuān)門(mén)用于自然語(yǔ)言處理的工具包。
(2)文本分布式表示抽取。
數(shù)據(jù)預(yù)處理后,將缺陷報(bào)告的文本和摘要拼接成段落,并在缺陷報(bào)告庫(kù)的基礎(chǔ)上形成段落的集合,再利用gensim(https://radimrehurek.com/gensim/)實(shí)現(xiàn)Doc2Vec模型,并抽取每份缺陷報(bào)告的分布式表示。
(3)特征抽取。
表1的特征中,特征1~19由工具包TakeLab(http://takelab.fer.hr/)的simple版本生成。TakeLab會(huì)自動(dòng)生成共計(jì)21種特征。本文人工去除其中的2種特征,因?yàn)榻?jīng)過(guò)數(shù)據(jù)歸一化后,所有數(shù)據(jù)的這2種特征的值均相同,即它們對(duì)重復(fù)缺陷報(bào)告檢測(cè)無(wú)任何意義。這2種特征基于文本中的塊索引符號(hào)(Stock Index Symbol)進(jìn)行抽取。塊索引符號(hào)是指在全部字母大寫(xiě)的單詞前有一個(gè)英文點(diǎn)號(hào)“.”的特殊符號(hào),如“.AAA”。
(4)二元分類(lèi)模型的訓(xùn)練與使用。
通過(guò)libsvm工具包(https://www.csie.ntu.edu.tw/~cjlin/libsvm/)實(shí)現(xiàn)支持向量機(jī)模型,包括網(wǎng)格搜索方法確定最佳參數(shù)等。利用scikit-learn工具箱實(shí)現(xiàn)K近鄰、決策樹(shù)、隨機(jī)森林和樸素貝葉斯等其它算法,模型參數(shù)為工具箱的默認(rèn)設(shè)置。
本節(jié)主要分析方法的檢測(cè)性能,對(duì)不同特征用于重復(fù)缺陷報(bào)告分類(lèi)的判別力進(jìn)行評(píng)價(jià),并分析一個(gè)對(duì)照方法無(wú)法檢測(cè)而本文方法能夠檢測(cè)的重復(fù)缺陷報(bào)告實(shí)例。
本文方法與對(duì)照方法在3個(gè)項(xiàng)目重復(fù)缺陷報(bào)告數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果如表4~表6所示,括號(hào)內(nèi)的數(shù)字是本文方法結(jié)果。從表4~表6中可以看出,相較于對(duì)照方法,本文方法在Eclipse、Open Office和NetBeans項(xiàng)目上的F1值分別平均增長(zhǎng)1.38%,2.61%和2.03%(對(duì)表中所有機(jī)器學(xué)習(xí)模型的F1值進(jìn)行求和平均),即在全部數(shù)據(jù)集上平均增長(zhǎng)約2%。在Accuracy等指標(biāo)上,本文方法也均優(yōu)于對(duì)照方法。以核函數(shù)SVM模型為例,相較于對(duì)照方法,本文方法在Eclipse、Open Office和NetBeans項(xiàng)目上的Accuracy值分別增長(zhǎng)1.2%,2.59%和2.5%,即正確分類(lèi)的測(cè)試樣本個(gè)數(shù)分別增長(zhǎng)2 907,2 436和4 514個(gè)(3個(gè)項(xiàng)目的測(cè)試集規(guī)模分別為242 302, 94 086和180 581)。這些結(jié)果充分表明了本文方法優(yōu)于對(duì)照方法。
Table 4 Evaluation results on the Eclipse project (numbers in parentheses are the results of our method)
Table 5 Evaluation results on the Open Office project (numbers in parentheses are the results of our method)
Table 6 Evaluation results on the NetBeans project (numbers in parentheses are the results of our method)
為了進(jìn)一步評(píng)價(jià)本文融入的新特征應(yīng)用于重復(fù)缺陷報(bào)告檢測(cè)中的有效性,本節(jié)對(duì)不同的特征進(jìn)行判別力分析,即判別力越高的特征具有越強(qiáng)的分類(lèi)能力。本文選擇3種常見(jiàn)的判別力分析指標(biāo),即斯皮爾曼(Spearman)相關(guān)性、費(fèi)舍爾(Fisher)得分和信息增益。Spearman相關(guān)系數(shù)用來(lái)反映2個(gè)變量之間的相似度,即判斷特征和類(lèi)別是正相關(guān)、負(fù)相關(guān)還是沒(méi)有相關(guān)程度。Fisher準(zhǔn)則的主要思想是判別力較強(qiáng)的特征表現(xiàn)為類(lèi)內(nèi)方差盡可能小而類(lèi)間方差盡可能大。某個(gè)特征的Fisher得分即為該特征在樣本集上的類(lèi)間方差和類(lèi)內(nèi)方差的比值。信息增益用于測(cè)度某個(gè)特征為分類(lèi)模型貢獻(xiàn)的信息量,信息增益越大說(shuō)明該特征越重要。所有指標(biāo)均為3個(gè)項(xiàng)目數(shù)據(jù)集上分別計(jì)算以后,再進(jìn)行求和平均,不同特征的判別力如表7所示。從表7中可以看出,除了在Fisher得分上新特征僅次于特征20,本文融入的新特征在判別力上排名最優(yōu)。特征20的計(jì)算結(jié)果見(jiàn)表7,即如果2份缺陷報(bào)告描述同一個(gè)產(chǎn)品,則特征值為1,否則為0。此外,從Spearman相關(guān)性中可以看到,基于版本與ID分別抽取的特征24和25,與分類(lèi)屬性呈現(xiàn)負(fù)相關(guān),從統(tǒng)計(jì)意義上表明,2份缺陷報(bào)告的版本號(hào)相差越大,或者ID相差越多,重復(fù)的可能性越小。
Table 7 Features’ discriminative performance
本文方法融入文本分布式表示來(lái)分析段落之間的語(yǔ)義相似性,這一點(diǎn)對(duì)于檢測(cè)字面相似度較低的重復(fù)缺陷報(bào)告尤為重要。表8是Lazer等人方法無(wú)法檢測(cè)而本文方法能夠檢測(cè)到的一個(gè)重復(fù)缺陷報(bào)告示例。從表8中可以看出,2份缺陷報(bào)告描述的是同一缺陷,即NetBeans 6.X版本的Local Variables窗口和Watches窗口無(wú)法顯示。2份缺陷報(bào)告由不同人提交,在大部分屬性上相同,而在產(chǎn)品和組件屬性上均不相同,在摘要和描述上也存在較大的字面差異,尤其在使用換行符、標(biāo)點(diǎn)符號(hào)和語(yǔ)言風(fēng)格等方面相差較大。比如,2份缺陷報(bào)告分別用Netbeans和NB描述NetBeans。該實(shí)例表明文本分布式表示能夠較好地適應(yīng)這種字面變化,再一次說(shuō)明了本文方法的有效性。
Table 8 An example of duplicate bug report detected表8 檢測(cè)到的重復(fù)缺陷報(bào)告示例
本文提出了一種融合文本分布式表示的重復(fù)缺陷報(bào)告檢測(cè)方法,通過(guò)抽取缺陷報(bào)告的分布式表示,將2份缺陷報(bào)告分布式表示的相似性作為一種新特征同傳統(tǒng)特征進(jìn)行融合之后再訓(xùn)練機(jī)器學(xué)習(xí)分類(lèi)模型,能夠更好地適應(yīng)重復(fù)缺陷報(bào)告在摘要和描述等非結(jié)構(gòu)化屬性上的復(fù)雜字面變化。相較于未使用分布式表示的檢測(cè)方法,具有一定程度的優(yōu)勢(shì)。本文方法在真實(shí)項(xiàng)目的大規(guī)模重復(fù)缺陷報(bào)告數(shù)據(jù)集上進(jìn)行了評(píng)測(cè),并與代表性方法D_TS進(jìn)行了比較,評(píng)測(cè)結(jié)果顯示了本文方法的有效性。