将 spark word2vec 向量转储到文件中

Dumping spark word2vec vectors to a file

我正在使用 spark mllib 生成词向量。我希望拟合我所有的数据,然后得到训练好的词向量并将它们转储到一个文件中。

我正在这样做:

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 保存在我的驱动程序的内存中。 我如何将这个 wordvectors 映射存储为 rdd,以便我可以写入文件而不将完整映射存储在驱动程序内存中?

我查看了 deeplearning4j 的 word2vec 实现,但该实现还需要将所有向量加载到驱动程序内存中。

Word2VecModel 有一个 save 函数,可以将其以自己的格式保存到磁盘 这将创建一个名为 data 的目录,其中包含数据的 parquet 文件和一个包含人类可读元数据的元数据文件。

您现在可以读取 parquet 文件并自行转换,或者 spark.read.parquet 将其读取到数据帧。每行将包含一些地图,您可以按照自己的意愿编写它。