2016-06-13 43 views
10

我已經從互聯網上下載了pretrained手套矢量文件。這是一個.txt文件。我無法加載和訪問它。使用gensim加載和訪問單詞矢量二進制文件很容易,但是當它是文本文件格式時,我不知道該怎麼做。在Python中加載預訓練手套矢量

在此先感謝

回答

24

手套模型文件是一個字 - 矢量格式。您可以打開文本文件來驗證。下面是一小段代碼,你可以用它來加載預訓練手套文件:

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 

然後,您可以簡單地使用模型變量訪問單詞矢量。

print model['hello']

+2

我想知道是否有更快的方式做到這一點。我使用類似於上面的代碼,但處理整個60億令牌嵌入需要大約27個小時。任何想法如何更快地做到這一點? –

+0

@EdwardBurgin,它花了我1分鐘來完成整個文件。請分享您在評論中提及的「類似代碼」。 –

15

你可以用大熊貓做要快:

import pandas as pd 
import csv 

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

然後得到一個字的矢量:

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

,並找到最接近的詞向量:

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

這應該是正確的答案。 – gobrewers14

+0

儘管加載模型的時間減少了近一半,但訪問時間增加了1000倍。反對字典訪問的loc。我想,我個人更喜歡較低的進入時間,因爲這會影響訓練時間。由於模型製作是一次性的,所以最好把時間投入到那裏並且一勞永逸地保存。如果我錯了,請糾正我。 –

+1

你應該在'read_table'中使用更多的參數:'na_values = None,keep_default_na = False'。否則,它會將許多有效的字符串(例如'null','NA'等)視爲'nan'浮點值。 –

5

我建議使用gensim來做所有事情。您可以閱讀該文件,也可以從此優秀軟件包中實施的許多方法中受益。

假設您使用C++程序生成GloVe向量,並且您的「-save-file」參數是「向量」。手套可執行文件會生成兩個文件,「vectors.bin」和「vectors.txt」。

使用glove2word2vec以文本格式手套向量轉換成word2vec文本格式:

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

最後,使用KeyedVectors閱讀word2vec TXT到gensim模式:

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

現在你可以使用gensim word2vec方法(例如,相似性),如你所願。

-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

請提供您的答案評論。爲什麼比已經接受的更好? – NatNgs

+0

這是來自kaggle,它炸燬了一些手套文件,例如800B.300d –

相關問題