2016-12-06 7 views
4

spark mllibを使って単語ベクトルを生成しています。私はすべての自分のデータに合わせて訓練された単語ベクトルを取得し、それらをファイルにダンプします。word2vecベクトルをファイルにダンプする

は、私はこれをやっている:

I  0.03 0.53 0.12... 
love 0.31 0.14 0.12... 
Spark 0.41 0.18 0.84... 

後:私のトレーニングデータが

I love Spark 

のような文章があった場合

JavaRDD<List<String>> data = javaSparkContext.parallelize(streamingData, partitions); 
Word2Vec word2vec = new Word2Vec(); 
Word2VecModel model = word2vec.fit(data); 

だから、私のように、ファイルに出力を保存したいですトレーニング、私はこのようなモデルオブジェクトからベクトルを取得しています

Map<String, float[]> wordMap = JavaConverters.mapAsJavaMapConverter(model.getVectors()).asJava(); 
List<String> wordvectorlist = Lists.newArrayList(); 
for (String s : wordMap.keySet()) { 
    StringBuilder wordvector = new StringBuilder(s); 
    for (float f : wordMap.get(s)) { 
     wordvector.append(" " + f); 
    } 
    wordvectorlist.add(wordvector.toString()); 
    if (wordvectorlist.size() > 1000000) { 
     writeToFile(wordvectorlist); 
     wordvectorlist.clear(); 
    } 

} 

非常に巨大なデータ(〜1.5 TB)に対してこれらの単語ベクトルを生成するため、返されたオブジェクトWord2VecModelをドライバのメモリに保存できないことがあります。 ドライバのメモリに完全なマップを保存せずにファイルに書き込むことができるように、このワードベクトルマップをrddとしてどのように保存できますか?

私はdeeplearning4jのword2vecの実装を検討しましたが、その実装ではドライバのメモリにすべてのベクトルをロードする必要もあります。

+0

編集:私はこれをコメントにしました。スパムのために申し訳ありません。我々は次回のリリースでパラメータサーバベースの実装に取り​​組んでいます。私が言うことができるのは、deeplearning4jの実装を見守っていることだけです。 この新しいパラメータサーバーベースの実装は、ディープウォーク、グローブ、および段落ベクトルでも機能します。 あなたがこのパラメータサーバについて興味があるなら、ここではnd4jに基づいています:https://github.com/deeplearning4j/nd4j/tree/master/nd4j-parameter-server-parent あなたのユースケースについて詳しく教えてください。 –

+0

@AdamGibsonあなたの入力に感謝します。私は 'word2vec'ライブラリを使用しており、同様の問題を抱えています。私はロードするための膨大なファイル(約6GB)を持っており、 'メモリへの読み込み 'プロセスは非常に困難です。上記のあなたのコメントに基づいて、我々は今、サーバーベースの実装を持っているように見えます。あなたは同じもののドキュメンテーション/例を私に教えてください。 –

答えて

3

Word2VecModelは、それ自身の形式でディスクに保存するsave機能を持っています これは、データのパーケットファイルと人間が読めるメタデータを持つメタデータファイルを持つdataというディレクトリを作成します。

これで、寄木細工のファイルを読んで自分で変換したり、代わりにspark.read.parquetを使ってデータフレームに読み込むことができます。各行には地図の一部が含まれていて、あなたが望む方法で書くことができます。

関連する問題