-->

ValueError异常:不能重塑大小3800的阵列分成形状(1200)(ValueError: c

2019-09-27 07:49发布

我想申请字嵌入在鸣叫。 我试图通过利用存在于该鸣叫如下词语向量的平均来创建针对每个鸣叫的载体:

def word_vector(tokens, size):
    vec = np.zeros(size).reshape((1, size))
    count = 0.
    for word in tokens:
        try:
            vec += model_w2v[word].reshape((1, size))
            count += 1.
        except KeyError: # handling the case where the token is not in vocabulary

            continue
    if count != 0:
        vec /= count
    return vec

接下来,当我尝试准备word2vec功能设置如下:

wordvec_arrays = np.zeros((len(tokenized_tweet), 200))
#the length of the vector is 200

for i in range(len(tokenized_tweet)):
    wordvec_arrays[i,:] = word_vector(tokenized_tweet[i], 200)

wordvec_df = pd.DataFrame(wordvec_arrays)
wordvec_df.shape

我得到的循环中出现以下错误:

 ValueError Traceback (most recent call last) <ipython-input-32-72aee891e885> in <module> 4 # wordvec_arrays.reshape(1,200) 5 for i in range(len(tokenized_tweet)): ----> 6 wordvec_arrays[i,:] = word_vector(tokenized_tweet[i], 200) 7 8 wordvec_df = pd.DataFrame(wordvec_arrays) <ipython-input-31-9e6501810162> in word_vector(tokens, size) 4 for word in tokens: 5 try: ----> 6 vec += model_w2v.wv.__getitem__(word).reshape((1, size)) 7 count += 1. 8 except KeyError: # handling the case where the token is not in vocabulary ValueError: cannot reshape array of size 3800 into shape (1,200) 

我检查了计算器所有可用的职位,但他们不真的帮了我。

我试图重塑阵列,它仍然给了我同样的错误。

我的模型是:

tokenized_tweet = df['tweet'].apply(lambda x: x.split()) # tokenizing

model_w2v = gensim.models.Word2Vec(
            tokenized_tweet,
            size=200, # desired no. of features/independent variables 
            window=5, # context window size
            min_count=2,
            sg = 1, # 1 for skip-gram model
            hs = 0,
            negative = 10, # for negative sampling
            workers= 2, # no.of cores
            seed = 34)

model_w2v.train(tokenized_tweet, total_examples= len(df['tweet']), epochs=20)

有什么建议吗?

Answer 1:

它看起来像你的意图word_vector()方法是取词的列表,然后相对于一个给定的Word2Vec模型,返回所有这些单词矢量的平均值(如果存在的话)。

要做到这一点,你不应该需要做载体中的任何明确的重新塑造-甚至的规格size ,因为这是由什么模型已经提供强制。 你可以使用实用方法从numpy简化代码很多。 例如, gensim n_similarity()方法,因为它的两个列表-的词的对比的一部分,已经做了平均很像你想什么,你可以看看它作为模型来源:

https://github.com/RaRe-Technologies/gensim/blob/f97d0e793faa57877a2bbedc15c287835463eaa9/gensim/models/keyedvectors.py#L996

所以,虽然我还没有测试此代码,我觉得你word_vector()方法可以基本上替换为:

import numpy as np

def average_words_vectors(tokens, wv_model):
    vectors = [wv_model[word] for word in tokens 
               if word in wv_model]  # avoiding KeyError
    return np.array(vectors).mean(axis=0)

(它有时它的意义与已经被标准化为单位长度向量工作的情况下-作为链接gensim通过应用代码gensim.matutils.unitvec()平均我没有做过这这里,因为你方法没有迈出那一步 - 但它是值得考虑)。

关于你的独立意见Word2Vec训练码:

  • 通常与刚刚1,2个字,或几个事件没有得到良好的矢量(由于有限数量的与各种各样的实施例), 与其他较常见字矢量的改进干涉 。 这就是为什么默认为min_count=5 。 所以要知道:你的生存载体可能会更好,如果你使用一个默认的(甚至更大)值这里,丢弃更多的罕见字。

  • “密集嵌入”像word2vec向量的尺寸是不是真正的“自变量”(或独立单独可解释的“特征”)为您的代码注释暗示,尽管他们可能似乎是这样作为单独的值/插槽在数据中。 例如,可以不接一个维度出来,并得出结论,“这是该样品的FOO性”(如“冷”或“硬度”或“积极性”等)。 相反,任何那些人可描述的含义的往往是在将组合空间,与任何个别的尺寸不完全对齐其它方向。 您可以排序的挑逗了那些通过比较载体,而下游ML算法可以利用这些复杂/纠结多维互动。 但如果你认为每一个维度视为自己的“特色”的 - 比是其他任何方式,它在技术上与该项目相关的一个数字 - 你可能会有误解的向量空间。



文章来源: ValueError: cannot reshape array of size 3800 into shape (1,200)