2017-03-28 90 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