在python中加载预训练的手套向量
nlp
python-2.7
4
0

我已经从互联网上下载了预先训练的手套矢量文件。这是一个.txt文件。我无法加载和访问它。使用gensim可以很容易地加载和访问单词向量二进制文件,但是当它是文本文件格式时,我不知道该怎么做。

提前致谢

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

我发现这种方法更快。

import pandas as pd

df = pd.read_csv('glove.840B.300d.txt', sep=" ", quoting=3, header=None, index_col=0)
glove = {key: val.values for key, val in df.T.items()}

保存字典:

import pickle
with open('glove.840B.300d.pkl', 'wb') as fp:
    pickle.dump(glove, fp)
收藏
评论

我建议使用gensim来做所有事情。您可以阅读该文件,还可以从在此出色的软件包上已实现许多方法中受益。

假设您使用C ++程序生成了GloVe向量,并且您的“ -save-file”参数是“ vectors”。 Glove可执行文件将为您生成两个文件“ vectors.bin”和“ vectors.txt”。

使用Gloves2word2vec将文本格式的GloVe向量转换为word2vec文本格式:

from gensim.scripts.glove2word2vec import glove2word2vec
glove2word2vec(glove_input_file="vectors.txt", word2vec_output_file="gensim_glove_vectors.txt")

最后,使用KeyedVectors将word2vec txt读取到gensim模型中:

from gensim.models.keyedvectors import KeyedVectors
glove_model = KeyedVectors.load_word2vec_format("gensim_glove_vectors.txt", binary=False)

现在,您可以根据需要使用gensim word2vec方法(例如,相似性)。

收藏
评论

如果您想要的只是嵌入矩阵,那么这是一个衬板

np.loadtxt(path, usecols=range(1, dim+1), comments=None)

其中path是下载的GloVe文件的路径, dim是单词嵌入的尺寸。

如果您同时需要单词和相应的向量,则可以

glove = np.loadtxt(path, dtype='str', comments=None)

并将单词和向量分开如下

words = glove[:, 0]
vectors = glove[:, 1:].astype('float')
收藏
评论

手套模型文件是一个词-矢量格式。您可以打开文本文件进行验证。这是一小段代码,可用于加载预先训练的手套文件:

import numpy as np
def loadGloveModel(gloveFile):
    print("Loading Glove Model")
    f = open(gloveFile,'r')
    model = {}
    for line in f:
        splitLine = line.split()
        word = splitLine[0]
        embedding = np.array([float(val) for val in splitLine[1:]])
        model[word] = embedding
    print("Done.",len(model)," words loaded!")
    return model

然后,您只需使用模型变量即可访问单词向量。

print model['hello']

收藏
评论

您可以使用熊猫更快地做到这一点:

import pandas as pd
import csv

words = pd.read_table(glove_data_file, sep=" ", index_col=0, header=None, quoting=csv.QUOTE_NONE)

然后得到一个单词的向量:

def vec(w):
  return words.loc[w].as_matrix()

并找到与向量最接近的词:

words_matrix = words.as_matrix()

def find_closest_word(v):
  diff = words_matrix - v
  delta = np.sum(diff * diff, axis=1)
  i = np.argmin(delta)
  return words.iloc[i].name
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号