Sentiment Analysis Using RNN with Tensorflow Keras

Haren Lin
5 min readJun 25, 2021

--

image source: http://dprogrammer.org/rnn-lstm-gru

以下的實作是在 Google Colab 上面運行的,會根據每個步驟一一解釋細節。不過在開始操作之前,請先記得把 Colab 的執行階段調整為 GPU 模式,因為文本資料較大,只用 CPU 處理訓練會相當耗時。

首先我們先引入一下接下來會使用到的套件,並下載資料 [Click Me] data

對於自然語言處理的任務當中,最重要的當然就是建立文字世界與機器世界的橋樑,必須先把文字轉換為機器能理解的 Word Embennding。

Word embedding is the collective name for a set of language modeling and feature learning techniques in natural language processing (NLP) where words or phrases from the vocabulary are mapped to vectors of real numbers.

我們會先根據手上的訓練資料,統計所有出現過的字以及其對應的次數,如果這個獨立的字出現不到十次,我們就過濾掉不保留。其中,要注意的是,我們統計出來的所有文字 words 中,也加入我們 padding 需要用到的 Token:<pad>,這是用來補足一個 Sequence 到統一的長度時會使用。建立好整個 words 後,我們可以先把這些文字存到資料夾底下,是為我們的字典 vocab.txt。另外,我們會建立一個哈希表 word2idx,儲存每個字對應的的 Index值。

有了每個字對應的 Index 之後,我們可以來進行 Word Embedding 的轉換了。我們有兩種選擇:第一種方法是用我們手上的資料進行訓練,取得適合我們資料的 Embedding,第二種方法是用別人已經預訓練好的模型,來生成我們資料的 Embedding。前者對於資料集較小的狀況,比較容易出現偏差,因此我們選用後者,來自於 Standford Glove 的 Pre-trained Model。接著把我們的 embedding 先用 npy 存起來,方便等一下使用。

接下來就是來處理我們的資料集,生成訓練資料。這邊我們想用比較特別的方式,因為常常我們在抓資料的時候,一整大筆的資料灌進來 CPU 會無法負荷,所以我們不採用過去常用的 x_train, y_train 直接 load 進來,我們給系統定義一個 data_generator 讓系統透過他去抓取資料,使用 tf.data.Dataset.from_generator,避免整個記憶體空間被佔據。

並且,來整理一下我們剛剛以及接下來會用到的參數們。裡面有一個特別想提及的參數是 clip_norm,這個是拿來做 gradient 數值的 clipping,當我的 gradient 出現異常大的值時,我把 clip 到我設定的數值,利於穩定模型的參數訓練。

完成前置步驟之後,就可以開始來定義一下模型架構。我們採取的是雙向 LSTM,也因此,後面 fully connected layer 的 unit 會是 2*rnn_unit。

接下來就可以著手訓練啦!

最後就是實際拿我們的測試資料來跑看看模型的表現。

在這篇文當中,可能會跟過去學的 model.compile、model.fit() 方法不太依樣,但其實概念都是一樣的,只是換了一種寫法,使它更有彈性。如果有看不懂的段落,可以隨時參考 Tensorflow 官方的 Document,其實從 Document 搭配實例,可以增加理解與記憶,共勉之。

Github for your reference:

This article will be updated at any time! Thanks for your reading. If you like the content, please click the “clap” button. You can also press the follow button to track new articles. Feel free to connect with me via LinkedIn or email.

--

--

Haren Lin
Haren Lin

Written by Haren Lin

MSWE @ UC Irvine | MSCS @ NTU GINM | B.S. @ NCCU CS x B.A. @ NCCU ECON | ex-SWE intern @ TrendMicro

No responses yet