【问题标题】:Doc2vec - About getting document vectorDoc2vec - 关于获取文档向量
【发布时间】:2019-01-19 21:04:12
【问题描述】:

我是 doc2vec 的新手,对文档向量有一些疑问。 我想要得到的是一个短语向量,比如“像猫一样的哺乳动物”。 所以,到目前为止我尝试的是使用 doc2vec 预训练模型,我尝试了下面的代码

import gensim.models as g
model = "path/pre-trained doc2vec model.bin"
m = g. Doc2vec.load(model)
oneword = 'cat'
phrase = 'cat like mammal'
oneword_vec = m[oneword]
phrase_vec = m[phrase_vec]

当我尝试这段代码时,我可以得到一个单词“cat”的向量,但不能得到“cat-like哺乳动物”的向量。 因为 word2vec 只为像“猫”这样的一个词提供向量,对吧? (如果我错了,请纠正我) 所以我搜索并找到了 infer_vector() 并尝试了下面的代码

phrase = phrase.lower().split(' ')
phrase_vec = m.infer_vector(phrase)

当我尝试这段代码时,我可以得到一个向量,但每次我尝试时都会得到不同的值 短语向量 = m.infer_vector(短语) 因为 infer_vector 有“步骤”。

当我设置 steps=0 时,我总是得到相同的向量。 phrase_vec = m.infer_vector(phrase, steps=0)

但是,我还发现文档向量是通过平均文档中的单词获得的。 like 如果文档是由‘cat-like哺乳动物’三个词组成,将‘cat’、‘like’、‘mammal’三个向量相加,然后取平均值,就是文档向量。 (如果我错了,请纠正我)

所以这里有一些问题。

  1. 使用 infer_vector() 0 步获取短语向量是否正确?
  2. 如果是词的正确平均向量得到文档向量,是否不需要使用infer_vector()?
  3. model.docvecs 有什么用?

【问题讨论】:

    标签: word-embedding doc2vec


    【解决方案1】:

    使用 0 步意味着根本不会发生推理:向量停留在其随机初始化的位置。所以你绝对不想要那个。每次运行infer_vector() 时,相同文本的向量略有不同是正常的:算法使用随机性。重要的是它们彼此相似,在很小的公差范围内。您更有可能通过 更大 steps 值使它们更相似(但仍不相同)。

    您还可以在Doc2Vec 训练或推理中看到有关这种不确定性的条目gensim FAQ

    将词向量平均在一起以获得 doc-vector 是一种有用的技术,它可以作为许多用途的简单基线。但这与Doc2Vec.infer_vector() 所做的不同——它涉及迭代调整候选向量以更好地预测文本的单词,就像Doc2Vec 训练一样。为了使您的 doc-vector 与模型训练期间创建的其他 doc-vector 具有可比性,您应该使用 infer_vector()

    model.docvecs 对象包含在模型训练期间学习的所有 doc-vectors,用于查找(通过在训练期间作为名称给出的标签)或其他操作,例如将 most_similar()N doc-vectors 查找到在训练期间学习的目标标签/向量。

    【讨论】:

    • 感谢您的友好解释。这很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多