nathanshartmann / portuguese_word_embeddings

Portuguese Word Embeddings: Evaluating on Word Analogies and Natural Language Tasks
GNU General Public License v3.0
235 stars 35 forks source link

Erro ao importar as word embeedings #21

Open guilhermeparreira opened 3 years ago

guilhermeparreira commented 3 years ago

Olá. Eu fiz o download dos arquivos 'cbow_s50.txt' e 'skip_s100.txt' e tentei ler a partir do seguinte código:

#glove_file = open('skip_s100.txt', encoding="utf8")
glove_file = open('cbow_s50.txt', encoding="utf8")
for line in glove_file:
    records = line.split()
    word = records[0]
      vector_dimensions = asarray(records[1:], dtype='float32')
      embeddings_dictionary[word] = vector_dimensions
glove_file.close()

Só que, ao ler o vetor da palavra 'r$', tem um separador decimal como sendo uma vírgula ao invés de um ponto para o primeiro valor ('0,0'). Conforme:

['r$', '0,0', '-1.5257', '-1.3465', '0.50135', '-1.3595', '-2.4554', '1.4728', '-1.7729', '1.5563', '-2.5805', '-0.76528', '-0.82861', '-2.4971', '1.3411', '0.17545', '3.3063', '1.2149', '0.21055', '-0.086131', '2.6523', '-2.0067', '-1.0035', '3.7835', '0.48662', '2.2626', '-6.9646', '-2.1993', '-2.6506', '0.11151', '0.71633', '-4.3761', '-1.7467', '3.668', '-2.4501', '2.2501', '3.337', '-0.35921', '0.62648', '-0.67942', '-3.3683', '-0.54832', '-0.25551', '1.1961', '1.4627', '-0.099943', '0.22756', '-0.51279', '-0.15101', '0.44685', '2.5067', '-1.316']

Como eu conseguiria ler tal arquivo sem erro?

nathanshartmann commented 1 year ago

Olá. Tudo bem?

Agradeço o feedback. Encontrei outros casos semelhantes a esse. Infelizmente aqui vejo duas alternativas: 1 - retirar essas entradas do vocabulário das embeddings, a fim de prover um dicionário mais apurado de valores 2 - retreinar as embeddings corrigindo o pré-processamento. A segunda alternativa me parece inviável, infelizmente.

cesargm2015 commented 1 year ago

Sei que é um post antigo, mas caso alguém precise, basta importar e tratar como exceção os tokens com problemas na conversão:

emmbed_dict = {}
token_exceptions = []

with open('glove_s300.txt','r') as f:
  next(f) # pula a primeira linha
  for line in f:
    try:
      values = line.strip().split()
      word = values[0]
      v = np.array(values[1:], dtype=np.float16)
      if len(v) == 300: # trata alguns tokens que passam e gera um vetor com dim. n+1
        emmbed_dict[word] = v
      else:
        token_exceptions.append(word)  
    except ValueError as e:
      token_exceptions.append(e)
EnzoBustos commented 1 year ago

Olá, estou tentando importar os word_embeddings da mesma forma como é recomendado no site do NILC, porém estou tendo dificuldades, estou utilizando o Google Colab para um projeto.

cbow_50 = KeyedVectors.load_word2vec_format("cbow_s50.txt")

E recebo o seguinte erro, cada vez que eu rodo aparecem números diferentes.

ValueError                                Traceback (most recent call last)
<ipython-input-28-c33f057910b5> in <cell line: 1>()
----> 1 cbow_50 = KeyedVectors.load_word2vec_format("cbow_s50.txt", )

4 frames
/usr/local/lib/python3.10/dist-packages/gensim/models/keyedvectors.py in add_vector(self, key, vector)
    560             self.index_to_key[target_index] = key
    561             self.key_to_index[key] = target_index
--> 562             self.vectors[target_index] = vector
    563             self.next_index += 1
    564         return target_index

ValueError: could not broadcast input array from shape (27,) into shape (50,)

Agradeço por qualquer ajuda.

nathanshartmann commented 1 year ago

Olá, estou tentando importar os word_embeddings da mesma forma como é recomendado no site do NILC, porém estou tendo dificuldades, estou utilizando o Google Colab para um projeto.

cbow_50 = KeyedVectors.load_word2vec_format("cbow_s50.txt")

E recebo o seguinte erro, cada vez que eu rodo aparecem números diferentes.

ValueError                                Traceback (most recent call last)
<ipython-input-28-c33f057910b5> in <cell line: 1>()
----> 1 cbow_50 = KeyedVectors.load_word2vec_format("cbow_s50.txt", )

4 frames
/usr/local/lib/python3.10/dist-packages/gensim/models/keyedvectors.py in add_vector(self, key, vector)
    560             self.index_to_key[target_index] = key
    561             self.key_to_index[key] = target_index
--> 562             self.vectors[target_index] = vector
    563             self.next_index += 1
    564         return target_index

ValueError: could not broadcast input array from shape (27,) into shape (50,)

Agradeço por qualquer ajuda.

Testei no GoogleColab com gensim na versão que já vem (também é a mais atual no momento gensim==4.3.1) e funcionou. Segue evidência:

image

nathanshartmann commented 1 year ago

@guilhermeparreira e @cesargm2015 poderiam me explicar qual a necessidade de ler o arquivo no formato que vocês estão tentando?

Se carregarem com o gensim, vocês conseguem recuperar as tuplas chave/valor.

Podem fazer algo do tipo:

from gensim.models import KeyedVectors

model = KeyedVectors.load_word2vec_format('cbow_s50.txt')

keys = list(model.key_to_index.keys())
values = model.vectors
dic = {keys[i]:values[i] for i in range(len(values))}
dic['casa'] # array([ 0.070092,  0.407779, -0.178947,  0.052426,  0.333784, -0.096429, ...], dtype=float32)

Se essa sugestão resolver a questão, fecharei a issue.