当我尝试从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 :
之所以提出这一点,是因为我对训练NN模型时使用word2vec
嵌入感到好奇。我在先前的解决方案中使用了glove
嵌入,但是word2vec
在我的机器上完全是灾难。也许,我需要缩小到与数据集相等的大小。如何缩小比例?那可行吗?我的训练数据暗淡为(10240, 6)
。有想法吗?