【问题标题】:How word2vec retrieves result from binary files?word2vec 如何从二进制文件中检索结果?
【发布时间】:2017-08-21 20:17:28
【问题描述】:
from gensim.models.keyedvectors import KeyedVectors
model = KeyedVectors.load_word2vec_format('google_news.bin', binary=True)
print(model['the']) # this prints the 300D vector for the word 'the'

代码将 google_news 二进制文件加载到模型中。 我的问题是,第 3 行如何计算二进制文件的输出(因为二进制文件包含 0 和 1)。

【问题讨论】:

  • “二进制”文件有点误导。计算机上的所有文件都以二进制形式存储。 binary=True这里指的是对文件进行序列化,这样电脑就可以直接加载文件,而不需要“解析”特定的格式。见泡菜文档;P

标签: neural-network nlp semantics text-mining word2vec


【解决方案1】:

我不确定这里的问题到底是什么,但我假设您问的是如何将二进制文件加载到您的 Python 应用程序中?例如,您可以使用 gensim,它具有内置工具来解码二进制文件:

from gensim.models.keyedvectors import KeyedVectors
model = KeyedVectors.load_word2vec_format('google_news.bin', binary=True)
print(model['the']) # this prints the 300D vector for the word 'the'

编辑

我觉得您的问题更多的是关于二进制文件?这似乎与 word2vec 无关。无论如何,在 word2vec 二进制文件中,每一行都是二进制格式的一对单词和权重。首先,通过循环字符将单词解码为字符串,直到它遇到“空格”的二进制字符。然后将其余部分从二进制解码为浮点数。我们知道浮点数,因为 word2vec 二进制文件有一个标题,例如“3000000 300”,它告诉我们有 3m 个单词,每个单词是一个 300D 向量。

二进制文件由一系列字节组成,每个字节为 8 位。在wiki page 上阅读有关二进制的更多信息。

十进制格式的数字0.0056,变成二进制:

00111011 10110111 10000000 00110100

所以这里有 4 个字节组成一个浮点数。我们怎么知道呢?因为我们假设二进制编码 32 位浮点数。

如果二进制文件表示 64 位精度浮点数怎么办?那么二进制的十进制0.0056就变成了:

00111111 01110110 11110000 00000110 10001101 10111000 10111010 11000111

是的,长度加倍,因为精度加倍。所以我们解码word2vec文件的时候,如果权重是300d,64位编码,那么每个数字应该有8个字节来表示。因此,词嵌入在文件的每一行中将有 300*64=19,200 个二进制数字。明白了吗?

您可以在 Google 上搜索“二进制数字的工作原理”,数以百万计的示例。

【讨论】:

  • 好的,正如您的代码所示,您正在将二进制文件加载到模型中。我的问题是,word2vec 模型(代码的第 3 行)如何从二进制文件中检索输出(打印语句的)。我认为,二进制文件仅由 0 和 1 组成
  • 没问题。如果您觉得这回答了问题,请将其标记为已回答。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多