использование испанской предварительно обученной модели с Gensim приводит к повышению KeyError («слово '% s' отсутствует в словаре"% word) - PullRequest
0 голосов
/ 10 ноября 2019

Я борюсь со следующей проблемой:

Я скачал предварительно обученную модель встраивания слов для Испанский (более 1 миллиона слов 300-мерные векторы словдля испанского) я загрузил его успешно, и мне даже удалось провести пару экспериментов, таких как большинство похожих слов и основные аналогии на испанском языке (от A к B, к 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"

Я уже проверил, что слово на самом деле находится во вложении слова. Я также исключил возможность ошибки кодирования.

Исходя из моих исследований, этот тип ошибки возникает, когда токен / слово предполагается заключить в список [], однако я не знаю, как применить это к этой конкретной проблеме. Кроме того, этот блок кода является тем же самым кодом, который используется в « Deep Learning Cookbook » в главе 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 голосов
/ 10 ноября 2019

Если вы получите сообщение об ошибке типа KeyError: "word 'Berlín' not in vocabulary", то вы можете доверять этой ошибке: слово на самом деле отсутствует в словаре. (Это не связано с отсутствием указания его в списке.)

Вы можете проверить это напрямую с помощью кода, подобного ...

print(model['Berlín'])

..., который, вероятно, будет отображать то же самоеошибка.

Если вы считаете, что «уже проверили, что слово на самом деле входит в состав слова», отредактируйте свой вопрос, чтобы показать выполненную вами проверку, в коде и выводе, чтобы проверить его наличие.

Вы можете просмотреть слова, фактически находящиеся в модели, в списке model.index2entity. Например, вы можете отобразить первые 10 слов в модели с помощью:

model.index2entity[:10]

... или найти позицию в этом списке слова с помощью ...

model.index2entity.index('Berlín')
* 1017Но за слово «нет» вы получите ValueError.

Хочу заметить, что вы процитировали слово с испанской буквой í ( i-sharp ), а не с простой пунктирной буквой-i i, используемой в других алфавитах,

В зависимости от того, как были построены векторы-слова, возможно, слово доступно в де-акцентированной форме ('Berlin'), или в форме с падением регистра ('berlín'), или в обоих (* 1029)*) или нет совсем.

Если не совсем, то вам нужно проверить его доступность, прежде чем пытаться использовать его в коде, решающем аналогии, или установить try: ... except: ... конструкцию с фиксацией ошибок для обработки ошибки, когда бы она ни возникалавверх.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...