我正在尝试使用此1000维维基百科word2vec模型来分析一些文档。
使用自省,我发现单词的向量表示是1000维numpy.ndarray,但是每当我尝试创建ndarray来查找最接近的单词时,我都会得到一个值错误:
ValueError: maximum supported dimension for an ndarray is 32, found 1000
从网上浏览的结果可以看出,32个数组的确是支持的最大维数-那有什么用呢?gensim如何输出1000维ndarray?
这是一些示例代码:
doc = [model[word] for word in text if word in model.vocab]
out = []
n = len(doc[0])
print(n)
print(len(model["hello"]))
print(type(doc[0]))
for i in range(n):
sum = 0
for d in doc:
sum += d[i]
out.append(sum/n)
out = np.ndarray(out)
输出:
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]
分开单独的类似单元格的值。
因此,按照最初方法的粗略解决方法可能是用以下任一方法替换最后一行:
result = np.ndarray(len(d))
for i in range(len(d)):
result[i] = d[i]
但是,有很多方法可以使此方法更加高效,紧凑和惯用–尽管下面最好的方法使大多数临时步骤都不必要,但我将在下文中提及其中的许多方法。
例如,您可以使用Python的方括号索引分配选项代替上面代码中的分配循环:
result = np.ndarray(len(d))
result[:] = d # same result as previous 3-lines w/ loop
但实际上,numpy
的array()
功能实际上可以从给定列表中创建必要的numpy
-native ndarray
,因此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
参数,它将所有插槽中的所有单个维度值平均在一起,只有一个最终平均值。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句