glove官网
glove的github
gensim帮助文档
将glove模型转换成gensim方便加载的格式(gensim支持word2vec格式的预训练模型格式)
from gensim.scripts.glove2word2vec import glove2word2vec
glove_input_file = 'F:\\dl-data\\vector\\glove.840B.300d.txt'
word2vec_output_file = 'F:\\dl-data\\vector\\glove.840B.300d.word2vec.txt'
(count, dimensions) = glove2word2vec(glove_input_file, word2vec_output_file)
print(count, '\n', dimensions)
运行后,等一段时间,得到glove.840B.300d.word2vec.txt文件。
打印输出结果为:词数为2196017 ,向量维度为300。
测试代码时可以用维度低的glove向量,这样速度快一些,比如glove.twitter.27B.25d.txt得到的结果为:词数为1193514,向量维度为25。
获得一个词的向量,以及得到与某个词最接近的几个词
注意这两个操作会占用大量内存,需要处理很长时间。
from gensim.models import KeyedVectors
# 加载模型
glove_model = KeyedVectors.load_word2vec_format(word2vec_output_file, binary=False)
# 如果希望直接获取某个单词的向量表示,直接以下标方式访问即可
cat_vec = glove_model['cat']
print(cat_vec)
# 获得单词frog的最相似向量的词汇
print(glove_model.most_similar('frog'))
打印输出为cat的300维向量,以及最接近的几个词
[('frogs', 0.7867065072059631), ('toad', 0.7364183068275452),
('turtle', 0.6883987188339233), ('monkey', 0.6711267232894897),
('lizard', 0.6548661589622498), ('Frog', 0.6517729759216309),
('snake', 0.6297693252563477), ('ladybug', 0.6290067434310913),
('squirrel', 0.6220200657844543), ('elephant', 0.614372968673706)]
更多用法,参考gensim关于这部分的示例,比如:
result = word_vectors.most_similar(positive=['woman', 'king'], negative=['man'])
print(result)
词向量可视化
按照上文的gensim得到glove的300维向量后,需要降低维度,在二维或三维的图上显示。
根据找到的资料,选择用SVD分解,它把词向量变成三个矩阵的乘积,具体的原理不懂。
在numpy.linalg中有svd函数,输出为三个矩阵U,S,VH。
U矩阵便是经过降维后的词向量矩阵,最后将U的前两个值表示这个词的位置,用matplotlib绘制。
U, s, Vh = la.svd(X, full_matrices=False)
绘制部分为
for i in range(matrix.shape[0]): # word
plt.text(U[i, 0], U[i, 1], words[i])
coord = U[:, 0:2]
plt.xlim((np.min(coord[:, 0]) - 0.1, np.max(coord[:, 0]) + 0.1))
plt.ylim((np.min(coord[:, 1]) - 0.1, np.max(coord[:, 1]) + 0.1))
结果图展示