李國繁,張 峰,2,劉 聰
1(山東科技大學(xué) 計算機科學(xué)與工程學(xué)院,山東 青島 266590) 2(山東省智慧礦山信息技術(shù)重點實驗室,山東 青島 266590) 3(山東理工大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,山東 淄博 255000)
互聯(lián)網(wǎng)的發(fā)展使得通過網(wǎng)絡(luò)獲取源代碼變的越來越容易,也帶來了代碼抄襲問題.源代碼抄襲檢測技術(shù)被越來越多的學(xué)者研究,其研究成果在計算機程序教學(xué)[1](通過Online Judge[2]提交代碼)和知識產(chǎn)權(quán)保護(hù)方面有著廣泛的應(yīng)用[3].近年來,一些跨編程語言的代碼自動轉(zhuǎn)換工具(1)https://www.tangiblesoftwaresolutions.com的出現(xiàn),使得計算機程序教學(xué)中跨語言的代碼抄襲檢測成為一個新的挑戰(zhàn).現(xiàn)有的代碼抄襲檢測方法主要用于檢測同種語言代碼之間的相似性,而不同編程語言之間的語法差異使得這些方法并不適用于檢測不同語言代碼之間相似度.在跨語言抄襲檢測方面,近年來出現(xiàn)了一些跨語言抄襲檢測的方法和工具[4-7].第1類方法是傳統(tǒng)的基于中間特征的檢測方法.該類方法將兩段不同語言編寫的源代碼轉(zhuǎn)換為統(tǒng)一的中間表示(如,寄存器中間語言(Register Transfer Language,RTL)[8],抽象語法樹(Abstract syntax tree,AST)[9]等),進(jìn)而將跨語言抄襲檢測問題轉(zhuǎn)換為同種語言抄襲檢測.第2類方法是基于機器學(xué)習(xí)的跨語言代碼抄襲檢測方法.該類方法通常將源代碼轉(zhuǎn)化為標(biāo)記(Token)序列,然后為每個標(biāo)記賦予一個向量表示,進(jìn)而通過一些機器學(xué)習(xí)方法.如,潛在語義分析(Latent Semantic Analysis,LSA)[6]、深度學(xué)習(xí)[10]等,將跨語言代碼抄襲的檢測問題轉(zhuǎn)換為二分類問題(抄襲或非抄襲).基于機器學(xué)習(xí)的方法可移植性較強,在訓(xùn)練得到模型的情況下,其判斷抄襲的速度更快,是當(dāng)前跨語言代碼抄襲檢測的研究熱點.但是,目前基于機器學(xué)習(xí)的大多數(shù)方法只是將代碼作為文本處理,很少考慮代碼的結(jié)構(gòu)特征(例如,AST[9]、控制結(jié)構(gòu)[11]等),受更改語句順序、等價結(jié)構(gòu)替換等混淆手段的影響,其檢測效果較考慮代碼結(jié)構(gòu)特征的機器學(xué)習(xí)方法要差.同時,現(xiàn)有基于機器學(xué)習(xí)的方法極易受到冗余代碼的影響,導(dǎo)致檢測準(zhǔn)確率的下降.
結(jié)構(gòu)是代碼的一種重要特征.例如,AST是源代碼語法結(jié)構(gòu)的一種抽象表示,它以樹的形式展現(xiàn)編程語言的語法結(jié)構(gòu).對同一問題的不同編程語言的實現(xiàn)代碼,若其實現(xiàn)思路相同,則代碼對應(yīng)的AST的結(jié)構(gòu)也具有一定的相似性[12].針對現(xiàn)有基于機器學(xué)習(xí)的跨語言代碼抄襲檢測方法存在的問題,本文結(jié)合代碼的AST結(jié)構(gòu)特征,提出了一種跨語言代碼抄襲檢測工具CLPDetector(Cross-Language Plagiarism Detector).該工具將大量具有是否抄襲標(biāo)簽的跨語言代碼對作為訓(xùn)練集進(jìn)行有監(jiān)督學(xué)習(xí),完成訓(xùn)練后得到的代碼抄襲檢測模型可直接用于跨語言的代碼抄襲檢測.在訓(xùn)練過程中,對于一段代碼,該工具首先將其轉(zhuǎn)換為AST,通過深度遍歷該AST,結(jié)合AST的節(jié)點值和節(jié)點類型形成表示代碼的token序列,為序列中每個token賦予一個向量表示,從而形成代碼的表示矩陣.然后將雙向長短期記憶網(wǎng)絡(luò)(Bi-directional Long Short Term Memory,BiLSTM)[13]、卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)[14]以及自注意力機制(Self-attention Mechanism)[15]3種深度學(xué)習(xí)方法相結(jié)合構(gòu)建特征提取模型,并將該模型嵌入到偽孿生網(wǎng)絡(luò)架構(gòu)[16]中,以構(gòu)建抄襲檢測模型,判斷不同語言代碼之間是否存在抄襲.為提高檢測模型的檢測準(zhǔn)確率,在模型訓(xùn)練之前,采用了兩個預(yù)處理策略:1)將預(yù)訓(xùn)練訓(xùn)練集中的代碼轉(zhuǎn)換為AST,利用skip-gram算法[17]對代碼標(biāo)記(token)進(jìn)行預(yù)訓(xùn)練,以生成一個能準(zhǔn)確表示token的詞嵌入(embedding);2)基于程序依賴圖(Program Dependency Graph,PDG)[11]對訓(xùn)練集中的冗余代碼進(jìn)行刪除[18].同時,為提高訓(xùn)練模型的檢測效率,在抄襲檢測之前,本文提出了一個基于屬性計數(shù)的過濾器,以降低非抄襲代碼對檢測效率的影響.本文的主要貢獻(xiàn)包括:
1)在代碼抄襲檢測方法層面,結(jié)合代碼的AST結(jié)構(gòu)特征,基于偽孿生網(wǎng)絡(luò)框架,通過融合多種深度學(xué)習(xí)模型,提出了一個新的跨語言抄襲檢測工具CLPDetector;
2)在方法執(zhí)行效率方面,為了提高方法檢測準(zhǔn)確率和檢測速度,基于PDG對代碼中的冗余代碼進(jìn)行刪除,并提出了一個用于檢測過程的基于屬性計數(shù)的過濾器;
3)在實驗部分,我們以Java和Python語言為例,基于一個開源的數(shù)據(jù)集(2)https://www.csg.ci.i.u-tokyo.ac.jp/projects/clone/,從精確率、召回率和F1值3個角度對CLPDetector的檢測效果行了驗證.實驗表明,CLPDetector的檢測效果要優(yōu)于目前其他基于機器學(xué)習(xí)的跨語言代碼抄襲檢測方法.
本節(jié)中我們將抄襲檢測相關(guān)工作分為兩部分進(jìn)行討論,首先討論了同種語言的代碼抄襲檢測研究,然后又討論了跨語言的代碼抄襲檢測研究.
目前,同種語言的抄襲檢測主要有基于結(jié)構(gòu)度量和屬性計數(shù)[19]的兩大類方法.其中基于結(jié)構(gòu)度量的方法是當(dāng)前的主流方法,包括基于token[20,21]、基于樹[22,23]、基于圖[24,25]的3類方法.
基于token的方法以快速著稱,應(yīng)用場景最為廣泛,如CPDP[26],SIM[27]和JPlag[28].但是這類方法忽略了代碼的結(jié)構(gòu)特征,致使其精度要遜于其他基于樹和圖的結(jié)構(gòu)度量方法.基于樹或圖的方法通過將源代碼轉(zhuǎn)換為AST[29]、控制流圖(CFG)[30]或程序依賴圖(PDG)[11],通過子樹匹配或子圖匹配實現(xiàn)代碼相似度的度量.這兩類方法在抄襲檢測方面有更高的準(zhǔn)確率,但是較高計算代價使這類方法往往不能擴展到大型代碼庫[31].
現(xiàn)有跨語言代碼抄襲檢測主要包括傳統(tǒng)的基于中間特征的檢測方法和基于機器學(xué)習(xí)的檢測方法.
基于中間特征的方法將不同語言編寫的代碼轉(zhuǎn)換為某一種中間特征,如中間語言或基于樹的中間表示[32,33,9],然后基于中間表示直接度量兩段代碼的相似度.例如,一些檢測方法[4,8,34]利用編譯器將不同語言代碼轉(zhuǎn)換為同一種中間表示語言,通用中間語言(Common Intermediate Language,CIL)[4]、如寄存器中間語言(Register Transfer Language,RTL)[8]以及編譯后的二進(jìn)制文件[34].然后,再將其轉(zhuǎn)換為標(biāo)記序列或直接在中間語言基礎(chǔ)上比較相似度.這類方法忽略了代碼的結(jié)構(gòu)特征,且對編譯器的依賴性較強.例如,基于CIL的方法只能應(yīng)用于Microsoft.Net語言,例如C#,ASP.Net,Visual Basic等.基于樹的中間表示方法通常將不同語言代碼轉(zhuǎn)換為同種樹結(jié)構(gòu),并通過子樹匹配或?qū)滢D(zhuǎn)換為對應(yīng)的矩陣,來度量不同語言代碼之間的相似度.例如,eCST(enriched Concrete Syntax Tree)[32]、AST[9]以及CodeDOM(Code Document Object Model)[33].與同種語言基于樹的抄襲檢測方法類似,這類方法的計算代價仍然較高.
為了在保證精度的條件下降低計算代價,提高檢測效率,近年來,一些研究人員將傳統(tǒng)方法與機器學(xué)習(xí)方法相結(jié)合來檢測跨語言的代碼抄襲.基于機器學(xué)習(xí)的方法通常將不同語言的源代碼轉(zhuǎn)換為標(biāo)記序列,并為每個標(biāo)記賦予對應(yīng)向量表示.然后,通過大量的包含是否抄襲標(biāo)記的代碼對訓(xùn)練集對所構(gòu)建的機器學(xué)習(xí)模型進(jìn)行有監(jiān)督的訓(xùn)練生成一個分類器,最后用訓(xùn)練得到的分類器直接判斷兩段代碼是否存在抄襲.按照是否考慮代碼的結(jié)構(gòu)特征,該類方法可分為不考慮代碼結(jié)構(gòu)特征[5,6,10,35]和考慮代碼結(jié)構(gòu)特征[12,36]的兩類方法.首先,第1類方法通常直接將代碼視為文本進(jìn)行處理.例如,DeSoCoRe[5]通過將代碼轉(zhuǎn)換為標(biāo)記序列,用tri-gram模型提取代碼特征,并基于歸一化對詞頻附加權(quán)重,然后通過余弦距離計算代碼相似度.Flores等[6]基于相似單詞出現(xiàn)在相似語境中的原則,利用潛在語義分析(Latent Semantic Analysis,LSA)計算不同語言代碼文本之間的相似性.類似的,Ullah等[35]利用主成分分析(Principal Component Analysis,PCA)從源代碼的標(biāo)記序列中提取特征,然后通過多元邏輯回歸模型對源代碼文檔進(jìn)行分類.Nafi等[10]提出了CLCDSA,從AST中提取代碼屬性特征(變量個數(shù)、圈復(fù)雜度等)形成代碼對應(yīng)的屬性向量,進(jìn)而結(jié)合深度學(xué)習(xí)的方法訓(xùn)練抄襲檢測模型.第2類方法考慮代碼的結(jié)構(gòu)特征,通常利用代碼的AST對代碼標(biāo)記進(jìn)行預(yù)訓(xùn)練以獲取較精確的標(biāo)記向量,或直接在代碼AST上進(jìn)行模型訓(xùn)練.例如,Perez等[12,36]將代碼轉(zhuǎn)換為AST并利用Skip-gram算法[17]從中學(xué)習(xí)標(biāo)記的向量表示,然后用BiLSTM構(gòu)建訓(xùn)練模型判斷代碼是否抄襲.
不考慮代碼結(jié)構(gòu)特征的機器學(xué)習(xí)方法由于直接將代碼作為文本進(jìn)行處理,所以其轉(zhuǎn)換代碼為對應(yīng)的矩陣表示的過程要更快,但受更改語句順序、等價結(jié)構(gòu)替換等混淆手段的影響,其檢測精度一般要比考慮代碼結(jié)構(gòu)特征的方法差;而考慮代碼結(jié)構(gòu)特征的機器學(xué)習(xí)方法與之相反.此外,基于機器學(xué)習(xí)的跨語言抄襲檢測方法的精度還受其他多方面因素的影響.例如,是否進(jìn)行預(yù)訓(xùn)練、訓(xùn)練集的代碼質(zhì)量以及所采用的具體的機器學(xué)習(xí)方法等.
代碼抄襲檢測問題相當(dāng)于一個二分類問題,其結(jié)果只有兩種情況:抄襲、非抄襲.因此,可以基于文本分方法的思想,通過潛在特征學(xué)習(xí)判斷代碼對屬于抄襲和非抄襲的概率[37],而屬于抄襲的概率即可視為兩段代碼之間的相似度.與解決文本分類問題的思路類似,本文方法可分為特征工程和分類模型兩部分,如圖1所示.
圖1 方法主要思想Fig.1 Idea of proposed approach
基于文本分類的思想,本文基于偽孿生網(wǎng)絡(luò)框架提出代碼抄襲檢測工具CLPDetector,其檢測模型的訓(xùn)練框架如圖2所示.為提高檢測模型的檢測精度,加快訓(xùn)練模型的收斂速度,在訓(xùn)練前,首先利用基于AST的skip-gram算法[12]對詞向量進(jìn)行了預(yù)訓(xùn)練.具體來說,對N種編程語言分別進(jìn)行預(yù)訓(xùn)練,得到N種編程語言對應(yīng)的詞向量,用于訓(xùn)練過程中的embedding層.檢測模型的訓(xùn)練集為帶標(biāo)簽(是否抄襲)的代碼對集合,為減小冗余代碼對檢測模型精度的影響,在將代碼轉(zhuǎn)換為AST之前,基于PDG將源碼中與輸出結(jié)果無數(shù)據(jù)依賴的冗余代碼刪除[18].然后,將代碼轉(zhuǎn)換為對應(yīng)的AST,通過深度優(yōu)先遍歷AST生成代碼的標(biāo)記序列,結(jié)合預(yù)訓(xùn)練生成的embedding將源代碼轉(zhuǎn)換為對應(yīng)的矩陣表示.接著,利用偽孿生網(wǎng)絡(luò)架構(gòu)[16]對數(shù)據(jù)進(jìn)行訓(xùn)練,并設(shè)定閾值把抄襲檢測問題轉(zhuǎn)換為一個有監(jiān)督的深度特征學(xué)習(xí)問題.在閾值的選擇上,參考已有工作[12,38,39],同時為了在實驗對比階段統(tǒng)一判定標(biāo)準(zhǔn),本文將判定閾值設(shè)為0.5,大于該閾值則判定為抄襲.
圖2 抄襲檢測模型訓(xùn)練框架Fig.2 Training framework of plagiarism detection model
完成抄襲檢測模型訓(xùn)練之后,CLPDetector的抄襲檢測過程如圖3所示.為提高模型的檢測效率,本文基于變量聲明數(shù)量、參數(shù)數(shù)量、圈復(fù)雜度等9種度量屬性(見4.2節(jié))構(gòu)建了一個過濾器,用于初步排除非抄襲的代碼對.具體檢測過程為:
圖3 抄襲檢測流程Fig.3 Process of plagiarism detection
對于兩段不同語言編寫的源代碼,首先基于PDG對代碼中的冗余代碼進(jìn)行刪除.然后基于SQO-OSS[40]提取代碼的變量聲明數(shù)量、參數(shù)數(shù)量、圈復(fù)雜度等9種度量屬性,并利用余弦相似度初步計算兩段代碼的相似度.若計算結(jié)果低于既定閾值,則判定代碼為非抄襲并結(jié)束檢測過程.若計算結(jié)果大于既定閾值,則深度優(yōu)先遍歷代碼對應(yīng)的AST并結(jié)合預(yù)訓(xùn)練生成的詞向量將代碼轉(zhuǎn)換為對應(yīng)的矩陣表示,然后利用訓(xùn)練完成的分類器進(jìn)一步判斷代碼是否抄襲.
本節(jié)主要介紹詞向量的預(yù)訓(xùn)練過程、基于代碼屬性的Metrics過濾器、以及具體的跨語言抄襲檢測訓(xùn)練網(wǎng)絡(luò)模型.
代碼抄襲檢測模型的輸入是基于詞向量的源代碼的矩陣表示.源代碼詞向量的獲取有兩種方法:1)通過設(shè)置隨機向量作為詞向量;2)通過預(yù)訓(xùn)練獲得較為準(zhǔn)確的詞向量.為了提高檢測準(zhǔn)確率,本文采用了第2種方法.
詞向量的訓(xùn)練需要大量的不同編程語言的代碼,這些代碼可以從開源網(wǎng)站上獲取,如GitHub.本文的詞向量預(yù)訓(xùn)練模型采用Perez等人[12]提出的基于AST的Skip-gram算法.Skip-gram算法[17]是Word2vec算法的一種,其核心思想是通過上下文來推斷中心詞.在進(jìn)行Skip-gram算法訓(xùn)練詞向量之前首先要為跨語言的一對代碼的編程語言分別建立一個token列表,每個列表對應(yīng)于某種編程語言.具體過程如下:
1)將預(yù)訓(xùn)練數(shù)據(jù)集中所有代碼轉(zhuǎn)換為AST;
2)深度優(yōu)先遍歷每個AST,統(tǒng)計AST中節(jié)點出現(xiàn)的次數(shù).其中,每個節(jié)點的命名規(guī)則為:如果AST中的節(jié)點只有節(jié)點類型沒有節(jié)點標(biāo)識,則以節(jié)點類型作為節(jié)點的名字;如果既有節(jié)點類型又有節(jié)點標(biāo)識,則將節(jié)點命名為“節(jié)點類型_節(jié)點標(biāo)識”;
3)按照頻次從高到低將節(jié)點名稱進(jìn)行排序,選取頻次最高的若干個節(jié)點名字外加“unknow”標(biāo)記[12]作為token表.以Java代碼為例,其對應(yīng)的token列表如表1所示.
表1 Java代碼token索引
接下來通過詞匯表和代碼轉(zhuǎn)換后的AST集合來構(gòu)建Skip-gram算法的輸入.對于AST中的每一個節(jié)點,設(shè)置其父節(jié)點遞歸深度為2,子節(jié)點遞歸深度為1,則每個節(jié)點將擁有3組數(shù)據(jù):<當(dāng)前節(jié)點索引,父節(jié)點索引>,<當(dāng)前節(jié)點索引,子節(jié)點索引>,<當(dāng)前節(jié)點索引,父節(jié)點的父節(jié)點索引>.當(dāng)對所有的AST節(jié)點遍歷完畢后,會得到一個輸入集合,我們將這個集合作為Skip-gram算法的輸入.借鑒文獻(xiàn)[12],本文中該算法的整體參數(shù)設(shè)置見表2.
表2 詞向量訓(xùn)練參數(shù)設(shè)置Table 2 Parameter setting of word vector training
如果兩段代碼具有相同的屬性值,那么它們的功能也是相似的[2].借鑒該思想,為減少進(jìn)入代碼抄襲檢測模型的代碼對數(shù)量,提高模型的執(zhí)行效率,使模型更易于擴展到大型數(shù)據(jù)集,本文提出了基于屬性度量的過濾器(Metrics Filter),用于在抄襲檢測階段初步排除不可能得抄襲代碼對,以提高抄襲檢測效率,其屬性列表如表3所示.Kawser等[10]通過手工驗證,證明了這9種屬性在跨語言代碼抄襲檢測中的適用性.過濾器首先通過SQO-OSS[40]獲取代碼中各屬性的值,利用各屬性值構(gòu)建的向量作為源代碼的屬性向量表示.通過余弦相似度計算兩向量的相似性.在抄襲或抄襲檢測中通常將0.5作為判斷閾值[12,41].為降低假陽性誤報率,我們僅排除在Metrics過濾器中所計算的相似度小于0.3的代碼對.
表3 源代碼各屬性及其描述Table3 Source code attributes and their descriptions
在分類器模型設(shè)計上,本文選擇了BiLSTM[13]、CNN[14]以及Attention[15]3種分類模型作為基礎(chǔ)模型.其中,BiLSTM是在Hochreiter等[42]提出的長短期記憶網(wǎng)絡(luò)(LSTM)的基礎(chǔ)上實現(xiàn)的.LSTM解決了循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)在長序列文本中的梯度消失和梯度爆炸問題,但只能獲取前向或后向文本依賴,而BiLSTM可以更好的捕捉上下文信息.卷積神經(jīng)網(wǎng)絡(luò)(CNN)通常用來處理圖像識別問題[43-45].如果將文本中的每個詞用一個向量表示,那么每個文本就可以形成一個矩陣.由此,就可以通過CNN來提取文本特征[46].Transformer是一種基于自注意力機制的新型神經(jīng)網(wǎng)絡(luò),通過編碼組件和解碼組件完成文本到文本之間的轉(zhuǎn)換,有效的改善了循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)訓(xùn)練時間長的問題.為了使其適用于抄襲檢測場景,本文僅僅使用其編碼組件部分作為訓(xùn)練模型,由于每次輸入模型中的樣本集較小,所以設(shè)置transform中自注意力層的多頭數(shù)量為5.
為了提高檢測準(zhǔn)確率,本文對上述3種基本分類模型及其組合模型進(jìn)行了對比試驗(見5.2節(jié)),結(jié)果表明同等條件下BiLSTM、CNN以及Attention相結(jié)合的模型效果最好.因此,本文將該組合模型作為分類器子模型,并將其嵌入到偽孿生網(wǎng)絡(luò)架構(gòu)[16]中.偽孿生網(wǎng)絡(luò)架構(gòu)是孿生網(wǎng)絡(luò)架構(gòu)[47]的變體,兩者在圖像驗證[48]、視覺跟蹤[49]方面有著廣泛的應(yīng)用.孿生網(wǎng)絡(luò)架構(gòu)中兩個訓(xùn)練模型的權(quán)值是共享的,而偽孿生網(wǎng)絡(luò)架構(gòu)中兩個訓(xùn)練模型的權(quán)值是非共享的.考慮到不同編程語言的語法差異,我們采用偽孿生網(wǎng)絡(luò)架構(gòu)[16]作為本文方法的主體架構(gòu).架構(gòu)中的具體分類器模型設(shè)計如圖4所示.
圖4 分類器模型Fig.4 Classifier model
分類器模型的輸入是源代碼對應(yīng)的矩陣表示(嵌入層),嵌入層的具體生成過程如圖2所示,將代碼轉(zhuǎn)換成對應(yīng)的AST之后,通過深度優(yōu)先遍歷AST形成表示代碼的標(biāo)記序列{x1,x2…xn}.然后將標(biāo)記序列的每個標(biāo)記都用預(yù)訓(xùn)練好的標(biāo)記向量來替換,形成嵌入矩陣R.其中,xi∈Rn×d,n為標(biāo)記個數(shù),d為標(biāo)記的向量維度.接著將矩陣R作為卷積神經(jīng)網(wǎng)絡(luò)的輸入,經(jīng)過卷積層、池化層進(jìn)行局部特征提取.這里的濾波器窗口大小分別3、4、5,激活函數(shù)為relu函數(shù).在CNN進(jìn)行局部特征提取之后,將其輸出作為BiLSTM的輸入.本文的BiLSTM模型的激活函數(shù)為softmax,模型優(yōu)化使用Adam優(yōu)化器.BiLSTM之后的注意力模型主要用來表示序列中標(biāo)記與輸出結(jié)果的相關(guān)性,通過對向量分配不同的權(quán)重來區(qū)分序列中標(biāo)記信息的重要性大小,提高分類的準(zhǔn)確性.模型的具體訓(xùn)練參數(shù)如表4所示.
表4 分類器模型訓(xùn)練參數(shù)設(shè)置
本節(jié)以Java和Python語言為例,驗證本文提出的跨語言抄襲檢測工具CLPDetector的檢測效果.
實驗在一個開源數(shù)據(jù)集[12]上進(jìn)行,該數(shù)據(jù)集包含預(yù)訓(xùn)練數(shù)據(jù)集和跨語言抄襲檢測模型訓(xùn)練數(shù)據(jù)集.預(yù)訓(xùn)練數(shù)據(jù)集中Java代碼是Apache開源代碼,Python代碼是從GitHub上下載的Python項目,這些項目的大小介于100K~100M之間.抄襲檢測模型訓(xùn)練數(shù)據(jù)集規(guī)模如表5所示.對于這兩個數(shù)據(jù)集,分別將其中的80%用于訓(xùn)練,將剩余的20%用于測試.在抄襲檢測模型訓(xùn)練之前,需要利用預(yù)訓(xùn)練數(shù)據(jù)集按照4.1節(jié)所示方法完成對不同語言的詞向量的預(yù)訓(xùn)練.
表5 實驗數(shù)據(jù)集Table 5 Experimental data set
本節(jié)在特定試驗場境下對多種機器學(xué)習(xí)模型進(jìn)行對比,以選出最適合的模型作為抄襲檢測訓(xùn)練模型.
通過將4.3節(jié)提到的3種分類模型及其組合(BiLSTM+Attention,BA;BiLSTM+CNN+Attention,BCA)嵌入到偽孿生架構(gòu)中來構(gòu)建抄襲檢測模型,并在實際數(shù)據(jù)集中驗證它們各自的檢測效果.為得到每個模型的最優(yōu)結(jié)果,通過交叉驗證的方法對各超參數(shù)進(jìn)行調(diào)優(yōu).評價指標(biāo)為抄襲檢測的準(zhǔn)確率.實驗結(jié)果如圖5所示,在非組合情況下BiLSTM的檢測效果要優(yōu)于另外兩種方法;在組合模型中BiLSTM結(jié)合Attention要優(yōu)于其結(jié)合CNN,而三者結(jié)合之后效果達(dá)到最優(yōu).
圖5 各分類器模型效果對比Fig.5 Comparison of different classifier models
本節(jié)與4種現(xiàn)有的跨語言抄襲檢測方法進(jìn)行對比,分別是基于中間特征表示的方法LICCA[32]、不考慮代碼結(jié)構(gòu)特征的機器學(xué)習(xí)方法CLCDSA[10]、DeSoCoRe[5]以及考慮代碼結(jié)構(gòu)特征的機器學(xué)習(xí)方法ASTLearner[12].其中,LICCA主要依賴于SSQSA平臺,通過一種通用的基于樹的中間表示eCST(豐富的具體語法樹)來進(jìn)行相似度對比.CLCDSA將屬性計數(shù)和深度學(xué)習(xí)方法結(jié)合起來進(jìn)行抄襲檢測.DeSoCoRe利用tri-gram模型提取代碼特征,并基于歸一化對詞頻附加權(quán)重,然后用過余弦距離計算相似度.ASTLeaner通過從抽象語樹中學(xué)習(xí)token向量,然后利用BiLSTM模型進(jìn)行抄襲分類.實驗數(shù)據(jù)集采用5.1節(jié)所描述的數(shù)據(jù)集.實驗的評價指標(biāo)為精確率、召回率和F1值.實驗結(jié)果如圖6所示.
圖6 各跨語言抄襲檢測工具效果對比Fig.6 Comparison of various cross language plagiarism detection tools
由實驗結(jié)果可知,DeSoCoRe的檢測效果要低于其他幾種方法,其原因是DeSoCoRe是基于串的方法,而基于串的方法對編程語言語法的依賴性較強,導(dǎo)致其在跨語言抄襲檢測方面效果較差.基于中間表示的LICCA在檢測效果上要低于除DeSoCoRe外的其他3種方法,其原因是LICCA要求兩個代碼片段的大小相似,且擁有相同的控制結(jié)構(gòu)[10].相比之下,CLPDetector的檢測效果要優(yōu)于CLCDSA和ASTLearner,這里的原因是多方面的,一方面得益于模型中融合的自注意力機制,這使得本文的模型在訓(xùn)練階段能夠更好的提取源代碼的潛在特征.另一方面得益于基于PDG的預(yù)處理方法,因為冗余代碼對基于屬性計數(shù)的CLCDSA是有影響的,因為這會改變源代碼的屬性數(shù)量.同時,ASTLearner對于冗余代碼同樣沒有任何處理措施.
本節(jié)針對本文提出的基于PDG的預(yù)處理方法的有效性進(jìn)行驗證.實驗結(jié)果如圖7所示,從中可以看出在停用基于
圖7 基于PDG的預(yù)處理效果驗證Fig.7 Validation of pre-process effect based on PDG
PDG 的預(yù)處理方法之后本文方法的檢測效果僅僅略高于CLCDSA.但仍然明顯優(yōu)于ASTLearner和CLCDSA.
現(xiàn)有的基于機器學(xué)習(xí)的跨語言代碼抄襲檢測方法很少考慮代碼的結(jié)構(gòu)特征,導(dǎo)致其檢測模型不能準(zhǔn)確的提取代碼的特征.本文考慮了代碼基于AST的結(jié)構(gòu)特征,基于AST對詞向量進(jìn)行預(yù)訓(xùn)練,并通過將BiLSTM、CNN、Attention這3種機器學(xué)習(xí)模型進(jìn)行融合并將其嵌入到偽孿生神經(jīng)網(wǎng)絡(luò)中構(gòu)建出一種新的抄襲檢測模型.同時通過基于PDG 的代碼預(yù)處理方法減小了冗余代碼對整個模型檢測效果的影響,并且在利用完成訓(xùn)練的模型檢測之前,添加了基于屬性統(tǒng)計的過濾器,這排除了一些非抄襲代碼對對抄襲檢測效率的影響.實驗表明此方法在精確率、召回率和F1值上優(yōu)于現(xiàn)有的其他跨語言抄襲檢測方法.
本文的研究工作還可以進(jìn)一步優(yōu)化.由于模型融合后復(fù)雜度升高,同時由于基于偽孿生網(wǎng)絡(luò)架構(gòu)本身收斂較慢,因此本文所提模型的訓(xùn)練周期較長.今后研究中我們擬通過設(shè)置更有效快捷的過濾器,精度更高,收斂更快的機器學(xué)習(xí)模型,以及更加精確的預(yù)訓(xùn)練方法,來進(jìn)一步提高跨語言抄襲檢測效率.