亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        一種基于深度學(xué)習(xí)的上帝類檢測方法?

        2019-06-11 07:39:50卜依凡李光杰
        軟件學(xué)報(bào) 2019年5期
        關(guān)鍵詞:分類器代碼上帝

        卜依凡,劉 輝,李光杰

        (北京理工大學(xué) 計(jì)算機(jī)學(xué)院,北京 100081)

        隨著產(chǎn)品需求的不斷變更,在程序設(shè)計(jì)之初設(shè)計(jì)好的代碼框架需要不斷調(diào)整以實(shí)現(xiàn)功能的變更.長此以往,程序?qū)⒅饾u偏離原有的框架,使得整個(gè)程序混亂不堪,難以進(jìn)行擴(kuò)展和維護(hù).為此,人們提出了軟件重構(gòu)以對此類軟件進(jìn)行優(yōu)化,在不改變其軟件外部特性的情況下提高軟件的設(shè)計(jì)質(zhì)量,進(jìn)而提高軟件的可維護(hù)性和可擴(kuò)展性[1].多年來,在開發(fā)過程中的實(shí)踐與應(yīng)用表明[1-3],代碼重構(gòu)在提升程序的可讀性和可維護(hù)性等方面都有著顯著的作用.通過對系統(tǒng)結(jié)構(gòu)的重新整理,開發(fā)人員不僅可以改進(jìn)原有的系統(tǒng)設(shè)計(jì)、延長軟件的生命周期,還能夠通過改善代碼邏輯來增強(qiáng)代碼理解,有助于從中發(fā)現(xiàn)程序缺陷[4].

        軟件重構(gòu)的關(guān)鍵步驟之一是明確需要重構(gòu)的代碼片段[4].而為了幫助開發(fā)人員確定需在程序中的何處進(jìn)行重構(gòu)操作,Fowler等人提出了代碼壞味(code smell)的概念[4],意指軟件系統(tǒng)中影響軟件質(zhì)量的設(shè)計(jì)問題.Fowler等人一共提出了22種代碼壞味,包括克隆代碼、特征依戀、長方法等.基于此定義,研究人員提出了一系列自動(dòng)或半自動(dòng)的方法,以從代碼中檢測這些代碼壞味[5-8].代碼壞味的概念及其檢測方法極大地推動(dòng)了自動(dòng)化軟件重構(gòu)的應(yīng)用和推廣,成為軟件重構(gòu)領(lǐng)域的重要研究熱點(diǎn)和研究難點(diǎn).

        本文針對上帝類進(jìn)行深入研究,研究其自動(dòng)化的檢測方法.上帝類是一種常見的代碼壞味,指的是某個(gè)承擔(dān)了本應(yīng)由多個(gè)類分別承擔(dān)的多個(gè)職責(zé)的類[9].上帝類違背了分而治之的基本思想以及單一職責(zé)的設(shè)計(jì)原則,嚴(yán)重影響軟件的可維護(hù)性和可理解性[4].對于上帝類的出現(xiàn),Fowler等人推薦使用提取類(extract class)或提取子類(extract subclass)等重構(gòu)操作,將一個(gè)大類拆分為小類,以提取出過大類中的一部分職責(zé).為了提醒程序員及時(shí)處理上帝類,研究人員提出了眾多檢測算法以自動(dòng)判定某個(gè)給定的類是否為上帝類[5-7,10].現(xiàn)有的檢測算法主要基于代碼行數(shù)、圈復(fù)雜度、內(nèi)聚度等常見的軟件度量來判定給定的類是否為上帝類[11].不同的檢測方法往往采用不同的度量項(xiàng),使用不同的閾值[12-14],因此,不同檢測方法間的檢測結(jié)果往往存在較大的差異[5].此外,現(xiàn)有檢測方法的查全率和查準(zhǔn)率偏低,導(dǎo)致程序員這些檢測方法和檢測工具難以在工業(yè)界廣泛使用.

        為此,本文提出了一種基于深度神經(jīng)網(wǎng)絡(luò)的上帝類檢測方法.該方法不僅利用了常見的軟件度量,而且充分利用了代碼中的文本信息,意圖通過挖掘文本語義揭示每個(gè)類所承擔(dān)的主要角色.此外,本方法將深度學(xué)習(xí)技術(shù)應(yīng)用于上帝類的檢測.深度學(xué)習(xí)在計(jì)算機(jī)視覺、自然語言處理等領(lǐng)域經(jīng)過廣泛的實(shí)踐,得到了很大的發(fā)展.與傳統(tǒng)的機(jī)器學(xué)習(xí)相比,深度學(xué)習(xí)可以更容易地捕捉到輸入數(shù)據(jù)中的深層關(guān)聯(lián),經(jīng)過多層映射和抽象,擬合出更符合輸入數(shù)據(jù)分布的模型.本文利用深度神經(jīng)網(wǎng)絡(luò)在文本處理方面的特長,將文本信息加入對上帝類的驗(yàn)證中,同時(shí)結(jié)合與上帝類在耦合度、內(nèi)聚度、類規(guī)模等屬性相關(guān)的多個(gè)度量項(xiàng),以深度學(xué)習(xí)善于自動(dòng)選擇原始數(shù)據(jù)特征的優(yōu)勢,幫助提取出這些度量項(xiàng)之間的相互關(guān)聯(lián),從而綜合評判待檢測程序是否應(yīng)為上帝類代碼壞味.

        有監(jiān)督的深度學(xué)習(xí)通常需要大量的標(biāo)記數(shù)據(jù)來作為訓(xùn)練樣本,但手工標(biāo)記上帝類樣本數(shù)據(jù)需要消耗大量的人工,難以收集足夠的訓(xùn)練樣本.為此,本文提出了一種借助開源項(xiàng)目源碼來構(gòu)建標(biāo)簽數(shù)據(jù)集的方法.通過預(yù)定義的類合并操作,實(shí)現(xiàn)上帝類樣本的自動(dòng)生成和標(biāo)注.考慮到Github,SourceForge等開源網(wǎng)站上有海量開源程序,該方法可以自動(dòng)構(gòu)造海量的帶標(biāo)簽的正負(fù)訓(xùn)練樣本,從而為基于深度學(xué)習(xí)的上帝類檢測奠定了基礎(chǔ).

        最后,對本文所提出的上帝類自動(dòng)檢測方法進(jìn)行了實(shí)驗(yàn)驗(yàn)證.在第三方開源數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果表明,該方法優(yōu)于現(xiàn)有的檢測方法.在不降低查準(zhǔn)率的前提下,較大幅度地提高了上帝類檢測的查全率(35.58%=95.56%-59.98%),最終綜合提高了上帝類壞味檢測的F1值(2.39%=8.15%-5.76%).

        本文第1節(jié)介紹相關(guān)研究的現(xiàn)狀,并對此進(jìn)行總結(jié)與分析.第2節(jié)具體介紹本文提出的上帝類檢測方法.第3節(jié)對所提出的方法進(jìn)行驗(yàn)證與評估.第4節(jié)進(jìn)行總論和展望.

        1 相關(guān)工作

        1.1 上帝類

        Fowler等人提出了代碼壞味的概念,并列出數(shù)十種常見的代碼壞味.其中,大類(large class)是承擔(dān)太多職責(zé)而變得臃腫的類.Fowler等人認(rèn)為,這樣的類不僅會(huì)增加類中代碼的理解難度,同時(shí)也容易導(dǎo)致其他代碼壞味的出現(xiàn)[1].Brown等人引入了設(shè)計(jì)反模式(antipattern)的概念來代指在程序設(shè)計(jì)過程中所出現(xiàn)的設(shè)計(jì)缺陷[15].Blob Class是典型的反模式.當(dāng)單個(gè)類中包含超過 60個(gè)成員變量及方法時(shí),Brown等人認(rèn)為此類違反了單一職責(zé)原則,應(yīng)該對其進(jìn)行重構(gòu).在此之后,Lanza等人正式提出了上帝類(god class)的概念,表示某些對外部數(shù)據(jù)操縱過多的類,并指出,這些類通常還會(huì)出現(xiàn)類內(nèi)成員間內(nèi)聚較低或類內(nèi)復(fù)雜度過高的問題[9].大類、Blob Class以及上帝類本質(zhì)上類似,都是指某個(gè)類承擔(dān)了過多的職責(zé),從而導(dǎo)致該類過于復(fù)雜、缺乏內(nèi)聚等問題.

        研究者們迄今已提出了多種方法來對這樣一些在項(xiàng)目中承擔(dān)過多職責(zé)的類進(jìn)行檢測與重構(gòu).Marinescu等人提出一種基于度量值指標(biāo)的方法來確定對包括上帝類在內(nèi)的 14種代碼壞味的檢測策略,并將此方法實(shí)現(xiàn)為工具 iPlasma[6].他們根據(jù)各代碼壞味的特征與定義選擇不同的度量項(xiàng)組合,以預(yù)設(shè)閾值的方式為各個(gè)壞味確定不同的檢測方案.如公式(1)所示,iPlasma將類內(nèi)圈復(fù)雜度(weighted method count,簡稱WMC)、類內(nèi)內(nèi)聚度(tight capsule cohesion,簡稱TCC)和對外訪問數(shù)(Access to foreign data,簡稱ATFD)這3個(gè)度量值綜合起來以實(shí)現(xiàn)對上帝類的判斷.

        其中,few、very_high以及one_third均為常量.當(dāng)一個(gè)類的3個(gè)度量值同時(shí)滿足上述條件時(shí),iPlasma會(huì)將其判定為上帝類.

        Moha等人定義了一種領(lǐng)域特定語言(domain-specific language,簡稱DSL),并利用這種語言對代碼壞味檢測規(guī)則進(jìn)行定義,以此形成了方法 DéCOR[7].通過對各類壞味的概念進(jìn)行文本分析,DéCOR將代碼壞味的定義轉(zhuǎn)化為以這種DSL語言表示的壞味檢測算法,在將其給定的算法實(shí)現(xiàn)為真正的程序后,便可以完成對于此代碼壞味的檢測.DéCOR在利用NMD,NAD和LCOM5等度量項(xiàng)來定義對于上帝類的檢測規(guī)則的基礎(chǔ)上,還綜合了一些文本信息來輔助其判斷,如當(dāng)類名中出現(xiàn)“Process”“Control”“Ctrl”等字樣時(shí),即說明此類為上帝類的可能性相對較大.

        Tsantalis等人提出了一種利用杰卡德距離來衡量兩個(gè)代碼實(shí)體之間相似性的方法,并以此方法為基礎(chǔ)實(shí)現(xiàn)了用于檢測代碼壞味的工具 JDeodorant.其最初用于檢測特征依戀(feature envy)代碼壞味并推薦移動(dòng)方法(move method)的重構(gòu)方案[8],在之后,則逐步增加了對于另外4種壞味——重復(fù)代碼(duplicated code)、switch語句(type checking/SwitchStatement)[16]、長方法(long method)[17]以及上帝類[10]——的檢測與重構(gòu)推薦.JDeodorant為類中的每個(gè)成員生成與之相關(guān)的其他成員集合(entity set),即訪問此成員以及被此成員訪問的其他成員的集合.他們將兩個(gè)成員之間的距離定義為其相關(guān)成員集合間的杰卡德距離,計(jì)算方式如公式(2)所示.

        其中,mi為類中所聲明的一個(gè)成員,Se則為成員e的相關(guān)成員集合.基于此距離度量項(xiàng),JDeodorant可以由此定義一個(gè)類內(nèi)的各個(gè)成員之間的節(jié)點(diǎn)距離,從而為被檢測類構(gòu)建一個(gè)以類內(nèi)成員為節(jié)點(diǎn)的樹狀圖層次結(jié)構(gòu),再根據(jù)所需閾值,對樹狀圖進(jìn)行橫向切割[10].一旦樹狀圖可以被切割為多個(gè)節(jié)點(diǎn)簇,則說明此類存在進(jìn)行提取類重構(gòu)操作的必要性,即可判定此類是一個(gè)上帝類.隨后,鐘林輝等人在 JDeodorant的基礎(chǔ)上對杰卡德距離進(jìn)行了擴(kuò)展,公式如下.

        其中,mi為類中聲明的第i個(gè)成員,n為類中的全部成員個(gè)數(shù).他們利用擴(kuò)展的杰卡德距離實(shí)現(xiàn)了一種改進(jìn)的層次聚類重構(gòu)方式,以彌補(bǔ)原方法難以衡量全局范圍內(nèi)的成員相似性的缺陷[18].

        綜上所述,上述檢測方法主要依賴于不同的代碼度量項(xiàng)(structural metrics)以及相應(yīng)的閾值來判定某個(gè)類是否為上帝類.不同的檢測方法往往采用不同的度量項(xiàng),使用不同的閾值[5,13,14],因此,不同檢測方法的檢測結(jié)果往往存在較大的差異[5].此外,現(xiàn)有檢測方法的查全率和查準(zhǔn)率偏低,導(dǎo)致這些檢測方法和檢測工具難以在工業(yè)界廣泛使用.

        1.2 基于機(jī)器學(xué)習(xí)的上帝類壞味檢測

        隨著機(jī)器學(xué)習(xí)的演進(jìn)與發(fā)展,研究者們提出了一批基于各類機(jī)器學(xué)習(xí)算法的代碼壞味檢測方法.Kreimer在2005年時(shí)提出了一種基于決策樹(decision tree)的對大類和長方法兩種代碼壞味的檢測方法[19].Khomh等人利用貝葉斯信念網(wǎng)絡(luò)(Bayesian belief network)實(shí)現(xiàn)了對上帝類相關(guān)反模式的檢測[20].Maiga等人則實(shí)現(xiàn)了基于支持向量機(jī)(support vector machine,簡稱SVM)的上帝類檢測方法[21].Palomba等人提出了一種基于信息檢索技術(shù)(information retrieval,簡稱 IR)來利用程序中的文本信息進(jìn)行壞味檢測的方法[22].類似的,馬賽等人嘗試了利用潛在語義分析技術(shù)來對上帝類進(jìn)行檢測[23].Fontana等人匯總了幾種常見的機(jī)器學(xué)習(xí)算法(J48,JRip,ERandom Forest,Baive Bayes,SMO以及LibSVM)來共同檢測各類代碼壞味,以便比較并總結(jié)不同算法在代碼壞味檢測領(lǐng)域中的表現(xiàn)與差異[24].

        有別于基于傳統(tǒng)機(jī)器學(xué)習(xí)的壞味檢測方法,本文充分利用了最新的深度學(xué)習(xí)技術(shù),能夠?qū)W習(xí)更加復(fù)雜的邏輯關(guān)系.此外,本文不僅利用了軟件度量信息,也使用了代碼中的文本信息以挖掘給定類所承擔(dān)的角色.最后,在訓(xùn)練集的收集方面,現(xiàn)有方法主要依賴于手工收集訓(xùn)練數(shù)據(jù),而本文提出了標(biāo)簽訓(xùn)練數(shù)據(jù)自動(dòng)生成方法.

        2 上帝類檢測方法

        為了自動(dòng)檢測上帝類,本文提出了一種基于深度學(xué)習(xí)的檢測方法.第 2.1節(jié)給出本文所提出方法的概覽介紹,之后的各小節(jié)將詳細(xì)介紹該方法的各個(gè)關(guān)鍵步驟.

        2.1 方法概述

        本文提出的基于深度學(xué)習(xí)的上帝類檢測方法如圖1所示.首先,利用大量的開源軟件項(xiàng)目工程作為代碼語料庫,實(shí)現(xiàn)了一種可以自動(dòng)生成標(biāo)簽樣本的工具來生成深度學(xué)習(xí)訓(xùn)練所需的大規(guī)模數(shù)據(jù)集.此工具基于如下假設(shè):若認(rèn)定開源項(xiàng)目的現(xiàn)有設(shè)計(jì)合理,那么若將其中的兩個(gè)類合并為一個(gè)類,則可以認(rèn)為這個(gè)大類承擔(dān)了兩個(gè)類的職責(zé).因此,本工具在不改變類的外部行為的前提下,通過盡可能多地對源碼中的類進(jìn)行兩兩合并以形成大類正樣本集合,隨后,從其余未參加合并的類中隨機(jī)抽取出相應(yīng)數(shù)目的類作為負(fù)樣本集合.為了盡可能保留代碼中與上帝類代碼壞味相關(guān)的特征,從正負(fù)樣本集中分別提取出符合預(yù)設(shè)輸入格式的文本信息與軟件度量作為神經(jīng)網(wǎng)絡(luò)分類器的輸入,分類器的預(yù)期輸出為樣本的標(biāo)簽(即是否為上帝類).經(jīng)過多次迭代訓(xùn)練后,可以得到最終被訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)分類器.對于給定的待測程序,首先提取每個(gè)待測試類的文本信息和軟件度量.將此信息依次輸入訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)分類器,得到最終的檢測結(jié)果.后續(xù)章節(jié)將依次介紹每個(gè)關(guān)鍵步驟的具體細(xì)節(jié).

        Fig.1 Overview of the god class detection based on deep learning圖1 基于深度學(xué)習(xí)的上帝類代碼壞味檢測方法概圖

        2.2 神經(jīng)網(wǎng)絡(luò)的輸入

        由于直接以全部代碼文本作為深度神經(jīng)網(wǎng)絡(luò)分類器的輸入時(shí)所要求的模型學(xué)習(xí)難度過大,我們需要對代碼文本進(jìn)行一部分的預(yù)處理操作,從代碼文本中提取出與上帝類代碼壞味相關(guān)的特征集合,并且摒棄一部分就本學(xué)習(xí)任務(wù)而言無價(jià)值的無關(guān)特征,以便降低模型構(gòu)建的難度.為了在充分利用代碼中的各類特征與信息時(shí)避免因特征過多而導(dǎo)致的維度爆炸,我們經(jīng)過反復(fù)考量與對比,選取了數(shù)個(gè)與上帝類代碼結(jié)構(gòu)相關(guān)的代碼度量項(xiàng)作為神經(jīng)網(wǎng)絡(luò)分類器的軟件度量特征;同時(shí),從代碼中提取了部分相關(guān)標(biāo)識(shí)符來作為神經(jīng)網(wǎng)絡(luò)分類器的文本信息特征.然而,盡管已剔除了一部分的無關(guān)特征與冗余特征,這些原始特征彼此間的相互關(guān)聯(lián)以及輸入特征與輸出標(biāo)簽間的潛在映射關(guān)系依然需要進(jìn)一步地分析.因此,我們利用了神經(jīng)網(wǎng)絡(luò)分類器來對原始特征進(jìn)行映射與學(xué)習(xí),以便最終輸出與樣本標(biāo)簽所對應(yīng)的分類結(jié)果.

        軟件度量信息是代碼壞味檢測研究中常用的判斷依據(jù).我們綜合了12個(gè)可以在不同方面體現(xiàn)上帝類特征的代碼度量項(xiàng),基本涵蓋上帝類代碼壞味結(jié)構(gòu)特征的各個(gè)方面,以期能夠在耦合度、內(nèi)聚度、復(fù)雜度以及代碼規(guī)模等方面更全面地表示代碼的結(jié)構(gòu)特征.表1為所選度量項(xiàng)的詳細(xì)信息.

        Table 1 Metrics表1 度量項(xiàng)

        此外,我們收集了被檢測類中所聲明的各成員標(biāo)識(shí)符來作為輸入的一部分.Arnaoudova等人的研究表明,有意義的標(biāo)識(shí)符可以有效揭示代碼組件在程序中的角色、行為與功能[25].一個(gè)類中的各個(gè)成員通過完成各自的功能,共同構(gòu)成其所在類的對外行為與角色,故可以認(rèn)為在理想情況下,存在于一個(gè)類中的多個(gè)成員標(biāo)識(shí)符之間應(yīng)該存在著語義上的相互關(guān)聯(lián).因此,我們將這種隱含在標(biāo)識(shí)符內(nèi)的語義關(guān)聯(lián)作為衡量被檢測類內(nèi)聚度的一個(gè)重要依據(jù),并結(jié)合上述的軟件度量指標(biāo),組成了本文所提出方法的輸入,如公式(4)所示.

        其中,mi為被檢測類中聲明的第i個(gè)方法或?qū)傩?name(mi)為mi的標(biāo)識(shí)符,metrics則為12個(gè)度量項(xiàng)的集合.

        2.3 標(biāo)識(shí)符的表示方式

        為了能夠挖掘標(biāo)識(shí)符之間的深層語義關(guān)聯(lián),我們利用Mikolov等人提出的著名詞向量化模型Word2Vector將標(biāo)識(shí)符中的詞語映射到高緯向量空間[26,27],以詞向量在高維空間中的分布來揭示詞與詞之間的相似性關(guān)系.作為自然語言處理領(lǐng)域的重要工具,Word2Vector構(gòu)建了一個(gè)以給定的文本作為輸入輸出的神經(jīng)網(wǎng)絡(luò).在進(jìn)行訓(xùn)練之后,可以利用此模型的隱含層將詞語轉(zhuǎn)化為稠密向量,實(shí)現(xiàn)以向量相似性來表示語義相似性的目的.我們利用大量項(xiàng)目源碼作為代碼語料庫,對Word2Vector模型進(jìn)行訓(xùn)練,構(gòu)建了一個(gè)針對程序語言的向量空間.隨后,根據(jù)如下步驟對將作為神經(jīng)網(wǎng)絡(luò)分類器輸入的各標(biāo)識(shí)符分別進(jìn)行預(yù)處理.

        (1) 根據(jù)駝峰命名法規(guī)則(camel case)和下劃線命名法規(guī)則對標(biāo)識(shí)符進(jìn)行分詞,將單個(gè)標(biāo)識(shí)符拆分為多個(gè)邏輯單字.

        (2) 利用已訓(xùn)練好的 Word2Vector模型將各邏輯單字分別映射為高維空間中固定長度(200維)的詞嵌入向量(word embedding).

        (3) 將單個(gè)標(biāo)識(shí)符中包含的各分詞向量相加后取均值構(gòu)成一個(gè)新的詞向量,以作為此標(biāo)識(shí)符在向量空間中的表示[28].

        針對訓(xùn)練過程所用的12個(gè)項(xiàng)目源碼進(jìn)行的統(tǒng)計(jì)分析表明,訓(xùn)練集中95.8%的類中不會(huì)聲明超過50個(gè)成員.因此,出于神經(jīng)網(wǎng)絡(luò)的設(shè)計(jì)需要,我們將神經(jīng)網(wǎng)絡(luò)輸入中的單個(gè)樣本的標(biāo)識(shí)符個(gè)數(shù)固定在 50個(gè),即只針對被檢測類中所聲明的前50個(gè)成員進(jìn)行預(yù)處理,類中成員數(shù)少于50個(gè)則以全零向量來做補(bǔ)零擴(kuò)展.

        2.4 基于深度神經(jīng)網(wǎng)絡(luò)的分類器

        本文所提出的基于深度神經(jīng)網(wǎng)絡(luò)的分類器結(jié)構(gòu)如圖2所示.

        Fig.2 Classifier based on neural network圖2 神經(jīng)網(wǎng)絡(luò)分類器

        如上文所述,此分類器的輸入分為文本輸入與度量輸入兩部分.文本輸入由類中的成員標(biāo)識(shí)符組成,類中的成員標(biāo)識(shí)符在經(jīng)過預(yù)處理(詳見第2.3節(jié))后,已經(jīng)由文本信息轉(zhuǎn)為數(shù)值信息,將以詞向量(輸入形式為50×200矩陣)的形式經(jīng)過輸入數(shù)據(jù)屏蔽層(masking,mask_value=0)進(jìn)入長短時(shí)記憶網(wǎng)絡(luò)(long short-term memory,簡稱LSTM)中,其中,LSTM 層激活函數(shù)為 sigmoid函數(shù),輸出維度為 2,并對該層權(quán)重做均勻分布(uniform)初始化.長短時(shí)記憶網(wǎng)絡(luò)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(recurrent neural network,簡稱RNN)的變體,通過規(guī)避梯度消失問題彌補(bǔ)了循環(huán)神經(jīng)網(wǎng)絡(luò)長期記憶失效的缺陷[29],因而在自然語言處理領(lǐng)域中獲得了充分應(yīng)用.我們希望利用長短時(shí)記憶網(wǎng)絡(luò)善于從長序列中提取關(guān)鍵語義特征的優(yōu)勢來對所輸入的多個(gè)標(biāo)識(shí)符詞向量進(jìn)行處理,以幫助分類器分析被檢測類在語義上的內(nèi)聚性.度量輸入體現(xiàn)了被檢測類的結(jié)構(gòu)特征.通過將從類中提取出的12個(gè)度量值輸入全連接層(dense),分類器可以在有監(jiān)督的情況下對輸入進(jìn)行迭代訓(xùn)練,逐步調(diào)整出與訓(xùn)練集標(biāo)簽最匹配的參數(shù)組合,其中,本全連接層激活函數(shù)為 tanh函數(shù),輸出維度為 12,并對本層權(quán)重做均勻分布(uniform)初始化.之后,兩部分?jǐn)?shù)據(jù)會(huì)經(jīng)由融合層(merge)以向量拼接(concatenate,axis=-1)的形式合并,再由一層全連接層映射到最終的Sigmoid輸出層,此間的全連接層激活函數(shù)為tanh函數(shù),輸出維度為4,權(quán)重初始化為全零矩陣(zero);輸出層激活函數(shù)為sigmoid函數(shù),輸出維度為1.最終選取的模型損失函數(shù)(loss function)為binary_crossentropy函數(shù),優(yōu)化器(optimizer)為adam自適應(yīng)方法,迭代次數(shù)(epoch)為10次,批尺寸(batch_size)為5.

        2.5 訓(xùn)練集的生成方式

        深度神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)決定了其對于訓(xùn)練樣本數(shù)量的要求.為了防止出現(xiàn)過擬合現(xiàn)象,我們需要大量的數(shù)據(jù)樣本來幫助提高神經(jīng)網(wǎng)絡(luò)的泛化能力.對此,我們提出一種通過合并類操作來自動(dòng)構(gòu)建標(biāo)簽樣本集的工具來輔助收集上節(jié)所述分類器在訓(xùn)練過程中所需的樣本集.在項(xiàng)目源碼可編譯的前提下,我們可以利用本樣本生成工具源源不斷地生成分類器所需的正負(fù)樣本,以及從所生成的樣本集中提取神經(jīng)網(wǎng)絡(luò)分類器所需要的全部特征輸入.利用本工具來幫助收集帶標(biāo)簽的訓(xùn)練樣本集,可以省去人工識(shí)別上帝類代碼壞味時(shí)所需要耗費(fèi)的大量時(shí)間和人力.由于此工具實(shí)現(xiàn)了自動(dòng)的樣本生成和特征提取預(yù)處理操作,因此只要能夠獲取到優(yōu)質(zhì)的可編譯開源項(xiàng)目資源,整個(gè)訓(xùn)練樣本的生成及特征提取過程均不需要人工干預(yù).在這樣的前提下,以互聯(lián)網(wǎng)中基數(shù)龐大的開源項(xiàng)目為基礎(chǔ),原則上我們可以利用此工具獲取到足夠充足的上帝類標(biāo)簽樣本集.

        假設(shè)某個(gè)程序的現(xiàn)有設(shè)計(jì)是合理的,那么將其中的兩個(gè)類合并成一個(gè)大類則是不合理的.這個(gè)合并起來的大類承擔(dān)本該由多個(gè)類一起承擔(dān)的多個(gè)角色,因此是一個(gè)上帝類.基于此,我們利用開源的高質(zhì)量代碼自動(dòng)構(gòu)造上帝類的正樣本.為了保證合并后大類的外部行為與合并之前保持一致,我們會(huì)在將兩類合并的基礎(chǔ)上盡可能不對兩類源碼進(jìn)行修改.

        如算法 1所示,在獲取到可編譯的開源項(xiàng)目源碼后,為了在最大化節(jié)省樣本生成時(shí)間的基礎(chǔ)上秉持多多益善的原則盡可能多地生成訓(xùn)練集正樣本,我們會(huì)對項(xiàng)目內(nèi)的各編譯單元進(jìn)行 3次篩選,以確定最終可用于生成訓(xùn)練樣本集的編譯單元集合.

        算法1.類型合并前后的判斷邏輯.

        3次篩選的具體實(shí)現(xiàn)步驟如下.

        (1) 第 1次篩選是對單個(gè)編譯單元中的頂層類進(jìn)行判斷,主要目的是篩選出能夠進(jìn)行合并操作的常規(guī)Class類.

        (2) 隨后,我們將對剩余的編譯單元集合進(jìn)行兩兩配對并開始第 2次篩選,這次篩選為初步判斷配對后的兩個(gè)編譯單元是否可以在不導(dǎo)致語法錯(cuò)誤的前提下進(jìn)行合并,如判斷兩個(gè)類中是否存在成員名沖突,或兩個(gè)類是否繼承于不同的父類.

        (3) 一對編譯單元如果可以通過上述判斷,便對此二者實(shí)現(xiàn)合并類操作,以得到最終需要的大類.此時(shí)進(jìn)行第3次篩選,用以確定此次合并類操作沒有導(dǎo)致任何的程序錯(cuò)誤與外部行為變化.

        兩個(gè)類C1和C2的合并類算法如下.

        (1) 生成一個(gè)空的新類(NewClass),并C1和C2中的模塊導(dǎo)入語句(import statement)以及全部的成員聲明語句都遷移至NewClass類內(nèi).

        (2) 在整個(gè)工程中搜索C1和C2以屬性類型、方法參數(shù)類型、方法返回類型等一系列形式出現(xiàn)在工程中其他類中的情況,將這些類中的C1和C2類型替換為NewClass類型.

        (3) 刪除工程中的C1和C2類.此時(shí),整個(gè)工程中全部與C1和C2相關(guān)的代碼均已被 NewClass替換,NewClass徹底取代了C1和C2類在此系統(tǒng)中的角色與職責(zé).

        我們將通過3次篩選的NewClass定義為人為注入的代碼壞味,由此便可以計(jì)算NewClass的12個(gè)度量值.根據(jù)第2.2節(jié)中所設(shè)計(jì)的輸入格式收集到所需數(shù)據(jù)后,我們即可導(dǎo)出以下格式的訓(xùn)練集正樣本.

        為了獲取負(fù)樣本集合,我們將經(jīng)過第1次篩選的編譯單元集合定義為全集collection,將可成功合并為大類的類的集合定義為集合posCollection,由此可定義posCollection在collection上的補(bǔ)集為negCollection,即

        假設(shè)某個(gè)程序的現(xiàn)有設(shè)計(jì)是合理的,那么negCollection中任意一個(gè)類都是上帝類的負(fù)樣本.為保證訓(xùn)練效果,我們從每個(gè)開源程序中收集的正負(fù)樣本的比例控制在 1:1.為了保證訓(xùn)練集負(fù)樣本的典型性以及此樣本生成工具設(shè)計(jì)思路的合理性,我們從negCollection中隨機(jī)抽取一個(gè)與正樣本集合樣本容量相同的集合,并入最終的帶標(biāo)簽的訓(xùn)練樣本.

        3 實(shí)驗(yàn)驗(yàn)證

        為了對所提出的方法進(jìn)行驗(yàn)證,我們收集了12個(gè)高質(zhì)量開源項(xiàng)目源碼作為樣本生成所需的代碼語料庫,并以此為基礎(chǔ)具體實(shí)現(xiàn)了該方法,相關(guān)的代碼與數(shù)據(jù)已上傳至 https://github.com/bby8808/GodClassDetection.同時(shí),我們以Palomba等人提出的代碼壞味數(shù)據(jù)集作為測試樣本[30],對本文所提出的方法進(jìn)行驗(yàn)證與分析.

        3.1 研究問題

        在實(shí)驗(yàn)驗(yàn)證階段,我們希望通過分析以下4個(gè)問題來對所提出的方法進(jìn)行評估.

        (1) 研究問題1:該方法是否能準(zhǔn)確有效地檢測出上帝類?其查全率和查準(zhǔn)率是否優(yōu)于現(xiàn)有方法?

        (2) 研究問題2:所提出的神經(jīng)網(wǎng)絡(luò)分類器中的兩個(gè)特征輸入(代碼文本特征與代碼結(jié)構(gòu)特征)對最終結(jié)果分別有什么影響?即如果只有其中的一個(gè)特征輸入,分類器的性能會(huì)如何變化?

        (3) 研究問題3:利用其他網(wǎng)絡(luò)模型(如卷積神經(jīng)網(wǎng)絡(luò)CNN和全連接網(wǎng)絡(luò)dense)替代神經(jīng)網(wǎng)絡(luò)分類器中所使用的長短時(shí)記憶網(wǎng)絡(luò)LSTM,能否進(jìn)一步提高分類器的性能,如查全率、查準(zhǔn)率等?

        (4) 研究問題 4:該方法訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)分類器的時(shí)間需要多久?利用已訓(xùn)練好的分類器進(jìn)行預(yù)測又需要多長時(shí)間?

        研究問題 1關(guān)注的是所提出的方法與當(dāng)前方法的檢測結(jié)果在查準(zhǔn)率(precision)與查全率(recall)等指標(biāo)上的區(qū)別.為了回答這個(gè)問題,我們選擇了JDeodorant[10]作為評估階段的對比實(shí)驗(yàn)對象.之所以選擇JDeodorant作為參照,是因?yàn)?JDeodorant作為知名的代碼重構(gòu)推薦工具,其代碼壞味的檢測能力已獲得了業(yè)內(nèi)的廣泛認(rèn)可[5,23,30].比較新的一些上帝類檢測方法,如 TACO[22]和 DéCOR[7],都沒有公開的實(shí)現(xiàn)體(源代碼或者可執(zhí)行程序),因此難以與他們在同一數(shù)據(jù)集上進(jìn)行實(shí)際比較.

        研究問題 2關(guān)注神經(jīng)網(wǎng)絡(luò)分類器輸入特征選取的有效性.我們在保持模型其他部分不變的情況下,分別剪除原模型中的度量項(xiàng)代碼結(jié)構(gòu)特征輸入與標(biāo)識(shí)符代碼文本特征輸入,將原模型拆分為兩個(gè)獨(dú)立的單一輸入神經(jīng)網(wǎng)絡(luò)并分別加以調(diào)優(yōu)訓(xùn)練.以各分類器在同一測試集上的最優(yōu)平均F1值作為衡量指標(biāo)來分析所提出的兩個(gè)特征分別在整個(gè)方法中所起的作用.

        研究問題 3主要關(guān)注在本方法所構(gòu)造的神經(jīng)網(wǎng)絡(luò)分類器中文本特征的處理方式.我們通過將所提出的網(wǎng)絡(luò)模型中的長短時(shí)記憶網(wǎng)絡(luò)替換為全連接神經(jīng)網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò),并同樣以各分類器在同一數(shù)據(jù)集上的最優(yōu)平均F1值作為指標(biāo)來幫助考察和分析在已有的方法架構(gòu)下3種神經(jīng)網(wǎng)絡(luò)對于最終結(jié)果的影響.

        研究問題 4則關(guān)注所提出方法的時(shí)間復(fù)雜度情況.由于基于機(jī)器學(xué)習(xí)的分類器訓(xùn)練通常都需要在訓(xùn)練過程中花費(fèi)過多的時(shí)間成本,因此對于時(shí)間代價(jià)的考察也應(yīng)成為我們對本文所提出方法的一個(gè)評估因素.對研究問題 4的考察,可以根據(jù)所提出方法在訓(xùn)練過程與預(yù)測過程中分別所需花費(fèi)的時(shí)間成本,探討基于深度學(xué)習(xí)的本方法在時(shí)間性能上的具體表現(xiàn).

        3.2 實(shí)驗(yàn)數(shù)據(jù)

        3.2.1 訓(xùn)練數(shù)據(jù)

        我們選擇了12個(gè)開源項(xiàng)目,以自動(dòng)構(gòu)造神經(jīng)網(wǎng)絡(luò)的訓(xùn)練數(shù)據(jù).表2給出了訓(xùn)練集所用工程各自的名稱、版本、類的數(shù)量(NOC)、方法數(shù)量(NOM)以及代碼行數(shù)(LOC).為了保證訓(xùn)練集樣本的可靠性,我們選取了如下的12個(gè)開源項(xiàng)目來幫助神經(jīng)網(wǎng)絡(luò)分類器的訓(xùn)練.作為知名的開源項(xiàng)目,這些項(xiàng)目擁有更高的代碼質(zhì)量,因此可以幫助我們獲取到更準(zhǔn)確的標(biāo)簽樣本,從而提高神經(jīng)網(wǎng)絡(luò)的訓(xùn)練效率.同時(shí),我們在選取訓(xùn)練樣本代碼語料庫的時(shí)候,會(huì)刻意參考項(xiàng)目的開發(fā)者與項(xiàng)目所涉及的領(lǐng)域.這一篩選條件的目的主要是為了消除特定開發(fā)者或特定項(xiàng)目領(lǐng)域可能會(huì)引入的特定代碼風(fēng)格傾向,以便保證訓(xùn)練集標(biāo)簽樣本的綜合性.

        Table 2 Projects for train set表2 訓(xùn)練集所涉項(xiàng)目列表

        3.2.2 測試數(shù)據(jù)

        在測試數(shù)據(jù)的準(zhǔn)備方面,我們利用了 Palomba等人提出的一個(gè)開源代碼壞味數(shù)據(jù)集來作為評估實(shí)驗(yàn)的實(shí)驗(yàn)對象,其中的代碼壞味記錄均經(jīng)由人工驗(yàn)證[30].之前的代碼壞味相關(guān)研究通常會(huì)綜合多個(gè)代碼壞味檢測工具的檢測結(jié)果作為研究數(shù)據(jù)的來源[24,31].盡管通過多個(gè)工具的互補(bǔ)可能可以獲取到不錯(cuò)的檢測精度,但人工進(jìn)行的代碼壞味檢測依然可以被認(rèn)為是最為可信的評估參考標(biāo)準(zhǔn).此數(shù)據(jù)集中包含了在30個(gè)軟件項(xiàng)目的395個(gè)歷史版本中13種代碼壞味的檢測情況.我們選擇包含上帝類而且可以通過編譯的13個(gè)項(xiàng)目作為測試項(xiàng)目.

        表3展示了驗(yàn)證所用的13個(gè)開源項(xiàng)目的詳細(xì)信息,包括其中的正樣本(在原有數(shù)據(jù)集上被標(biāo)記為上帝類的類)個(gè)數(shù)(NOPS)與負(fù)樣本(沒有被標(biāo)記為上帝類的類)個(gè)數(shù)(NONS).

        Table 3 Projects for test set表3 測試集所涉項(xiàng)目列表

        Table 3 Projects for test set (Continued)表3 測試集所涉項(xiàng)目列表(續(xù))

        3.3 實(shí)驗(yàn)過程

        我們以表2中所列出的各開源項(xiàng)目作為代碼語料庫,利用如前所述的標(biāo)簽樣本生成工具(詳見第2.5節(jié))逐條生成固定格式的正負(fù)樣本數(shù)據(jù)(詳見第 2.2節(jié)),以構(gòu)建出神經(jīng)網(wǎng)絡(luò)分類器的訓(xùn)練集(其中包括正樣本 845條,負(fù)樣本775條).隨后,經(jīng)過在訓(xùn)練集上的多輪訓(xùn)練,我們可以得到一個(gè)以類中成員標(biāo)識(shí)符集合與軟件度量值集合為輸入的分類器.此分類器能夠輸出被檢測類中存在上帝類代碼壞味的概率.

        以表3中所列的各項(xiàng)目作為測試項(xiàng)目,我們解析其中的源碼并按照神經(jīng)網(wǎng)絡(luò)所定義的輸入格式從項(xiàng)目中提取數(shù)據(jù)作為測試樣本,由此生成測試集.將測試集輸入已訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)分類器后,得到的輸出集合即為神經(jīng)網(wǎng)絡(luò)分類器在此測試集上的預(yù)測結(jié)果.作為參照,我們在 JDeodorant中同樣對此測試集進(jìn)行上帝類代碼壞味檢測,同時(shí)導(dǎo)出其檢測結(jié)果以便與本文所提出的方法進(jìn)行對比.

        所提模型代碼基于keras實(shí)現(xiàn).在模型優(yōu)化階段,我們以交叉熵作為損失函數(shù),并選擇自適應(yīng)學(xué)習(xí)率的Adam作為優(yōu)化算法.同時(shí),為了直觀對比不同方法的上帝類代碼壞味檢測能力,我們利用 Palomba等人提出的代碼壞味數(shù)據(jù)集作為測試樣本的正確標(biāo)簽,并以如下方法來分別計(jì)算兩種檢測結(jié)果與正確標(biāo)簽之間的查準(zhǔn)率、查全率以及F1值:

        3.4 實(shí)驗(yàn)結(jié)果與分析

        為了回答研究問題1,我們總結(jié)了本方法與JDeodorant在相同測試集上的上帝類檢測結(jié)果,如下表4所示.其中,第1列顯示測試集中的項(xiàng)目名稱,第2列~第4列顯示我們所提出的方法測試結(jié)果的查準(zhǔn)率與查全率,第5列~第7列顯示JDeodorant的測試結(jié)果的查準(zhǔn)率與查全率.表中最后一行列出了各方法表現(xiàn)的平均值.

        根據(jù)表4,我們可以看出:

        · 在對于上帝類代碼壞味的檢測能力上,所提出方法在此測試集中的表現(xiàn)總體上優(yōu)于 JDeodorant,平均F1值提高了2.39%=(8.15%-5.76%),其中,本方法相對于JDeodorant的優(yōu)勢在查全率上尤為明顯,平均提高35.58%=(95.56%-59.98%).

        · 盡管所提出方法的平均查準(zhǔn)率(4.29%)是高于已有方法的(3.09%),但總體上兩種方法的查準(zhǔn)率依然都偏低.

        針對研究問題2,我們設(shè)計(jì)了一組對比實(shí)驗(yàn)來考察所提出方法中的代碼文本特征與代碼結(jié)構(gòu)特征分別對于最終上帝類檢測結(jié)果的影響.通過對比單一的代碼文本特征輸入、單一的代碼結(jié)構(gòu)特征輸入和二者綜合輸入這3種輸入方式下的各神經(jīng)網(wǎng)絡(luò)分類器在同一數(shù)據(jù)集上的上帝類代碼壞味檢測能力,我們可以直觀看出所提出方法中的兩個(gè)輸入特征在神經(jīng)網(wǎng)絡(luò)中的作用.3種輸入方式在測試集上的具體表現(xiàn)見表5.

        Table 4 Results on god class detection表4 上帝類檢測結(jié)果

        Table 5 Results on god class detection among features表5 不同特征下的上帝類檢測結(jié)果

        由表5可以看出:

        · 當(dāng)代碼文本特征與代碼結(jié)構(gòu)特征均為神經(jīng)網(wǎng)絡(luò)的輸入時(shí),分類器在測試集上的綜合表現(xiàn)優(yōu)于任何一種單一輸入的神經(jīng)網(wǎng)絡(luò)分類器,具體表現(xiàn)為雙輸入分類器的平均F1值相對于單文本輸入分類器和單數(shù)值輸入分類器分別提高了7.01%=(8.17%-1.16%)和4.45%=(8.17%-3.72%).

        · 與代碼文本特征相比,代碼結(jié)構(gòu)特征對于分類器的預(yù)測成功率起到了更大的作用,尤其在查準(zhǔn)率上的影響十分明顯,平均查準(zhǔn)率高出了1.31%=(1.90%-0.59%).

        此外,為了回答研究問題3,我們分別將全連接神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)以及長短時(shí)記憶網(wǎng)絡(luò)這3種網(wǎng)絡(luò)模型運(yùn)用于分類器中的文本特征處理環(huán)節(jié).各分類器經(jīng)過調(diào)優(yōu)后在同一測試集上的具體表現(xiàn)見表6.需注意的是,表中3種神經(jīng)網(wǎng)絡(luò)分類器除文本特征提取環(huán)節(jié)所用模型不同外,網(wǎng)絡(luò)其余部分均保持一致.其中,第2列~第4列數(shù)據(jù)相關(guān)的分類器采用長短時(shí)記憶網(wǎng)絡(luò)處理代碼文本特征信息,第5列~第7列所對應(yīng)的全連接神經(jīng)網(wǎng)絡(luò)在文本特征提取部分的隱含層激活函數(shù)為sigmoid函數(shù),第8列~第10列相關(guān)分類器則采用三層一維卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行文本特征提取.

        Table 6 Results on god class detection among approaches to text feature exacting表6 不同文本特征處理方式下的上帝類檢測結(jié)果

        由表6可以看出:

        · 在本文所提出方法的架構(gòu)下,長短時(shí)記憶網(wǎng)絡(luò)的代碼文本特征提取能力整體上高于全連接神經(jīng)網(wǎng)絡(luò)與卷積神經(jīng)網(wǎng)絡(luò),LSTM 分類器的F1值與另兩者相比,分別高出了 0.7%=(8.17%-7.47%)和3.81%=(8.17%- 4.36%).

        · Dense分類器的表現(xiàn)在測試集中的不同項(xiàng)目間差異很大,既有不少項(xiàng)目的查準(zhǔn)率和F1值均高于LSTM分類器,也出現(xiàn)了檢測不出項(xiàng)目中的上帝類代碼壞味的情況(FreeMind和Hadoop).

        · 針對上述情況,為保穩(wěn)妥,我們認(rèn)為,選擇長短時(shí)記憶網(wǎng)絡(luò)作為整個(gè)神經(jīng)網(wǎng)絡(luò)中的代碼文本特征提取層時(shí)的最終效果較為良好.

        針對研究問題 4,我們對所提出方法的時(shí)間性能進(jìn)行了考察.通過在普通配置的個(gè)人電腦(16GB RAM,Intel Core CPU i7-6700)上運(yùn)行所提出方法的全部流程,我們記錄了所提出的分類器的整個(gè)訓(xùn)練與預(yù)測過程的耗時(shí)情況.表7列出了訓(xùn)練集所涉各工程提取訓(xùn)練樣本數(shù)據(jù)時(shí)所耗的時(shí)間(以min為單位).

        Table 7 Time of train set data generation表7 訓(xùn)練集數(shù)據(jù)生成所用時(shí)間

        可以看出,收集樣本數(shù)據(jù)的過程耗時(shí)頗久.為從 12個(gè)開源項(xiàng)目中提取分類器的訓(xùn)練集,我們累計(jì)花費(fèi)了559min,平均每個(gè)項(xiàng)目需要 46.6min.其中,耗時(shí)最多的兩個(gè)項(xiàng)目 android-backup-extractor(LOC=304,458)與 weka(LOC=444,493)花費(fèi)了超過總時(shí)長一半(56.9%=318÷559)的時(shí)間.與耗費(fèi)了近10個(gè)小時(shí)的訓(xùn)練集生成過程相比,神經(jīng)網(wǎng)絡(luò)在12個(gè)開源項(xiàng)目上的訓(xùn)練過程僅需46s.在13個(gè)開源項(xiàng)目上的測試過程中耗時(shí)36′46″(平均每個(gè)項(xiàng)目2′50″),其中36′24″均用于從測試項(xiàng)目中提取輸入信息,占了總測試時(shí)間的99.1%.但是訓(xùn)練集的自動(dòng)生成是可以提前準(zhǔn)備的,并不需要在每次使用該方法進(jìn)行上帝類檢測的時(shí)候再次生成訓(xùn)練集.

        3.5 有效性威脅

        對于評估有效性的第1個(gè)威脅在于用來驗(yàn)證實(shí)驗(yàn)結(jié)果的數(shù)據(jù)集中只包含了25個(gè)開源項(xiàng)目.這些項(xiàng)目的某些特性可能會(huì)使結(jié)論產(chǎn)生偏差,從而導(dǎo)致所得結(jié)論不適用于其他項(xiàng)目.為了減少這一威脅,我們選擇的訓(xùn)練及測試項(xiàng)目均出自不同的研究領(lǐng)域及開發(fā)人員,以期減少某些項(xiàng)目間的特定關(guān)聯(lián)對于驗(yàn)證結(jié)果造成影響.

        其次,對于評估有效性的第 2個(gè)威脅在于評估所用的測試集中被人工標(biāo)注的上帝類代碼壞味個(gè)數(shù)普遍較少.在這樣的數(shù)據(jù)集上進(jìn)行上帝類檢測時(shí),很容易出現(xiàn)檢測效果兩極分化的情況.為了盡可能保證所得出的結(jié)論適用于實(shí)際應(yīng)用,我們選擇了符合實(shí)際開發(fā)過程中上帝類出現(xiàn)情況與分布概率的標(biāo)簽數(shù)據(jù)集作為結(jié)果驗(yàn)證的基準(zhǔn).在現(xiàn)實(shí)開發(fā)場景中,項(xiàng)目中出現(xiàn)上帝類代碼壞味的概率平均保持在1.7%左右.

        對于評估有效性的第 3個(gè)威脅在于所用的開源代碼壞味數(shù)據(jù)集中的上帝類壞味是由開發(fā)人員手動(dòng)標(biāo)注的.人工標(biāo)注雖然更符合實(shí)際應(yīng)用場景,但難以避免數(shù)據(jù)集貢獻(xiàn)者在標(biāo)記時(shí)由于個(gè)人主觀原因而出現(xiàn)判斷誤差.為了減少這一威脅,我們選擇了各類代碼壞味數(shù)據(jù)集中研究人員最常用的開源數(shù)據(jù)集,希望通過使用經(jīng)過反復(fù)驗(yàn)證的數(shù)據(jù)集可以更有效地避免主觀性標(biāo)注所帶來的影響.

        4 討 論

        4.1 樣本噪音

        由于所提出方法中的樣本生成方法(詳見第 2.5節(jié))是建立在所涉及的各個(gè)類均符合單一職責(zé)原則的假設(shè)上的,即假設(shè)用于構(gòu)建訓(xùn)練集正負(fù)樣本的全部類均不存在上帝類代碼壞味,且均可獨(dú)立承擔(dān)其作為一個(gè)類的職責(zé).然而實(shí)際上,這樣的假設(shè)也許并不成立.我們用以構(gòu)造訓(xùn)練集的項(xiàng)目源碼中是可能出現(xiàn)上帝類代碼壞味的.因此,這樣的樣本生成方式可能會(huì)導(dǎo)致所生成的訓(xùn)練集中出現(xiàn)噪音——即訓(xùn)練集中有些樣本的標(biāo)簽是錯(cuò)誤的.為了減少這種噪音對于分類器訓(xùn)練結(jié)果的影響,我們盡可能地選取了高質(zhì)量的項(xiàng)目源碼用以構(gòu)造訓(xùn)練集,以盡量避免設(shè)計(jì)不夠完善的類出現(xiàn)在樣本集合中.同時(shí),為了增加神經(jīng)網(wǎng)絡(luò)的魯棒性,在神經(jīng)網(wǎng)絡(luò)的設(shè)計(jì)過程中,我們選擇了在自然語言處理領(lǐng)域獲得很大成功的長短時(shí)記憶網(wǎng)絡(luò),并輔以一些防過擬合手段來幫助減少樣本噪音對于訓(xùn)練結(jié)果的干擾.

        4.2 文本預(yù)處理

        所提出的方法在對神經(jīng)網(wǎng)絡(luò)的文本輸入進(jìn)行預(yù)處理時(shí)(詳見第 2.3節(jié)),為了將從源碼中提取出的標(biāo)識(shí)符以詞向量的形式輸入到神經(jīng)網(wǎng)絡(luò),我們會(huì)以大寫字母和下劃線為分隔符來對標(biāo)識(shí)符執(zhí)行分詞操作.這種分詞方式對于代碼中的大部分標(biāo)識(shí)符(如AbstractMethodFragment、text_length)是有效的,但對于由多個(gè)大寫字母連接組成的詞語(如 XMLReader)則并不能完全按照詞語語義進(jìn)行劃分.針對這一情況,我們對大量的開源工程源碼文本進(jìn)行類似的分詞操作,并將分詞后的結(jié)果作為 Word2Vector訓(xùn)練的語料庫.在這樣的語料庫下訓(xùn)練出的Word2Vector模型隱含層將既可以為語料庫中已出現(xiàn)的詞語在高維空間中映射詞向量,同樣可以為語料庫中連續(xù)出現(xiàn)的字母序列映射空間距離相近的高維向量.此外,標(biāo)識(shí)符中的縮寫詞(如,numberOfChildren縮寫為numOfChildren)也可能會(huì)導(dǎo)致標(biāo)識(shí)符語義上的不準(zhǔn)確.為此,我們在對Word2Vector的訓(xùn)練語料庫的選取過程中遵循了大規(guī)模和高質(zhì)量兩個(gè)原則,從而盡量保證完整收集常見縮寫詞并且避免非常規(guī)縮寫詞的出現(xiàn).

        4.3 過擬合問題

        在神經(jīng)網(wǎng)絡(luò)的應(yīng)用過程中,過擬合是最常見的影響網(wǎng)絡(luò)模型泛化能力的原因之一[32].對此,研究人員提出了降低模型復(fù)雜性[32]、添加正則懲罰項(xiàng)(regularization)[33]、增加隨機(jī)噪聲(noise)、隨機(jī)刪除隱層神經(jīng)元(dropout)[34]以及選擇適合的迭代訓(xùn)練次數(shù)(early stopping)[35]等多種方法,以提高神經(jīng)網(wǎng)絡(luò)的泛化性能.由于本文所提出方法中的神經(jīng)網(wǎng)絡(luò)模型參數(shù)數(shù)量較大,我們也在模型訓(xùn)練過程中加入了一些手段來降低過參數(shù)化對網(wǎng)絡(luò)模型的影響.在盡量減少不必要的神經(jīng)元和神經(jīng)網(wǎng)絡(luò)隱層的同時(shí),我們嘗試了上述多種防過擬合手段,最終確定了目前的整體模型.首先,經(jīng)過實(shí)驗(yàn)對比我們發(fā)現(xiàn),相對于添加高斯噪聲和正則化參數(shù),隨機(jī)刪除隱藏層內(nèi)的一部分神經(jīng)元對于所提出的分類器最終測試效果的提升更為明顯.在實(shí)際訓(xùn)練過程中,我們將 Dropout的丟棄率設(shè)為60%.其次,我們以訓(xùn)練樣本集中 10%的隨機(jī)樣本集作為驗(yàn)證集,在每輪迭代后,對權(quán)重更新后的網(wǎng)絡(luò)進(jìn)行驗(yàn)證,發(fā)現(xiàn)經(jīng)過10次迭代訓(xùn)練后,神經(jīng)網(wǎng)絡(luò)的訓(xùn)練結(jié)果進(jìn)入相對穩(wěn)定階段,且驗(yàn)證結(jié)果數(shù)據(jù)沒有與訓(xùn)練結(jié)果數(shù)據(jù)出現(xiàn)大的偏差,由此確定了神經(jīng)網(wǎng)絡(luò)訓(xùn)練的迭代次數(shù)為 10次.通過上述消除過擬合的方法和手段,我們最終顯著提高了神經(jīng)網(wǎng)絡(luò)分類器的泛化能力,所提出的方法在測試集上的平均F1值由之前的 0.18%提高至上文所述的8.17%.

        5 總 結(jié)

        在本文中,我們提出了一種基于深度學(xué)習(xí)的上帝類代碼壞味檢測方法.通過分析大量源碼的文本信息與軟件度量信息,深度神經(jīng)網(wǎng)絡(luò)在反復(fù)迭代中學(xué)習(xí)從輸入中提取出與上帝類壞味相關(guān)的特征,最終生成分類器模型.為了滿足深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程對于大規(guī)模樣本集的需求,我們還實(shí)現(xiàn)了一種可以自動(dòng)利用開源項(xiàng)目源碼來構(gòu)建上帝類樣本的方式來生成大量訓(xùn)練數(shù)據(jù)的工具.

        為了保證實(shí)驗(yàn)評估結(jié)果的精準(zhǔn)可靠,我們利用開源代碼壞味數(shù)據(jù)集來對所提出方法進(jìn)行驗(yàn)證.我們從12個(gè)開源項(xiàng)目中提取訓(xùn)練樣本以訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型,并在13個(gè)人工標(biāo)記的開源項(xiàng)目上對所生成的網(wǎng)絡(luò)模型進(jìn)行測試.實(shí)驗(yàn)結(jié)果表明,相對于現(xiàn)有方法,本文所提出的上帝類檢測方法在測試集上的綜合表現(xiàn)更佳,具體體現(xiàn)為F1值平均提升2.39%,查全率和查準(zhǔn)率分別提高35.58%和1.20%.

        可以看出,盡管所提出的方法在測試集上的查準(zhǔn)率較現(xiàn)有方法已有提高,但總體來說依舊偏低,導(dǎo)致所提出的方法可能并不適合直接應(yīng)用于實(shí)際開發(fā)場景的完全自動(dòng)化檢測.然而得益于本文所提出方法的查全率有了較大幅度的提高,上帝類的檢出成功率得到了更高的保障,被檢測程序中的潛在上帝類壞味中的大多數(shù)都可由此方法檢測出來.因此,本方法可用于實(shí)際開發(fā)中的上帝類代碼壞味輔助檢測,通過提供上帝類壞味候選清單,來幫助開發(fā)人員縮小人工檢測的范圍,從而更快地鎖定上帝類代碼壞味的重構(gòu)時(shí)機(jī).同時(shí),在未來的研究中,我們將針對上帝類代碼壞味檢測的可用性做進(jìn)一步改進(jìn),以實(shí)現(xiàn)完全自動(dòng)化的上帝類壞味檢測.此外,在本文所提出的代碼壞味檢測的模型基礎(chǔ)上,我們也將對基于深度學(xué)習(xí)的提取類重構(gòu)操作進(jìn)行進(jìn)一步的研究.

        上帝類代碼壞味屬于類級別的代碼壞味,因而在本文中,我們的訓(xùn)練樣本自動(dòng)生成工具的合并粒度也在類級別上.同時(shí),由于上帝類是因違反了單一職責(zé)原則而引發(fā)的代碼壞味,因此我們?yōu)槟M生成上帝類代碼壞味,實(shí)現(xiàn)了為單個(gè)類中注入多個(gè)職責(zé)的自動(dòng)化工具,以此來實(shí)現(xiàn)上帝類代碼壞味標(biāo)簽樣本的自動(dòng)生成.此外,在開發(fā)人員人工判定上帝類代碼壞味的過程中,相對于檢測數(shù)據(jù)類等壞味會(huì)更偏向于對代碼規(guī)模和類內(nèi)內(nèi)聚度的考察,而相對于長方法等壞味則更偏向于對代碼耦合度的考量,因此我們綜合了各種與上帝類代碼壞味相關(guān)的結(jié)構(gòu)特征,以上文中的12個(gè)度量項(xiàng)作為神經(jīng)網(wǎng)絡(luò)分類器的代碼結(jié)構(gòu)特征輸入.

        然而由于不同的代碼壞味的特點(diǎn)不同,在壞味檢測過程中所需的文本特征和結(jié)構(gòu)特征也不同.針對除上帝類以外的其他代碼壞味,我們可以基于所提出方法的框架模式,通過替換各類壞味所特有的特征表現(xiàn)以及壞味合成方式來實(shí)現(xiàn)不同的基于深度學(xué)習(xí)的壞味檢測方法.例如,與上帝類代碼壞味在類級別上過于臃腫不同,長方法屬于方法級別的代碼壞味.因此,若要在本文所提出方法的基礎(chǔ)上實(shí)現(xiàn)長方法代碼壞味的深度學(xué)習(xí)檢測方法,我們可以通過批量調(diào)用方法內(nèi)聯(lián)(inline method)重構(gòu)操作來實(shí)現(xiàn)長方法壞味樣本集的自動(dòng)構(gòu)建,并以與長方法相關(guān)的幾項(xiàng)度量值作為二分類神經(jīng)網(wǎng)絡(luò)的輸入特征,來實(shí)現(xiàn)針對長方法代碼壞味的深度學(xué)習(xí)檢測方法.結(jié)合以上分析,我們可在未來以本文所提出方法的模式為基礎(chǔ)來實(shí)現(xiàn)對數(shù)據(jù)類、長方法等其他代碼壞味在不同程序語言中的深度學(xué)習(xí)檢測方法.

        猜你喜歡
        分類器代碼上帝
        120秒的“上帝”
        創(chuàng)世代碼
        創(chuàng)世代碼
        創(chuàng)世代碼
        創(chuàng)世代碼
        BP-GA光照分類器在車道線識(shí)別中的應(yīng)用
        電子測試(2018年1期)2018-04-18 11:52:35
        當(dāng)上帝為你關(guān)上一扇門,請你為自己打開一扇窗
        當(dāng)上帝給你關(guān)上一扇門,請你自己打開一扇窗
        加權(quán)空-譜與最近鄰分類器相結(jié)合的高光譜圖像分類
        結(jié)合模糊(C+P)均值聚類和SP-V-支持向量機(jī)的TSK分類器
        麻豆av一区二区天堂| 无码人妻精品一区二区| 久久99精品久久久久久hb无码| 欧美日韩一线| 国产精品自拍视频免费观看| 日日噜噜夜夜狠狠久久丁香五月| 亚洲aⅴ在线无码播放毛片一线天 中国国语毛片免费观看视频 | 亚洲AV秘 无码一区二区三区| 青青草免费观看视频免费 | 一区二区三区av波多野结衣| 欧美性猛交xxxx乱大交蜜桃| 国产一区二区三区最新视频| 日韩人妻免费视频一专区| 丰满少妇呻吟高潮经历| 色丁香色婷婷| 亚洲黄色一插一抽动态图在线看| 国产在线观看自拍av| 人妻有码中文字幕| 国产精品高清视亚洲乱码有限公司| 一区二区中文字幕蜜桃 | 无码字幕av一区二区三区| 欧美一片二片午夜福利在线快 | 亚洲人成伊人成综合久久| 中文字幕亚洲精品无码| 久久人妻公开中文字幕| 亚洲专区在线观看第三页| 亚洲一区二区三区中文字幕网| www射我里面在线观看| 亚洲精品综合第一国产综合| 亚洲天堂线上免费av| 亚洲av一二三区成人影片| 日韩人妻精品无码一区二区三区 | 国产精品jizz在线观看老狼| 久久精品国产88久久综合| 亚洲一区二区三区激情在线观看 | 久久精品熟女亚洲av艳妇| 日本高清一区二区三区在线观看| 成人免费777777被爆出| 亚洲成AⅤ人在线观看无码| 国产特黄a三级三级三中国| 比较有韵味的熟妇无码|