web-dev-qa-db-fra.com

Charger des vecteurs de gants pré-entraînés en python

J'ai téléchargé un fichier vectoriel de gant non entrainé sur Internet. C'est un fichier .txt. Je suis incapable de charger et d'y accéder. Il est facile de charger et d’accéder à un fichier binaire vectoriel Word à l’aide de gensim mais je ne sais pas comment le faire quand il s’agit d’un format de fichier texte.

Merci d'avance

22
Same

les fichiers de modèle de gant sont au format Word - vectoriel. Vous pouvez ouvrir le fichier texte pour vérifier cela. Voici un petit extrait de code que vous pouvez utiliser pour charger un fichier de gant pré-entraîné:

import numpy as np
def loadGloveModel(gloveFile):
    print "Loading Glove Model"
    f = open(gloveFile,'r')
    model = {}
    for line in f:
        splitLine = line.split()
        Word = splitLine[0]
        embedding = np.array([float(val) for val in splitLine[1:]])
        model[Word] = embedding
    print "Done.",len(model)," words loaded!"
    return model

Vous pouvez ensuite accéder aux vecteurs Word en utilisant simplement la variable de modèle.

print model['hello']

47
Karishma Malkan

Vous pouvez le faire beaucoup plus vite avec les pandas:

import pandas as pd
import csv

words = pd.read_table(glove_data_file, sep=" ", index_col=0, header=None, quoting=csv.QUOTE_NONE)

Ensuite, pour obtenir le vecteur d'un mot:

def vec(w):
  return words.loc[w].as_matrix()

Et pour trouver le mot le plus proche d'un vecteur:

words_matrix = words.as_matrix()

def find_closest_Word(v):
  diff = words_matrix - v
  delta = np.sum(diff * diff, axis=1)
  i = np.argmin(delta)
  return words.iloc[i].name
34
Petter

Je suggère d'utiliser gensim pour tout faire. Vous pouvez lire le fichier et bénéficier de nombreuses méthodes déjà implémentées sur cet excellent package.

Supposons que vous ayez généré GloVe vecteur en utilisant le programme C++ et que votre paramètre "-save-file" soit "vecteur". Le gant exécutable vous générera deux fichiers, "vectors.bin" et "vectors.txt".

Utilisez glove2Word2vec pour convertir les vecteurs GloVe au format texte au format texte Word2vec:

from gensim.scripts.glove2Word2vec import glove2Word2vec
glove2Word2vec(glove_input_file="vectors.txt", Word2vec_output_file="gensim_glove_vectors.txt")

Enfin, lisez le texte Word2vec d’un modèle de gensim à l’aide de KeyedVectors :

from gensim.models.keyedvectors import KeyedVectors
glove_model = KeyedVectors.load_Word2vec_format("gensim_glove_vectors.txt", binary=False)

Vous pouvez maintenant utiliser gensim Word2vec méthodes (par exemple, similarité) comme vous le souhaitez.

19
Ben

J'ai trouvé cette approche plus rapidement. 

import pandas as pd

df = pd.read_csv('glove.840B.300d.txt', sep=" ", quoting=3, header=None, index_col=0)
glove = {key: val.values for key, val in df.T.items()}

Enregistrez le dictionnaire:

import pickle
with open('glove.840B.300d.pkl', 'wb') as fp:
    pickle.dump(glove, fp)
0
Indra

Version Python3 qui gère également les bigrammes et les trigrammes:

import numpy as np


def load_glove_model(glove_file):
    print("Loading Glove Model")
    f = open(glove_file, 'r')
    model = {}
    vector_size = 300
    for line in f:
        split_line = line.split()
        Word = " ".join(split_line[0:len(split_line) - vector_size])
        embedding = np.array([float(val) for val in split_line[-vector_size:]])
        model[Word] = embedding
    print("Done.\n" + str(len(model)) + " words loaded!")
    return model
0
alabroski