1. 程式人生 > >極簡使用︱Glove-python詞向量訓練與使用

極簡使用︱Glove-python詞向量訓練與使用

glove/word2vec/fasttext目前詞向量比較通用的三種方式,其中word2vec來看,在gensim已經可以極快使用(可見:python︱gensim訓練word2vec及相關函式與功能理解

官方glove教程比較囉嗦,可能還得設定一些引數表,操作不是特別方便。
筆者使用的時候,用的是一款比較省力/封裝的。

官方glove:https://github.com/stanfordnlp/GloVe
筆者使用:https://github.com/maciejkula/glove-python


1 安裝:

pip install glove_python

2 訓練:

具體函式細節可參考:github

生成嵌入是一個兩步過程: 從語料庫中生成一個匹配矩陣,然後用它生成嵌入矩陣。 Corpus 類有助於從令牌的interable構建一個語料庫。
還支援基本的pagragraph向量。 在word空間vector段落向量是在單詞向量空間中嵌入段落,這樣段落表示就接近於它所包含的單詞,因為在語料庫中的單詞的頻率調整。 在訓練模型上通過呼叫 transform_paragraph 方法來訓練單詞嵌入後,可以得到這些結果。

其中段落向量是詞向量的平均可見(該模組沒有教程,筆者就不做過多分析了):

paragraph_vector = np.mean(self.word_vectors[word_ids], axis=0)

(1)準備資料集

from __future__ import print_function
import argparse
import pprint
import gensim
from glove import Glove
from glove import Corpus

sentense = [['你','是','誰'],['我','是','中國人']]
corpus_model = Corpus()
corpus_model.fit(sentense, window=10)
#corpus_model.save('corpus.model')
print('Dict size: %s' % len(corpus_model.dictionary))
print('Collocations: %s' % corpus_model.matrix.nnz)

其中corpus_model.fit(corpus, window=10, ignore_missing=False)
ignore_missing代表如果出現OOV的詞,該如何處理。

(2)訓練

glove = Glove(no_components=100, learning_rate=0.05)
glove.fit(corpus_model.matrix, epochs=10,
          no_threads=1, verbose=True)
glove.add_dictionary(corpus_model.dictionary)

>>> Performing 10 training epochs with 1 threads
>>> Epoch 0
>>> Epoch 1
>>> Epoch 2
>>> Epoch 3
>>> Epoch 4
>>> Epoch 5
>>> Epoch 6
>>> Epoch 7
>>> Epoch 8
>>> Epoch 9

維度no_components,可以與word2vec一起使用。
模型得儲存為:glove.save('glove.model')

(3)使用:模型得儲存與載入

glove模型儲存與載入:

glove.save('glove.model')
glove = Glove.load('glove.model')

corpus儲存與載入:

corpus_model.save('corpus.model')
corpus_model = Corpus.load('corpus.model')

(4)使用:求相似詞

根據glove求相似詞。

glove.most_similar('我', number=10)

>>> [('中國人', 0.15130809810072138),
>>>  ('你', 0.0739901044877504),
>>>  ('誰', -0.05137569131012555),
>>>  ('是', -0.08668606334919005)]

(5)使用:詞向量矩陣

詞向量矩陣

# 全部詞向量矩陣
glove.word_vectors
# 指定詞條詞向量
glove.word_vectors[glove.dictionary['你']]

語料協同矩陣 corpus coocurrence matrix

corpus_model.matrix.todense().tolist()

>>>     [[0.0, 1.0, 0.5, 0.0, 0.0],
		 [0.0, 0.0, 1.0, 1.0, 1.0],
		 [0.0, 0.0, 0.0, 0.0, 0.0],
		 [0.0, 0.0, 0.0, 0.0, 0.5],
		 [0.0, 0.0, 0.0, 0.0, 0.0]]

由corpus_model引出得語料協同矩陣