You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:15:04