首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Doc2Vec和PySpark: Gensim Doc2vec and

Doc2Vec和PySpark: Gensim Doc2vec and
EN

Stack Overflow用户
提问于 2016-02-25 00:40:27
回答 1查看 3.7K关注 0票数 11

我正在研究DeepDist (链接)模块,并考虑将其与GensimDoc2Vec API结合起来,以便在PySpark上训练段落向量。实际上,链接提供了以下简洁的示例,说明如何为GensimWord2Vec模型进行段落向量的训练:

代码语言:javascript
复制
from deepdist import DeepDist
from gensim.models.word2vec import Word2Vec
from pyspark import SparkContext

sc = SparkContext()
corpus = sc.textFile('enwiki').map(lambda s: s.split())

def gradient(model, sentences):  # executes on workers
    syn0, syn1 = model.syn0.copy(), model.syn1.copy()   # previous weights
    model.train(sentences)
    return {'syn0': model.syn0 - syn0, 'syn1': model.syn1 - syn1}

def descent(model, update):      # executes on master
    model.syn0 += update['syn0']
    model.syn1 += update['syn1']

with DeepDist(Word2Vec(corpus.collect()) as dd:
    dd.train(corpus, gradient, descent)
    print dd.model.most_similar(positive=['woman', 'king'], negative=['man']) 

据我所知,DeepDist正在将梯度下降的工作分批分发给工人,并对其进行重组并在主版进行更新。如果我将Word2Vec替换为Doc2Vec,那么应该使用单词向量来训练文档向量。

因此,我研究了gensim.models.doc2vec (链接)的源代码。Doc2Vec模型实例中有以下字段:

  1. model.syn0
  2. model.syn0_lockf
  3. model.docvecs.doctag_syn0
  4. model.docvecs.doctag_syn0_lockf

gensim.models.word2vec (链接)的源代码相比,Doc2Vec模型中缺少以下字段:

  1. model.syn1
  2. model.syn1neg

我认为我没有接触到lockf向量,因为当新的数据点出现时,它们似乎是在训练完成后使用的。因此,我的代码应该类似于

代码语言:javascript
复制
from deepdist import DeepDist
from gensim.models.doc2vec import Doc2Vec, LabeledSentence
from pyspark import SparkContext

sc = SparkContext()

# assume my dataset is in format 10-char-id followed by doc content
# 1 line per doc
corpus = sc.textFile('data_set').map(
    lambda s: LabeledSentence(words=s[10:].split(),labels=s[:10])
)

def gradient(model, sentence):  # executes on workers
    syn0, doctag_syn0 = model.syn0.copy(), model.docvecs.doctag_syn0.copy()   # previous weights
    model.train(sentence)
    return {'syn0': model.syn0 - syn0, 'doctag_syn0': model.docvecs.doctag_syn0 - doctag_syn0}

def descent(model, update):      # executes on master
    model.syn0 += update['syn0']
    model.docvecs.doctag_syn0 += update['doctag_syn0']

with DeepDist(Doc2Vec(corpus.collect()) as dd:
    dd.train(corpus, gradient, descent)
    print dd.model.most_similar(positive=['woman', 'king'], negative=['man']) 

我有遗漏什么重要的东西吗?例如:

  1. 我应该关心model.syn1吗?他们到底是什么意思?
  2. 我说的对吗,model.*_lockf是训练后锁定的矩阵?
  3. 假设每个文档都在一行中,前缀为0填充的10位数字id,我可以使用lambda s: LabeledSentence(words=s[10:].split(),labels=s[:10]来解析数据集吗?

任何建议/贡献都是非常感谢的。我将写一篇博客文章来总结结果,在这里提到贡献者,可能会帮助其他人在缩放的分布式系统上训练Doc2Vec模型,而不会花费大量的开发时间来解决我现在正在解决的问题。

谢谢

2018年6月13日更新

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

如果你现在坚持尝试我的想法,请记住你是在冒险。另外,如果有人知道DeepDist仍然有效,请在评论中报告。它能帮助其他读者。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-03 20:34:51

为了避免这个问题保持开放状态,下面是提问者是如何解决这种情况的:

我没能实现这一点,直到我认为它不起作用已经太晚了。DeepDist在后端使用Flask应用程序与Spark界面进行交互。因为它不再被维护,斯派克的更新很可能已经破坏了它。如果你想在星火中接受Doc2Vec培训,只需选择Deeplearning4J(displearning4j.org/doc2vec#)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35616088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档