Doc2Vec:从ConcatenatedDocvecs推断最相似的向量

时间:2019-01-14 17:15:23

标签: python gensim word2vec doc2vec

我正在按照here

提供的指南生成Pandas DataFrame的Doc2Vec嵌入
public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('username')->unique();
        $table->string('password');
        $table->string('img');
        $table->string('fnamelname');
        $table->string('role');
        $table->rememberToken();
        $table->timestamps();
    });
}

/**

给出一个文档向量V,如果我尝试从ConcatenatedDocvecs模型中推断出与该文档向量V最相似的文档,则会出现以下错误:

from gensim.models import Doc2Vec
from gensim.models.doc2vec import TaggedDocument
from gensim.test.test_doc2vec import ConcatenatedDoc2Vec
import gensim.models.doc2vec
from collections import OrderedDict
import pandas as pd
import numpy as np

cube_embedded =  # pandas cube
# convert the cube to documents
alldocs = [TaggedDocument(doc, [i]) for i, doc in enumerate(cube_embedded.values.tolist())]

# train models
simple_models = [
    # PV-DBOW plain
    Doc2Vec(dm=0, vector_size=100, negative=5, hs=0, min_count=2, sample=0, epochs=20, workers=cores),
    # PV-DM w/ default averaging; a higher starting alpha may improve CBOW/PV-DM modes
    Doc2Vec(dm=1, vector_size=100, window=10, negative=5, hs=0, min_count=2, sample=0, epochs=20, workers=cores, alpha=0.05, comment='alpha=0.05'),
    # PV-DM w/ concatenation - big, slow, experimental mode window=5 (both sides) approximates paper's apparent 10-word total window size
    Doc2Vec(dm=1, dm_concat=1, vector_size=100, window=5, negative=5, hs=0, min_count=2, sample=0, epochs=20, workers=cores),
]

for d2v_model in simple_models:
    d2v_model.build_vocab(alldocs)
    d2v_model.train(alldocs, total_examples=d2v_model.corpus_count, epochs=d2v_model.epochs)

models_by_name = OrderedDict((str(d2v_model), d2v_model) for d2v_model in simple_models)
models_by_name['dbow+dmm'] = ConcatenatedDoc2Vec([simple_models[0], simple_models[1]])
models_by_name['dbow+dmc'] = ConcatenatedDoc2Vec([simple_models[0], simple_models[2]])

当然,我不能使用简单的模型来推断相似的文档,因为生成的向量嵌入的大小为100(而不是串联向量的大小为200)。

如何从ConcatenatedDocvecs模型中获取与文档向量最相似的文档列表?

1 个答案:

答案 0 :(得分:1)

ConcatenatedDocvecs是一个简单的实用程序包装器类,使您可以在多个基础的Doc2Vec模型中访问标签向量的串联。它的存在使复制原始“ ParagraphVector”论文中的某些分析变得更加容易。

它不能重现Doc2Vec模型(或一组键控向量)的所有功能,因此不能直接用您要执行的most_similar()来帮助您。

您可以改为在每个组成模型中执行最相似的操作,然后组合两个相似性度量(每个邻居)(例如通过对它们进行平均)来为组合模型获得可用的相似性值(和然后重新排序)。我怀疑但不确定,这两个100d模型的值的行为非常像串联200d模型的真实余弦相似性。

或者,您可以使用gensim中的各种ConcatenatedDoc2Vec类,而不是使用KeyedVectors包装类(仅在请求时创建并返回串联的200d向量),然后使用(或改编)一个将用来自两个组成模型的所有串联的200d向量填充。然后,它的most_similar()将起作用。