我正在尝试使用预训练的word2vector模型来创建单词嵌入,但是当我试图从word2vec遗传模型创建权重矩阵时,出现以下错误:
代码:
import gensim
w2v_model = gensim.models.KeyedVectors.load_word2vec_format("/content/drive/My Drive/GoogleNews-vectors-negative300.bin.gz", binary=True)
vocab_size = len(tokenizer.word_index) + 1
print(vocab_size)
EMBEDDING_DIM=300
# Function to create weight matrix from word2vec gensim model
def get_weight_matrix(model, vocab):
# total vocabulary size plus 0 for unknown words
vocab_size = len(vocab) + 1
# define weight matrix dimensions with all 0
weight_matrix = np.zeros((vocab_size, EMBEDDING_DIM))
# step vocab, store vectors using the Tokenizer's integer mapping
for word, i in vocab.items():
weight_matrix[i] = model[word]
return weight_matrix
embedding_vectors = get_weight_matrix(w2v_model, tokenizer.word_index)
出现以下错误:
答案 0 :(得分:0)
请注意:粘贴完整的错误最好是格式化文本而不是文本图像。 (有关原因的完整列表,请参见Why not upload images of code/errors when asking a question?。)
但是关于您的问题:
如果遇到KeyError: word 'didnt' not in vocabulary
错误,可以相信您所请求的单词不在您所请求的单词向量中。 (在这种情况下,Google在2012年左右训练并发布了GoogleNews
个向量。)
您可以在查找之前进行检查-'didnt' in w2v_model
,它将返回False
,然后执行其他操作。或者,您可以使用Python try: ... catch: ...
公式来实现它,但是当它发生时再做其他事情。
但是,如果您提供的model
没有您希望的单词向量,那么代码应该做什么取决于您。
(注意:GoogleNews
向量确实包含"didn't"
的向量,其收缩带有。因此,在这种情况下,问题可能是标记化正在从收缩中去除这种内部标点符号,但Google在制作这些向量时不选择这样做。但是,除非您确定通过其他步骤确定永远不可能发生,否则您的代码应该准备好处理丢失的单词。)