王玲
(廣東郵電職業(yè)技術(shù)學院 廣東省廣州市 510630)
文本分類是指對文本集按照一定的分類體系或標準進行自動分類標記。主要應用于信息檢索、垃圾文本過濾、輿情檢測、情感分析等領(lǐng)域,一直是自然語言處理領(lǐng)域的研究熱點。它依據(jù)已經(jīng)被分類標注的文本訓練集合,得到文本特征和文本類別之間的關(guān)系模型,然后利用這種通過學習得到的模型對新的文本進行類別判斷。現(xiàn)階段文本分類從基于知識的方法轉(zhuǎn)變?yōu)榛诮y(tǒng)計和機器學習的方法。
當前文本分類主要面對的是兩方面問題:
(1)文本表示問題,即怎樣高質(zhì)量的實現(xiàn)詞語的向量表達;
(2)文本分類的訓練模型問題。
本文對常用的模型進行對比的基礎(chǔ)上,選擇了基于Word2Vec的詞嵌入模型的實現(xiàn),以及基于雙向長短期記憶網(wǎng)絡(luò)(BiLSTM)的文本分類神經(jīng)網(wǎng)絡(luò)模型。
文本語料是符號集合,計算機是無法處理符號集合的,詞嵌入就是將符號集合中的詞(或者更高粒度的句子等)映射為向量。這是NLP 工作中必要的部分。文本的語義表示能力決定著文本表示能力的強弱。
(1)離散表示,有One-hot 表達、Bag of Words 詞袋表達、Tf-Idf 權(quán)值向量表達等等,他們各有缺陷,比如One-hot 表達忽略了詞頻信息,面臨著高維困境,并且忽略了詞語上下文關(guān)聯(lián);Tfidf 表達用詞頻來衡量文章中的一個詞的重要性不夠全面,而且無法體現(xiàn)詞在上下文的重要性。總體上,離散表示方法,存在無法衡量詞向量之間的關(guān)系、詞向量維度膨脹、數(shù)據(jù)稀疏等缺陷。
(2)神經(jīng)網(wǎng)絡(luò)表示,目前最常用的詞嵌入模型之一Word2Vec,是谷歌2013年提出的。Word2Vec 詞向量是深度學習在自然語言處理領(lǐng)域的應用,它有兩種網(wǎng)絡(luò)結(jié)構(gòu),分別是連續(xù)詞袋模型CBOW(Continues Bag of Words)和跳字模型Skip-gram。
CBOW 模型的訓練輸入是某一個特征詞的上下文相關(guān)的詞對應的詞向量,而輸出就是這個特定詞的詞向量。Skip-Gram 模型和CBOW 的思路相反,即輸入是特定的一個詞的詞向量,而輸出的是特定詞對應的上下文詞向量。
可以通過gensim、tensorflow、spark 等實現(xiàn)Word2Vec。這里以gensim 為例實現(xiàn)Word2Vec 詞嵌入訓練。
# 詞向量訓練
#text 是經(jīng)過文本預處理的語料(對于中文要首先經(jīng)過分詞,去除停用詞、低頻詞)
#wlen 是詞向量上下文的距離設(shè)定值
#size 是詞向量的維度設(shè)定值
w2v_model=Word2Vec(sentences=text,window=win_len,size=wlen,min_count=1)
# 存儲所有詞語
vocab_list=[word for word,_ in w2v_model.wv.vocab.items()]
# 生成一個全零數(shù)組用于后續(xù)存儲詞向量,長度加1,用于表示新詞
data=np.zeros([len(vocab_list)+1,w2v_model.vector_size])
for i in range(len(vocab_list)):
data[i+1]=w2v_model.wv[vocab_list[i]]# 存儲某個詞的詞向量
# 將數(shù)組轉(zhuǎn)為DataFrame,這里設(shè)置一個全零行,用于匹配不存在的新詞
data_frame=pd.DataFrame(data,index=['0']+ vocab_list)
# 保存詞向量
data_frame.to_csv('embedding_matrix.csv',index=None)
創(chuàng)建Word2Vec 模型時,主要的參數(shù)有:
sentences:要訓練的語料列表;
window:詞向量上下文的距離,默認為5;
size:詞向量的維度,默認值是100;
min_count:計算詞向量的詞語的最小詞頻,默認是5。如果所有詞語都需要參與訓練,就設(shè)置為1;
sg:如果是0,則是CBOW 模型,是1 則是Skip-Gram 模型,默認是0;
iter:隨機梯度下降法中迭代的最大次數(shù),默認是5。語料量大的情況下,可以增大這個值。
可以在計算量和訓練效果之間,權(quán)衡參數(shù)的設(shè)置值。
CNN 可以提取句子特征,但缺乏學習順序相關(guān)性的能力。近年來,對時間序列敏感的問題,RNN 比較適合。
循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)是一種對序列型數(shù)據(jù)進行建模的深度神經(jīng)網(wǎng)絡(luò)模型。比如某個單詞的含義會因為上下文的內(nèi)容不同而不同,RNN 就適合解決這類問題。
但是,在RNN 中,常用的激活函數(shù)(sigmoid 函數(shù)、tanh 函數(shù)),在求梯度的過程中,隨著時間序列的不斷深入,會導致梯度越來越小直到接近于 0,這就會引起梯度消失現(xiàn)象。梯度消失就意味著那一層的參數(shù)再也不更新了,則模型的訓練毫無意義。Relu 函數(shù)一定程度上可以解決梯度消失的問題,但是容易引起梯度爆炸的問題。
為了避免RNN 模型的缺陷,一種由長短期記憶單元LSTM 組成的RNN(longshort-term memory,LSTM)的循環(huán)神經(jīng)網(wǎng)絡(luò)架構(gòu)得到廣泛的應用。LSTM 增加了對過去狀態(tài)的過濾,從而可以選擇哪些狀態(tài)對當前更有影響,而不是簡單的選擇最近的狀態(tài)。
LSTM 只能夠捕獲前向的上下文信息,隨著深度學習的發(fā)展,可以分別捕獲前向和后向的上、下文信息的雙向長短期記憶網(wǎng)絡(luò)(bidirectional long short-tem memory,BiLSTM)出現(xiàn)了,BiLSTM 能得到更好的文本表示。近幾年LSTM 和BiLSTM 在文本分類領(lǐng)域取得很多的進展。
這里基于tensorflow 搭建文本分類的RNN 神經(jīng)網(wǎng)絡(luò)模型:


首先,沒有進行詞嵌入預訓練,在Embedding 層,沒有設(shè)置weights 參數(shù),那么詞嵌入權(quán)值矩陣則是隨機初值。而當用語料中的詞語進行單獨的預訓練之后,將預訓練得到的詞向量用于此詞嵌入層,經(jīng)過實際對比,采用預訓練之后,模型精度顯著提升。
模型可以通過調(diào)整以下主要參數(shù),進行性能和精度的調(diào)整:將詞向量預訓練的window 增大,可以將更長范圍的上下文詞語考慮進來,但是并不是越大越好,要根據(jù)實際情況進行調(diào)整,并且會增加計算量;網(wǎng)絡(luò)設(shè)置,全連接層的個數(shù),每個層的神經(jīng)元個數(shù)。在訓練時候,訓練集和驗證集的占比,增加訓練集的占比,使得訓練更加充分;將詞向量矩陣設(shè)為在模型訓練過程中是可調(diào)試的形式(通過trainable 設(shè)置)等。通過調(diào)整epochs 和batch_size 參數(shù),控制模型訓練過程中的計算負荷。
文本分類是自然語言處理領(lǐng)域的研究熱點。當前重點側(cè)重在兩個方面,一是詞向量模型的研究,二是文本分類深度神經(jīng)網(wǎng)絡(luò)分類模型的研究。本文采用基于Word2Vec 的詞嵌入模型和BiLSTM 雙向長短期記憶模型,實現(xiàn)對文本的分類模型訓練,以及模型優(yōu)化,對比其他主要模型,當前選擇模型的準確率是相對較高的。