gpt4 book ai didi

python - 值错误 : cannot reshape array of size 3800 into shape (1, 200)

转载 作者:行者123 更新时间:2023-12-01 00:44:03 24 4
gpt4 key购买 nike

我正在尝试在推文上应用词嵌入。我试图通过取推文中出现的单词向量的平均值来为每条推文创建一个向量,如下所示:

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)

我检查了 stackOverflow 中的所有可用帖子,但没有一个真正对我有帮助。

我尝试 reshape 数组,但它仍然给我同样的错误。

我的模型是:

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)

请问有什么建议吗?

最佳答案

看起来 word_vector() 方法的目的是获取单词列表,然后针对给定的 Word2Vec 模型,返回以下值的平均值所有这些单词的向量(如果存在)。

为此,您不需要对向量进行任何显式的重新整形,甚至不需要指定大小,因为这是由模型已提供的内容强制的。您可以使用 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.matutils.unitvec()< 作为链接的 gensim 代码 到平均值。我在这里没有这样做,因为你的方法没有采取该步骤 - 但这是需要考虑的事情。)

Word2Vec 训练代码的单独观察:

  • 通常,仅出现 1、2 次或几次的单词不会获得良好的向量(由于示例的数量和种类有限),但确实会产生干扰随着其他更常见词向量的改进。这就是默认值为 min_count=5 的原因。因此请注意:如果您在此处使用默认(甚至更大)值,丢弃更多的稀有单词,您的幸存向量可能会变得更好。

  • 像 word2vec-vectors 这样的“密集嵌入”的维度并不是真正的“独立变量”(或独立的可单独解释的“特征”),正如代码注释所暗示的那样,即使它们看起来可能是作为数据中单独的值/槽的方式。例如,你不能选出一个维度并得出结论,“这就是这个样本的愚蠢之处”(例如“冷漠”或“坚硬”或“积极”等)。相反,任何人类可描述的含义都倾向于是组合空间中的其他方向,而不是与任何单独的维度完全一致。您可以通过比较向量来梳理这些问题,下游的机器学习算法可以利用这些复杂/纠缠的多维交互。但是,如果您将每个维度视为其自己的“特征”(除了"is"之外,从技术上讲,它是与该项目相关的单个数字),您可能会容易误解向量空间。

关于python - 值错误 : cannot reshape array of size 3800 into shape (1, 200),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57125306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com