2017-03-28 15 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アプリケーションにバイナリをロードする方法を求めていると仮定しますか?私はあなたの質問は、一般的には、バイナリファイルの詳細であると感じ

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' 

EDIT

:あなたはバイナリをデコードするために組み込まれているツール例えばgensimを使用することができますか?これは特にword2vecには関係していないようです。とにかく、word2vecバイナリファイルでは、各行はバイナリ形式の単語と重みのペアです。最初に、単語は "space"のバイナリ文字を満たすまで文字をループして文字列にデコードされます。その後、残りはバイナリからフロートにデコードされます。 word2vecバイナリファイルには3000000 300などのヘッダがあるので、3mの単語があり、各単語は300Dのベクトルであるため、浮動小数点の数がわかります。

バイナリファイルは、各8ビットの一連のバイトとして編成されます。 wiki pageのバイナリについて詳しくは、こちらをご覧ください。

数10進数で0.0056は、バイナリになった:

00111011 10110111 10000000 00110100 

は、だからここにフロートを構成する4つのバイトがあります。これをどうやって知るのですか?バイナリは32ビット浮動小数点を符号化すると仮定しているからです。

バイナリファイルが64ビット精度浮動小数点を表す場合はどうなりますか?次にバイナリの小数点以下0.0056は次のようになります。

00111111 01110110 11110000 00000110 10001101 10111000 10111010 11000111 

はい、2倍の精度です。したがって、word2vecファイルをデコードするとき、ウェイトが300dで64ビットエンコーディングの場合、各数字を表す8バイトが必要です。したがって、単語の埋め込みには、ファイルの各行に300 * 64 = 19,200の2進数が入ります。それを得る?

Googleの「バイナリ数字の仕組み」は、数百万の例があります。

+0

大丈夫です。コードに示されているように、バイナリファイルをモデルにロードしています。私の質問は、word2vecモデル(コードの3行目)がバイナリファイルから(print文の)出力をどのように取得するかです。私は、バイナリファイルは0と1のみで構成されていると思います。 – user7342148

+0

私は答えを更新しました。 – vega

+0

あなたの答えに感謝します。 – user7342148

関連する問題