2016-06-13 19 views
10

Mam pobrany plik wektora rękawicy z Internetu. Jest to plik .txt. Nie mogę załadować i uzyskać do niego dostępu. Łatwo jest załadować i uzyskać dostęp do binarnego pliku wektorowego przy użyciu gensim, ale nie wiem, jak to zrobić, gdy jest to format pliku tekstowego.Załaduj wstępnie przygotowane wektory rękawiczek w pytonie

Z góry dzięki

Odpowiedz

24

pliki modeli rękawic są w wyrazie - format wektorowy. Możesz otworzyć plik tekstowy, aby to sprawdzić. Oto mały fragment kodu można użyć, aby załadować plik pretrained rękawic:

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 

Następnie można przejść do wektorów słowo po prostu za pomocą zmiennej modelu.

print model['hello']

+2

Zastanawiam się, czy istnieje szybszy sposób robienia tego. Używam kodu podobnego do powyższego, ale przetworzenie całego tokena 6-bitowego tokena zajmie około 27 godzin. Wszelkie pomysły, jak to zrobić szybciej? –

+0

@EdwardBurgin, wykonanie całego pliku zajmuje mi 1 minutę. prosimy o udostępnienie "podobnego kodu", o którym mowa w komentarzu. –

15

Można to zrobić o wiele szybciej z pand:

import pandas as pd 
import csv 

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

Następnie, aby uzyskać wektor słowa:

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

i znaleźć najbliższy słowo wektor :

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

To powinna być poprawna odpowiedź. – gobrewers14

+0

Chociaż czas ładowania modelu zmniejsza się o prawie połowę, ale czas dostępu zwiększa się o 1000x. loc przeciw dostępowi do dyktowania. Myślę, że osobiście wolałbym niższy czas dostępu, co wpłynie na czas treningu. ponieważ tworzenie modelu to jednorazowy wysiłek, lepiej zainwestować tam czas i zapisać go raz na zawsze. popraw mnie, jeśli się mylę. –

+1

Powinieneś użyć kilku dodatkowych argumentów w 'read_table':' na_values ​​= None, keep_default_na = False'. W przeciwnym razie uwzględni on wiele poprawnych łańcuchów (np. "Null", "NA", itp.) Jako wartości zmiennoprzecinkowe 'nan'. –

5

Proponuję użyć gensim, aby zrobić wszystko. Możesz przeczytać plik, a także skorzystać z wielu metod już wdrożonych w tym świetnym pakiecie.

Załóżmy, że generowane są wektory GloVe przy użyciu programu C++, a parametr "-save-file" to "wektory". Plik wykonywalny rękawicy wygeneruje dwa pliki "vectors.bin" i "vectors.txt".

Zastosowanie glove2word2vec przekonwertować wektory rękawiczki w formacie tekstowym do word2vec formatu tekstowego:

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

Wreszcie czytać txt word2vec do gensim modelu korzystania KeyedVectors:

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

Teraz można użyć gensim word2vec metody (na przykład podobieństwo), jak chcesz.

-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

Proszę podać komentarz do swojej odpowiedzi. Dlaczego jest lepszy niż już przyjęty? – NatNgs

+0

to pochodzi od kaggle i wysadza się w niektórych plikach rękawic, np. 800B.300d –