glove/word2vec/fasttext目前词向量比较通用的三种方式,其中word2vec来看,在gensim已经可以极快使用(可见:python︱gensim训练word2vec及相关函数与功能理解)
官方glove教程比较啰嗦,可能还得设置一些参数表,操作不是特别方便。
笔者使用的时候,用的是一款比较省力/封装的。
官方glove:https://github.com/stanfordnlp/GloVe
笔者使用:https://github.com/maciejkula/glove-python
pip install glove_python
具体函数细节可参考:github
生成嵌入是一个两步过程: 从语料库中生成一个匹配矩阵,然后用它生成嵌入矩阵。 Corpus 类有助于从令牌的interable构建一个语料库。
还支持基本的pagragraph向量。 在word空间vector段落向量是在单词向量空间中嵌入段落,这样段落表示就接近于它所包含的单词,因为在语料库中的单词的频率调整。 在训练模型上通过调用 transform_paragraph 方法来训练单词嵌入后,可以得到这些结果。
其中段落向量是词向量的平均可见(该模块没有教程,笔者就不做过多分析了):
paragraph_vector = np.mean(self.word_vectors[word_ids], axis=0)
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的词,该如何处理。
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')
glove模型保存与加载:
glove.save('glove.model')
glove = Glove.load('glove.model')
corpus保存与加载:
corpus_model.save('corpus.model')
corpus_model = Corpus.load('corpus.model')
根据glove求相似词。
glove.most_similar('我', number=10)
>>> [('中国人', 0.15130809810072138),
>>> ('你', 0.0739901044877504),
>>> ('谁', -0.05137569131012555),
>>> ('是', -0.08668606334919005)]
词向量矩阵
# 全部词向量矩阵
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引出得语料协同矩阵