Python 将西班牙语预训练模型与Gensim一起使用会导致raise KeyError(“word';%s';不在词汇表中”word)

Python 将西班牙语预训练模型与Gensim一起使用会导致raise KeyError(“word';%s';不在词汇表中”word),python,deep-learning,gensim,word-embedding,keyerror,Python,Deep Learning,Gensim,Word Embedding,Keyerror,我正在努力解决以下问题: 我为西班牙语下载了一个预先训练好的单词嵌入模型(西班牙语300维单词向量超过100万个单词) 我成功地加载了它,甚至还做了一些实验,比如西班牙语中最相似的单词和基本类比(a是B,C是what),但当我尝试以下内容时: for pais in 'Italia', 'Francia', 'India', 'China': print(' is the capital of ' (A_is_to_B_as_C_is_to('Alemania','

我正在努力解决以下问题:

我为西班牙语下载了一个预先训练好的单词嵌入模型(西班牙语300维单词向量超过100万个单词) 我成功地加载了它,甚至还做了一些实验,比如西班牙语中最相似的单词和基本类比(a是B,C是what),但当我尝试以下内容时:

 for pais in 'Italia', 'Francia', 'India', 'China':
      print(' is the capital of '  
      (A_is_to_B_as_C_is_to('Alemania','Berlín',pais),pais))
它引发了一个错误:

KeyError: "word 'Berlín' not in vocabulary"
我已经检查过这个词是否真的存在于单词嵌入中。我还消除了编码错误的可能性

根据我的研究,这种类型的错误是在令牌/单词应该包装在列表[]中时产生的,但是我不知道如何将其应用于这个特定问题。此外,这段代码与第3章(Word2vecMath)中“深度学习食谱”中使用的代码相同

这是完整的脚本:

import os
from keras.utils import get_file
import gensim

from gensim.models.keyedvectors import KeyedVectors

import subprocess
import numpy as np
import matplotlib.pyplot as plt
from IPython.core.pylabtools import figsize


from sklearn.manifold import TSNE
import json
from collections import Counter
from itertools import chain

from keras.models import load_model
path = ("D:\Pretrained_wordEmbeddings_ESP\embeddings-l-model.vec")


model = gensim.models.KeyedVectors.load_word2vec_format(path, binary=False)


data=model.most_similar(positive=["muerte"])

print(data[:])


def A_is_to_B_as_C_is_to(a, b, c, topn=1):
    a, b, c = map(lambda x:x if type(x) == list else [x], (a, b, c))
    res = model.most_similar(positive=b + c, negative=a, topn=topn)
    if len(res):
        if topn == 1:
            return res[0][0]
        return [x[0] for x in res]
    return None

A_is_to_B_as_C_is_to('hombre', 'mujer', 'rey')

## for pais in 'Italia', 'Francia', 'India', 'China':
##    print(' is the capital of '  
##          (A_is_to_B_as_C_is_to('Alemania', 'Berlín', pais), pais))

感谢您的支持

如果您遇到类似
KeyError的错误:“单词'Berlín'不在词汇表中”
,那么您可以相信该错误:该单词确实不在词汇表中。(这不是因为没有在列表中指定它。)

您可以直接通过以下代码进行检查:

打印(型号['Berlín']
…可能会显示相同的错误

如果您认为您“已经检查了单词是否确实存在于单词嵌入中”,请编辑您的问题以显示您在代码和输出中执行的检查,以验证其存在

您可以在列表
model.index2entity
中查看模型中的实际单词。例如,您可以通过以下方式显示模型中的前10个单词:

model.index2entity[:10]
…或通过…查找单词列表中的位置

model.index2entity.index('Berlín'))
但是,对于一个不存在的单词,您将得到一个
ValueError

我注意到你引用的单词是西班牙语字母
I
(),而不是其他字母中使用的普通虚线-I
I
字母

根据单词向量的构造方式,可能该单词有去重音形式(
'Berlin'
)或大小写平铺形式(
'berlín'
),或者两者都有(
'Berlin'
),或者根本没有


如果没有,那么在尝试在类比求解代码中使用它之前,您应该检查它的可用性,或者设置一个
try:。。。除了:…
错误捕获构造以在出现错误时处理该错误

单词嵌入的大小写较低。所以,我最初的帖子是不准确的,贝林和柏林这两个词实际上在单词嵌入中(现在我知道了),它不包括柏林或贝林。