衡 威,范 磊
(上海交通大學(xué) 網(wǎng)絡(luò)空間安全學(xué)院,上海 200240)
文檔特征可以用于文檔的聚類、分類以及相似度分析等領(lǐng)域。已有的文檔特征提取算法包括來源于自然語言處理領(lǐng)域的詞袋模型、文檔主題模型以及近年來常用的神經(jīng)網(wǎng)絡(luò)相關(guān)特征提取方法等。已有的特征提取方法首先需要完成對文本數(shù)據(jù)進行預(yù)處理,主要包括分詞、停用詞的過濾等。文檔特征提取依賴于解析后的純文本內(nèi)容,因此在實際應(yīng)用中需要對獲取的各種格式文檔做文本內(nèi)容解析,以便獲取其中包含的文本信息。
與此對應(yīng),文本數(shù)據(jù)在計算機中是以二進制形式存儲的,不同的文檔類型對信息的保存格式各不相同。如果直接以二進制形式對文檔數(shù)據(jù)進行特征提取,可以免去對文檔的恢復(fù),具有對不同文件格式的普適性。本文提出了一種基于滑動窗口的二進制文檔取詞算法,可實現(xiàn)二進制文檔的直接特征分析。
相較于傳統(tǒng)的特征提取方法如詞袋模型等,神經(jīng)網(wǎng)絡(luò)用來做特征提取所能處理的數(shù)據(jù)量更大,維度更高,效果也更好[1]。而二進制文本經(jīng)過滑動窗口的取詞后,會有數(shù)據(jù)量的激增和維度的爆炸。因此,本文提出了一種基于神經(jīng)網(wǎng)絡(luò)的二進制文件特征提取算法實現(xiàn)特征的降維。
本文模型先使用滑動窗口做取詞處理,使用TFIDF生成每篇文章的關(guān)鍵詞及其權(quán)重,選取權(quán)重值較高的部分生成詞匯表;再使用Word2vec生成相應(yīng)的詞向量替換卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)中原本的One-hot編碼,按照詞匯表生成每篇文章對應(yīng)的向量,并將降維后的特征向量輸出。綜合考慮二進制文本數(shù)據(jù)的本身的特點,使用THUCNews的一個子集并將其轉(zhuǎn)化成二進制的格式后作為實驗數(shù)據(jù),使用模型生成特征并用其做分類訓(xùn)練驗證效果。
本文的特征提取主要針對二進制文本進行,希望能提取出該序列的主要成分即特征。特征提取本身是一個降維的過程,其中一組原始變量被簡化為更易于管理的組(特征)進行處理,同時仍然準(zhǔn)確、完整地描述原始數(shù)據(jù)集[2]。在已有的特征提取研究中,最接近的是自然語言處理技術(shù)(Natural Language Processing,NLP)中所用到的特征提取,因為同樣是對一個序列進行特征提取。
1.1.1 One-hot編碼相關(guān)特征提取
以英文為例,一個文本可以簡單被理解為詞語的線形序列。一個one-hot編碼的文本是一個多維向量,向量的維度是所有出現(xiàn)過的詞語,而每一個維度的值為0或者1。0表示該詞在該本文中沒有出現(xiàn),1則相反[3]。
1.1.2 詞袋模型
詞袋模型是抽象文檔或句子的稀疏矩陣編碼。它本身在各種文章理解中都作為高效的處理方法而存在。基于上述的one-hot編碼,每一個文檔D可以被簡化為N×M矩陣。其中N為此文檔的詞語數(shù)量,M為語料庫的詞匯總數(shù)。對于這個文檔,有:
詞袋抽象模型:
可以看到,詞袋模型直接完成了詞匯的相加而去除了詞匯順序的信息。一個人在理解句子意思時,如果句子的詞語順序被打亂,通常情況下人并不會產(chǎn)生理解障礙[4]。
現(xiàn)今深度學(xué)習(xí)蓬勃發(fā)展,特別是在計算機視覺領(lǐng)域,許多前沿的研究已經(jīng)能利用神經(jīng)網(wǎng)絡(luò)提取圖片的各種特征。針對自然語言處理問題,學(xué)界也研發(fā)了許多相應(yīng)的深度學(xué)習(xí)網(wǎng)絡(luò)來提取其特征[5]。
1.2.1 RNN文本特征提取
傳統(tǒng)的全連接網(wǎng)絡(luò)是由一個輸入層向量、一個輸出層向量和多個隱藏層向量線性排布組成的神經(jīng)網(wǎng)絡(luò),在處理定維特征問題可以起到一定的效果。而循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)在全連接網(wǎng)絡(luò)的基礎(chǔ)上,在部分隱藏層加入回環(huán),而一個隱藏層的輸出會被保留作為下一次處理的輸入。這種設(shè)計起到了信息保留的作用。自然語言文本作為以詞匯為單位的序列時非常適合RNN處理,且其意味著考慮了語序[6]。
1.2.2 LSTM文本特征提取
長短期記憶神經(jīng)網(wǎng)絡(luò)(Long Short-Term Memory,LSTM)是一種RNN的變體。由于傳統(tǒng)的RNN只有1單位的延時單元,詞語的相關(guān)性并沒有被很好記憶[7]。一旦一個重要信息是跨段落的關(guān)聯(lián)性存在時,隨著梯度擴散傳播,遠處的詞匯影響力會持續(xù)減小。LSTM在RNN的基礎(chǔ)上將RNN中的節(jié)點替換成一種專用的單元,以更具有選擇性地記憶信息,提升處理效果。LSTM的核心概念是單元(Cell)狀態(tài)和各種門[8]。
1.2.3 Word2vec
Word2vec是由Google提出的一個詞匯向量化方案。相比one-hot編碼,Word2vec可以借助語料庫信息,將詞匯從高維的稀疏矩陣轉(zhuǎn)化成低維的稠密矩陣[9]。
Word2vec目前主要有CBOW和skip-gram兩種訓(xùn)練方式。如圖1所示的兩種模型,CBOW模型以一個中心詞對應(yīng)的上下文的單詞作為輸入,以該中心詞作為輸出進行訓(xùn)練,相當(dāng)于預(yù)測在給定的上下文情況下最有可能出現(xiàn)的單詞為哪個[10];而skipgram訓(xùn)練詞向量主要通過以一個單詞作為輸入,然后預(yù)測它的上下文單詞來實現(xiàn)。這種方法可以使用生成的向量快速比較詞距,也可以在這個詞匯集范圍內(nèi)量化相同詞根的不同形式之間的關(guān)系。
圖1 CBOW模型和skip-gram 模型
1.2.4 Text-CNN
CNN最初用于處理圖像問題,但是在自然語言處理中,使用CNN進行文本分類也可以取得良好效果。文本中,每個詞都可以用一個行向量表示,一句話可以用一個矩陣來表示,那么處理文本就與處理圖像類似。該模型由Kim在2013年提出[11],通過驗證實驗和業(yè)界的共識,在文本分類任務(wù)中此模型已經(jīng)能夠取到較好的結(jié)果。雖然在某些數(shù)據(jù)集上效果可能會比RNN稍差,但是CNN模型訓(xùn)練的效率更高。所以,一般認(rèn)為CNN模型在文本分類任務(wù)中是兼具效率與質(zhì)量的理想模型。Text-CNN模型的整體網(wǎng)絡(luò)架構(gòu)由輸入層、卷積層、池化層和全連接層4部分構(gòu)成。
模型流程如圖2所示。獲取二進制文本數(shù)據(jù)后,使用合適大小及步長的滑動窗口對每個二進制文檔做取詞處理;取詞后內(nèi)容劇增,使用TFIDF生成每篇文章的關(guān)鍵詞及其權(quán)重,選取權(quán)重值較高的前8 000個生成詞匯表;再使用Word2vec生成相應(yīng)的詞向量替換CNN中原本的One-hot編碼,按照詞匯表生成每篇文章對應(yīng)的向量,之后使用CNN對生成的向量做降維處理,并將其作為最后的特征進行輸出,最后使用機器學(xué)習(xí)的分類算法進行特征好壞的驗證。
圖2 方案流程
滑動窗口取詞算法是本文的主要創(chuàng)新點之一,目前以及傳統(tǒng)的取詞算法都是基于特定的語料庫。而對文本二進制化后,已經(jīng)是對文本內(nèi)容的一種模糊化處理,這種情況下沒有合適的語料庫來做取詞處理。但是,在UTF-8的編碼中,中文文本中的一個漢字基本上用3 Bytes表示,像“體育”對應(yīng)的二進制編碼為“xe4xbdx93xe8x82xb2”。因此,考慮到中文詞匯大小和盡可能保持語義的問題,最終取詞算法采用加窗方式對二進制文本進行取詞處理。使用一個固定長度的“窗口”,在二進制形式下遍歷文章,從頭到尾滑動,窗口內(nèi)的內(nèi)容為所要提取的一個詞匯,每次移動指定大小的步長,滑動后到達新的位置,此時窗口內(nèi)的內(nèi)容為下一個要取的詞匯。當(dāng)遍歷完整篇文章后,完成對該文章的取詞工作,從而生成該文章比較有代表性的二進制詞匯內(nèi)容。
例如,對于一段序列0x4fff20da002f,取窗長window size為4,步長step為2,那么詞匯會被切割為 0x4fff、0xff20、0x20da、0xda00和 0x002f。窗長不宜過長,最終采用的窗口大小是6 Bytes,因為在UTF-8編碼中一個漢字是3 Bytes,6 Bytes相當(dāng)于一個詞語,步長是1 Bytes,對于效率與結(jié)果都比較均衡,如圖3所示。
圖3 二進制文件取詞示意
但是,由于步長大小的限制和窗長的設(shè)定,最終的取詞結(jié)果會產(chǎn)生一定程度上的冗余而導(dǎo)致空間爆發(fā),如原本1 MB的文件經(jīng)過取詞以后可能會變成14 MB。但在后續(xù)詞匯表的構(gòu)建中可通過詞頻的統(tǒng)計和篩選來減少詞匯的冗余。
由于上文的取詞處理使得每篇文檔的大小及內(nèi)容都成倍擴增,通過觀察取詞后的數(shù)據(jù),發(fā)現(xiàn)一些詞重復(fù)出現(xiàn)且并沒有實際意義,如表示空格的x00。因此先使用TFIDF對所有的文本進行初步訓(xùn)練,生成每一篇文章的關(guān)鍵詞及其對應(yīng)的權(quán)重。
TFIDF是一種常見的文檔特征提取算法,基本原理是在一個文檔庫中降低泛用詞的權(quán)重而提高專有詞權(quán)重。詞頻表示特定詞語出現(xiàn)在文中的頻率。為了使不同長度的文章比重差不多,需要對該文章的詞數(shù)做歸一化處理。對于某一特定文件的詞語,它的重要性可以表示為:
式中的ni,j指這個詞在文件dj中出現(xiàn)的次數(shù),而下面的分母表示所有詞匯在文件中出現(xiàn)的總次數(shù)。
逆向文件頻率(Inverse Document Frequency)是一個詞語在整個語料庫中重要程度的表示。某一特定詞語的idf可以表示為:
其中|D|指語料庫中文件的總個數(shù),|{ j:ti∈dj}|指包含詞語的文件數(shù)目。如果該詞語不在語料庫中,導(dǎo)致分母為0。因此,一般情況下使用1+|{ j:ti∈dj}|。然后,有:
某一特定文章內(nèi)的高頻詞匯以及在整個語料庫出現(xiàn)較少的詞匯,可以產(chǎn)生高權(quán)重的TFIDF。因此,常見詞語的TFIDF一般較低,而重要的詞語會相對較高。
訓(xùn)練完成后,將所有的關(guān)鍵詞按權(quán)重從大到小進行排序,選取前8 000個作為詞匯表,之后使用詞匯表中每個詞匯對應(yīng)的ID與每篇文章中的詞匯替換,初步生成該文章對應(yīng)的向量。同時去除無意義的、非關(guān)鍵性的詞匯做初步降維。這是本文的一個創(chuàng)新點。
Word2vec主要用來訓(xùn)練數(shù)據(jù)集生成其對應(yīng)的詞向量來嵌入到后續(xù)步驟CNN模型中的詞嵌入層來替代原本的One-hot編碼。其采用3層的神經(jīng)網(wǎng)絡(luò),如圖4所示,包含輸入層、隱層和輸出層。核心技術(shù)是根據(jù)詞語出現(xiàn)的頻率用Huffman編碼,使得所有詞頻相似的詞在隱藏層激活的內(nèi)容基本一致。出現(xiàn)頻率越高的詞語,激活的隱藏層數(shù)目越少,有效降低了計算的復(fù)雜度[12]。
圖4 Word2vec結(jié)構(gòu)
流程如下:
(1)分詞-滑動窗口完成取詞;
(2)構(gòu)造詞典,統(tǒng)計詞頻。這一步需要遍歷所有文本,找出所有出現(xiàn)過的詞,并統(tǒng)計各詞的出現(xiàn)頻率。
(3)構(gòu)造樹形結(jié)構(gòu)。依照出現(xiàn)概率構(gòu)造Huffman樹。
(4)生成節(jié)點所在的二進制碼。
(5)初始化各非葉節(jié)點的中間向量和葉節(jié)點的詞向量。樹中的各個節(jié)點都存儲著一個長為m的向量,但葉節(jié)點和非葉結(jié)點中的向量含義不同。葉節(jié)點中存儲的是各詞的詞向量,作為神經(jīng)網(wǎng)絡(luò)的輸入;而非葉結(jié)點中存儲的是中間向量,對應(yīng)于神經(jīng)網(wǎng)絡(luò)中隱含層的參數(shù),與輸入共同決定分類結(jié)果。
(6)訓(xùn)練中間向量和詞向量。
Word2vec模型對取詞好的文檔進行詞向量化后,將相應(yīng)的詞向量數(shù)據(jù)嵌入CNN模型的詞嵌入層。該模型主要由輸入層、卷積層、池化層和全連接層4部分構(gòu)成,其中輸入層又叫詞嵌入層。該模型的輸入層需要輸入一個定長的文本序列,通過分析語料集樣本的長度指定一個輸入序列的長度L。比L短的樣本序列需要填充,比L長的序列需要截取[13]。最終,輸入層輸入的是文本序列中各個詞匯對應(yīng)的詞向量。
卷積層輸入的是一個表示句子的矩陣,維度為n×d,即每句話共有n個詞,每個詞由一個d維的詞向量表示。假設(shè)Xi:j+i表示Xi到Xi+j個詞,使用一個寬度為d、高度為h的卷積核W與Xi:i+h-1(h個詞)進行卷積操作,再使用激活函數(shù)激活得到相應(yīng)的特征ci,則卷積操作可以表示為:
經(jīng)過卷積操作后,可以得到一個n-h+1維的向量c形如:
在Text-CNN模型的池化層中使用最大值池化(Max-pool),即減少了模型參數(shù),又保證了在不定長卷基層的輸出上獲得一個定長的全連接層的輸入。卷積層與池化層在分類模型的核心作用是特征提取,從輸入的定長文本序列中,利用局部詞序信息提取初級特征,并組合初級的特征為高級特征,通過卷積與池化操作省去了傳統(tǒng)機器學(xué)習(xí)中的特征工程步驟。本文主要使用該模型做特征的降維。
為使實驗過程及結(jié)果更具說服力,使用THUCNews的一個子集作為實驗數(shù)據(jù)集。而THUCNews根據(jù)新浪新聞RSS訂閱頻道2005—2011年間的歷史數(shù)據(jù)篩選過濾生成,包含74萬篇新聞文檔(2.19 GB),均為UTF-8純文本格式,選取其中的部分?jǐn)?shù)據(jù)進行實驗。文本類別涉及10個類別,即categories=[‘體育’,’財經(jīng)’,’房產(chǎn)’,’家居’,’教育’,’科技’,’時尚’,’時政’,’游戲’,’娛樂’],每個分類6 500條數(shù)據(jù)。訓(xùn)練集每個種類有5 000條數(shù)據(jù),驗證集每個種類有500條數(shù)據(jù),測試集每個種類1 000條數(shù)據(jù)。為使其更符合實驗場景,將原來的純文本數(shù)據(jù)分別轉(zhuǎn)存為二進制Word文檔。
而文檔作為一種二進制文件,是數(shù)字編碼的線形表示。如果相同類型文件具有結(jié)構(gòu)共性,那么這兩個文件的二進制編碼中一定存在相似的部分。原則上,只要提取出共性部分,剩下的部分就是文檔獨特的內(nèi)容。因此,首先對獲取的二進制文檔數(shù)據(jù)集使用滑動窗口做取詞處理,結(jié)果如表1所示。
表1 文檔取詞結(jié)果示例
處理完后,使用Word2vec對取詞后的文檔進行詞向量化處理,再將其嵌入CNN中替代原本one-hot編碼模式。
在這之前需要先構(gòu)建詞匯表,遍歷所有的文檔,使用TFIDF統(tǒng)計每篇文檔中的關(guān)鍵詞及其權(quán)重,匯總后選取權(quán)重值較高的前8 000個作為詞匯表。經(jīng)過滑動窗口的取詞處理,最終統(tǒng)計所有不重復(fù)的詞匯有近100萬個,實驗數(shù)據(jù)有50 000篇,每篇文章中的詞匯少則有幾千個,多則上萬,而權(quán)重值靠前且數(shù)值較大的,每篇文章中平均有幾十個??紤]到同種類文章的重復(fù)性,選取8 000的維度能夠?qū)崿F(xiàn)對每種類型的文章94.5%的高平均覆蓋率,其中部分二進制詞語的中文對應(yīng)如表2所示。
表2 二進制詞匯中文對照
生成該詞匯表后,首先使用Word2vec生成詞向量。在這種方法中,生成每一個二進制文檔的詞向量前,首先遍歷該文檔中包含的二進制詞匯,看其是否在詞匯表中。如果不在,直接跳過,在詞匯表中則將其匯總后使用Word2vec訓(xùn)練,生成該文檔對應(yīng)的詞向量表達形式。本文中使用的是Word2vec中的CBOW算法,即預(yù)測在給定的上下文的情況下,最有可能出現(xiàn)的單詞為哪個[14]。特征向量的維度是100,window(表示當(dāng)前詞與預(yù)測詞在一個句子中的最大距離是多少)大小為5,min_count參數(shù)設(shè)定為1,workers(控制訓(xùn)練的并行數(shù))設(shè)定為6,結(jié)果如表3所示。
表3 Word2vec詞向量化結(jié)果示例
完成這一步驟后,將每篇文檔對應(yīng)的詞向量文檔轉(zhuǎn)化成numpy格式文件保存,在后續(xù)使用中將其嵌入CNN的嵌入層作為模型的詞向量使用。之后使用該詞匯表生成和表內(nèi)詞匯對應(yīng)的詞典,即原詞匯表中的二進制詞匯作為鍵,值為從上往下遍歷詞匯表每個二進制詞匯相應(yīng)的ID順序。完成這一步驟后,遍歷每個二進制詞匯文檔,若所取二進制詞匯不是則該位置記為0,若是則將其存儲替換為該鍵對應(yīng)的ID值,最后生成整篇文章的ID數(shù)值表達形式。完成后,使用keras提供的pad_sequences將文本pad設(shè)定為固定長度,這里選取max_length為60。文章向量化后,作為輸入送入CNN中做進一步處理。
CNN模型使用的是經(jīng)典的單層Text-CNN模型,由Word2vec生成數(shù)據(jù)集的詞向量,嵌入到CNN模型中的embedding層,替換原本的One-hot編碼。其他參數(shù)包括詞匯表的大小設(shè)定為8 000、卷積核的尺寸設(shè)置為5、卷積核的數(shù)目為128。同時,將該詞嵌入層的維度設(shè)置為與Word2vec訓(xùn)練的詞向量相同的維度100,并預(yù)留好后續(xù)輸入數(shù)據(jù)的占位符input_x。該占位符的參數(shù)序列維度需要設(shè)置為60。但是,由于只是對于二進制文本的特征提取,并不涉及原本CNN實質(zhì)性的分類的相關(guān)內(nèi)容,因此其他部分的輸入如類別等內(nèi)容不做專門處理,之后在池化層后輸出降維后的每篇文章的特征向量。最終,每篇文章以一個256維的向量來表示,如表4所示。
表4 二進制文本特征向量
上文中,提取到了每個文本各的特征向量,然后使用如余弦距離的計算等方法比較文章之間的相似度,計算相同種類文本特征向量之間和不同種類文本特征向量之間的余弦距離,初步證明該方法進行特征提取效果的好壞。再用機器學(xué)習(xí)的分類方法支持向量機(Support Vector Machine,SVM),用數(shù)據(jù)集中的訓(xùn)練集訓(xùn)練分類模型,測試集檢驗分類效果。余弦距離計算結(jié)果如表5所示??梢钥闯觯煌N類文檔間和相同種類文檔間的距離有明顯差異,同種類文檔之間距離更近。
表5 各類文檔間余弦距離
之后對于輸出的特征向量使用SVM分類模型進行分類訓(xùn)練和驗證,最終測試分類準(zhǔn)確率達到92.8%,各種類別實驗結(jié)果如表6所示。
表6 各類別分類結(jié)果
從實驗結(jié)果可以看出,準(zhǔn)確率相較于同領(lǐng)域內(nèi)其他模型稍有欠缺,但在數(shù)據(jù)預(yù)處理上大大簡化了操作的復(fù)雜程度,省去了其他文本分類方法中復(fù)雜的文本恢復(fù)、選取合適的語料庫進行取詞處理等過程,有效的提高了工作效率。
傳統(tǒng)的文件分析方法是基于文件格式本身的,但是由于系統(tǒng)并不能確定文件格式,期望一種基于文件二進制的特征提取算法,不管任何文件都能提取它的二進制特征。于是,提出了基于神經(jīng)網(wǎng)絡(luò)的針對二進制文本特征的提取模型,經(jīng)由滑動窗口的取詞、TFIDF訓(xùn)練生成詞匯表、Word2vec的詞向量化以及CNN的降維處理,最終輸出所需要的每個二進制文本相對應(yīng)的特征向量。最后通過余弦距離的比較和SVM分類結(jié)果的驗證,表明該模型的有效性和高效性。下一步將針對該模型進一步進行優(yōu)化,從而提高該模型的精度和普適性。