在使用 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
指定向量的長度。