2016-06-13 11 views
10

Ich habe pretrained Handschuh Vektordatei aus dem Internet heruntergeladen. Es ist eine TXT-Datei. Ich kann nicht laden und darauf zugreifen. Es ist einfach zu laden und auf eine Word-Vektor-Binärdatei mit Gensim zugreifen, aber ich weiß nicht, wie es geht, wenn es ein Textdateiformat ist.Load Pretrained Handschuh Vektoren in Python

Vielen Dank im Voraus

Antwort

24

Handschuh-Modell-Dateien sind in einem Wort - Vektor-Format. Sie können die Textdatei öffnen, um dies zu überprüfen. Hier ist ein kleiner Ausschnitt des Codes können Sie eine vortrainierte Handschuh-Datei laden verwenden:

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 

Sie können dann die Wortvektoren zugreifen, indem Sie einfach das Modell Variable.

print model['hello']

+2

Ich frage mich, ob es eine schnellere Möglichkeit gibt, dies zu tun. Ich verwende Code ähnlich dem oben, aber es würde ungefähr 27 Stunden dauern, die ganzen 6 Milliarden Token-Einbettungen zu verarbeiten. Irgendwelche Ideen, wie man das schneller macht? –

+0

@EdwardBurgin, es dauert 1 Minute, um die ganze Datei zu vervollständigen. Bitte teilen Sie den "ähnlichen Code", auf den Sie sich in Ihrem Kommentar beziehen. –

15

Sie können mit Pandas es viel schneller tun:

import pandas as pd 
import csv 

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

dann den Vektor für ein Wort zu bekommen:

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

und das nächste Wort zu einem Vektor finden :

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 
+0

Dies sollte die richtige Antwort sein. – gobrewers14

+0

Obwohl die Zeit zum Laden des Modells um fast die Hälfte reduziert wird, erhöht sich die Zugriffszeit um 1000x. loc gegen dict access. Ich denke, persönlich würde ich eine kürzere Zugriffszeit bevorzugen, da dies die Trainingszeit beeinflussen wird. Da es sich bei der Modellherstellung um eine einmalige Anstrengung handelt, ist es besser, die Zeit dort zu investieren und sie ein für alle Mal zu speichern. korrigiere mich, wenn ich falsch liege. –

+1

Sie sollten ein paar weitere Argumente in 'read_table' verwenden:' na_values ​​= None, keep_default_na = False'. Andernfalls werden viele gültige Zeichenfolgen (z. B. "Null", "NA" usw.) als Gleitkommawerte "nan" betrachtet. –

5

Ich schlage vor, mit gensim alles zu tun. Sie können die Datei lesen und profitieren auch von vielen Methoden, die bereits in diesem großartigen Paket implementiert sind.

Angenommen, Sie haben GloVe Vektoren mit dem C++ - Programm generiert und dass der Parameter "-save-file" "Vektoren" ist. Glove executable erzeugt zwei Dateien, "vectors.bin" und "vectors.txt".

Verwenden glove2word2vec Handschuh Vektoren im Textformat in das word2vec Text-Format zu konvertieren:

from gensim.scripts.glove2word2vec import glove2word2vec 
glove2word2vec(glove_input_file="vectors.txt", word2vec_output_file="gensim_glove_vectors.txt") 

Schließlich lesen Sie die word2vec txt zu einem GENSIM Modell KeyedVectors:

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

Jetzt können Sie verwenden gensim word2vec Methoden (zum Beispiel Ähnlichkeit), wie Sie möchten.

-1
EMBEDDING_LIFE = 'path/to/your/glove.txt' 

def get_coefs(word,*arr): 
     return word, np.asarray(arr, dtype='float32') 

embeddings_index = dict(get_coefs(*o.strip().split()) for o in open(EMBEDDING_FILE)) 

all_embs = np.stack(embeddings_index.values()) 
emb_mean,emb_std = all_embs.mean(), all_embs.std() 
word_index = tokenizer.word_index 
nb_words = min(max_features, len(word_index)) 

embedding_matrix = np.random.normal(emb_mean, emb_std, (nb_words, embed_size)) 

for word, i in word_index.items(): 
if i >= max_features: continue 
embedding_vector = embeddings_index.get(word) 
if embedding_vector is not None: embedding_matrix[i] = embedding_vector 
+0

Bitte geben Sie einen Kommentar zu Ihrer Antwort. Warum ist es besser als bereits akzeptiert? – NatNgs

+0

das kommt von kaggle und es explodiert auf einigen Handschuhakten, z. 800B.300d –