如何使用infer_vector批量生成多文档向量?Doc2Vec模型问题求助
如何批量使用Doc2Vec的infer_vector生成文档向量并转为(5,50)的DataFrame?
我已经训练好一个Doc2Vec模型,现在需要用
infer_vector为5个文档生成向量,但infer_vector仅支持单次处理一个文档。请问如何批量传入这5个文档,将结果拼接为形状(5,50)的DataFrame?我编写了如下代码,但循环无法正常运行:
def InferVector(prop,log,New_std_nested_list): Vec_df = np.array([]) fname = (prop.get("Filepaths","Model_Saving_Path")+'model_July12_doc2vec_ELA.bin') model = Doc2Vec.load(fname) for i in range( 0, len(New_std_nested_list) ): temp = New_std_nested_list[i] vec = model.infer_vector([temp]) Vec_df = np.append(Vec_df,vec) return Vec_df是否有其他解决方法?
让我来帮你排查问题并给出修正方案:
你的代码存在两个核心问题
np.append会破坏数组形状:每次调用np.append(Vec_df, vec)都会把新向量扁平化后追加到一维数组里,最终你得到的是长度为5*50=250的一维数组,而非期望的(5,50)二维数组。infer_vector的参数格式错误:如果New_std_nested_list里的每个temp已经是分词后的文档列表(比如["hello", "world", "doc2vec"]),那么model.infer_vector([temp])相当于把整个列表当成了一个单独的"词",这会导致生成的向量完全不符合预期——你应该直接传入temp本身。
修正后的代码
我们改用列表来收集每个文档的向量,最后统一转换为二维数组再生成DataFrame,这样既高效又能保证形状正确:
import numpy as np import pandas as pd from gensim.models.doc2vec import Doc2Vec def InferVector(prop, log, New_std_nested_list): # 只加载一次模型,避免重复IO操作 model_path = prop.get("Filepaths", "Model_Saving_Path") + "model_July12_doc2vec_ELA.bin" model = Doc2Vec.load(model_path) # 用列表批量收集向量 document_vectors = [] for doc_tokens in New_std_nested_list: # 关键:doc_tokens必须是分词后的词列表,比如["this", "is", "my", "document"] vec = model.infer_vector(doc_tokens) document_vectors.append(vec) # 转换为(5,50)的二维数组,再转为DataFrame vec_array = np.array(document_vectors) vec_df = pd.DataFrame(vec_array) return vec_df
额外说明
- 如果你的
New_std_nested_list里存储的是原始字符串文档而非分词列表,需要先对每个文档做分词处理,比如:# 示例:简单分词(实际场景建议用专业分词工具,比如jieba、nltk等) for raw_doc in New_std_nested_list: doc_tokens = raw_doc.split() # 按空格拆分,根据你的需求调整 vec = model.infer_vector(doc_tokens) document_vectors.append(vec) - 建议给
infer_vector加上epochs参数(比如model.infer_vector(doc_tokens, epochs=20)),默认的epochs可能较少,生成的向量稳定性不足。
内容的提问来源于stack exchange,提问作者Jennifer Therese
相关产品推荐
相关产品推荐

