如何从DataFrame中获取Word2Vec输出结果对应的图书索引及关联信息
解决方法
Word2Vec的训练对象是词汇,输出的most_similar结果是词汇级别的相似度结果,本身不会携带你DataFrame里的图书关联信息,所以你需要手动建立词汇和对应图书的映射关系,再关联查询即可。
步骤1:提前构建词汇到图书信息的映射
这里以匹配书名中的词汇为例,你也可以根据需求改成匹配Description字段的词汇:
import pandas as pd from gensim.models import Word2Vec # 你的原有训练逻辑 df = pd.read_csv("books.csv") sentences = [i.split(" ") for i in df['Description']] model = Word2Vec(sentences, min_count=1, workers=4, epochs=5, window=20) # 构建词汇到图书信息的映射字典,统一转小写匹配,避免大小写问题 word_book_map = {} for _, row in df.iterrows(): # 拆分书名字符串为单个词汇 name_words = [w.lower() for w in row["Book_Name"].split()] for word in name_words: # 一个词对应多本图书的话,这里默认存第一个匹配到的,可根据需求调整 if word not in word_book_map: word_book_map[word] = (row["Book_id"], row["Book_Name"])
步骤2:关联相似度结果输出目标格式
# 拿到相似度查询结果 similar_res = model.wv.most_similar("scanner", topn=10) # 关联映射表生成最终结果 final_output = [] for keyword, score in similar_res: if keyword in word_book_map: book_id, book_name = word_book_map[keyword] final_output.append( (book_id, book_name, keyword, score) ) print(final_output)
运行后输出的final_output就是你要求的格式。
补充说明
你之前用model.wv.index_to_key不符合预期的原因是,这个属性返回的是Word2Vec训练生成的全量词汇表,只存了词汇本身,没有和你的图书业务数据做绑定,自然拿不到对应的图书ID、书名等信息。
如果你实际需求是做「图书到图书的推荐」,更合理的方案是先把每本图书的所有描述词汇的向量取平均值,生成单本图书的全局向量,再计算图书之间的相似度,避免词汇匹配可能带来的误差,示例代码如下:
from sklearn.metrics.pairwise import cosine_similarity # 生成单本图书的向量:所有描述词汇向量取平均 def cal_book_vec(desc): words = desc.split() valid_vecs = [model.wv[w] for w in words if w in model.wv] return sum(valid_vecs)/len(valid_vecs) if valid_vecs else None df["book_vec"] = df["Description"].apply(cal_book_vec) # 示例:查询和《A Scanner Darkly》相似的Top10图书 target_vec = df[df["Book_id"] == 10201]["book_vec"].iloc[0] df["similar_score"] = df["book_vec"].apply(lambda x: cosine_similarity([x], [target_vec])[0][0] if x is not None else 0) # 排除自身后取相似度前10 top10_books = df[df["Book_id"] != 10201].sort_values("similar_score", ascending=False).head(10) # 转成目标格式 book_rec_res = list(top10_books.apply(lambda row: (row["Book_id"], row["Book_Name"], row["similar_score"]), axis=1))
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

