我正在按照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模型中获取与文档向量最相似的文档列表?
答案 0 :(得分:1)
ConcatenatedDocvecs
是一个简单的实用程序包装器类,使您可以在多个基础的Doc2Vec
模型中访问标签向量的串联。它的存在使复制原始“ ParagraphVector”论文中的某些分析变得更加容易。
它不能重现Doc2Vec
模型(或一组键控向量)的所有功能,因此不能直接用您要执行的most_similar()
来帮助您。
您可以改为在每个组成模型中执行最相似的操作,然后组合两个相似性度量(每个邻居)(例如通过对它们进行平均)来为组合模型获得可用的相似性值(和然后重新排序)。我怀疑但不确定,这两个100d模型的值的行为非常像串联200d模型的真实余弦相似性。
或者,您可以使用gensim中的各种ConcatenatedDoc2Vec
类,而不是使用KeyedVectors
包装类(仅在请求时创建并返回串联的200d向量),然后使用(或改编)一个将用来自两个组成模型的所有串联的200d向量填充。然后,它的most_similar()
将起作用。