我已經從互聯網上下載了pretrained手套矢量文件。這是一個.txt文件。我無法加載和訪問它。使用gensim加載和訪問單詞矢量二進制文件很容易,但是當它是文本文件格式時,我不知道該怎麼做。在Python中加載預訓練手套矢量
在此先感謝
我已經從互聯網上下載了pretrained手套矢量文件。這是一個.txt文件。我無法加載和訪問它。使用gensim加載和訪問單詞矢量二進制文件很容易,但是當它是文本文件格式時,我不知道該怎麼做。在Python中加載預訓練手套矢量
在此先感謝
手套模型文件是一個字 - 矢量格式。您可以打開文本文件來驗證。下面是一小段代碼,你可以用它來加載預訓練手套文件:
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']
你可以用大熊貓做要快:
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
這應該是正確的答案。 – gobrewers14
儘管加載模型的時間減少了近一半,但訪問時間增加了1000倍。反對字典訪問的loc。我想,我個人更喜歡較低的進入時間,因爲這會影響訓練時間。由於模型製作是一次性的,所以最好把時間投入到那裏並且一勞永逸地保存。如果我錯了,請糾正我。 –
你應該在'read_table'中使用更多的參數:'na_values = None,keep_default_na = False'。否則,它會將許多有效的字符串(例如'null','NA'等)視爲'nan'浮點值。 –
我建議使用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方法(例如,相似性),如你所願。
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
請提供您的答案評論。爲什麼比已經接受的更好? – NatNgs
這是來自kaggle,它炸燬了一些手套文件,例如800B.300d –
我想知道是否有更快的方式做到這一點。我使用類似於上面的代碼,但處理整個60億令牌嵌入需要大約27個小時。任何想法如何更快地做到這一點? –
@EdwardBurgin,它花了我1分鐘來完成整個文件。請分享您在評論中提及的「類似代碼」。 –