GloVe 簡介
Introduction from official site: GloVe is an unsupervised learning algorithm for obtaining vector representations for words. Training is performed on aggregated global word-word co-occurrence statistics from a corpus, and the resulting representations showcase interesting linear substructures of the word vector space.
Stanford 提出 Global Vectors for Word Representation (GloVe) 模型,透過無監督式學習的方法得到每個文字的向量表示法。官方提出預訓練好的模型給大家使用,大家可以選擇不同的 hidden dimension (50d, 100d, 200d, 300d)作為自己模型的 Word Embedding 表示。
GloVe 使用
首先,我們可以到 StanfordNLP 的 GloVe 官方網站,然後點選下載你想要的 Pre-Trained Word Embedding 表示,以下將使用最簡單的 glove.6B.50d.txt。或是直接點選此網站下載:http://nlp.stanford.edu/data/glove.6B.zip(注意!此為 822MB 的大檔,請留意您的網路使用量)
下載好檔案後,我們可以打開看一下他的長相,她每一行的資料是由一個單詞,與後面 N 個數字組成。這 N 個數字就是他的向量表示法,而 N 取決於你是使用多少維度的預訓練模型。(N = 50, 100, 200, 300)
接下來,當然就是建立一個具有 mapping 功能的 dictionary,來儲存這些字對應到的 Word Embedding 表示嘍!存好也順便隨意挑個字來看看長相。
不過在這之中,其實他有一個 Error Term 存在,有向量的長度不是我們指定的 50,我們必須把這種東西過濾掉。
過濾好資料有完整的對應關係後,我們可以來玩玩這些向量!我們借助 Spicy 套件的幫忙,裡面的 Spatial 有 distance.euclidean 函式,可以幫我們計算兩個向量之間的歐式距離。用歐式距離作為我們的評斷標準,找出與某個指定文字最相似的前幾名的單詞。
他會印出以下文字:
['hello', 'goodbye', 'kiss', 'hey']
我們可以觀察,的確意思相近的文字歐式距離較近,也代表他們在向量空間上分佈在相近的區塊。
此外,我們也能用數學中向量加減法來看看,他們的表示是不是合邏輯。
GloVe 結合 NN (Using Tensorflow Keras)
說到要結合 NN,想必得透過 keras.layers.Embedding 來幫助我們做 Token ID 與向量的轉換。如果對於 keras.layers.Embedding 這層東西還不熟的讀者,可以先參考以下文章,因為底下我將使用相同的程式碼,來講解實作流程。
流程講解:
(1) 先將文本資料準備好,並先透過 Tokenizer 進行斷詞。
小細節:如果使用 keras.preprocessing.text.Tokenizer 來斷詞,word_index 的 index 會從 1 開始,而不是我們熟悉的 0。
(2) 將完成斷詞的文本資料,透過 Tokenizer 的 texts_to_sequences,把文章的詞轉成 Index。
(3) 實施 Padding 截長補短。因爲文章長短不一,我們必須把所有文章的長度固定。若我們原先的文章少於我們指定的長度,則在後面以零補滿。若我們原先的文章大於我們指定的長度,則直接截斷。
(4) 定義模型第一層 Embedding Layer Weights,也就是把 Corpus 中每個字的 Representation 傳進去視為 Weights,並設定這層的參數。(line 49)
這邊可能需要更細節的說明:我們的 Weights 會使用二維的矩陣來設計 (embedding_matrix),第一個維度是 Corpus 中獨立的文字個數 + 1,為什麼要+1是因為別忘了我們剛才有 padding 的操作,必須增加一個維度來儲存他的 Embedding。第二個維度是 hidden dimension,代表你用多少維度的向量來描述一個文字,像我們用的 glove.6B.50d.txt 就是用 50 維。因此你會看到 line 41 的程式碼我們先設計出 shape = (vocab_size+1, hidden_dim=50) 的空矩陣。接著,開始把 Corpus 中的每個字與其對應的 Index 抓出來,然後到先前存好的字與 Embedding 對應關係的 dictionary 中尋找是否有存在於其中,如果存在就把他的 Embedding 存放到 embedding_matrix 中,如果不存在就都用 0 表示。(line 42–45)
(5) 最後就是把我們的深度學習模型剩下的 Layers 設計完,即可執行嘍!
以上,雖然用文字表示流程真的很複雜,但程式碼真的很簡短,以下提供讀者參考與理解。(如果上述有說明不清楚的地方,還請多包涵)
[Reference] GloVe Paper:
[Reference] GloVe Official Site:
[Extra Reading] Using Pre-trained Word Embeddings in a Keras Model:
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 at any time. Feel free to contact me via LinkedIn or email.