如何从Gensim的ConcatenatedDoc2Vec获取联合模型的文档标签?
解决ConcatenatedDoc2Vec获取联合文档向量的问题
嘿,我之前复现Mikolov的PV-DM+PV-DBOW组合模型时,也碰到过一模一样的问题!ConcatenatedDoc2Vec确实有点“偷懒”——它本身并不存储拼接后的文档向量,只是把两个独立的Doc2Vec模型包装起来,方便后续对新文档做向量推断。不过要拿到训练好的文档的联合向量,咱们完全可以手动搞定:
方法一:按索引拼接(适合用数字索引的文档)
如果你的训练语料是按顺序给文档分配数字索引的(比如tags=[i]),直接遍历索引,把两个模型对应位置的向量拼接就行:
import numpy as np from gensim.models import ConcatenatedDoc2Vec # 假设你已经训练好两个基础模型:pv_dm_model 和 pv_dbow_model concatenated_model = ConcatenatedDoc2Vec([pv_dm_model, pv_dbow_model]) # 生成拼接后的文档向量列表 concatenated_doc_vecs = [] for doc_idx in range(len(pv_dm_model.docvecs)): # 从两个模型分别获取对应文档的向量 vec_dm = pv_dm_model.docvecs.vectors_docs[doc_idx] vec_dbow = pv_dbow_model.docvecs.vectors_docs[doc_idx] # 拼接向量 combined_vec = np.concatenate([vec_dm, vec_dbow]) concatenated_doc_vecs.append(combined_vec)
⚠️ 注意:一定要保证两个模型是用完全相同的训练语料训练的,文档的索引顺序必须一一对应,不然拼接出来的向量就完全不对了!
方法二:按文档标签拼接(适合自定义标签的文档)
如果你的文档用的是自定义标签(比如tags=['doc_001', 'doc_002']),可以遍历标签集合来拼接:
concatenated_doc_vecs = {} # 遍历其中一个模型的所有文档标签 for doc_tag in pv_dm_model.docvecs.doctags.keys(): vec_dm = pv_dm_model.docvecs[doc_tag] vec_dbow = pv_dbow_model.docvecs[doc_tag] combined_vec = np.concatenate([vec_dm, vec_dbow]) concatenated_doc_vecs[doc_tag] = combined_vec
这样得到的字典会把每个文档标签和对应的联合向量关联起来,后续做t-SNE的时候直接提取值列表就行。
其实ConcatenatedDoc2Vec的核心作用是简化新文档的向量推断——调用它的infer_vector方法时,会自动调用两个基础模型的infer_vector,再把结果拼接返回。但对于训练阶段已有的文档向量,它确实没有做额外存储,所以手动拼接是最直接有效的方案。
内容的提问来源于stack exchange,提问作者Carlos Martin del Campo
相关产品推荐
相关产品推荐

