NPL之如何使用Glove--词向量转化
如何使用Glove1. Glove 简单介绍2. 下载预训练的Glove的Vector3. 生成wordslist.npy与wordVector.npy两个文件4. Glove的使用5. 定义以个函数计算某个词最近的距离6. 词向量的计算7 图片展示8. 参考资料1. Glove 简单介绍GloVe(Global Vectors for Word Representation)是一种“用于获取词的
如何使用Glove
1. Glove 简单介绍
GloVe(Global Vectors for Word Representation)是一种“用于获取词的向量表示的无监督学习算法。” 简而言之,GloVe允许我们获取文本语料库,并将该语料库中的每个单词直观地转换为高维空间中的位置。 这意味着相似的词将被放在一起。
如果您想详细了解GloVe的工作原理,请在最后找到链接的文章。
2. 下载预训练了的Glove的Vector
访问https://nlp.stanford.edu/projects/glove/.
在Download pre-trained word vectors的下面你可以下载四种不一样的预训练数据集。
本文是使用第一个比较小的。
你也可以直接用这个链接下载glove.6B.zip
下载后解压,里面应该有四个文件
我们下面的例子就用glove.6B.50d.txt文件
3. 生成wordslist.npy与wordVector.npy两个文件
- 加载glove.6B.50d.txt文件 --把你的文件放在一个你自己的目录下面,我是放在glove_data这个目录下面
- 用numpy 保存生成两个文件wordslist.npy,wordVector.npy
import numpy as np
from scipy import spatial
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
embeddings_dict = {}
with open("./glove_data/glove.6B.50d.txt", 'r', encoding="utf-8") as f:
for line in f:
values = line.split()
word = values[0]
vector = np.asarray(values[1:], "float32")
embeddings_dict[word] = vector
np.save('./glove_data//wordsList', np.array(list(embeddings_dict.keys())))
np.save('./glove_data//wordVectors', np.array(list(embeddings_dict.values()), dtype='float32'))
结果
4. Glove的使用
- 导入wordslist.npy,wordVector.npy
- 用wordslist查询baseball这个词的索引
- 用wordVectors通过索引查询baseball的词向量
wordsList = np.load('./glove_data/wordsList.npy')
print('Loaded the word list!')
wordsList = wordsList.tolist() # Originally loaded as numpy array
wordVectors = np.load('./glove_data/wordVectors.npy')
print('Loaded the word vectors!')
print(len(wordsList))
# print(wordsList)
print(wordVectors.shape)
baseballIndex = wordsList.index('baseball')
print(baseballIndex)
print(wordVectors[baseballIndex])
运行结果
Loaded the word list!
Loaded the word vectors!
400001
(400001, 50)
1444
[-1.9327 1.0421 -0.78515 0.91033 0.22711 -0.62158 -1.6493
0.07686 -0.5868 0.058831 0.35628 0.68916 -0.50598 0.70473
1.2664 -0.40031 -0.020687 0.80863 -0.90566 -0.074054 -0.87675
-0.6291 -0.12685 0.11524 -0.55685 -1.6826 -0.26291 0.22632
0.713 -1.0828 2.1231 0.49869 0.066711 -0.48226 -0.17897
0.47699 0.16384 0.16537 -0.11506 -0.15962 -0.94926 -0.42833
-0.59457 1.3566 -0.27506 0.19918 -0.36008 0.55667 -0.70315
0.17157 ]
5. 定义一个函数计算某个词与其它词的距离,然后排序
找King这个词距离最近的其它的词。
因为找出来太多了,所以我们去前5个看看
def find_closest_embeddings(embedding):
return sorted(embeddings_dict.keys(), key=lambda word: spatial.distance.euclidean(embeddings_dict[word], embedding))
#print(find_closest_embeddings(embeddings_dict["king"]))
print(find_closest_embeddings(embeddings_dict["king"])[1:6])
结果
['prince', 'queen', 'uncle', 'ii', 'grandson']
6. 词向量的计算
例如, twig-branch+hand ≈ finger
print(find_closest_embeddings(embeddings_dict["twig"] - embeddings_dict["branch"] + embeddings_dict["hand"])[:5])
结果是fingernails是距离最近的
['fingernails', 'toenails', 'stringy', 'peeling', 'shove']
7 图片展示
利用TSNE降维,把每个词的词向量转化为二维向量,然后展示出来。
tsne = TSNE(n_components=2, random_state=0)
words = list(embeddings_dict.keys())
vectors = [embeddings_dict[word] for word in words]
Y = tsne.fit_transform(vectors[:500])
plt.scatter(Y[:, 0], Y[:, 1])
for label, x, y in zip(words, Y[:, 0], Y[:, 1]):
plt.annotate(label, xy=(x, y), xytext=(0, 0), textcoords="offset points")
plt.show()
运行结果
9. python环境中的所需包的版本
执行环境的所需相关的包的版本如下
import numpy as np
import scipy as scipy
import sklearn as sklearn
1.18.1
1.4.1
0.22.1
8. 参考资料
[1] https://medium.com/analytics-vidhya/basics-of-using-pre-trained-glove-vectors-in-python-d38905f356db
[2] Original GloVe Paper: https://nlp.stanford.edu/pubs/glove.pdf
[3] Original t-SNE Paper: http://jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)