Pyspark如何从word2vec单词嵌入中计算Doc2Vec?

时间:2018-01-02 16:20:46

标签: apache-spark nlp pyspark word2vec doc2vec

我有一个pyspark数据框,其中包含大约300k个唯一行的语料库,每个行都有一个" doc"每篇文章中都包含几句文字。

处理完毕后,我有每行/ doc的200维矢量化表示。我的NLP流程:

  1. 使用regex udf
  2. 删除标点符号
  3. 使用nltk snowball udf进行词干“
  4. Pyspark Tokenizer
  5. Word2Vec(ml.feature.Word2Vec,vectorSize = 200,windowSize = 5)
  6. 我理解这个实现如何使用skipgram模型根据使用的完整语料库为每个单词创建嵌入。我的问题是:这个实现如何从语料库中每个单词的向量转到每个文档/行的向量?

    它是否与gensim doc2vec实现中的过程相同,它只是简单地将每个文档中的单词向量连接在一起?:How does gensim calculate doc2vec paragraph vectors。如果是这样,它如何将向量切割到指定大小200(它只使用前200个单词?平均值?)?

    我无法从源代码中找到信息:https://spark.apache.org/docs/2.2.0/api/python/_modules/pyspark/ml/feature.html#Word2Vec

    非常感谢任何帮助或参考资料!

2 个答案:

答案 0 :(得分:5)

从文字向量到文本范围的单个向量的一种简单方法是将向量平均在一起。并且,对于某些任务而言,这通常足够好。

但是,Doc2Vec中的gensim类不是这样做的。该类实现'Paragraph Vectors' technique,其中以类似于字向量的方式训练单独的文档向量。

doc-vectors参与训练有点像浮动合成词,涉及每个滑动窗口/目标词预测。它们不是组合或连接 - 来自先前存在的字向量,但在某些模式下,它们可以同时与字向量一起训练。 (然而,在gensim中使用参数dm=0启用的快速且通常表现最佳的PV-DBOW模式根本不训练或使用输入字向量。它只训练doc-vectors适用于预测每个文本示例中的单词。)

由于您已经提到过多个库(Spark MLib和gensim),但您没有显示您的代码,因此无法确定您的 现有流程正在进行中。

答案 1 :(得分:0)

在Pyspark中,ml.feature.Word2Vec用于通过计算word2vecs的平均值以及每个文档中术语频率(TF)的权重来获取被调用的doc2vec。 您可以在https://spark.apache.org/docs/2.2.0/api/python/_modules/pyspark/ml/feature.html#Word2Vec

中研究官方示例的结果