Я столкнулся с довольно странной проблемой, когда пытался создать матрицу встраивания из word2vec
векторов встраивания, создание такой матрицы заняло у меня отчаянно много времени, и я понял, почему это так. Однако моя цель - создать word2vec
матрицу встраивания для построения слоев встраивания и использовать ее для обучения CNN
.
Вот что я попробовал:
import gensim
import numpy as np
import string
import gensim
from gensim.models import Word2Vec
from gensim.utils import simple_preprocess
from gensim.models.keyedvectors import KeyedVectors
word2vec = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
word2vec.syn0.shape[0] // 300000
word2vec.syn0.shape[1] // 300
word2vec.syn0.shape // (3000000, 300)
вот исходный необработанный текст в матричном представлении:
word2vec.syn0 ->
array([[ 1.1291504e-03, -8.9645386e-04, 3.1852722e-04, ...,
-1.5640259e-03, -1.2302399e-04, -8.6307526e-05],
[ 7.0312500e-02, 8.6914062e-02, 8.7890625e-02, ...,
-4.7607422e-02, 1.4465332e-02, -6.2500000e-02],
[-1.1779785e-02, -4.7363281e-02, 4.4677734e-02, ...,
7.1289062e-02, -3.4912109e-02, 2.4169922e-02],
...,
[-1.9653320e-02, -9.0820312e-02, -1.9409180e-02, ...,
-1.6357422e-02, -1.3427734e-02, 4.6630859e-02],
[ 3.2714844e-02, -3.2226562e-02, 3.6132812e-02, ...,
-8.8500977e-03, 2.6977539e-02, 1.9042969e-02],
[ 4.5166016e-02, -4.5166016e-02, -3.9367676e-03, ...,
7.9589844e-02, 7.2265625e-02, 1.3000488e-02]], dtype=float32)
и вот как я строю массив:
embeddings = np.zeros((word2vec.syn0.shape[0] + 1, word2vec.syn0.shape[1]), dtype = "float32")
Задача
приведенный ниже код занимает огромное количество времени на моей машине, и я ищу другой способ сделать это.
embeddings[:word2vec.syn0.shape[0]] = word2vec.syn0
Поскольку я начинаю использовать word2vec
встраивание, я не могу понять, как лучше всего создать слой встраивания из word2vec
встраивания. Если вышеприведенный строковый код может быть каким-то образом оптимизирован или эквивалентен использованию glove
встраивания, я был бы рад этому если описанный выше процесс может быть успешно выполнен, я сделаю следующее для создания матрицы внедрения и построения из нее слоя внедрения.
Вот мое продолжение вышеуказанных кодов:
MAX_TOKENS = word2vec.syn0.shape[0]
embedding_dim = word2vec.syn0.shape[1]
hidden_dim_1 = 200
hidden_dim_2 = 100
NUM_CLASSES = 10
embedder = Embedding(MAX_TOKENS + 1, embedding_dim, weights = [embeddings], trainable = False)
Есть ли способ оптимизации кода выше для создания слоев встраивания из word2vec
? Может кто-нибудь предоставляет возможность взломать это? Есть идеи?
обновление
Я также согласен с решением использования glove
встраивания, если оно эквивалентно word2vec
. Есть ли какое-нибудь подходящее решение по этому поводу?
обновление 2 :
Я излагаю эту мысль, потому что мне любопытно использовать word2vec
встраивание, когда я тренирую модель NN. Я использовал встраивание glove
для моего предыдущего решения, но word2vec
- это катастрофа на моей машине. Возможно, мне нужно уменьшить размер моего набора данных. Как я могу уменьшить? это выполнимо? мои тренировочные данные имеют тусклый (10240, 6)
. Есть идеи?