本發(fā)明涉及一種代碼分類的方法,特別是一種基于神經(jīng)網(wǎng)絡(luò)語言模型的代碼分類方法,可以對代碼按照功能進(jìn)行分類。
背景技術(shù):
hindle等人利用統(tǒng)計學(xué)的方法將編程語言與自然語言進(jìn)行了比較,發(fā)現(xiàn)它們有非常相似的統(tǒng)計學(xué)特性。這些特性對于人類來說非常難以捕捉,但是他們證明了可以將基于學(xué)習(xí)的方法應(yīng)用在代碼分析領(lǐng)域。基于機器學(xué)習(xí)的代碼分析方法已經(jīng)被研究了很長一段時間,在解決代碼錯誤檢測、代碼重復(fù)性分析等問題時,依賴了大量的人工特征。對于一個具體的問題,這些特征需要大量的有標(biāo)簽的數(shù)據(jù)。而且該方法對于數(shù)據(jù)的表示是一種onehot的表示,即使用n維向量來對字典中的n個詞進(jìn)行編碼。這樣,在數(shù)據(jù)量增大的情況下會帶來維度災(zāi)難的問題。經(jīng)過研究表明,人工特征的效果可能要比自動學(xué)習(xí)的特征的效果還要差。例如在自然語言處理(naturallanguageprocessing,nlp)中,自動學(xué)習(xí)到的詞的分類要比著名的詞典wordnet還要準(zhǔn)確。
技術(shù)實現(xiàn)要素:
基于以上技術(shù)問題,本發(fā)明提供了一種基于神經(jīng)網(wǎng)絡(luò)語言模型的代碼分類方法,旨在解決代碼分類時因符號表示方法造成維度災(zāi)難的技術(shù)問題。
本發(fā)明采用的技術(shù)方案如下:
一種基于神經(jīng)網(wǎng)絡(luò)語言模型的代碼分類方法,包括以下步驟:
步驟1:將代碼轉(zhuǎn)換為ast樹;
步驟2:初始化ast樹結(jié)點ci的向量vec(ci),所述結(jié)點ci中非葉子結(jié)點pk的向量為vec(pk)1,所述非葉子結(jié)點pk的孩子結(jié)點tx的向量為vec(tx),其中vec(pk)1∈vec(ci),vec(tx)∈vec(ci),其中i表示結(jié)點的序號,k表示非葉子節(jié)點的序號,x表示孩子結(jié)點的序號;
步驟3:利用所述孩子結(jié)點tx的向量vec(tx),得到所述非葉子結(jié)點pk的重構(gòu)向量vec(pk)2;
步驟4:利用ast_node2vec模型對所述結(jié)點向量vec(ci)進(jìn)行學(xué)習(xí),若不滿足循環(huán)條件,更新結(jié)點向量vec(ci),跳轉(zhuǎn)到步驟3;若滿足循環(huán)條件,則輸出更新了結(jié)點向量vec(ci)的ast樹和更新后的非葉子結(jié)點pk的重構(gòu)向量vec(pk)2;
步驟5:將更新了結(jié)點向量vec(ci)的ast樹和更新后的非葉子結(jié)點pk的重構(gòu)向量vec(pk)2作為基于樹的卷積神經(jīng)網(wǎng)絡(luò)的輸入,利用基于樹的卷積神經(jīng)網(wǎng)絡(luò)完成對代碼的分類。
進(jìn)一步的,所述步驟2中,ast樹的結(jié)點向量vec(ci)的初始化的方法為給所述ast樹中的結(jié)點分別分配一個隨機值向量。
進(jìn)一步的,所述步驟3中,非葉子結(jié)點pk的重構(gòu)向量vec(pk)2的計算步驟如下:
其中,n表示結(jié)點的個數(shù),b表示大小為
進(jìn)一步的,利用ast_node2vec模型對所述結(jié)點向量vec(ci)進(jìn)行學(xué)習(xí)的步驟如下:
s401:計算非葉子結(jié)點pk的向量vec(pk)1和重構(gòu)向量vec(pk)2之間的差異值,計算公式如下為:
s402:對ast樹中的結(jié)點進(jìn)行負(fù)采樣,得到y(tǒng)個訓(xùn)練樣例和y個由訓(xùn)練樣例產(chǎn)生的負(fù)樣例,訓(xùn)練樣例與負(fù)樣例的損失函數(shù)的計算公式如下:
其中,d(y)表示第y個訓(xùn)練樣例的差異值,
s403:對ast_node2vec模型的參數(shù)進(jìn)行正則化,得到的目標(biāo)函數(shù)公式如下:
其中,m表示矩陣wl和wr中元素的個數(shù)且
s404:對所述目標(biāo)函數(shù)使用隨機梯度下降算法,使模型的參數(shù)得到調(diào)整,其中參數(shù)的更新公式如下:
其中,vec(ci)j表示結(jié)點向量vec(ci)中的元素,
進(jìn)一步的,利用所述基于樹的卷積神經(jīng)網(wǎng)絡(luò)完成對代碼的分類的具體步驟如下:
s501:將非將更新了結(jié)點向量vec(ci)的ast樹和更新后的非葉子結(jié)點pk的重構(gòu)向量vec(pk)2作為基于樹的卷積神經(jīng)網(wǎng)絡(luò)中編碼層的輸入,利用所述非葉子結(jié)點pk的向量vec(pk)1和重構(gòu)向量vec(pk)2計算非葉子結(jié)點pk的線性組合向量vec(pk),計算公式如下:
vec(ek)=wcomb1·vec(pk)1+wcomb2·vec(pk)2(10),
其中,wcomb1表示非葉子結(jié)點pk的向量vec(pk)1的權(quán)重,wcomb2表示重構(gòu)向量vec(pk)2的權(quán)重;
s502:將所述非葉子結(jié)點pk的向量vec(pk)1替換為所述線性組合向量vec(pk),其余葉子結(jié)點的向量不變,得到更新后的ast樹;
s503:利用卷積層對更新后的ast樹進(jìn)行處理,即使特征探測器在ast樹進(jìn)行滑動,得到特征探測器輸出h,計算公式如下:
其中,
s504:將卷積層輸出的ast樹輸入到池化層進(jìn)行處理;
s505:將池化層處理后的ast樹輸入到隱藏層進(jìn)行處理;
s506:將隱藏層處理后的結(jié)果輸入到輸出層中,輸出分類的結(jié)果。
綜上所述,由于采用了上述技術(shù)方案,本發(fā)明的有益效果是:
基于神經(jīng)網(wǎng)絡(luò)語言模型,可利用分布式的表示方法表示ast樹中結(jié)點的符號,能夠有效的避免維度災(zāi)難的問題,特別是在處理大規(guī)模數(shù)據(jù)問題時;利用該分類方法能顯示出語義上的相似性,充分利用了編程語言中豐富的結(jié)構(gòu)化信息;利用抽象語法樹來表示代碼,不依賴于源語言的語法,對于所有編程語言來說具有通用性;利用無監(jiān)督學(xué)習(xí)方式學(xué)習(xí)到結(jié)點的向量表示,有效地避免了使用深度神經(jīng)網(wǎng)絡(luò)時所遇到的梯度彌散問題;將代碼進(jìn)行分類,使相同功能的代碼得到重復(fù)利用,提升軟件的開發(fā)效率。
附圖說明
圖1是本發(fā)明的流程圖;
圖2是本發(fā)明的示意圖。
具體實施方式
本說明書中公開的所有特征,除了互相排斥的特征和/或步驟以外,均可以以任何方式組合。
下面結(jié)合附圖對本發(fā)明作詳細(xì)說明。
一種基于神經(jīng)網(wǎng)絡(luò)語言模型的代碼分類方法,包括以下步驟:
步驟1:利用工具pycparser將代碼轉(zhuǎn)換為ast樹(抽象語法樹)。
步驟2:初始化ast樹結(jié)點ci的向量vec(ci),即給所述ast樹中的結(jié)點分別分配一個隨機值向量;所述結(jié)點ci中非葉子結(jié)點pk的向量為vec(pk)1,所述非葉子結(jié)點pk的孩子結(jié)點tx的向量為vec(tx),其中vec(pk)1∈vec(ci),vec(tx)∈vec(ci),其中i表示結(jié)點的序號,k表示非葉子節(jié)點的序號,x表示孩子結(jié)點的序號。
步驟3:為了使ast樹中相似的結(jié)點間有著相近的向量表示,ast樹中一個非葉子結(jié)點pk的向量表示可以由其孩子子結(jié)點的向量表示通過一個單層的神經(jīng)網(wǎng)絡(luò)得到;即利用孩子結(jié)點tx的向量vec(tx),得到所述非葉子結(jié)點pk的重構(gòu)向量vec(pk)2的計算步驟如下:
其中,n表示結(jié)點的個數(shù),b表示大小為
步驟4:利用ast_node2vec模型對所述結(jié)點向量vec(ci)進(jìn)行學(xué)習(xí),若不滿足循環(huán)條件,更新結(jié)點向量vec(ci),跳轉(zhuǎn)到步驟3;若滿足循環(huán)條件,則輸出更新了結(jié)點向量vec(ci)的ast樹和更新后的非葉子結(jié)點pk的重構(gòu)向量vec(pk)2,循環(huán)條件可設(shè)置為循環(huán)次數(shù);
進(jìn)行學(xué)習(xí)的步驟如下:
s401:計算非葉子結(jié)點pk的向量vec(pk)1和重構(gòu)向量vec(pk)2之間的差異值,計算公式如下為:
s402:對ast樹中的結(jié)點進(jìn)行負(fù)采樣,得到y(tǒng)個訓(xùn)練樣例和y個由訓(xùn)練樣例產(chǎn)生的負(fù)樣例,訓(xùn)練樣例與負(fù)樣例的損失函數(shù)的計算公式如下:
其中,d(y)表示第y個訓(xùn)練樣例的差異值,
s403:對ast_node2vec模型的參數(shù)進(jìn)行正則化,得到的目標(biāo)函數(shù)公式如下:
其中,m表示矩陣wl和wr中元素的個數(shù)且
s404:對所述目標(biāo)函數(shù)使用隨機梯度下降算法,使模型的參數(shù)得到調(diào)整,其中參數(shù)的更新公式如下:
其中,vec(ci)j表示結(jié)點向量vec(ci)中的元素,
步驟5:將更新了結(jié)點向量vec(ci)的ast樹和更新后的非葉子結(jié)點pk的重構(gòu)向量vec(pk)2作為基于樹的卷積神經(jīng)網(wǎng)絡(luò)(tcnn)的輸入,利用基于樹的所述卷積神經(jīng)網(wǎng)絡(luò)完成對代碼的分類,具體步驟如下:
s501:將非將更新了結(jié)點向量vec(ci)的ast樹和更新后的非葉子結(jié)點pk的重構(gòu)向量vec(pk)2作為基于樹的卷積神經(jīng)網(wǎng)絡(luò)中編碼層的輸入,利用所述非葉子結(jié)點pk的向量vec(pk)1和重構(gòu)向量vec(pk)2計算非葉子結(jié)點pk的線性組合向量vec(pk),計算公式如下:
vec(pk)=wcomb1·vec(pk)1+wcomb2·vec(pk)2(25),
其中,wcomb1表示非葉子結(jié)點pk的向量vec(pk)1的權(quán)重,wcomb2表示重構(gòu)向量vec(pk)2的權(quán)重;
s502:將所述非葉子結(jié)點pk的向量vec(pk)1替換為所述線性組合向量vec(pk),其余葉子結(jié)點的向量不變,得到更新后的ast樹;
s503:利用卷積層對更新后的ast樹進(jìn)行處理,即使特征探測器在ast樹進(jìn)行滑動,得到特征探測器輸出h,計算公式如下:
其中,
s504:將卷積層輸出的ast樹輸入到池化層進(jìn)行處理,將結(jié)點ci的多維向量轉(zhuǎn)化為一維向量,選取所述一維向量中的最大值,輸出所述最大值;
s505:將池化層處理后的ast樹輸入到隱藏層進(jìn)行處理,即將ast樹中的結(jié)點ci與隱藏層中的每一個神經(jīng)元進(jìn)行連接;
s506:將隱藏層處理后的結(jié)果輸入到輸出層中,輸出層采用的函為數(shù)softmax,輸出分類的結(jié)果。
如上所述即為本發(fā)明的實施例。本發(fā)明不局限于上述實施方式,任何人應(yīng)該得知在本發(fā)明的啟示下做出的結(jié)構(gòu)變化,凡是與本發(fā)明具有相同或相近的技術(shù)方案,均落入本發(fā)明的保護(hù)范圍之內(nèi)。