1. 程式人生 > 其它 >自然語言處理之Glove原理和實現要點

自然語言處理之Glove原理和實現要點

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效能也相對較好。