我是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]
当我尝试这段代码时,我可以得到一个单词“猫”的向量,而不是“猫类哺乳动物”的向量。 因为word2vec仅提供一个单词的向量,例如'cat'对吗? (如果我错了,请纠正我) 所以我搜索并找到了infer_vector()并尝试了下面的代码
phrase = phrase.lower().split(' ')
phrase_vec = m.infer_vector(phrase)
当我尝试这段代码时,我可以得到一个向量,但是每次尝试时我得到不同的值 短语vec = m.infer_vector(短语) 因为infer_vector具有“步骤”。
当我设置steps = 0时,我总是得到相同的向量。 短语vec = m.infer_vector(短语,步骤= 0)
但是,我还发现文档向量是通过对文档中的单词进行平均获得的。 例如,如果文档由“猫样哺乳动物”这三个词组成,则将“猫”,“喜欢”,“哺乳动物”三个向量相加,然后取平均值,这就是文档向量。 (如果我错了,请纠正我)
这是一些问题。
答案 0 :(得分:0)
使用0步表示完全不进行推断:向量停留在其随机初始化的位置。所以您绝对不想要那样。每次运行infer_vector()
时,相同文本的向量都会略有不同是正常的:算法使用的是随机性。重要的是,它们彼此相似,且容差很小。您更有可能使它们与更大 steps
值更相似(但仍不相同)。
您还可以在Doc2Vec
训练中或gensim FAQ的推论中看到有关此不确定性的条目。
将单词向量平均在一起以获得文档向量是一种有用的技术,对于许多用途而言,作为简单的基线可能会很好。但这与Doc2Vec.infer_vector()
所做的不一样-涉及迭代地调整候选向量,使其越来越好地预测文本的单词,就像Doc2Vec
训练一样。为了使您的文档向量与在模型训练期间创建的其他文档向量可比,您应该使用infer_vector()
。
model.docvecs
对象保存在模型训练期间学习的所有文档向量,用于查找(通过训练期间作为其名称给出的标签)或其他操作,例如查找most_similar()
N doc -在训练过程中学习到的目标标记/向量中的向量。