Загрузка Перфектных перчаточных векторов в 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