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

        ?

        基于Transformer和卷積神經(jīng)網(wǎng)絡(luò)的代碼克隆檢測

        2023-10-26 08:35:20賁可榮楊佳輝
        關(guān)鍵詞:檢測信息模型

        賁可榮, 楊佳輝, 張 獻(xiàn), 趙 翀

        (海軍工程大學(xué) 電子工程學(xué)院,湖北 武漢 430033)

        代碼克隆是軟件開發(fā)中的常見現(xiàn)象。在軟件開發(fā)和演化的過程中,程序員通過復(fù)制和粘貼代碼段,或者使用框架、復(fù)用設(shè)計(jì)模式和自動(dòng)工具生成代碼等方式加速軟件開發(fā)。以上操作導(dǎo)致代碼庫中存在2個(gè)及以上相同或相似代碼段的現(xiàn)象稱為代碼克隆[1]。開源社區(qū)中的代碼克隆可以提高開發(fā)效率,但是也會(huì)導(dǎo)致缺陷傳播,降低系統(tǒng)的可靠性。代碼克隆檢測技術(shù)目的在于自動(dòng)檢測軟件系統(tǒng)中克隆的代碼,可以幫助開發(fā)人員和管理者及時(shí)發(fā)現(xiàn)代碼克隆造成的缺陷,更好地保證軟件質(zhì)量。

        根據(jù)相似程度的不同,Bellon等[2]將代碼克隆分為4種類型,從type1到type4,代碼相似程度逐漸降低,檢測難度也逐漸增加。傳統(tǒng)的代碼克隆檢測方法基于人工定義的規(guī)則,對(duì)專家經(jīng)驗(yàn)依賴程度較高?;谏疃葘W(xué)習(xí)的方法能夠自動(dòng)學(xué)習(xí)出代碼的特征,擺脫“特征工程”的難題,減少人工分析成本。Hindle等[3]認(rèn)為編程語言和自然語言一樣,具有重復(fù)性和可預(yù)測性,能夠被機(jī)器理解和分析。受Hindle等[3]工作的啟發(fā),許多學(xué)者將代碼作為自然語言來處理。例如早期的Nicad方法[4]通過對(duì)比2個(gè)代碼行中最長相同序列來檢測代碼克隆,該方法在文本層面進(jìn)行分析,不能檢測type4類型的克隆?;谠~法的克隆檢測中,代碼被表示為token序列。CClearner[5]將程序的單詞分為8種類型,針對(duì)每個(gè)類型比較2個(gè)代碼片段的詞頻序列,得到8維向量送入神經(jīng)網(wǎng)絡(luò)中訓(xùn)練。盡管代碼和自然語言有很多共性的特征,都是由一系列單詞組成,但是代碼具有更清晰的邏輯、豐富且復(fù)雜的結(jié)構(gòu),且標(biāo)識(shí)符之間存在長距離依賴,將代碼視作自然語言或者token序列進(jìn)行處理容易丟失信息。

        抽象語法樹(abstract syntax tree,AST)是基于抽象語法結(jié)構(gòu)將源代碼轉(zhuǎn)換為樹結(jié)構(gòu)的表示形式。研究表明,基于AST表征的模型明顯優(yōu)于基于序列表征的模型[6-8]。CDLH模型[6]使用基于樹的長短期記憶網(wǎng)絡(luò)(tree-structured long short-term memory,Tree-LSTM)遍歷AST,為了提高效率,使用特定的哈希函數(shù)對(duì)代碼向量進(jìn)行哈希處理,比較散列向量之間的漢明距離來識(shí)別代碼克隆。為了解決子節(jié)點(diǎn)數(shù)目可變的問題,將AST轉(zhuǎn)換為全二叉樹。Zeng等[9]基于遞歸自動(dòng)編碼器(recursive autoencoder,RAE)模型提出了加權(quán)遞歸自編碼器(weighted recursive autoencoder,WRAE),利用WRAE分析AST,提取程序特征并將函數(shù)編碼成向量。該方法在輸入之前利用二叉樹生成規(guī)則將AST轉(zhuǎn)換成了完滿二叉樹。

        由于程序的復(fù)雜性,AST的結(jié)構(gòu)通常又大又深,尤其是嵌套結(jié)構(gòu),這樣容易產(chǎn)生梯度消失問題,導(dǎo)致AST丟失從遠(yuǎn)程節(jié)點(diǎn)到根節(jié)點(diǎn)攜帶的一些語義信息。為了簡化和提高效率,直接將AST視為二叉樹或者將AST轉(zhuǎn)換為二叉樹,這種做法破壞了源代碼的原始語法結(jié)構(gòu),削弱了神經(jīng)網(wǎng)絡(luò)模型捕獲真實(shí)語義的能力。為了克服上述基于AST的神經(jīng)網(wǎng)絡(luò)的局限性,Zhang等[10]提出了ASTNN,將每個(gè)大型的AST分割成許多語句樹序列,在保留原始代碼語義的基礎(chǔ)上解決了梯度消失問題。詞向量訓(xùn)練器將每一個(gè)語句樹都編碼成向量送入雙向門控循環(huán)單元(bidirectional gated recurrent unit,BiGRU)中,生成代碼片段的向量表示。Meng等[11]在ASTNN模型的基礎(chǔ)上進(jìn)行改進(jìn),特征提取階段用BiLSTM替換原本的BiGRU,新增加一個(gè)注意力網(wǎng)絡(luò)層提取代碼特征。

        在特征提取階段,現(xiàn)有的大部分模型都使用基于循環(huán)神經(jīng)網(wǎng)絡(luò)(recurrent neural network,RNN)的時(shí)間序列模型。2017年,谷歌團(tuán)隊(duì)[12]提出了完全基于自注意力的深度學(xué)習(xí)模型——Transformer。相較于RNN,自注意力支持高度的并行化,并且還能輕松地實(shí)現(xiàn)長期上下文建模。

        1 代碼克隆檢測方法

        本文提出一種基于Transformer和卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)的代碼克隆檢測(Transformer and CNN based code clone detection,TCCCD)方法。TCCCD方法的總體架構(gòu)如圖1所示。基于AST的表征方式能夠?qū)崿F(xiàn)源代碼的抽象表示,優(yōu)于基于token的表征方式。為了解決AST過大帶來的梯度消失問題,先將代碼解析成AST,同時(shí)保留源代碼的語法結(jié)構(gòu)。本文借鑒ASTNN切割A(yù)ST的思想,將一段代碼的AST切割為小型語句子樹,其中,語句子樹由先序遍歷得到的語句節(jié)點(diǎn)序列構(gòu)成,蘊(yùn)含代碼結(jié)構(gòu)和層次化信息。每一組語句樹通過語句編碼器編碼成向量,送入神經(jīng)網(wǎng)絡(luò)中。在神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)方面,現(xiàn)有的模型大多使用基于RNN的時(shí)間序列模型,當(dāng)2個(gè)相關(guān)性較大的時(shí)刻距離較遠(yuǎn)時(shí),會(huì)產(chǎn)生較大的信息損失。本文使用Transformer的Encoder部分提取代碼的全局信息,Transformer能夠直接對(duì)輸入序列之間的更長距離的依賴關(guān)系建模。作為補(bǔ)充,使用CNN捕獲代碼的局部信息,學(xué)習(xí)出蘊(yùn)含詞法、語法和結(jié)構(gòu)信息的代碼向量表示。計(jì)算兩段代碼向量的歐氏距離表征語義關(guān)聯(lián)程度,訓(xùn)練一個(gè)二元分類器檢測代碼克隆。

        圖1 TCCCD的總體架構(gòu)

        1.1 分割A(yù)ST,編碼語句樹序列

        首先,面向函數(shù)粒度,使用現(xiàn)有的語法分析工具,將代碼解析為AST。為了防止AST規(guī)模過大而導(dǎo)致梯度消失問題,不能直接將AST作為模型的輸入,而是按照語句粒度對(duì)AST進(jìn)行切割。

        AST經(jīng)過先序遍歷,得到語句節(jié)點(diǎn)的集合S,將MethodDeclaration視為一種特殊的語句節(jié)點(diǎn),故S′=S∪{MethodDeclaration},集合S′中的每一個(gè)節(jié)點(diǎn)都對(duì)應(yīng)代碼中的一條語句。對(duì)于嵌套語句C,C={FuncDef,While,DoWhile,Try,For,If,Switch},定義一系列獨(dú)立節(jié)點(diǎn)P={block,body}。其中,block用于拆分嵌套語句的頭和主體部分;body用于方法聲明。對(duì)于所有的語句節(jié)點(diǎn)s,s∈S′,將s的后代定義為D(s)。節(jié)點(diǎn)d∈D(s),如果s和d之間存在一條路徑通過節(jié)點(diǎn)p,p∈P,表明節(jié)點(diǎn)d被節(jié)點(diǎn)s中的一條語句包含,則稱節(jié)點(diǎn)d為節(jié)點(diǎn)s的子語句節(jié)點(diǎn)。那么,以s為根的語句樹是由s及其所有后代節(jié)點(diǎn)D(s)組成。按照語句樹的定義,構(gòu)造函數(shù)遞歸地創(chuàng)建語句樹,并將其依次添加到語句樹序列中。語句樹序列的順序蘊(yùn)含了代碼結(jié)構(gòu)的層次化信息。

        針對(duì)分割得到的語句樹序列,將每棵語句樹編碼成向量。首先,經(jīng)過Word2Vec訓(xùn)練符號(hào)嵌入向量,得到初始輸入;其次,遍歷語句樹,并遞歸地將當(dāng)前節(jié)點(diǎn)的符號(hào)作為新的輸入進(jìn)行計(jì)算,同時(shí)計(jì)算其葉子節(jié)點(diǎn)的隱藏狀態(tài)。對(duì)于非葉子節(jié)點(diǎn)來說,以節(jié)點(diǎn)n為例:

        (1)

        式中:xn表示節(jié)點(diǎn)n的one hot向量;We表示預(yù)訓(xùn)練好的詞嵌入矩陣。

        (2)

        式中:Wn∈Rd×k表示權(quán)重矩陣;C表示子節(jié)點(diǎn)的個(gè)數(shù);hi為葉子節(jié)點(diǎn)的隱藏狀態(tài);bn表示偏置;σ(·)為激活函數(shù);h表示更新后的隱藏狀態(tài)。

        由于每棵語句樹子節(jié)點(diǎn)的個(gè)數(shù)不一致,計(jì)算葉子節(jié)點(diǎn)的隱藏狀態(tài)時(shí),為了利用矩陣運(yùn)算進(jìn)行批處理,使用ST-tree的動(dòng)態(tài)批處理樣本的算法[10]。

        如式(3)所示,經(jīng)過最大池化,可以得到每一個(gè)語句樹最后的向量表示et,其中,N表示語句樹的節(jié)點(diǎn)個(gè)數(shù)。

        et=[maxhi1,maxhi2,…,maxhik],i=1,2,…,N。

        (3)

        1.2 Transformer的Encoder捕獲全局信息

        在RNN中,由于信息是沿著時(shí)刻逐層傳遞的,因此,當(dāng)2個(gè)相關(guān)性較大的時(shí)刻距離較遠(yuǎn)時(shí),會(huì)產(chǎn)生較大的信息損失。雖然引入了門控機(jī)制,如LSTM、GRU等,可以部分解決這種長距離依賴問題,但是它們的記憶窗口也是有限的。CNN善于捕獲局部特征,如果想要捕獲遠(yuǎn)距離特征,需要增加網(wǎng)絡(luò)深度。Transformer完全基于自注意力,能夠直接建模輸入序列之間更長距離的依賴關(guān)系。綜合考慮Transformer的性能與參數(shù)量,本文使用Transformer的Encoder提取全局的特征。

        Transformer的Encoder部分捕獲全局信息主要包含以下5個(gè)步驟。

        步驟1 位置編碼。輸入為經(jīng)過詞嵌入后的張量,故只需對(duì)輸入進(jìn)行位置編碼,位置編碼的方法為

        PE(pos,2i)=sin(pos/10 0002i/d);

        (4)

        PE(pos,2i+1)=cos(pos/10 0002i/d)。

        (5)

        X表示經(jīng)過詞嵌入后得到的張量,將詞嵌入與位置編碼相加,可以得到經(jīng)過位置編碼后的輸出Y:

        Y=X+PE(X);

        (6)

        步驟2 將向量Y作為輸入,送入多層注意力機(jī)制層。注意力函數(shù)是基于3個(gè)矩陣(Q、K、V)同時(shí)計(jì)算的。

        (7)

        步驟3 通過殘差連接和層歸一化,使矩陣運(yùn)算維數(shù)一致。將網(wǎng)絡(luò)中的隱藏層歸一化為標(biāo)準(zhǔn)正態(tài)分布,加快模型的訓(xùn)練速度和收斂速度。

        Y′=Y+YAttention;

        (8)

        Y″=LayerNorm(Y′)。

        (9)

        步驟4 通過前饋層和2個(gè)線性映射層,使用激活函數(shù)來生成向量Yhidden。

        Yhidden=σ(Linear(Linear(Y″)))。

        (10)

        步驟5 進(jìn)行殘差連接和層歸一化,得到最終向量C1。

        Y′hidden=Yhidden+Y″;

        (11)

        C1=LayerNorm(Y′hidden)。

        (12)

        1.3 CNN捕獲全局信息

        根據(jù)文獻(xiàn)[13-15]的研究,CNN和self-attention在特征信息的提取上存在差異。self-attention焦點(diǎn)在全局上下文中決定在哪里投射更多的注意力,而CNN更多地關(guān)注所輸入的局部特征信息。不同的模型和結(jié)構(gòu)通常會(huì)學(xué)習(xí)到不同的特征[16],Transformer與CNN可以互補(bǔ)[17]。

        借鑒ConvS2S[18],選取其中的卷積塊結(jié)構(gòu),利用級(jí)聯(lián)一維卷積獲得代碼行局部特征信息。如式(13)所示,每個(gè)卷積層包括一個(gè)一維卷積、一個(gè)門控線性單元(gated linear unit,GLU)和一個(gè)殘差連接。

        F=Y+GLU(Conv(Y))。

        (13)

        式中:Y表示CNN的輸入,為經(jīng)過詞嵌入層和位置編碼得到的向量,與Transformer的Encoder共享。Conv表示一維卷積層,其卷積核大小常設(shè)置為3。

        最后,為了使卷積層輸出的特征向量C2與上文中的向量C1具有相同維數(shù),增加一個(gè)線性層網(wǎng)絡(luò):

        C2=Linear(F)。

        (14)

        1.4 融合Transformer的Encoder和CNN學(xué)習(xí)到的特征

        將Transformer的Encoder學(xué)習(xí)到的全局上下文特征與CNN學(xué)習(xí)到的局部代碼特征表示相融合,相比以往的方法大多只用到單個(gè)模型學(xué)習(xí)代碼特征,本文方法能充分挖掘代碼信息。

        Z=Concat(C1,C2)。

        (15)

        如式(15)所示,通過矩陣連接將2個(gè)特征向量進(jìn)行合并,得到代碼表示向量Z,相當(dāng)于將CNN部分嵌入Transformer的Encoder中,通過設(shè)置layer的大小,可以實(shí)現(xiàn)Transformer的Encoder部分與CNN的堆疊。

        考慮到不同語句的重要性直觀上是不相等的,例如,ForStatement語句中的API調(diào)用可能包含更多的函數(shù)信息,因此,使用最大池化來捕獲最重要的語義。該模型最終生成一個(gè)向量r∈R2m,它被視為代碼片段的向量表示。

        1.5 計(jì)算兩段代碼向量的相似度

        (16)

        式中:Wo∈R2m×M為權(quán)值矩陣;bo為偏置。

        二元交叉熵被用作損失函數(shù)。

        (17)

        (18)

        式中:δ為閾值。本文實(shí)驗(yàn)將δ設(shè)為0.5[10-11]。如果相似度閾值高于0.5,得到預(yù)測值為True,將代碼對(duì)標(biāo)識(shí)為克隆。

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

        2.1 實(shí)驗(yàn)數(shù)據(jù)與評(píng)測指標(biāo)

        代碼克隆檢測使用的數(shù)據(jù)集包括OJClone和BigCloneBench,這2個(gè)數(shù)據(jù)集已被許多研究人員用于代碼相似性檢測和克隆檢測[6,10-11]。OJClone數(shù)據(jù)集的標(biāo)簽分為2類;BigCloneBench數(shù)據(jù)集的標(biāo)簽分為5類,分別表示類型1至類型4的代碼克隆,其中類型3的代碼克隆分為強(qiáng)3型和中度3型。

        數(shù)據(jù)集基礎(chǔ)信息如表1所示。對(duì)于OJClone數(shù)據(jù)集,7 500個(gè)代碼段組合可以得到超過2 800萬個(gè)代碼對(duì),隨機(jī)選取50 000個(gè)代碼對(duì)構(gòu)成實(shí)驗(yàn)數(shù)據(jù)集。對(duì)于BigCloneBench,59 688個(gè)代碼段組合可以得到超過600萬個(gè)真代碼克隆對(duì)和超過26萬個(gè)假代碼克隆對(duì)。隨機(jī)抽取了20 000對(duì)假代碼克隆對(duì),抽取中度3型和類型4代碼克隆對(duì)共20 000對(duì),類型1、類型2和強(qiáng)3型數(shù)量較少,均小于20 000對(duì),以上全部加入實(shí)驗(yàn)數(shù)據(jù)集中。2個(gè)實(shí)驗(yàn)數(shù)據(jù)集中的數(shù)據(jù)均以3∶1∶1的比例隨機(jī)劃分為訓(xùn)練集、驗(yàn)證集和測試集。

        表1 代碼克隆檢測數(shù)據(jù)集

        代碼克隆檢測常使用混淆矩陣來評(píng)估模型的性能。所有指標(biāo)的計(jì)算方式為

        (19)

        式中:Precision表示精度;Recall表示召回率;TP表示被分類系統(tǒng)識(shí)別為克隆的克隆對(duì)數(shù)量;FP表示被識(shí)別為克隆的非克隆對(duì)的數(shù)量;TN表示被識(shí)別為非克隆的非克隆對(duì)的數(shù)量;FN表示被識(shí)別為非克隆的克隆對(duì)的數(shù)量。

        2.2 實(shí)驗(yàn)環(huán)境與參數(shù)設(shè)置

        本實(shí)驗(yàn)的硬件環(huán)境為Inter(R)Core i7-8700K CPU、NVIDIA GeForce GTX 1080 Ti(discrete graphics)、RAM 32.00 GB。軟件環(huán)境為Anaconda 3.6.0、Pycharm 3.4.0、Pytorch 1.6.0。使用pycparser解析C代碼、Javalang解析Java代碼得到AST;使用Word2Vec得到詞嵌入表示;AdaMax為優(yōu)化器。

        經(jīng)過反復(fù)多次實(shí)驗(yàn),調(diào)整模型參數(shù),直至得到性能最優(yōu)的模型。詳細(xì)的模型參數(shù)如下:Encodedimension為128;Embeddingdimension為128;Hiddendimension為256;Epoch為15;Batchsize為32;Numberofhead為8;Kernelsize為3;Numberofencoderblocklayer為6;maxlength為512;δ為0.5。

        2.3 實(shí)驗(yàn)結(jié)果

        2.3.1 模型結(jié)構(gòu)分析

        為了分析模型結(jié)構(gòu)對(duì)代碼克隆檢測的影響,驗(yàn)證TCCCD中融合2個(gè)網(wǎng)絡(luò)后提取特征的能力更強(qiáng),設(shè)計(jì)了3種神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行代碼克隆檢測比較,即TCCCD、CNN及Transformer的Encoder。

        在OJClone數(shù)據(jù)集上進(jìn)行實(shí)驗(yàn),圖2展示了經(jīng)過每一輪訓(xùn)練之后,3個(gè)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)在OJClone驗(yàn)證集上的損失曲線。圖3展示了3個(gè)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)在OJClone數(shù)據(jù)集上檢測代碼克隆的精度、召回率和F1值??梢钥闯?使用Transformer的Encoder和CNN相結(jié)合的結(jié)構(gòu),即TCCCD,相對(duì)于其他2個(gè)結(jié)構(gòu)收斂速度更快。經(jīng)過1輪訓(xùn)練之后,TCCCD在驗(yàn)證集上的損失值就降低到了0.126 8。在15輪的訓(xùn)練過程中,TCCCD每一輪驗(yàn)證損失值均低于另外2個(gè)網(wǎng)絡(luò)結(jié)構(gòu)。經(jīng)過15輪訓(xùn)練之后,TCCCD結(jié)構(gòu)的精度為98.9%,召回率為98.1%,F1值為98.5%。3個(gè)評(píng)價(jià)指標(biāo)值均高于其他2個(gè)網(wǎng)絡(luò)結(jié)構(gòu)。

        圖2 不同神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)在OJClone驗(yàn)證集上的損失曲線

        圖3 不同神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)在OJClone檢測代碼克隆結(jié)果

        表2展示了不同神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)在數(shù)據(jù)集BigCloneBench上對(duì)4種不同類型的代碼克隆檢測結(jié)果,其中,BCB-T1、BCB-T2、BCB-T4分別代表數(shù)據(jù)集BigCloneBench中的類型1、類型2、類型4,BCB-ST3和BCB-MT3分別代表數(shù)據(jù)集BigCloneBench中的強(qiáng)3型和中度3型。實(shí)驗(yàn)表明,在4種類型的代碼克隆中,TCCCD方法精度、召回率及F1值均為最高。TCCCD相對(duì)于使用Transformer的Encoder部分或者CNN提取代碼特征有優(yōu)勢(shì),可以提高檢測精度,同時(shí)降低誤報(bào)率和漏報(bào)率。且TCCCD在識(shí)別BCB-T1和BCB-T2中2個(gè)代碼片段的相似性方面都非常有效,因?yàn)槌瞬煌臉?biāo)識(shí)符名稱、注釋等,這2個(gè)代碼片段幾乎相同。而在其他代碼克隆類型中,TCCCD檢測效果稍有下降,尤其在BCB-T4中,檢測精度可以達(dá)到99.3%,召回率卻只有91.2%,F1值也只有93.8%。說明檢測的假陽性率較高,有一些語義上相似的代碼對(duì)并不屬于代碼克隆對(duì)。

        表2 不同神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)在BigCloneBench數(shù)據(jù)集上對(duì)4種不同類型的代碼克隆檢測結(jié)果

        實(shí)驗(yàn)表明,Transformer的Encoder部分和CNN學(xué)習(xí)到了不同的代碼特征,2個(gè)網(wǎng)絡(luò)相結(jié)合提取特征的能力更強(qiáng)。

        2.3.2 各方法在2個(gè)數(shù)據(jù)集上的檢測結(jié)果對(duì)比

        表3展示了各模型在OJClone數(shù)據(jù)集上檢測代碼克隆的結(jié)果??梢钥吹?RAE和CDLH方法的精度和F1值都比較小,均低于60%。這是因?yàn)镽AE基于token序列進(jìn)行編碼,無法有效學(xué)習(xí)到代碼的結(jié)構(gòu)特征。OJClone是由學(xué)生提交的編程題構(gòu)造而來,一般很少引用第三方庫,通常會(huì)定義i、j、k等沒有意義的變量名。因此,CDLH雖然是基于AST,依舊會(huì)丟失很多詞匯信息,只能捕獲一些語法信息。ASTNN、At-BiLSTM、TCCCD檢測代碼克隆的效果較好,精度、召回率和F1值均高于90%。3種方法都基于語句子樹進(jìn)行編碼,說明將大型AST切割成語句子樹的方法有助于模型學(xué)習(xí)代碼的結(jié)構(gòu)信息、語句級(jí)的詞法和語法信息。TCCCD在各項(xiàng)度量指標(biāo)上均高于其他任何一個(gè)模型。在檢測精度上,TCCCD與ASTNN均具有最高值98.9%;在召回率上,TCCCD比ASTNN高5.4百分點(diǎn),比At-BiLSTM高2.8百分點(diǎn),達(dá)到了98.1%;在F1值上,TCCCD比ASTNN高3百分點(diǎn)、比At-BiLSTM高出2.5百分點(diǎn),達(dá)到了98.5%。Transformer的Encoder部分和CNN相輔相成,可以學(xué)習(xí)出融合代碼全局信息和局部信息的稠密向量表示。TCCCD能提取到更多的詞法、語法和結(jié)構(gòu)信息來衡量代碼的相似性。

        表3 各方法在OJClone數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果

        表4展示了各方法在BigCloneBench上的檢測結(jié)果。

        表4 各方法在BigCloneBench數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果

        由于BigCloneBench包含4種代碼克隆類型,所以最終的結(jié)果是根據(jù)4種類型的代碼對(duì)數(shù)量加權(quán)計(jì)算得來。相較于OJClone數(shù)據(jù)集,RAE和CDLH方法檢測效果均有提升,RAE的檢測精度由48.9%提升到了73.5%,CDLH的檢測精度由47.0%提升到了92.0%。這是由于BigCloneBench是從真實(shí)項(xiàng)目中挖掘到的,實(shí)現(xiàn)同一個(gè)問題時(shí)往往會(huì)用到相同的第三方庫的類以及Java基礎(chǔ)類。而ASTNN、At-BiLSTM、TCCCD檢測效果稍有下降,原因是類型4的代碼對(duì)占代碼克隆對(duì)總數(shù)的一半以上。而類型4為語義相似的代碼克隆對(duì),有一些語義上相似的代碼對(duì)并不屬于代碼克隆,致使假陽性率升高,使得召回率和F1值均有所降低。雖然上述3個(gè)方法在BigCloneBench上檢測效果略有下降,但還是優(yōu)于RAE和CDLH方法。

        在檢測精度上,TCCCD為99.1%,比ASTNN高出1.2百分點(diǎn),比At-BiLSTM高出3.2百分點(diǎn);在召回率值上,TCCCD比ASTNN高出3.1百分點(diǎn)、比At-BiLSTM高出0.4百分點(diǎn);在F1值上,TCCCD比ASTNN高出1.3百分點(diǎn),比At-BiLSTM高出0.8百分點(diǎn),達(dá)到了94.2%。相比之下,TCCCD可以實(shí)現(xiàn)更高檢測精度,同時(shí)降低誤報(bào)率。

        3 結(jié)論

        本文構(gòu)建了基于Transformer和卷積神經(jīng)網(wǎng)絡(luò)的代碼克隆檢測模型——TCCCD。為了解決AST過大帶來的梯度消失問題,同時(shí)保留源代碼的語法結(jié)構(gòu),將AST切割為多個(gè)語句子樹。在神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)方面,本文將注意力模型與CNN相結(jié)合來提取代碼特征。TCCCD使用Transformer的Encoder來提取代碼的全局信息,由于Transformer與卷積神經(jīng)網(wǎng)絡(luò)形成互補(bǔ),再利用CNN模型,捕獲代碼的局部信息,進(jìn)而學(xué)習(xí)出蘊(yùn)含詞法、語法和結(jié)構(gòu)信息的代碼向量表示。本文方法在OJClone和BigCloneBench數(shù)據(jù)集上進(jìn)行評(píng)測,并與代表性代碼克隆檢測方法進(jìn)行比較,精度、召回率、F1值均有提升。實(shí)驗(yàn)結(jié)果表明,該方法能夠有效檢測代碼克隆。

        猜你喜歡
        檢測信息模型
        一半模型
        “不等式”檢測題
        “一元一次不等式”檢測題
        “一元一次不等式組”檢測題
        重要模型『一線三等角』
        重尾非線性自回歸模型自加權(quán)M-估計(jì)的漸近分布
        訂閱信息
        中華手工(2017年2期)2017-06-06 23:00:31
        3D打印中的模型分割與打包
        小波變換在PCB缺陷檢測中的應(yīng)用
        展會(huì)信息
        国产成人精品999在线观看| 亚洲中文字幕精品视频| 日本精品人妻在线观看| 亚洲一区二区懂色av| 日韩 无码 偷拍 中文字幕| 国产美女久久精品香蕉69| 亚洲精品成AV无在线观看| 国产三级在线观看不卡| 少妇人妻综合久久中文字幕| 午夜不卡无码中文字幕影院| 无码少妇a片一区二区三区| 亚洲高潮喷水中文字幕| 国产av精品一区二区三区视频| 曰韩少妇内射免费播放| 中文字幕人妻熟女人妻洋洋 | 日本丰满熟妇videossexhd| 超碰97人人做人人爱少妇| 亚洲天堂99| 性色av成人精品久久| 激情在线一区二区三区视频| 中文无码熟妇人妻av在线| 国产精品第1页在线观看| 久久久亚洲精品蜜臀av| 中文字幕人妻精品一区| 亚洲va韩国va欧美va| 成人h动漫精品一区二区| 超清无码AV丝袜片在线观看| 东北老熟女被弄的嗷嗷叫高潮| 少妇内射兰兰久久| 欧美视频久久久| 91国语对白在线观看| 久久亚洲中文字幕精品一区| 国产内射在线激情一区| 人妻系列无码专区久久五月天 | 人妖精品视频在线观看| 丝袜美腿精品福利在线视频| 久久久噜噜噜久久| 国产成人无码免费网站| 99久久久69精品一区二区三区 | 色yeye在线观看| 黑人玩弄极品人妻系列视频|