Apache spark Doc2Vec和PySpark:Gensim Doc2Vec在DeepDist上

Apache spark Doc2Vec和PySpark:Gensim Doc2Vec在DeepDist上,apache-spark,pyspark,gensim,word2vec,Apache Spark,Pyspark,Gensim,Word2vec,我正在查看DeepDist()模块,并考虑将其与Gensim的Doc2VecAPI相结合,以便在PySpark上训练段落向量。该链接实际上提供了以下清晰示例,说明如何为Gensim的Word2Vec型号执行此操作: 从deepdist导入deepdist 从gensim.models.word2vec导入word2vec 从pyspark导入SparkContext sc=SparkContext() corpus=sc.textFile('enwiki').map(lambda s:s.spl

我正在查看
DeepDist
()模块,并考虑将其与
Gensim
Doc2Vec
API相结合,以便在
PySpark
上训练段落向量。该链接实际上提供了以下清晰示例,说明如何为Gensim的
Word2Vec
型号执行此操作:

从deepdist导入deepdist
从gensim.models.word2vec导入word2vec
从pyspark导入SparkContext
sc=SparkContext()
corpus=sc.textFile('enwiki').map(lambda s:s.split())
def梯度(模型,句子):#在工人身上执行
syn0,syn1=model.syn0.copy(),model.syn1.copy()#以前的权重
模型训练(句子)
返回{'syn0':model.syn0-syn0,'syn1':model.syn1-syn1}
def下降(模型,更新):#在主控计算机上执行
model.syn0+=更新['syn0']
model.syn1+=更新['syn1']
使用DeepDist(Word2Vec(corpus.collect())作为dd:
dd.列车(主体、坡度、下降)
打印dd.model.most_相似(正片=['woman','king'],负片=['man'])
据我所知,
DeepDist
正在将梯度下降的工作分批分发到工作人员中,并在master上进行重组和更新。如果我将
Word2Vec
替换为
Doc2Vec
,则应该存在正在使用word向量进行训练的文档向量

因此,我查看了
gensim.models.doc2vec
()的源代码。在
doc2vec
模型实例中有以下字段:

  • model.syn0
  • model.syn0\u锁
  • model.docvecs.doctag\u syn0
  • model.docvecs.doctag\u syn0\u lock
  • gensim.models.word2vec
    ()的源代码相比,
    Doc2Vec
    模型中缺少以下字段:

  • model.syn1
  • model.syn1neg
  • 我想我不会触摸
    向量,因为它们似乎是在训练完成后,当新的数据点出现时使用的。因此我的代码应该是

    从deepdist导入deepdist
    从gensim.models.doc2vec导入doc2vec,LabeledSentence
    从pyspark导入SparkContext
    sc=SparkContext()
    #假设我的数据集格式为10字符id,后跟文档内容
    #每个文件1行
    语料库=sc.textFile('data_set').map(
    lambda s:LabeledSentence(words=s[10:].split(),labels=s[:10])
    )
    def梯度(模型,句子):#在工人身上执行
    syn0,doctag_syn0=model.syn0.copy(),model.docvecs.doctag_syn0.copy()#以前的权重
    火车模型(句子)
    返回{'syn0':model.syn0-syn0,'doctag_syn0':model.docvecs.doctag_syn0-doctag_syn0}
    def下降(模型,更新):#在主控计算机上执行
    model.syn0+=更新['syn0']
    model.docvecs.doctag\u syn0+=更新['doctag\u syn0']
    以DeepDist(Doc2Vec(corpus.collect())作为dd:
    dd.列车(主体、坡度、下降)
    打印dd.model.most_相似(正片=['woman','king'],负片=['man'])
    
    我是否遗漏了任何重要信息?例如:

  • 我应该关心model.syn1吗?它们到底是什么意思
  • 我说的
    model..\u lock f
    是训练后锁定的矩阵吗
  • 假设每个文档都在一行中,并以一个0填充的10位id作为前缀,我可以使用
    lambda s:LabeledSentence(words=s[10:]split(),labels=s[:10]
    来解析我的数据集吗
  • 非常感谢您的任何建议/贡献。我将写一篇博文总结结果,在这里提及贡献者,有可能帮助其他人在可扩展的分布式系统上培训Doc2Vec模型,而无需花费大量开发时间来解决我现在正在解决的问题

    谢谢


    更新日期:2018年6月13日

    很抱歉,我没有实现这一点。但是现在有更好的选择,而且
    DeepDist
    已经有一段时间没有维护了。请阅读下面的评论


    如果你现在坚持尝试我的想法,请注意你是在冒险。另外,如果有人知道
    DeepDist
    仍然有效,请在评论中回复。这将有助于其他读者。

    为了避免这个问题继续显示为开放的,提问者是如何解决这个问题的:

    我没有实现这一点,直到太迟了,我才认为它不会起作用。DeepDist在后端使用Flask应用程序与Spark web界面交互。由于它不再维护,Spark的更新很可能已经破坏了它。如果您正在Spark中寻找Doc2Vec培训,只需使用Deeplearning4J(Deeplearning4J.org/Doc2Vec#)


    那篇博文是你写的吗?:)我真的很期待你的发现。你实现了这个吗?我也有兴趣在pyspark中培训doc2vec。对于阅读本文的人来说:我没有实现这个,直到太迟了,我才认为它不会起作用。DeepDist在后端使用Flask应用程序与Spark web界面交互。因为它没有维护任何此外,Spark的更新很可能已经破坏了它。如果您正在Spark中寻找Doc2Vec培训,只需使用Deeplearning4J()