何燁辛,谷 林,孫 晨
(1.西安工程大學(xué) 計(jì)算機(jī)科學(xué)學(xué)院,陜西 西安 710048;2.西安科技大學(xué) 管理學(xué)院,陜西 西安 710054)
在互聯(lián)網(wǎng)飛速發(fā)展與數(shù)據(jù)大爆炸的時(shí)代,海量的數(shù)據(jù)如何有效地進(jìn)行特征提取是自然語言處理領(lǐng)域一個(gè)重要的研究方向。在自然語言處理領(lǐng)域和人工智能領(lǐng)域中,高效地實(shí)現(xiàn)人與計(jì)算機(jī)之間用自然語言進(jìn)行有效通信的各種理論和方法是現(xiàn)今學(xué)者們廣泛研究的內(nèi)容。在計(jì)算機(jī)學(xué)科相關(guān)教育教學(xué)中,編譯錯(cuò)誤信息是衡量學(xué)生代碼正確性和代碼質(zhì)量的一個(gè)重要指標(biāo),而編譯錯(cuò)誤信息特征的提取不僅可以有效地進(jìn)行特征的聚類與分類等研究,還可以為計(jì)算機(jī)學(xué)科的教育教學(xué)中學(xué)生編程問題提供針對(duì)性的指導(dǎo),從而提高學(xué)生的編程效率,提升編程興趣。在文本特征提取中,目前已有的特征提取方法包含詞袋模型[1-3]、信息增益(information gain,IG)[4-5]、詞頻-逆向文件頻率模型[6-9](term frequency-inverse document frequency,TF-IDF)以及word2vec文本特征提取[10-11]等相關(guān)方法。文獻(xiàn)[12]提出了一種方法用來解決從英語和意大利語文本中以無監(jiān)督的方式提取關(guān)鍵詞或短語的問題。這種方法的主要特征是由兩種方法集成,單詞嵌入模型(例如word2vec或GloVe能夠捕獲單詞及其上下文的語義)和聚類算法(能夠識(shí)別術(shù)語的本質(zhì))并選擇較重要的一個(gè)或多個(gè)來表示文本的內(nèi)容以更優(yōu)的方式實(shí)現(xiàn)英語和意大利語關(guān)鍵詞或短語提取。文獻(xiàn)[13]使用word2vec將單詞表示為矢量形式的模型計(jì)算英語單詞之間的相似度。使用英語維基百科中的320 000條文章作為語料庫(kù),利用余弦相似度計(jì)算方法確定相似度值。然后,該模型通過測(cè)試集黃金標(biāo)準(zhǔn)WordSim-353(多達(dá)353對(duì)單詞)和SimLex-999(多達(dá)999對(duì)單詞)進(jìn)行測(cè)試,并根據(jù)人類判斷將它們標(biāo)記為相似值。皮爾遜相關(guān)性用于找出相關(guān)性的準(zhǔn)確性。文獻(xiàn)[14]使用word2vec模型進(jìn)行短文本的詞向量生成,使用該方法的前提是忽略不同詞性的詞語對(duì)短文本的影響力,引入詞性改進(jìn)特征權(quán)重計(jì)算方法,將詞性對(duì)文本分類的貢獻(xiàn)度嵌入到傳統(tǒng)的TF-IDF算法中計(jì)算短文本中詞的權(quán)重,并結(jié)合word2vec詞向量生成短文本向量,最后利用SVM實(shí)現(xiàn)短文本分類。文獻(xiàn)[15]利用詞間向量余弦的相似性構(gòu)造了一種迭代算法來識(shí)別相似詞。算法利用種子情感詞在通用的漢語情感詞匯(DSL、NSL和HSL)中,自動(dòng)生成新的替代情感詞。最后,情感詞自動(dòng)從備選詞中選擇相似情感詞的詞匯比較和統(tǒng)計(jì)分析方法,利用word2vec自動(dòng)構(gòu)建用于教育目的特定領(lǐng)域的漢語情感詞典;文獻(xiàn)[16]尋求通過將無監(jiān)督的深度神經(jīng)網(wǎng)絡(luò)技術(shù)與詞嵌入方法相集成來提高ATS的質(zhì)量。首先,開發(fā)了基于單詞嵌入的文本摘要,并且展示了word2vec表示比傳統(tǒng)的BOW表示提供了更好的結(jié)果。其次,結(jié)合word2vec和無監(jiān)督特征學(xué)習(xí)方法提出其他模型,以合并來自不同來源的信息。文獻(xiàn)[11]是使用維基百科語料庫(kù),通過word2vec訓(xùn)練得到相應(yīng)的詞模型,然后加權(quán)分配模型中的詞向量與對(duì)應(yīng)詞的TF-IDF值,建立了對(duì)應(yīng)的短文本特征表達(dá)方法。
根據(jù)上述研究,目前基于word2vec文本特征提取方法的研究立足不同視角,涉足多個(gè)方面,國(guó)內(nèi)外學(xué)者使用基于word2vec詞向量模型的應(yīng)用十分廣泛,而對(duì)于編譯錯(cuò)誤信息文本數(shù)據(jù)的研究目前仍比較少。該文主要是針對(duì)Java程序的編譯錯(cuò)誤信息,希望能夠提取該序列主要成分,即編譯錯(cuò)誤信息特征。相對(duì)于單一使用word2vec詞向量表示模型,word2vec和卷積神經(jīng)網(wǎng)絡(luò)相結(jié)合的模型可以增強(qiáng)數(shù)據(jù)的精度,增大數(shù)據(jù)的處理量,更好地表示編譯錯(cuò)誤信息特征向量。因此該文主要使用的方法是結(jié)合word2vec工具中的skip-gram模型與CNN神經(jīng)網(wǎng)絡(luò),以無監(jiān)督學(xué)習(xí)的方式從大量編譯錯(cuò)誤信息中學(xué)習(xí)語義信息,達(dá)到編譯錯(cuò)誤特征提取的目的。
該文構(gòu)建了一種適用于編譯錯(cuò)誤信息的特征化表示方法,運(yùn)用word2vec和CNN神經(jīng)網(wǎng)絡(luò)相結(jié)合的方法提取編譯器錯(cuò)誤信息的語義特征,最終形成編譯錯(cuò)誤信息空間向量模型的特征化表示。具體流程如圖1所示。
圖1 編譯錯(cuò)誤信息特征提取流程
機(jī)器學(xué)習(xí)相關(guān)算法中實(shí)現(xiàn)計(jì)算機(jī)與人之間利用自然語言進(jìn)行通信的首要任務(wù)是用數(shù)學(xué)數(shù)字表示文本特征,最常見的表示方式為使用詞向量來表示某個(gè)詞語。在現(xiàn)今的研究中,利用神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練大量的數(shù)據(jù)是獲得詞向量表示的主要方法,神經(jīng)網(wǎng)絡(luò)模型表示詞向量的基本思想不但可以包含詞間的潛在語義關(guān)系,同時(shí)可以高效地避免維數(shù)災(zāi)難。word2vec最先是由Mikolov在2013年提出的[17],是一種基于淺層神經(jīng)的詞向量生成模型。該模型的主要作用是求得低維度的詞向量,并對(duì)相關(guān)數(shù)據(jù)詞語與上下文語義之間關(guān)系進(jìn)行建模。該方法得出的詞向量的維度一般處于100~300之間,可以更好地解決傳統(tǒng)空間向量模型高維稀疏的問題。近年來,word2vec被廣泛應(yīng)用到文本特征提取工作中。word2vec主要包含兩個(gè)模型:跳字模型(skip-gram)和連續(xù)詞袋模型(continuous bag of words,CBOW)。skip-gram是給定input word來預(yù)測(cè)上下文,而CBOW是給定上下文來預(yù)測(cè)input word。
CBOW模型包括輸入層、投影層和輸出層。假設(shè)以(context(w),w)為例,context(w)構(gòu)成是由w前后各x個(gè)詞。其中輸入層中的詞向量涵蓋context(w)中2x個(gè)詞v(context(w)1),v(context(w)2),…,v(context(w)2x);投影層是求和累加輸入層中的2x個(gè)向量,如公式(1)。其技術(shù)原理如圖2(a)所示。
(1)
skip-gram模型包括三層,分別為輸入層、投影層和輸出層。其中,輸入層輸入當(dāng)前特征詞,詞的詞向量Wt∈Rm;輸出為該特征詞上下文窗口中詞出現(xiàn)的概率;投影層的目的是使目標(biāo)函數(shù)L值最大化。假定有一組詞序列ω1,ω2,…,ωN,則:
(2)
其中,N為詞序列的長(zhǎng)度;c為當(dāng)前特征詞的上下文長(zhǎng)度;p(ωj+1|ωj)為在已知當(dāng)前詞ωj出現(xiàn)的概率下,其上下文特征詞ωj+1出現(xiàn)的概率。通過skip-gram模型訓(xùn)練得到的全部詞向量,組成詞向量矩陣X∈Rmn。以xi∈Rm表示特征詞i在m維空間中的詞向量[18]。其技術(shù)原理如圖2(b)所示。
(a)
(b)
該文將采用word2vec工具中的skip-gram模型進(jìn)行編譯錯(cuò)誤信息文本詞向量生成的相關(guān)訓(xùn)練。主要是利用Hierarchical Softmax構(gòu)造的一棵Huffman樹作為word2vec模型的輸出層訓(xùn)練詞向量。其具體流程如下所示:
步驟1:取詞完成。采用分詞-滑動(dòng)窗口的方式進(jìn)行取詞,如圖3所示。
圖3 分詞-滑動(dòng)窗口取詞
步驟2:構(gòu)造編譯錯(cuò)誤信息詞典并統(tǒng)計(jì)詞頻。
步驟3:構(gòu)造樹形結(jié)構(gòu)。核心技術(shù)是Hierarchical Softmax構(gòu)造的一棵Huffman樹;生成節(jié)點(diǎn)并初始化各非葉節(jié)點(diǎn)的中間向量和葉節(jié)點(diǎn)的詞向量,如圖4所示。
圖4 Huffman樹結(jié)構(gòu)圖
步驟4:訓(xùn)練中間向量和詞向量。
卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)是一種多層神經(jīng)網(wǎng)絡(luò)。其構(gòu)建主要是模仿生物的視知覺,可用來進(jìn)行監(jiān)督學(xué)習(xí)和非監(jiān)督學(xué)習(xí),是深度學(xué)習(xí)的代表算法之一。卷積神經(jīng)網(wǎng)絡(luò)隱含層內(nèi)的卷積核參數(shù)共享和層間連接的稀疏性使得卷積神經(jīng)網(wǎng)絡(luò)能夠以較小的計(jì)算量對(duì)格點(diǎn)化(grid-like topology)特征。該神經(jīng)網(wǎng)絡(luò)模型包含3層結(jié)構(gòu),分別為輸入層、卷積層和“池化+連接層”,如圖5所示。
1.2.1 輸入層
輸入層又稱數(shù)據(jù)輸入層,主要是對(duì)原始數(shù)據(jù)進(jìn)行預(yù)處理;其中包括去均值、歸一化和PCA降維。
該文利用word2vec工具的skip-gram模型訓(xùn)練編譯錯(cuò)誤信息語料庫(kù)中的數(shù)據(jù),生成對(duì)應(yīng)詞向量。則輸入層輸入的數(shù)據(jù)為編譯錯(cuò)誤信息序列中各個(gè)詞匯對(duì)應(yīng)的詞向量,是一個(gè)表示編譯錯(cuò)誤信息句子的矩陣,如公式(3)所示。其維度為m×n,其中每個(gè)詞是由一個(gè)n維的詞向量進(jìn)行表示。
(3)
圖5 卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
1.2.2 卷積層
卷積層是卷積神經(jīng)網(wǎng)絡(luò)最重要的一個(gè)層次,主要有兩個(gè)關(guān)鍵的操作,分別是局部關(guān)聯(lián)和窗口滑動(dòng)。
在卷積層中輸入的是公式(3)所示的維度為m×n的矩陣,用來表示編譯錯(cuò)誤信息句子矩陣。在卷積層進(jìn)行卷積操作時(shí),卷積核的寬度的選取與詞向量的維度保持一致,這樣的方式可以保證卷積核在每次滑動(dòng)過的位置是一個(gè)完整的詞向量。
卷積計(jì)算如公式(4)所示:
yi=f(∑wi·xi:i+h-1+b)
(4)
其中,wi表示為卷積核的權(quán)重矩陣,xi:i+h-1表示第i行到i+h-1行的詞向量矩陣,b表示偏置,函數(shù)f表示激活函數(shù)。
當(dāng)編譯錯(cuò)誤信息經(jīng)過卷積相關(guān)操作后,最終可以得到一個(gè)n-h+1維的向量y,如公式(5)所示。
y=[y1,y2,…,yn-h+1]
(5)
1.2.3 池化+連接層
池化是存在于連續(xù)的卷積層中間的,主要作用是用于數(shù)據(jù)和參數(shù)量的壓縮,充分減少過擬合現(xiàn)象,更方便優(yōu)化。連接層是所有的神經(jīng)元的權(quán)重連接,通常是處于卷積神經(jīng)網(wǎng)絡(luò)的尾部進(jìn)行。
卷積層之后,通常需要在CNN之間添加池化。池化的主要作用是不斷降低維數(shù),減少CNN神經(jīng)網(wǎng)絡(luò)中的參數(shù)和計(jì)算次數(shù)。極大地縮短了訓(xùn)練時(shí)間并控制過度擬合。目前最常見的池類型是最大池化(max pooling),它在每個(gè)窗口中占用最大值。將卷積層輸出的編譯錯(cuò)誤信息特征向量中提取最大值表示為最重要的編譯錯(cuò)誤信息特征,相同卷積核卷積池化后的標(biāo)量組合得到這個(gè)窗口大小的特征向量,將所有窗口下的特征向量進(jìn)行連接層的連接,最終組合成為完整的編譯錯(cuò)誤信息的特征向量。
SVM(support vector machine),又稱支持向量機(jī),是二分類模型中的一種。它的主要原理是定義在特征空間上的間隔最大的線性分類器。是一種基于統(tǒng)計(jì)學(xué)習(xí)理論的機(jī)器學(xué)習(xí)方法,由貝爾實(shí)驗(yàn)室中的Vapnik首次提出。支持向量機(jī)學(xué)習(xí)的主要目的就是用于尋找類別間隔最大化的分類邊界,最終將所求解問題轉(zhuǎn)化為一個(gè)凸二次規(guī)劃問題并進(jìn)行求解。其步驟如下:
(1)將數(shù)據(jù)轉(zhuǎn)為支持向量機(jī)包的格式;
(2)對(duì)數(shù)據(jù)進(jìn)行歸一化處理;
(3)優(yōu)先選擇徑向基核函數(shù);
(4)通過交叉驗(yàn)證尋找最佳函數(shù);
(5)使用最佳參數(shù)訓(xùn)練編譯錯(cuò)誤信息數(shù)據(jù)。
結(jié)果評(píng)定可以直觀地證明方法使用的準(zhǔn)確性。該文采用文本分類技術(shù)中經(jīng)常使用的評(píng)價(jià)指標(biāo)作為實(shí)驗(yàn)結(jié)果評(píng)定的依據(jù)。為了驗(yàn)證模型的編譯錯(cuò)誤信息特征提取效果,針對(duì)結(jié)果的測(cè)評(píng),該文引入以下三個(gè)指標(biāo)對(duì)分類器的結(jié)果進(jìn)行評(píng)價(jià),分別為準(zhǔn)確率、召回率和F1-Score值,其中F1-Score值是準(zhǔn)確率和召回率的綜合指標(biāo),如式(6)、(7)所示。
(1)準(zhǔn)確率(precision)。
(6)
(2)召回率(recall)。
(7)
(3)F1-Score值。
(8)
其中,TP(cj)表示應(yīng)為cj的樣本且被正確分成cj類的樣本數(shù);FN(cj)表示應(yīng)為cj類的樣本沒有被正確分成cj類的樣本數(shù);FP(cj)表示不為cj類的樣本但被分為cj類的樣本數(shù)。
2.1.1 數(shù)據(jù)來源
該文采用某校2018級(jí)軟件工程系四個(gè)班級(jí)共151名學(xué)生《面向?qū)ο蟪绦蛟O(shè)計(jì)課程》學(xué)習(xí)期間所提交的Java編程作業(yè),主要選取的是在實(shí)現(xiàn)單一方法時(shí)學(xué)生編寫Java代碼的短片段所遇到的相關(guān)錯(cuò)誤提示。將Java編譯錯(cuò)誤信息分為三類,分別為語法錯(cuò)誤、語義錯(cuò)誤和邏輯錯(cuò)誤。語法錯(cuò)誤是指程序中單詞的拼寫,標(biāo)點(diǎn)和順序等錯(cuò)誤。語義錯(cuò)誤是處理代碼的含義,是由錯(cuò)誤的編程語言解釋方式導(dǎo)致的錯(cuò)誤。這些類型的錯(cuò)誤大多數(shù)是Java和類似語言所特有的,但是比語法錯(cuò)誤更抽象。邏輯錯(cuò)誤一般是指編程過程中發(fā)生導(dǎo)致偏離程序本身意思的錯(cuò)誤,程序可以通過編譯并成功運(yùn)行,但是運(yùn)行結(jié)果與期望值不符。編譯錯(cuò)誤信息語料庫(kù)中有錯(cuò)誤信息652條,其中訓(xùn)練集文本數(shù)520條,測(cè)試集文本數(shù)132條。
2.1.2 數(shù)據(jù)預(yù)處理
在實(shí)驗(yàn)開始之前,首先需要對(duì)數(shù)據(jù)進(jìn)行降噪處理。需要?jiǎng)h除編譯錯(cuò)誤信息文本數(shù)據(jù)中的標(biāo)點(diǎn)符號(hào)和一些無意義的常用詞,在編譯錯(cuò)誤信息中利用正則表達(dá)式讀取無意義常用詞和數(shù)字并剔除它,同時(shí)將符號(hào)利用正則表達(dá)式替換為一個(gè)空格,用空格將數(shù)據(jù)進(jìn)行分割。
實(shí)驗(yàn)中利用機(jī)器學(xué)習(xí)的支持向量機(jī)(SVM)算法將編譯錯(cuò)誤信息特征進(jìn)行分類實(shí)驗(yàn),測(cè)評(píng)結(jié)果采用所有類別的平均值進(jìn)行展示。實(shí)驗(yàn)結(jié)果如表1所示。使用word2vec結(jié)合CNN的方法可以大大減少直接對(duì)文本向量化而出現(xiàn)部分編譯錯(cuò)誤文本特征丟失,從而降低編譯錯(cuò)誤信息文本分類的準(zhǔn)確性。相較單一使用word2vec進(jìn)行編譯錯(cuò)誤信息特征提取的方法,word2vec與CNN相結(jié)合的方法對(duì)編譯錯(cuò)誤信息特征表示的效果顯著提升。
表1 實(shí)驗(yàn)結(jié)果 %
該文提出了一種基于word2vec與CNN神經(jīng)網(wǎng)絡(luò)相結(jié)合的編譯錯(cuò)誤信息特征提取的方法。為了更全面且準(zhǔn)確地使用向量表示編譯錯(cuò)誤信息,采用word2vec工具中skip-gram模型對(duì)編譯錯(cuò)誤信息文本進(jìn)行低維的詞向量表示,然后結(jié)合卷積神經(jīng)網(wǎng)絡(luò)提取編譯錯(cuò)誤信息文本中最重要的特征表示,在池化+連接池層中組合成完整的編譯錯(cuò)誤信息特征表示。最后經(jīng)過相關(guān)實(shí)驗(yàn),通過SVM分類方法將word2vec模型和word2vec+CNN模型進(jìn)行結(jié)果比對(duì)。結(jié)果表明word2vec+CNN方法能較好地適用于編譯錯(cuò)誤信息特征提取。下一步將針對(duì)該模型進(jìn)一步進(jìn)行優(yōu)化,以提高編譯錯(cuò)誤信息特征提取的準(zhǔn)確性,更好地得到編譯錯(cuò)誤信息的有效分類。