基于Word2Vec的阿拉伯语书籍推荐系统报错排查与方案咨询
阿拉伯语书籍推荐系统KeyError问题及模型适配建议
一、KeyError报错解决方法
报错核心原因:输入的书名الخليفة未在数据集的Title列中匹配到,大概率是输入书名与数据集中的书名格式不一致(比如未做相同的阿拉伯语标准化、存在变音符号/标点差异)。
具体修复步骤:
统一文本预处理规则
将用于书籍描述的阿拉伯语预处理逻辑,同步应用到Title列,确保输入书名与数据中的标题格式一致:# 合并预处理步骤为一个函数 def preprocess_arabic_text(text): text = remove_diacritics(text) text = remove_punctuations(text) text = normalize_arabic(text) text = text.strip() # 去除首尾空格 return text # 对数据集的Title列做预处理,生成标准化后的标题列 df1['processed_title'] = df1['Title'].apply(preprocess_arabic_text)修改推荐函数的索引匹配逻辑
改用标准化后的标题创建索引,并对输入的书名先做预处理,同时增加容错判断:# 提前创建预处理后的标题与索引映射(只需执行一次) indices = pd.Series(df1.index, index=df1['processed_title']).drop_duplicates() # 修改推荐函数 def recommendations2(title): # 对输入书名做预处理 processed_input = preprocess_arabic_text(title) # 容错判断:如果书名不存在,直接提示 if processed_input not in indices: print(f"未找到书名:{title},请检查输入或数据集内容") return idx = indices[processed_input] sim_scores = list(enumerate(cosine_similaritiess[idx])) sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True) sim_scores = sim_scores[1:6] # 排除自身 book_indices = [i[0] for i in sim_scores] recommend = df1[['Title', 'Cover']].iloc[book_indices] for index, row in recommend.iterrows(): response = requests.get(row['Cover']) img = Image.open(BytesIO(response.content)) plt.figure() plt.imshow(img) plt.title(row['Title'])验证数据集内容
先确认数据集中是否真的包含目标书名,执行以下代码排查:# 模糊匹配检查数据集中的相关标题 print(df1[df1['processed_title'].str.contains('خليف', case=False)])
二、阿拉伯语模型适配建议
当前使用的google_model是英文预训练Word2Vec模型,阿拉伯语词汇基本不在其词表中,会导致大量词汇被忽略,生成的向量准确性极低,推荐效果无法保障。必须更换为阿拉伯语专属预训练模型:
推荐模型及优化方案:
- AraVec:专门针对阿拉伯语训练的Word2Vec模型,支持多种场景(如推特、新闻)的预训练版本,能准确捕捉阿拉伯语词汇语义。
- FastText阿拉伯语模型:支持未登录词(OOV),对阿拉伯语的形态变化(如词根、派生词)处理更友好。
- ArabERT/BERT Arabic:基于Transformer的预训练模型,通过句子嵌入替代平均Word2Vec向量,能生成更精准的语义表示,推荐效果更优。
模型替换示例(以AraVec为例):
# 加载阿拉伯语预训练Word2Vec模型(需提前下载) from gensim.models import Word2Vec arabic_w2v_model = Word2Vec.load("aravec_twitter_300d.model") # 修改vectors2函数中的模型引用 def vectors2(x): global word_embeddingss word_embeddingss = [] for line in df1['c']: avgword2vecc = None countt = 0 for word in line.split(): # 替换为阿拉伯语模型的词表检查 if word in arabic_w2v_model.wv.vocab: countt += 1 if avgword2vecc is None: avgword2vecc = arabic_w2v_model.wv[word] else: avgword2vecc = avgword2vecc + arabic_w2v_model.wv[word] if avgword2vecc is not None: avgword2vecc = avgword2vecc / countt word_embeddingss.append(avgword2vecc)
额外优化:
将向量生成和余弦相似度计算提前执行(只需一次),避免每次推荐重复计算,大幅提升效率:
# 提前生成向量和余弦相似度 vectors2(df1) cosine_similaritiess = cosine_similarity(word_embeddingss, word_embeddingss)
内容的提问来源于stack exchange,提问作者Nadeen
相关产品推荐
相关产品推荐

