Gensim word2vec model outputs 1000 dimension ndarray but the maximum number of ndarray dimensions is 32 - how?
我正在尝试使用这个 1000 维维基百科 word2vec 模型来分析一些文档。
使用自省我发现一个单词的向量表示是一个 1000 维的 numpy.ndarray,但是每当我尝试创建一个 ndarray 来查找最近的单词时,我都会得到一个值错误:
1 | ValueError: maximum supported dimension for an ndarray is 32, found 1000 |
我可以通过在线查看 32 确实是 ndarray 支持的最大维数 - 那么给出了什么? gensim 如何能够输出 1000 维的 ndarray?
这里是一些示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 | 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) |
输出:
1 2 3 4 | 1000 1000 <class 'numpy.ndarray'> ValueError: maximum supported dimension for an ndarray is 32, found 1000 |
这里的目标是计算语料库中所有单词的平均向量,其格式可用于在模型中查找附近的单词,因此欢迎提出任何替代建议。
您正在调用
但是,即使您将提供给
沿着您尝试采用的方法——这不是我们将在下面介绍的最佳方法——你真的想创建一个具有 1000 个浮点维度的单个向量。也就是说,1000 个类似单元格的值 - 不是
因此,按照您最初的方法的粗略解决方法可能是将您的最后一行替换为:
1 2 3 | result = np.ndarray(len(d)) for i in range(len(d)): result[i] = d[i] |
但是有很多方法可以逐步提高效率、紧凑性和惯用性——我将在下面提到其中的一些方法,尽管最好的方法从根本上来说是不必要的。 首先,您可以使用 Python 的括号索引赋值选项,而不是上面代码中的赋值循环: 但实际上, 但进一步, 这允许更快、更清晰、单行的方法,可以将整个原始代码替换为以下内容:
2
result[:] = d # same result as previous 3-lines w/ loop
2
3
4
doc = [model[word] for word in text if word in model.vocab]
# average all those vectors
out = np.mean(doc, axis=0)
(如果没有