使用Keras進行深度學習:(三)使用text-CNN處理自然語言(上)

上一篇文章中一直圍繞著CNN處理圖像數據進行講解,而CNN除了處理圖像數據之外,還適用於文本分類。CNN模型首次使用在文本分類,是Yoon Kim發表的“Convolutional Neural Networks for Sentence Classification”論文中。在講解text-CNN之前,先介紹自然語言處理和Keras對自然語言的預處理。

自然語言處理就是通過對文本進行分析,從文本中提取關鍵詞來讓計算機處理或理解自然語言,完成一些有用的應用,如:情感分析,問答系統等。比如在情感分析中,其本質就是根據已知的文字和情感符號(如評論等)推測這段文字是正面還是負面的。想象一下,如果我們能夠更加精確地進行情感分析,可以大大提升人們對於事物的理解效率。比如不少基金公司利用人們對於某家公司的看法態度來預測未來股票的漲跌。

接下來將使用imdb影評數據集簡單介紹Keras如何預處理文本數據。該數據集在這裡下載。由於下載得的是tar.gz壓縮文件,可以使用python的tarfile模塊解壓。解壓後的目錄為:


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(上)


1 讀取imdb數據集

我們通過以下函數分別讀取train和test中的所有影評


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(上)


得到的影評如下圖,每條影評用雙引號包住。


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(上)


2 使用Tokenizer將影評文字轉換成數字特徵

在上文中已經得到了每條影評文字了,但是text-CNN的輸入應該是數字矩陣。可以使用Keras的Tokenizer模塊實現轉換。

簡單講解Tokenizer如何實現轉換。當我們創建了一個Tokenizer對象後,使用該對象的fit_on_texts()函數,可以將輸入的文本中的每個詞編號,編號是根據詞頻的,詞頻越大,編號越小。可能這時會有疑問:Tokenizer是如何判斷文本的一個詞呢?其實它是以空格去識別每個詞。因為英文的詞與詞之間是以空格分隔,所以我們可以直接將文本作為函數的參數,但是當我們處理中文文本時,我們需要使用分詞工具將詞與詞分開,並且詞間使用空格分開。具體實現如下:


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(上)


使用word_index屬性可以看到每次詞對應的編碼,可以發現類似”the”、”a”等詞的詞頻很高,但是這些詞並不能表達文本的主題,我們稱之為停用詞。對文本預處理的過程中,我們希望能夠儘可能提取到更多關鍵詞去表達這句話或文本的中心思想,因此我們可以將這些停用詞去掉後再編碼。網上有許多歸納好的停用詞,大家可以下載了之後,去除該文本中的停用詞。


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(上)


對每個詞編碼之後,每句影評中的每個詞就可以用對應的編碼表示,即每條影評已經轉變成一個向量了:


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(上)



3 讓每句數字影評長度相同

對每個詞編碼之後,每句影評中的每個詞就可以用對應的編碼表示,即每條影評已經轉變成一個向量。但是,由於影評的長度不唯一,需要將每條影評的長度設置一個固定值。


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(上)


每個句子的長度都固定為150,如果長度大於150,則將超過的部分截掉;如果小於150,則在最前面用0填充。每個句子如下:


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(上)


4 使用Embedding層將每個詞編碼轉換為詞向量

通過以上操作,已經將每個句子變成一個向量,但上文已經提及text-CNN的輸入是一個數字矩陣,即每個影評樣本應該是以一個矩陣,每一行代表一個詞,因此,需要將詞編碼轉換成詞向量。使用Keras的Embedding層可以實現轉換。Embedding層基於上文所得的詞編碼,對每個詞進行one-hot編碼,每個詞都會以一個vocabulary_size(如上文的2000)維的向量;然後通過神經網絡的訓練迭代更新得到一個合適的權重矩陣(具體實現過程可以參考skip-gram模型),行大小為vocabulary_size,列大小為詞向量的維度,將本來以one-hot編碼的詞向量映射到低維空間,得到低維詞向量。比如the的編號為1,則對應的詞向量為權重矩陣的第一行向量。如下圖,藍色線對應權重值組成了該詞的詞向量。需要聲明一點的是Embedding層是作為模型的第一層,在訓練模型的同時,得到該語料庫的詞向量。當然,也可以使用已經預訓練好的詞向量表示現有語料庫中的詞。


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(上)


至此已經將文本數據預處理完畢,將每個影評樣本轉換為一個數字矩陣,矩陣的每一行表示一個詞向量。下圖梳理了處理文本數據的一般步驟。在此基礎上,可以針對相應數據集的特點對數據集進行特定的處理。比如:在該數據集中影評可能含有一些html標籤,我們可以使用正則表達式將這些標籤去除。


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(上)


對深度學習感興趣,熱愛Tensorflow的小夥伴,歡迎關注我們的網站http://www.panchuang.net 我們的公眾號:磐創AI。


分享到:


相關文章: