2016-12-06 47 views
4

我正在使用spark mllib生成word矢量。我希望适合我所有的数据,然后获取训练好的单词矢量并将它们转储到一个文件中。将spark2 wordc矢量转储到文件

我这样做:

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

所以,如果我的训练数据有这样的句子

I love Spark 

我想将输出文件保存为:

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

后训练,我从模型对象中获取这样的向量,如下所示

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保存在我的驱动程序的内存中。 如何将此wordvector映射存储为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的目录,其中包含数据的parquet文件和具有人类可读元数据的元数据文件。

您现在可以读取实木复合地板文件并自行转换它,或者改为将spark.read.parquet读取到数据框中。每行将包含一些地图,你可以任何你想要的方式写它。