How to use GloVe as your word embedding?



Original Source Here

How to use GloVe as your word embedding?

Stanford, CA

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 表示。

Different dimensions of word representations in Pre-trained GloVe

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

%d bloggers like this: