自然語言處理之Glove原理和實現要點
阿新 • • 發佈:2022-04-12
glove定義
一個基於全域性詞頻統計的詞表徵工具
glove實現
-
共現矩陣的構建
論文原文(https://aclanthology.org/D14-1162/)指出共現矩陣中的每一個元素\(X_{ij}\)代表單詞 \(i\) 和上下文單詞\(j\)在特定大小的上下文視窗內共同出現的次數。一般而言這個次數的最小單位是1,但是GLOVE不那麼認為:它根據兩個單詞在上下文視窗的距離d,提出一個衰減函式:\(decay = 1/d\)用於計算權重,也就是距離越遠的兩個單詞所佔總計數的權重越小。
當前很多實現都只count了次數,準確應該乘上權重,由於語料可能較大,所以以一定的batch進行計算和載入。
點選檢視程式碼
import defaultdict co_matrix = defaultdict(float) # 設定左右視窗大小 left_win = 10 right_win = 10 def window(text,start,end): last_index = len(text) + 1 selected_tokens = text[max(start, 0):min(end, last_index) + 1] return selected_tokens def build_co_matrix(corpus): for i,word in enumerate(corpus): start = i-left_win end = i+right_win left_region = window(corpus,start,i-1) right_region = window(corpus,i+1,end) for d_l,word_l in enumerate(left_region[::-1]): co_matrix[(word,word_l)] += 1/(d_l+1) for d_r,word_r in enumerate(right_region): co_matrix[(word,word_r)] += 1/(d_r+1) return
-
詞向量的構建
詞向量和共現矩陣之間的近似關係為:\(w^T_iw_j+b_i+b_j = log(X_{ij})\),\(w_i和w_j\)是我們要求解的詞向量,其loss_function為:
-
glove的訓練
訓練主要根據其上述定義的損失函式定義向量和其他變數,利用adgrad進行梯度下降,最終將\(w\)和\(\mathop{w}\limits^*\)的和作為最後的word vector。
-
glove與word2vec的比較
glove利用所有word對當前word的影響來構建當前word的vector,而word2vec沒有充分利用所有語料,glove效能也相對較好。