[發明專利]一種基于上下文環境的依戀情結代碼味道檢測方法有效
| 申請號: | 202110007180.6 | 申請日: | 2021-01-05 |
| 公開(公告)號: | CN112732570B | 公開(公告)日: | 2022-05-31 |
| 發明(設計)人: | 施重陽;趙舒鑫;任少君;江賀 | 申請(專利權)人: | 北京理工大學 |
| 主分類號: | G06F11/36 | 分類號: | G06F11/36;G06N3/08;G06N3/04 |
| 代理公司: | 北京正陽理工知識產權代理事務所(普通合伙) 11639 | 代理人: | 張利萍 |
| 地址: | 100081 *** | 國省代碼: | 北京;11 |
| 權利要求書: | 查看更多 | 說明書: | 查看更多 |
| 摘要: | |||
| 搜索關鍵詞: | 一種 基于 上下文 環境 依戀 情結 代碼 味道 檢測 方法 | ||
1.一種基于上下文環境的依戀情結代碼味道檢測方法,包括模型訓練部分和模型測試部分;
其中,模型訓練包括:代碼上下文信息表示A、函數及類關聯特征提取B和代碼味道分類C;模型測試包括代碼上下文信息表示D、函數及類關聯特征提取E和代碼味道分類F;
代碼上下文信息表示A和代碼上下文信息表示D是基于注意力機制和卷積神經網絡的上下文信息表示;
函數及類關聯特征提取B和函數及類關聯特征提取E是基于卷積神經網絡的函數及類關聯特征提取;
代碼味道分類C和代碼味道分類F是基于多層感知機的代碼味道分類;
其特征在于:
其中,代碼上下文信息表示A和代碼上下文信息表示D的操作為:基于注意力機制和卷積神經網絡,對被檢測的代碼上下文進行特征表示并進行語義特征提取,具體如下:
將檢測的代碼函數解構為三部分,第一個部分包括返回值和參數類型,第二個部分包括內部調用的方法名字及內部調用的屬性名字,第三部分為函數名字;通過這種解構方式,將上下文環境元素引入特征依戀檢測;
具體地:
將被檢測的代碼函數的返回值和參數類型,作為一個上下文信息元組拼接在一起,用符號Method_context表示;同時,將被檢測的代碼函數內部調用的方法的名字及內部調用的屬性的名字作為一個內容元組拼接在一起,用符號Method_content表示;最后,將被檢測的代碼函數的名字作為一個單獨的名稱信息元組,用符號Method_name表示:
Method_context=<returnm,parameterm> (1)
Method_content=<method_namem,attribute_namem> (2)
Method_name=<namem> (3)
其中,returnm代表代碼函數的返回值,parameterm代表代碼函數的參數;method_namem代表代碼函數內部調用的方法的名字,attribute_namem代表代碼函數內部調用的屬性的名字;namem代表代碼函數的名字;
將被檢測的代碼函數包含類內部調用方法的上下文信息,作為包含類的上下文信息元組拼接在一起,用符號ContainClass_context表示;同時,將包含類內部的方法、屬性的名字作為內容元組拼接在一起,用符號ContainClass_content表示;最后將包含類的名字作為一個內容元組拼接在一起,用符號ContainClass_name表示:
ContainClass_context=returncm,parametercm (4)
ContainClass_content=Method_namecc,attribute_namecc (5)
ContainClass_name=namecc (6)
其中;returncm代表包含類內部函數的返回值,parametercm代表包含類內部函數的參數;Method_namecc代表包含類內部函數名稱,attribute_namecc代表包含類內部屬性名稱;namecc中代表包含類的名字;
將被檢測的代碼函數的目標類內部的方法的上下文信息,作為目標類的上下文信息元組拼接在一起,用符號TargetClass_context表示;同時,將目標類內部的方法、屬性的名字作為內容元組拼接在一起,用符號TargetClass_content表示;最后將目標類的名字作為一個內容元組拼接在一起,用符號TargetClass_name表示;
TargetClass_context=returntm,parametertm (7)
TargetClass_content=Method_nametc,attribute_nametc (8)
TargetClass_name=nametc (9)
其中,returntm代表目標類內部函數的返回值,parametertm代表目標內部函數的參數;Method_nametc代表目標類內部函數名稱,attribute_nametc代表目標類內部屬性名稱;nametc中代表目標類的名字;
步驟2:結合大小寫字母、數字、下劃線、斜杠以及英文句號標志,對步驟1輸出的各代碼標識符進行分詞,再對分詞后的單詞序列進行處理及篩選;
經分詞后,每一個代碼標識符得到一個單詞序列,隨后對得到的單詞序列進行處理及篩選;
其中,對分詞后得到的單詞序列進行處理及和篩選的具體方法為:
步驟2.1:若得到的單詞序列中有單個的大寫或小寫英文字母,并且該單詞無實際意義的,刪除該字母;
步驟2.2:將得到的單詞序列全部轉換成小寫;
步驟2.3:按照步驟1中的輸出元組,將對應元組得到的單詞序列拼接起來,得到一個長單詞序列;
該長單詞序列所包含的單詞數為對應元組中代碼標識符所分單詞數的和:
Method_context=returnm,parameterm (10)
=concat(w1,w2,…,wn). (11)
其中,returnm、parameterm分別表示代碼函數的返回值和參數;wi為相對應的代碼標識符分解出的單詞,下標i的取值范圍為1到n,n代表wi的數量;concat(·)為將輸入連接起來的函數,concat(w1,w2,…,wn)表示將w1,w2,…,wn連接起來;按照此步驟,對步驟1中所有的輸出元組都做相同的處理;
步驟3:根據步驟2輸出的Method_context,將Method_context長單詞序列轉換為一個包含有n個單詞的長句子,將句子中的每一個單詞輸入到單詞嵌入層將句子中每個單詞轉換為單詞向量;其中,單詞嵌入層將輸入的每一個單詞轉換為一個數字向量,稱為單詞向量;單詞嵌入層將每一個單詞轉換為單詞向量,表示如式(12):
V(Method_context)=V(concat(w1,w2,…,wn))
=concat(V(w1),V(w2),…,V(wn)) (12)
其中,V(·)表示單詞嵌入函數,即將輸入的(·)轉換為相對應的單詞向量;V(wi)表示將wi轉換為一個單詞向量,下標i的取值范圍為1到n;對經過步驟2處理的所有輸出元組都做相同的處理;
公式(12)表明,將Method_context轉換為單詞向量等價于將Method_context所包含的每一個wi轉換為對應的單詞向量V(wi),再將n個單詞向量經concat(·)函數連接起來;
步驟4:將步驟3輸出的與V(Method_context)相同形式的9個單詞向量輸入到卷積神經網絡CNN中,以提取句子中各單詞間的上下文關系,并從這些關系中獲得相關的語義特征,得到9個對應元組內部特征;
其中,CNN包括三種不同尺寸的過濾器,記為W2()、W3()、W4(),每種尺寸的過濾器分別有32個以確保能夠充分提取輸入單詞間的上下文關系;
在嵌入層后的卷積層中,每一個卷積操作包含:大小為“2*單詞向量維度”的過濾器32個,記為W2();“3*單詞向量維度”的過濾器32個,記為W3();“4*單詞向量維度”的過濾器32個,記為W4();3個不同尺寸的過濾器分別作用于步驟3輸出的嵌入表示以獲取到提取出來的代碼標識符的內部特征;該卷積層中尺寸大小為i*單詞向量維度的過濾器經過卷積操作得到一個特征ci,通過公式(13)獲得:
cij=tanh(Wi(j)·mi+bi(j)) (13)
其中,i的取值范圍為2-4,j的取值范圍為1-32;Wi(j)表示卷積尺寸為i*單詞向量的第j個過濾器的權重矩陣;bi(j)是第j個過濾器的偏置參數;tanh(·)是一個非線性的激活函數;mi表示9個輸入矩陣中的符合過濾器尺寸的單詞向量;
對于同一單詞矩陣,3個不同尺寸的過濾器都會提取到32個特征矩陣,應該將同一單詞矩陣的96個特征矩陣轉換到同一Tensor類型數據中,通過公式(14)及(15)完成:
ci=Concat(ci1,…,ci32) (14)
outputcn_method_context=Concat(ci) (15)
其中,ci代表尺寸為i*單詞向量維度的32過濾器的特征矩陣組合結果,i的取值范圍為2-4;ci1表示尺寸為i*單詞向量維度的第一個過濾器獲得的輸出特征;outputcn_method_context代表3種不同尺寸的共96個過濾器對Method_context信息矩陣的處理結果,對步驟3輸出的9種信息都做相同的處理;
步驟5:將經過步驟4操作得到的9個輸出,輸入到一個基于CNN的自注意力機制層,輸出9個代碼上下文信息表示矩陣,通過這個操作將信息利用率進一步提升;
基于CNN的自注意力機制,是在spatial和channel兩個維度完成的:
outputat_method_context=aspatial(achanneloutputcn_method_context) (16)
其中,outputat_method_context表示經過自注意力機制處理的Method_context數據矩陣;outputcn_method_context表示步驟4中輸出的經過CNN卷積的Method_context數據;achannel是自注意力機制在CNN層輸入數據channel維度的權重,通過基于輸入數據的寬和高的globalmax polling和global average pooling以及共享的多層感知機來完成對不同channel賦予不同的權重;aspatial是自注意力機制對已經經過channel維度處理的數據賦予spatial維度的權重,通過全局最大池化、全局平均池化及降維操作來完成對不同的spatial賦予不同的權重;對于步驟4輸出的9個信息矩陣,都需要做相同的處理,輸出9個語義特征矩陣;
經過步驟1到步驟5,完成了代碼上下文信息表示,即對代碼的函數及類的上下文信息進行特征表示并進行語義特征提取;
函數及類關聯特征提取B和函數及類關聯特征提取E的操作為:利用基于LSTM的深度學習方法,對已經被自注意力層賦予不同權重的函數及類信息進行關聯特征提取;
具體地:
步驟6:對步驟5輸出的語義特征矩陣進行拼接融合,轉換成符合卷積要求的9個特征矩陣;
步驟7:將步驟6輸出的特征矩陣進行分類,Method_name、ContainClass_name、TargetClass_name的三個特征矩陣由同一個CNN卷積層進行處理,Method_context、ContainClass_context、TargetClass_context的三個特征矩陣由同一個CNN卷積層進行處理,Method_content、ContainClass_content、TargetClass_content的三個特征矩陣由同一個CNN卷積層進行處理;按照以上規則將特征矩陣輸入到CNN網絡模型中,得到更深層次的語義特征矩陣;
其中,CNN中包括三個并行的卷積層,記為卷積層1、卷積層2以及卷積層3;將Method_name、ContainClass_name、TargetClass_name三個特征矩陣輸入到卷積層1中,剩余6個矩陣按照前述規則分別輸入到卷積層2和卷積層3;
在卷積層1中,使用64個過濾器去獲得結構化輸入的多維特征,每個過濾器的大小設置為3*1;卷積層2和卷積層3參數設置與卷積層1相同;
卷積層1中的每一個卷積操作包括一個過濾器Wl1(),這個過濾器作用于對應尺寸的單詞向量上,提取更深層次的文本特征;卷積層1中的第i個卷積操作得到一個特征ci,通過公式(14)獲得:
ci=tanh(Wl1(j)·mi+bl1(j)). (17)
其中,i的取值范圍為1-64;Wl1(j)表示i個卷積操作中的第j個過濾器的權重矩陣;bl1(j)是第j個過濾器的偏置參數,其中j的取值范圍為1-64;tanh(·)是一個非線性的激活函數;mi表示輸入矩陣中的符合過濾器尺寸的單詞向量;對卷積層2和卷積層3設置同樣的參數,并且完成同樣的操作;
在卷積層1中,這個過濾器應用到對應尺寸的單詞向量上,從而生成一個特征匹配Cl1(i),Cl1(i)和卷積層1表示為(18)到(19):
Cl1(i)=[c1,c2,…,cn], (18)
outputl1_n=CNN1(inputn)
=[Cl1(1),Cl1(2),…,Cl1(64)]. (19)
其中,CNN1()表示卷積層1對應的卷積函數;inputn表示輸入的特征矩陣,對于卷積層1來說共有三個不同的輸入特征矩陣,分別是Method_name、ContainClass_name、TargetClass_name的特征矩陣,即對應n的取值為1-3;outputl1_n表示卷積層1的輸出對inputn,對于三個不同的輸入特征矩陣,共有三個輸出;
卷積層2和卷積層3同樣執行相同的操作,輸出表示為(20)到(21):
outputl2_n=CNN2(inputn)
=[Cl2(1),Cl2(2),…,Cl2(64)], (20)
outputl3_n=CNN3(inputn)
=[Cl3(1),Cl3(2),…,Cl3(64)]. (21)
其中,Cl2(i)表示卷積層2中的第i個過濾器提取的特征,i的取值范圍為1-64;CNN2(·)表示卷積層2的卷積函數;inputn表示輸入的特征矩陣,對于卷積層2來說共有三個不同的輸入特征矩陣,分別是Method_context、ContainClass_context、TargetClass_context的特征矩陣,即對應n的取值為1-3;outputl2_n表示卷積層2對inputn的輸出;Cl3(i)表示卷積層3中的第i個過濾器提取的特征,i的取值范圍為1-64;CNN3(·)表示卷積層3的卷積函數;inputn表示輸入的特征矩陣,對于卷積層3來說共有三個不同的輸入特征矩陣,分別是Method_content、ContainClass_content、TargetClass_content的特征矩陣,即對應n的取值為1-3;outputl3_n表示卷積層3對inputn的輸出;
步驟8:將步驟7輸出的9個特征矩陣中和上下文信息相關的3個矩陣outputl2_1、outputl2_2、outputl2_3進行壓縮維度以及max_pooling操作以符合LSTM輸入要求;
步驟9:將經過步驟8操作的輸出關于context矩陣輸入到LSTM層,以提取輸入矩陣中各單詞之間的上下文關系,并從中獲得函數及類之間的關聯特征,輸出LSTM層的隱藏層狀態h;
其中,LSTM層使用三個門來控制LSTM單元中的狀態流;對于每一個時間狀態t,通過給定的單詞向量V(wt)、當前的單元狀態ct和隱藏層狀態ht、通過先前的單元狀態ct-1和隱藏層狀態ht-1,基于公式(22)-(25)進行更新;
其中,t的取值范圍為0-n;it、ft和ot是范圍在0-1的三個激活狀態;σ是logisticsigmoid激活函數,b表示運算時的偏置參數,tanh(·)是一種非線性激活函數,表示元素乘積;W表示對應隱藏層狀態h的權重矩陣,Wc表示單元狀態c對應的權重矩陣;ht表示時間狀態t對應的隱藏層狀態,ct表示時間狀態t對應的單元狀態,表示時間狀態t計算過程中臨時的單元狀態;bc表示單元狀態c對應的偏置參數;
經過步驟6至步驟9的操作,完成了函數及類關聯特征的提取;
所述代碼味道分類,是在基于CNN神經網絡和注意力機制的代碼上下文信息表示和基于LSTM神經網絡的函數及類關聯特征提取的基礎上進行的,利用多層感知機神經網絡模型將提取到的深層特征包括上下文特征和關聯特征與代碼味道檢測結果自動地匹配起來,完成分類模型的訓練;
具體地:
步驟10:將步驟7中卷積層1和卷積層3輸出的深度語義特征和步驟9輸出的函數及類之間的關聯特征在全連接層連接起來,得到多層感知機模型的輸入;
步驟11:將步驟10的輸出輸入到多層感知機模型中,利用多層感知機模型將從文本信息中提取到的深度語義特征和函數及類之間的關聯特征映射到單個輸出中;
其中,多層感知機模型的輸出層只有一個神經元,表示本次識別代碼味道的結果,即存在代碼味道或不存在代碼味道,該輸出層的激活函數為sigmoid函數;
步驟12:將步驟11的輸出結果與數據集中的標簽比較,計算binary_cross_entropy作為訓練過程的損失函數,最小化損失函數以完成代碼函數味道分類器的訓練;binary_cross_entropy損失函數表示為:
其中,是數據集中第i條數據的真實分類;y(i)是對第i條數據預測出的代碼味道的分類結果;log()表示對數為2的對數函數;N表示訓練數據的數據量;
至此,從步驟1到步驟12,完成了模型訓練;
模型訓練包括代碼上下文信息表示A、函數及類關聯特征提取B和代碼味道分類C;模型測試包括代碼上下文信息表示D、函數及類關聯特征提取E和代碼味道分類F;
其中,步驟1到步驟5,對應模型訓練中的代碼上下文信息表示A;步驟6到步驟9,對應模型訓練中的函數及類關聯特征提取B;步驟10到步驟12,對應模型訓練中的代碼味道分類C;
模型測試部分與步驟1到步驟12完全相同,其中,步驟1到步驟5,對應模型測試中的代碼上下文信息表示A;步驟6到步驟9,對應模型測試中的函數及類關聯特征提取B;步驟10到步驟12,對應模型訓練中的代碼味道分類C;
模型訓練結束后,再根據步驟1到步驟12所描述的過程,完成對代碼函數的代碼味道檢測測試,最終得到代碼味道檢測結果。
該專利技術資料僅供研究查看技術是否侵權等信息,商用須獲得專利權人授權。該專利全部權利屬于北京理工大學,未經北京理工大學許可,擅自商用是侵權行為。如果您想購買此專利、獲得商業授權和技術合作,請聯系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/202110007180.6/1.html,轉載請聲明來源鉆瓜專利網。





