How to use GloVe as your word embedding?
Original Source Here
How to use GloVe as your word embedding?
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 設計完,即可執行嘍!
以上,雖然用文字表示流程真的很複雜,但程式碼真的很簡短,以下提供讀者參考與理解。(如果上述有說明不清楚的地方,還請多包涵)
AI/ML
Trending AI/ML Article Identified & Digested via Granola by Ramsey Elbasheer; a Machine-Driven RSS Bot
via WordPress https://ramseyelbasheer.io/2021/07/04/how-to-use-glove-as-your-word-embedding/