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

问题描述 投票:0回答:1

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

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

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

感谢您的支持

python deep-learning gensim word-embedding keyerror
1个回答
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')或两者都可用('berlin'),或者一点也不。

如果根本不做,那么您想在尝试将其用于类比解决方案代码之前检查其可用性,或者设置一个try: ... except: ...错误捕捉构造以在错误出现时对其进行处理。

© www.soinside.com 2019 - 2024. All rights reserved.