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

whs*_*s2k 5 nlp apache-spark word2vec pyspark doc2vec

我有一个pyspark数据框,其中包含大约300k个唯一行的语料库,每个行都有一个"doc",每个文档包含几个文本句子.

在处理之后,我有每行/ doc的200维矢量化表示.我的NLP流程:

  1. 用正则表达式udf删除标点符号
  2. 用nltk雪球udf词干
  3. Pyspark Tokenizer
  4. Word2Vec(ml.feature.Word2Vec,vectorSize = 200,windowSize = 5)

我理解这个实现如何使用skipgram模型根据使用的完整语料库为每个单词创建嵌入.我的问题是:这个实现如何从语料库中每个单词的向量转到每个文档/行的向量?

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

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

任何帮助或参考材料,超级赞赏!

goj*_*omo 5

从词向量到文本范围的单个向量的一种简单方法是将向量平均在一起。而且,这对于某些任务来说通常效果很好。

然而,这不是Doc2Vec班级的gensim做法。该类实现了“段落向量”技术,其中以类似于词向量的方式训练单独的文档向量。

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

由于您提到了多个库(Spark MLib 和 gensim),但您没有展示您的代码,因此不确定 现有的流程究竟做什么。

  • 我专门使用 pyspark.ml(特性和功能),假装它会比 gensim 更快。我在此处的另一个回复的 scala 源代码中找到了更多详细信息:https://github.com/apache/spark/blob/v2.2.0/mllib/src/main/scala/org/apache/spark/ml/feature/ Word2Vec.scala 看起来像是“将向量平均在一起”的方法。谢谢提供信息! (2认同)