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

基于内容的推荐系统出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:25:27