https://radimrehurek.com/gensim/models/doc2vec.html
例如,如果我们训练了 doc2vec
“aaaaaaAAAAAAaaaaaa” - “标签 1”
“bbbbbbBBBBBbbbb” - “标签 2”
我们可以使用 Doc2vec 推断“aaaaAAAAAAaaaaAA”是标签 1 吗?
我知道 Doc2vec 可以训练词向量和标签向量。使用这个向量,我们可以推断出哪个标签中的看不见的句子(训练单词的组合)?
https://radimrehurek.com/gensim/models/doc2vec.html
例如,如果我们训练了 doc2vec
“aaaaaaAAAAAAaaaaaa” - “标签 1”
“bbbbbbBBBBBbbbb” - “标签 2”
我们可以使用 Doc2vec 推断“aaaaAAAAAAaaaaAA”是标签 1 吗?
我知道 Doc2vec 可以训练词向量和标签向量。使用这个向量,我们可以推断出哪个标签中的看不见的句子(训练单词的组合)?
这个问题的标题与其文本是一个单独的问题,所以我将分别回答这两个问题(假设一个导致另一个)。
# ... trained model stored in var model
list_of_words = ["this", "is", "a", "new","unseen", "sentence"]
inferred_embedding = model.infer_vector(list_of_words)
这是如何运作的 ?根据原始论文(https://cs.stanford.edu/~quocle/paragraph_vector.pdf),我们有两个随机初始化的权重矩阵 这是来自 Word2Vec 的相同矩阵,其中每一列或每一行都映射到一个词向量,并且 这是文档矩阵,其中每一列或每一行都映射到一个句子/文档。在训练固定窗口的softmax分类器期间 大小移动(以类似方式的移动窗口)最小化以下对数似然(多类交叉熵):
在哪里 对应于表示 句子, 它在该文档中的字数和 是个 中的词 文档。所有反向传播记住的是我们当前正在移动我们的窗口化 softmax 的文档,并且只更新矩阵中的那一行 连同那个窗口中的文字。
此外,当我们想推断不在训练集中的东西时,我们会修复 这样它就不会更新并增加矩阵 使用新的随机初始化行并只训练几次迭代(新行保存推断向量的嵌入)。这就引出了问题2。
简短的回答是否定的,这不是 Doc2Vec 的用途。由于随机初始化+收敛和训练的复杂性,您推断的向量将永远不会与其对应的向量完全相同(即,如果它已包含在训练集中)。这就是为什么 Gensim 没有内置函数来支持这一点的原因。但是,鉴于模型已经训练有素,这两个向量应该任意接近,因此您可以得出结论它们非常相似。
即使修复随机种子也可能不起作用;还有很多其他变量会影响其收敛性,请参阅https://github.com/RaRe-Technologies/gensim/issues/374上的第一个答案。
在任何情况下,您都可以通过迭代训练集并将相似度与推断向量进行比较,在数据集中找到与推断句子最相似的标签。但是你为什么要对训练集中的某些东西进行精确匹配呢?这就是正则表达式的用途。这些文档嵌入的目的是用于有监督或无监督的学习任务(即分类和聚类)。
我今天试图解决这个问题,但找不到任何由 gensim.Doc2Vec 给出的模块,这些模块计算了不在训练模型中的推断文档向量与训练模型中的文档向量之间的相似性。所以基本上我是这样做的。
from scipy import spatial
inferred_vector=model.infer_vector(sentence.split())
for labels in labelled_documents:
print (1- spatial.distance.cosine(inferred_vector,model.docvecs[labels]))
基于 Gensim Doc2Vec教程,你可以做这样的事情。
inferred_vector = model_dmm.infer_vector(sentence.split())
sims = model.docvecs.most_similar([inferred_vector], topn=len(model.docvecs))
这将为您提供包含所有标签的元组列表以及与属于每个标签的新文档相关联的概率。那么你可以简单地将最大值作为你的标签。