[發明專利]一種基于深度語義的代碼函數味道檢測方法有效
| 申請號: | 201910705359.1 | 申請日: | 2019-08-01 |
| 公開(公告)號: | CN110413319B | 公開(公告)日: | 2020-10-09 |
| 發明(設計)人: | 施重陽;郭學良;江賀 | 申請(專利權)人: | 北京理工大學 |
| 主分類號: | G06F8/77 | 分類號: | G06F8/77;G06F16/35;G06K9/62 |
| 代理公司: | 北京正陽理工知識產權代理事務所(普通合伙) 11639 | 代理人: | 唐華 |
| 地址: | 100081 *** | 國省代碼: | 北京;11 |
| 權利要求書: | 查看更多 | 說明書: | 查看更多 |
| 摘要: | |||
| 搜索關鍵詞: | 一種 基于 深度 語義 代碼 函數 味道 檢測 方法 | ||
1.一種基于深度語義的代碼函數味道檢測方法,其特征在于:包括模型訓練以及模型測試;
其中,模型訓練包括代碼函數表示A、結構化特征提取A和代碼味道分類A;模型測試包括代碼函數表示B、結構化特征提取B和代碼味道分類B;
代碼函數表示A和代碼函數表示B是基于注意力機制和LSTM神經網絡的代碼函數表示;結構化特征提取A和結構化特征提取B是基于卷積神經網絡的結構化特征提取;代碼味道分類A和代碼味道分類B是基于多層感知機的代碼味道分類;
其中,所述代碼函數表示A和代碼函數表示B的操作為:對被檢測的代碼函數基于注意力機制和LSTM神經網絡對代碼函數進行特征表示并進行語義特征提取,具體為:
步驟1:將被檢測的代碼函數所在的項目名、包名、類名和函數名作為一個元組拼接在一起,輸出代碼標識符,作為深度語義提取的文本輸入,用公式(1)中的符號textual_input表示:
textual_input=namepr,namepa,namec,namem (1)
其中,namepr代表代碼函數所在的項目名;namepa代表代碼函數所在的包名;namec代表代碼函數所在的類名;namem代表代碼函數所在的函數名;
且namepr,namepa,namec以及namem統稱代碼標識符;
步驟2:結合大小寫字母、數字、下劃線、斜杠以及英文句號標志,對步驟1輸出的各個代碼標識符進行分詞,再對分詞后的長度進行統一并拼接表示;
經步驟2分詞后,每一個代碼標識符得到一個單詞序列,每個單詞序列的長度設置為q,q的取值范圍為4-10;
對分詞后的長度進行統一并拼接表示,具體為:
步驟2.1若代碼標識符所包含的單詞數超過了q,則將多出的單詞刪除,若代碼標識符所包含的單詞數少于q,則將空余部分用0補齊;
步驟2.2將得到的namepr,namepa,namec,namem此4個單詞序列拼接起來得到一個長單詞序列,該長單詞序列所包含的單詞數應為4個級別的代碼標識符所分單詞數的和;
minput=concat(namepr,namepa,namec,namem) (2)
=concat(w1,w2,···,wn), (3)
其中,namepr、namepa、namec和namem分別表示代碼函數所在的項目名、包名、類名和函數名,wi為相對應的代碼標識符分解出的單詞,下標i的取值范圍為1到n,n代表wi的數量,其取值范圍為16到40;
concat(·)為將輸入連接起來的函數,且concat(w1,w2,···,wn)表示將w1,w2,···,wn連接起來;
步驟3:根據步驟2輸出的minput,將minput長單詞序列轉換為一個包含有n個單詞的長句子,將句子中的每一個單詞輸入到單詞嵌入層將句子中每個單詞轉換為單詞向量;
步驟3中,單詞嵌入層將輸入的每一個單詞轉換為一個數字向量,稱為單詞向量;
單詞嵌入層將每一個單詞轉換為單詞向量,表示如公式(4):
V(minput)=V(concat(w1,w2,···,wn))
=concat(V(w1),V(w2),···,V(wn)) (4)
其中,V(·)表示單詞嵌入函數,即將輸入的·轉換為相對應的單詞向量;V(wi)表示將wi轉換為一個單詞向量,下標i的取值范圍為1到n;
公式(4)表明將minput轉換為單詞向量,等價于將minput所包含的每一個wi轉換為對應的單詞向量V(wi),再將n個單詞向量經concat(·)函數連接起來;
步驟4:將步驟3輸出的V(minput)單詞向量輸入到LSTM層以提取長單詞序列minput中各單詞間的上下文關系并從這些關系中獲得相關的語義特征,輸出LSTM層的隱藏層狀態h;
其中,LSTM層使用三個門去控制LSTM單元中的狀態流;對于每一個時間狀態t,通過給定的單詞向量V(wt),當前的單元狀態ct和隱藏層狀態ht通過先前的單元狀態ct-1和隱藏層狀態ht-1基于(5)-(8)進行更新;
其中,t的取值范圍為0-n;
其中,it、ft和ot是范圍在0-1的三個激活狀態;
σ是logistic sigmoid激活函數,b表示運算時的偏置參數,tanh(·)是一種非線性激活函數,表示元素乘積;W表示對應隱藏層狀態h的權重矩陣,Wc表示單元狀態c對應的權重矩陣;
其中,ht表示時間狀態t對應的隱藏層狀態,ct表示時間狀態t對應的單元狀態,表示時間狀態t計算過程中臨時的單元狀態;
步驟5:將步驟4的輸出的LSTM層隱藏層狀態h輸入到一個自注意力機制層,輸出上下文語義特征m;
其中,上下文語義特征由步驟4中的隱藏層狀態的權重和組成,由符號m表示(9):
其中,n對應著單詞序列中的單詞數量,即4q,n的取值范圍是16-40;
at是ht的注意力權重,表示第t個隱藏層狀態對代碼氣味檢測的重要程度;
對應著每一個隱藏層狀態的注意力權重at定義如公式(10)-(11):
e(ht)=W1tanh(W2ht) (10)
其中,W1和W2為權重矩陣,e(·)是一種計算隱藏層狀態對代碼味道檢測重要程度的分數函數;
經過步驟1到步驟5,完成了代碼函數表示,即對代碼函數進行特征表示并進行語義特征提取;
所述結構化特征提取A和結構化特征提取B的操作是:利用基于CNN的深度學習方法,對通過軟件重構工具提取出的代碼度量結構化信息進行結構化特征提取,具體為:
步驟6:利用代碼重構工具對需要檢測的代碼進行結構化信息提取,從而得到相應的代碼度量;
步驟7:對步驟6輸出的代碼度量進行預處理操作,得到代碼函數的結構化信息metric_input;
將所有的代碼度量分為4組,按照項目、包、類和函數的包含順序連接起來,作為結構化特征提取部分的輸入;
其中,結構化信息由metric_input表示:
metric_input=concat(grouppr,grouppa,groupc,groupm) (12)
=concat(m1,m2,…,mx). (13)
其中,grouppr、grouppa、groupc和groupm分別表示項目、包、類和函數對應的代碼度量,x表示結構化信息metric_input包含代碼度量的總數,mi表示結構化信息中的第i個代碼度量,i的取值范圍為1到x;
步驟8:將步驟7輸出的結構化信息metric_input輸入到卷積神經網絡模型CNN中,得到對應的結構化特征outputl3;
其中,CNN中包括三個卷積層,記為卷積層1、卷積層2以及卷積層3;
將結構化信息metric_input轉換為一個二維矩陣,并將這個矩陣輸入到CNN中的卷積層1;
卷積層1中的每一個卷積操作包括一個過濾器Wl1(),這個過濾器作用于一個代碼度量上去生成一個新的特征;
卷積層1中的第i個卷積操作得到一個特征ci,通過公式(14)獲得:
ci=tanh(Wl1(j)·mi+bl1(j)). (14)
其中,i的取值范圍為1-256,Wl1(j)表示i個卷積操作中的第j個過濾器的權重矩陣,bl1(j)是第j個過濾器的偏置參數,其中,j的取值范圍為1-256,mi表示metric_input中的一個代碼度量;
在卷積層1中,這個過濾器應用到每一個結構化輸入中的代碼度量上,從而生成一個特征匹配,記為Cl1(i);
特征匹配Cl1(i)和卷積層1表示為(15)到(16):
Cl1(i)=[c1,c2,…,cn], (15)
outputl1=CNN1(input)
=[Cl1(1),Cl1(2),…,Cl1(256)]. (16)
CNN1(·)表示卷積層1對應的卷積函數,input表示輸入的代碼度量,outputl1表示卷積層1的輸出;
接下來,將卷積層1的輸出輸入到卷積層2中,然后將卷積層2的輸出輸入到卷積層3中;
卷積層2和卷積層3的輸出表示為(17)到(18):
outputl2=CNN2(outputl1)
=[Cl2(1),Cl2(2),···,Cl2(128)], (17)
outputl3=CNN3(outputl2)
=[Cl3(1),Cl3(2),···,Cl3(64)]. (18)
其中,Cl2(i)表示卷積層2中的第i個過濾器生成的特征匹配,i的取值范圍為1-128,CNN2(·)表示卷積層2對應的卷積函數,outputl2表示卷積層2的輸出,Cl3(i)表示卷積層3中的第i個過濾器生成的特征匹配,i的取值范圍為1-64,CNN3(·)表示卷積層3對應的卷積函數,outputl3表示卷積層3的輸出;
步驟9:將步驟8輸出的結構化特征outputl3輸入到一個扁平操作中,將其轉變為一個一維向量;
經過步驟6至步驟9的操作,完成了結構化特征提取;
所述代碼函數味道分類是在基于注意力機制和LSTM神經網絡代碼函數表示操作和基于CNN的結構化特征提取的基礎上進行的,利用多層感知機神經網絡模型將提取到的深層特征包括語義特征和結構化特征與代碼味道檢測結果自動地匹配起來,完成分類模型的訓練,具體為:
步驟10:將步驟5輸出的上下文語義特征和步驟9輸出的一維向量在全連接層連接起來,得到多層感知機模型的輸入;
步驟11:將步驟10的輸出輸入到多層感知機模型中,利用多層感知機模型將從文本信息中提取出的上下文語義特征和從代碼度量信息中提取出的結構化特征映射到單個輸出中;
步驟12:將步驟11的輸出結果與數據集中的標簽相比較,計算binary_cross_entropy作為訓練過程的損失函數,最小化損失函數以完成代碼函數味道分類器的訓練;
其中,binary_cross_entropy損失函數表示為(19):
其中,是數據集中第i條數據的真實分類,y(i)是對第i條數據預測出的代碼味道的分類結果,log()表示對數為2的對數函數,N表示訓練數據的數據量;
至此,從步驟1到步驟12,完成了模型訓練;
其中,步驟1到步驟5,對應模型訓練中的代碼函數表示A;步驟6到步驟9,對應模型訓練中的結構化特征提取A;步驟10到步驟11,對應模型訓練中的代碼函數味道分類A;
模型測試與步驟1到步驟11完全相同,其中,步驟1到步驟5,對應模型測試中的代碼函數表示B;步驟6到步驟9,對應模型測試中的結構化特征提取B;步驟10到步驟11,對應模型測試中的代碼函數味道分類B;
模型訓練結束后,再根據步驟1到步驟11所描述的過程,完成對代碼函數的代碼味道檢測測試,得到代碼味道檢測結果。
該專利技術資料僅供研究查看技術是否侵權等信息,商用須獲得專利權人授權。該專利全部權利屬于北京理工大學,未經北京理工大學許可,擅自商用是侵權行為。如果您想購買此專利、獲得商業授權和技術合作,請聯系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/201910705359.1/1.html,轉載請聲明來源鉆瓜專利網。





