2017-03-28 81 views
0
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)。word2vec如何从二进制文件中检索结果?

+0

请参阅'pickle':https://docs.python.org/3/library/pickle.html – alvas

+0

“二进制”文件有点误导。计算机上的所有文件都以二进制形式存储。 'binary = True'是指文件的序列化,以便计算机可以直接加载文件而不需要“解析”特定的格式。请参阅pickle文档; P – alvas

回答

0

我不确定问题到底是什么,但我假设你问如何将二进制文件加载到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”,因此我们知道浮点数,它告诉我们有3个词,每个词是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个二进制数字。得到它?

你可以谷歌“如何二进制数字”工作,数以百万计的例子。

+0

好的,如您的代码所示,您正在将二进制文件加载到模型中。我的问题是,word2vec模型(代码的第3行)如何从二进制文件中检索(print语句的)输出。我认为,二进制文件是由0和1组成的 – user7342148

+0

我更新了答案,希望帮助 – vega

+0

谢谢你的回答@vega – user7342148