極簡使用︱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引出得語料協同矩陣