我尝试使用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
这里的目标是计算语料库中所有单词的平均向量,这种格式可以用来在模型中找到附近的单词,因此任何其他的建议都是受欢迎的。在
您正在调用
numpy
的ndarray()
构造函数,其中有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]
分隔类似单元格的值。在因此,按照您最初的方法,一个粗略的解决方案可能是将最后一行替换为:
但是,有很多方法可以逐步提高这种方法的效率、紧凑性和惯用性——我将在下面提到其中的一些方法,尽管最底层的最佳方法使大多数这些过渡步骤变得不必要。在
首先,您可以使用Python的括号索引赋值选项,而不是上面我的代码中的赋值循环:
^{pr2}$但实际上,
numpy
的array()
函数基本上可以从给定的列表中创建必要的numpy
-nativendarray
,所以根本不用ndarray()
,而可以使用array()
:但是更进一步地,
numpy
的许多本机处理数组(和类似数组的列表)的函数已经包含了在一个步骤中对多个向量进行平均的操作(甚至循环都隐藏在非常高效的编译代码或CPU批量向量操作中)。例如,有一个mean()
函数,它可以对数字列表、多维数组或对齐的向量集等进行平均。在这允许更快、更清晰、更简单的方法,可以用类似以下内容替换整个原始代码:
(如果没有
axis
参数,它将把所有槽中的所有单个维度值平均为一个最终的平均值。)相关问题 更多 >
编程相关推荐