Любое эффективное решение при попытке создать встраиваемую матрицу из Word2vec? - PullRequest
2 голосов
/ 17 марта 2019

Я столкнулся с довольно странной проблемой, когда пытался создать матрицу встраивания из 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). Есть идеи?

...