草庐IT

关于 python:Gensim word2vec 模型输出 1000 维 ndarray 但 ndarray 维度的最大数量为 32 – 如何?

codeneng 2023-03-28 原文

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

这里的目标是计算语料库中所有单词的平均向量,其格式可用于在模型中查找附近的单词,因此欢迎提出任何替代建议。


您正在调用 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] 单独的类似单元格的值。

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

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

但是有很多方法可以逐步提高效率、紧凑性和惯用性——我将在下面提到其中的一些方法,尽管最好的方法从根本上来说是不必要的。

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

1
2
result = np.ndarray(len(d))
result[:] = d  # same result as previous 3-lines w/ loop

但实际上,numpy\\的array()函数本质上可以从给定的列表中创建必要的numpy-native ndarray,所以完全不用ndarray(),你可以只使用array():

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

但进一步,numpy 的许多原生处理数组(和类似数组的列表)的函数已经包括在一个步骤中执行多个向量的平均值的事情(甚至循环都隐藏在里面非常高效的编译代码或 CPU 大容量向量操作)。例如,有一个 mean() 函数可以平均数字列表、数字的多维数组或对齐的向量集等等。

这允许更快、更清晰、单行的方法,可以将整个原始代码替换为以下内容:

1
2
3
4
# 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 参数,它会将所有插槽中的所有单个维度值平均在一起,形成一个最终的平均数。)

  • 你是对的,我误解了构造函数的使用。我确实知道 np.mean 但由于我不确定数据类型发生了什么,我尝试手动进行以减少未知数。

有关关于 python:Gensim word2vec 模型输出 1000 维 ndarray 但 ndarray 维度的最大数量为 32 – 如何?的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  3. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  4. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  5. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  6. ruby - 将 spawn() 的标准输出/标准错误重定向到 Ruby 中的字符串 - 2

    我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  9. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  10. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

随机推荐