Gensim word2vec模型输出1000维ndarray,但ndarray维数的最大数目是32个如何?

2024-10-02 02:30:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用this1000维wikipediaword2vec模型来分析一些文档。在

通过内省,我发现单词的向量表示是1000维努比·恩达雷,但是,每当我试图创建一个ndarray来查找最接近的单词时,就会出现一个值错误:

ValueError: maximum supported dimension for an ndarray is 32, found 1000

从我在网上看了一下,32确实是一个ndarray支持的最大维数-那又是什么呢?gensim如何能够输出1000维的ndarray?在

下面是一些示例代码:

^{pr2}$

哪些输出:

1000
1000
<class 'numpy.ndarray'>
ValueError: maximum supported dimension for an ndarray is 32, found 1000

这里的目标是计算语料库中所有单词的平均向量,这种格式可以用来在模型中找到附近的单词,因此任何其他的建议都是受欢迎的。在


Tags: 文档模型anforis单词向量supported
1条回答
网友
1楼 · 发布于 2024-10-02 02:30:35

您正在调用numpyndarray()构造函数,其中有1000个数字,您可以手工计算1000个维度中每个维度的平均值。在

ndarray()函数希望它的参数是所构造矩阵的形状,因此它试图创建一个形状为(d[0], d[1], ..., d[999])的新矩阵,然后该矩阵中的每个单独值都将使用1000 int的坐标集进行寻址。而且,实际上numpy数组只能有32个独立维度。在

但是,即使您将提供给ndarray()的列表缩减为32个数字,您仍然会遇到问题,因为您的32个数字是浮点值,ndarray()需要整数。(你会得到一个TypeError。)

在您尝试采用的方法中,这并不是我们将要讨论的最佳方法,您确实希望创建一个由1000个浮点维组成的单矢量。也就是说,1000个类似单元格的值–不是d[0] * d[1] * ... * d[999]分隔类似单元格的值。在

因此,按照您最初的方法,一个粗略的解决方案可能是将最后一行替换为:

result = np.ndarray(len(d))
for i in range(len(d)):
    result[i] = d[i]

但是,有很多方法可以逐步提高这种方法的效率、紧凑性和惯用性——我将在下面提到其中的一些方法,尽管最底层的最佳方法使大多数这些过渡步骤变得不必要。在

首先,您可以使用Python的括号索引赋值选项,而不是上面我的代码中的赋值循环:

^{pr2}$

但实际上,numpyarray()函数基本上可以从给定的列表中创建必要的numpy-nativendarray,所以根本不用ndarray(),而可以使用array()

result = np.array(d)  # same result as previous 2-lines

但是更进一步地,numpy的许多本机处理数组(和类似数组的列表)的函数已经包含了在一个步骤中对多个向量进行平均的操作(甚至循环都隐藏在非常高效的编译代码或CPU批量向量操作中)。例如,有一个mean()函数,它可以对数字列表、多维数组或对齐的向量集等进行平均。在

这允许更快、更清晰、更简单的方法,可以用类似以下内容替换整个原始代码:

# get a list of available word-vetors
doc = [model[word] for word in text if word in model.vocab]
# average all those vectors
out = np.mean(doc, axis=0)

(如果没有axis参数,它将把所有槽中的所有单个维度值平均为一个最终的平均值。)

相关问题 更多 >

    热门问题