Загрузка Перфектных перчаточных векторов в python
Я загрузил предварительно просматриваемый векторный файл перчаток из Интернета. Это файл .txt. Я не могу загрузить и получить к нему доступ. Легко загрузить и получить доступ к двоичному файлу слова-вектора с помощью gensim, но я не знаю, как это сделать, когда это текстовый формат.
Заранее спасибо
Ответы
Ответ 1
Файлы моделей перчаток представлены в словесно-векторном формате. Вы можете открыть текстовый файл, чтобы проверить это. Вот небольшой фрагмент кода, который вы можете использовать для загрузки предварительно подготовленного файла перчаток:
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
Вы можете сделать это намного быстрее с помощью pandas:
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
Ответ 3
Я предлагаю использовать gensim, чтобы сделать все. Вы можете прочитать файл, а также воспользоваться множеством методов, уже реализованных в этом замечательном пакете.
Предположим, что вы сгенерировали векторы GloVe с использованием программы на С++ и что ваш параметр "-save-file" является "вектором". Glove executable сгенерирует вам два файла: "vectors.bin" и "vectors.txt".
Используйте glove2word2vec для преобразования векторов GloVe в текстовом формате в текстовый формат word2vec:
from gensim.scripts.glove2word2vec import glove2word2vec
glove2word2vec(glove_input_file="vectors.txt", word2vec_output_file="gensim_glove_vectors.txt")
Наконец, прочитайте word2vec txt для модели gensim, используя KeyedVectors:
from gensim.models.keyedvectors import KeyedVectors
glove_model = KeyedVectors.load_word2vec_format("gensim_glove_vectors.txt", binary=False)
Теперь вы можете использовать gensim word2vec методы (например, сходство), как вам бы хотелось.
Ответ 4
Здесь один вкладыш, если все, что вам нужно, это матрица встраивания
np.loadtxt(path, usecols=range(1, dim+1), comments=None)
где path
- это путь к загруженному файлу GloVe, а dim
- размер вложения слова.
Если вы хотите и слова, и соответствующие векторы, вы можете сделать
glove = np.loadtxt(path, dtype='str', comments=None)
и разделить слова и векторы следующим образом
words = glove[:, 0]
vectors = glove[:, 1:].astype('float')
Ответ 5
Я нашел этот подход быстрее.
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()}
Сохранить словарь:
import pickle
with open('glove.840B.300d.pkl', 'wb') as fp:
pickle.dump(glove, fp)
Ответ 6
Версия Python3, которая также обрабатывает биграммы и триграммы:
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
Ответ 7
import os
import numpy as np
# store all the pre-trained word vectors
print('Loading word vectors...')
word2vec = {}
with open(os.path.join('glove/glove.6B.%sd.txt' % EMBEDDING_DIM)) as f: #enter the path where you unzipped the glove file
# is just a space-separated text file in the format:
# word vec[0] vec[1] vec[2] ...
for line in f:
values = line.split()
word = values[0]
vec = np.asarray(values[1:], dtype='float32')
word2vec[word] = vec
print('Found %s word vectors.' % len(word2vec))
Ответ 8
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