我正在使用 spark mllib 生成词 vector 。我希望拟合我所有的数据,然后获取经过训练的词 vector 并将它们转储到一个文件中。
我正在这样做:
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...
训练后,我像这样从模型对象中获取 vector
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)生成这些词 vector ,因此,我可能无法将返回的对象 Word2VecModel 保存在我的驱动程序的内存中。 我如何将这个词 vector 映射存储为 rdd,以便我可以写入文件而不将完整映射存储在驱动程序内存中?
我研究了 deeplearning4j 的 word2vec 实现,但该实现还需要将所有 vector 加载到驱动程序内存中。
最佳答案
Word2VecModel 有一个 save以自己的格式将其保存到磁盘的功能 这将创建一个名为 data 的目录,其中包含数据的 parquet 文件和一个包含人类可读元数据的元数据文件。
您现在可以读取 parquet 文件并自行转换,或者执行 spark.read.parquet 将其读取到数据帧。每行将包含一些 map ,您可以按照自己的意愿编写。
关于java - 将 spark word2vec vector 转储到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40991973/