在Gensim中使用西班牙语预训练模型会引发KeyError(“单词'%s'不在词汇表中”%word)

时间:2019-11-10 07:30:53

标签: python deep-learning gensim word-embedding keyerror

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

我下载了西班牙语预训练词嵌入模型(超过一百万个单词,用于西班牙语的300维单词向量) 我成功加载了它,甚至设法进行了一些实验,例如西班牙语中最相似的单词和基本类比(A代表B,C代表B),但是当我尝试以下操作时:

 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))

感谢您的支持

1 个答案:

答案 0 :(得分:0)

如果遇到类似KeyError: "word 'Berlín' not in vocabulary"的错误,则可以相信该错误:单词实际上不在词汇表中。 (这不是由于缺少在列表中指定它的原因。)

您可以直接通过类似...的代码进行检查

print(model['Berlín'])

...这可能会显示相同的错误。

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

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

model.index2entity[:10]

...或通过...在单词列表中查找位置。

model.index2entity.index('Berlín')

但是,对于一个不存在的单词,您会得到一个ValueError

我确实注意到您用西班牙语字母íi-acute)而不是其他字母中使用的普通点缀-i i来引用该词。

取决于单词向量的构造方式,单词可能以非重音形式('Berlin')或大小写统一形式('berlín')或二者兼有({ {1}}),或者根本不这样做。

如果根本不做,那么您想先检查其可用性,然后再尝试在类比解析代码中使用它,或设置一个'berlin'错误捕捉结构以在错误出现时对其进行处理。