Keras Embedding Layer 搭配 gensim Word2Vec 用法

在使用 RNN (Recurrent Neural Network) 做文字相關的處理時,我們可以利用 gensim 的 Word2Vec 將一個詞彙轉成一個向量表達。

一個簡單的作法是,將 training data 和 testing data 資料裡的那些詞彙以對應的向量取代,然而這樣會很佔記憶體,以我目前的作業為例(2019 李宏毅 機器學習 作業6,這次作業資料是不公開的),training data + testing data 約 20 MB 但經過 Word2Vec 的轉換後就變成超過 10 GB 了,不僅執行速度慢,甚至電腦上根本不會有那麼多的記憶體。

為了避免這個問題,我們會將 Word2Vec 中的詞彙做個編號(index),接著將 training / testing data 中的資料以這個編號取代,在 keras 上訓練時,我們則需要將 index 到 vector 的對應傳入(w2v_model.wv.vectors提供了這個對應,以下稱之index2vec)。

用法範例: https://gist.github.com/domen111/64cb6628cd57c2ffa4f91024ba6190ae

接著在 keras 上需要利用 keras.layers.Embedding來把index2vec傳入,keras.layers.Embedding參數如下:

1
keras.layers.Embedding(input_dim, output_dim, embeddings_initializer='uniform', embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None)

在 model 的第一層加入:

1
model.add(Embedding(index2vec.shape[0], index2vec.shape[1], weights=[index2vec], trainable=False))

weights指定要把每個詞彙 Embedding 成什麼,也就是我們的 index2vec 表格,input_dim指定字典的大小,output_dim指定向量的長度。