1. 程式人生 > >基於tensorflow的CNN和LSTM文字情感分析對比(附完整程式碼)

基於tensorflow的CNN和LSTM文字情感分析對比(附完整程式碼)

如今科技日益發展、網路技術不斷深入到大眾生活中,貼吧、網站、電子郵件,使用者評論等使得人們有更多的便捷方式在網路中發表自己的意見和看法。這些數量龐大的文字中的情感資訊有著極大的研究價值和實用價值。而如何能夠從眾多文字資訊和資料中準確而高效地分析出文字中所蘊含的情感,並判斷情感極性,對情感做出分類,是目前自然語言處理中的一個熱門研究課題。關於文字情感分析,在此之前國內外專家和學者們都已經做了大量的研究,其中運用深度學習來對文字進行情感分析是常用的文字情感分析方法。神經網路模型通過學習和訓練後,能有效地模擬人腦的學習方式,對大量的輸入文字資訊進行高效的分析,並對文字中的情感進行判斷,非常適合用於文字情感分析的研究中。

關鍵詞:文字情感分析;深度學習;CNN;LSTM;

完整程式碼見GitHub(包含IMDB資料集):https://github.com/HqWei/Sentiment-Analysis

情感分析物件:

IMDB(Internet Movie Database網際網路電影資料庫)資料集,我們在這個資料集上做的訓練和測試。這個資料集包含 25000 條電影資料,其中 12500 條正向資料,12500 條負向資料。我們將25000個文字中的23000個文字評論作為訓練集,將剩下的2000個文字評論作為測試集。

圖x,負面評價文字示例

圖x,正面評價文字示例

文字預處理

輸入文字,在將輸入文字轉化成向量之前,我們需要將標點符號、括號、問號等刪去,只留下字母、數字和字元, 同時將大寫字母轉化為小寫

效果如下圖

 文字轉化為向量

在將深度學習運用於文字情感分析的過程中,我們需要考慮網路模型的輸入資料的形式。在其他例子中,卷積神經網路(CNN)使用畫素值作為輸入,logistic迴歸使用一些可以量化的特徵值作為輸入,強化學習模型使用獎勵訊號來進行更新。通常的輸入資料是需要被標記的標量值。當我們處理文字任務時,可能會想到利用這樣的資料管道。

但是,這樣的處理方式存在著很多問題。我們不能像點積或者反向傳播那樣在一個字串上執行普通的運算操作。所以在這裡我們不能將字串作為輸入,而是需要將文字轉換成計算機可識別的格式,由於計算機只能識別數字,因此我們可以將文字中的每一個詞都轉化為一個向量,也稱作詞向量。詞向量

用一個向量的形式表示文字中的一個詞,通過這種轉化方式就能採用機器學習把任何輸入量化成我們需要的數值表示,然後就可以充分利用計算機的計算能力,計算得出最終想要的結果,保證了操作的可行性

如圖所示,我們可以將上面的這段文字輸入資料轉化成一個 16*D 的輸入矩陣。

我們希望建立這種詞向量的方式是可以表示單詞及其在上下文中意義的。例如,我們希望單詞 “love” 和 “adore” 這兩個詞在向量空間中是有一定的相關性的,因為他們的意思相似,而且都在類似的上下文中使用,因此他們的空間相距距離會相對較小。而“love”、“adore”這兩個單詞與單詞“baseball”的意思有很大的不同,詞性也不相同,那麼“love”、“adore”這兩個單詞的向量與單詞“baseball”的向量相距距離就會相對較大。單詞的向量表示也被稱之為詞嵌入。

為了得到這些詞嵌入,我們採用一個很著名的模型 “Word2Vec”。“Word2Vec”是近幾年很火的演算法,它通過神經網路機器學習演算法來訓練N-gram 語言模型,並在訓練過程中求出word所對應的vector的方法。它是將詞表徵為實數值向量的一種高效的演算法模型,其利用深度學習的思想,可以通過訓練,把對文字內容的處理簡化為 K 維向量空間中的向量運算,而向量空間上的相似度可以用來表示文字語義上的相似。在這個模型中,每個詞的詞向量是根據上下文的語境來進行推斷的,如果兩個詞在上下文的語境中可以被互換,那麼這就表示這兩個詞的意思相似,詞性相似,那麼他們的詞向量中相距距離就非常近。在自然語言中,上下文的語境對分析詞語的意義是非常重要的。

簡單來說,Word2Vec這個模型的作用就是從一大堆句子(以 Wikipedia 為例)中為每個獨一無二的單詞進行建模,並且輸出一個唯一的向量,Word2Vec 模型的輸出被稱為一個嵌入矩陣。該嵌入矩陣將包含訓練語料庫中每個不同單詞的向量。 傳統上,嵌入矩陣可以包含超過300萬個單詞向量。

Word2Vec模型是通過對資料集中的每個句子進行訓練,在其上滑動一個固定大小的視窗,並試圖預測視窗的中心詞,給出其他詞。使用損失函式和優化程式,該模型為每個唯一字生成向量。這個訓練過程的細節可能會變得有點複雜,所以我們現在要跳過細節,但這裡主要的一點是,任何深度學習方法對於NLP任務的輸入可能都會有單詞向量作為輸入。

Google 已經幫助我們在大規模資料集上訓練出來了 Word2Vec 模型,它包括 1000 億個不同的詞,在這個模型中,谷歌能建立300萬個詞向量,每個向量維度為 300。在理想情況下,我們將使用這些向量來構建模型,但是因為這個單詞向量矩陣太大了(3.6G),因此在此次研究中我們將使用一個更加易於管理的矩陣,該矩陣由 GloVe 進行訓練得到。矩陣將包含 400000 個詞向量,每個向量的維數為 50。

 我們將匯入兩個不同的資料結構,一個是包含 400000 個單詞的 Python 列表,一個是包含所有單詞向量值的 400000*50 維的嵌入矩陣。

結果對比:

卷積神經網路和LSTM網路層數和精度比較

網路模型

網路層數

測試精度

經典CNN(Lenet5)

7

71.2%

改進的CNN模型

14

77.25%

LSTM模型

1

84.2%

注:CNN網路層數包括:卷積層,池化層,全連線層。

綜上可知,CNN神經網路模型運用於文字情感分析時效果不如LSTM神經網路模型效果好,經典的CNN模型在文字情感分析正確率只有71.2%,而對經典進行改進之後,增加了卷積層和池化層,CNN模型的正確率得到了提高,但正確率也是隻有77.25%,仍然比不上只用了一層LSTM網路的正確率高。從結果對比中我們可以知道,CNN不光可以應用於影象處理領域,也能成功有效地對文字資訊進行分析,但LSTM在解決文字情感分析的問題時效果要比CNN好。

總結:

將CNN與LSTM兩種神經網路模型應用到了文字情感分析的問題當中,使用Word2Vec模型及它的子矩陣GloVe來將文字資訊進行預處理,轉換成了詞向量及向量矩陣,使用了IMDB資料集來對模型進行訓練,並用TensorFlow進行建模、訓練。

情感分析是近年來一個炙手可熱的課題,而文字又是情感的載體之一,在面對越來越多的文字資訊產生,以及文字情感中所蘊含的巨大研究價值時,如何能高效而準確地分析文字情感是我們當前和未來都要面對的難題,也是未來發展的方向,任重而道遠。而將深度學習運用到文字情感分析的問題中,是處理文字情感分類的一個突破口,也是以後研究人員們深入討論、研究的方向。