基于内容的推荐系统出现KeyError错误,求技术解决方案
基于内容的推荐系统KeyError问题排查
问题描述
本人是机器学习新手,正在搭建基于内容的推荐系统模型,已完成TfidfVectorizer、余弦相似度等模块开发,但调用推荐函数时出现KeyError错误,无法定位原因,恳请协助排查代码问题。
报错信息
KeyError Traceback (most recent call last) <ipython-input-34-f89afa6121c5> in <module> ----> 1 jobs_recommendations(jobs_recomend.Kemampuan['Golang, Backend Development, SQL Server, MySQL']) 2 frames /usr/local/lib/python3.7/dist-packages/pandas/core/indexes/range.py in get_loc(self, key, method, tolerance) 386 except ValueError as err: 387 raise KeyError(key) from err --> 388 raise KeyError(key) 389 return super().get_loc(key, method=method, tolerance=tolerance) 390 KeyError: 'Golang, Backend Development, SQL Server, MySQL'
核心代码片段
1. 数据集处理
jobs_recomend = jobs_new jobs_recomend.sample(5)
2. TfidfVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer # 初始化TfidfVectorizer tf = TfidfVectorizer() # 对技能数据计算idf tf.fit(jobs_recomend['skill']) # 查看特征名称映射 tf.get_feature_names()
3. TF-IDF矩阵
tfidf_matrix = tf.fit_transform(jobs_recomend['skill']) tfidf_matrix.shape
4. 余弦相似度
from sklearn.metrics.pairwise import cosine_similarity cosine_sim = cosine_similarity(tfidf_matrix) cosine_sim
5. 推荐函数
def jobs_recommendations(skill, similarity_data=cosine_sim_df, items=jobs_recomend[['skill','type of work']], k=10): index = similarity_data.loc[skill].to_numpy().argpartition( range(similarity_data)) closest = similarity_data.columns[index[-1:-(k+2):-1]] closest = closest.drop(skill, errors='ignore') return pd.DataFrame(closest).merge(items).head(k) jobs_recommendations(jobs_recomend.skill['Golang, Backend Development, SQL Server, MySQL'])
问题根源及修复方案
1. 索引取值逻辑错误
调用函数时使用jobs_recomend.skill['Golang, Backend Development, SQL Server, MySQL'],试图用技能字符串作为行索引取值,但jobs_recomend的行索引是默认整数序列,并非技能字符串,因此找不到对应行,触发KeyError。
2. 余弦相似度矩阵未正确转换为带索引的DataFrame
代码中仅计算了numpy数组格式的cosine_sim,但推荐函数依赖similarity_data.loc[skill]通过技能字符串索引取值,需要将矩阵转换为以skill列为索引和列名的DataFrame,且原代码未定义cosine_sim_df变量。
3. 重复调用fit导致逻辑冗余
tf.fit(jobs_recomend['skill'])之后又调用tf.fit_transform(jobs_recomend['skill']),重复fit会覆盖之前的idf计算,属于冗余操作。
修正后的完整代码
数据处理与相似度计算
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity import pandas as pd # 数据集处理 jobs_recomend = jobs_new # TfidfVectorizer:仅调用一次fit_transform完成拟合与转换 tf = TfidfVectorizer() tfidf_matrix = tf.fit_transform(jobs_recomend['skill']) # 将余弦相似度矩阵转换为带技能索引的DataFrame cosine_sim = cosine_similarity(tfidf_matrix) cosine_sim_df = pd.DataFrame( cosine_sim, index=jobs_recomend['skill'], columns=jobs_recomend['skill'] )
推荐函数与调用
def jobs_recommendations(skill, similarity_data=cosine_sim_df, items=jobs_recomend[['skill','type of work']], k=10): # 提前检查技能是否存在,避免KeyError if skill not in similarity_data.index: print(f"技能 {skill} 不存在于数据集中") return pd.DataFrame() # 获取相似度排序后的索引 index = similarity_data.loc[skill].to_numpy().argpartition( range(-k-1, len(similarity_data)) ) # 提取最相似的k个技能(排除自身) closest = similarity_data.columns[index[-1:-(k+2):-1]] closest = closest.drop(skill, errors='ignore') # 合并返回结果 return pd.DataFrame(closest, columns=['skill']).merge(items, on='skill').head(k) # 直接传入技能字符串调用函数 jobs_recommendations('Golang, Backend Development, SQL Server, MySQL')
内容的提问来源于stack exchange,提问作者Arin
相关产品推荐
相关产品推荐

