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

使用Gensim Doc2Vec处理多语言文档时相似度异常问题排查

问题

我正在构建基于文档向量表示相似度的书籍内容推荐系统,文档为书籍描述,多数是英文,也包含其他语言。使用Gensim的Doc2Vec生成文档向量后发现,按模型原理不同语言文档因词汇无重叠相似度应极低,但实际数据集中日语与意大利语文档的相似度最高可达0.9,请问这是什么原因?

可能的原因
  • 非英文文本预处理失效:你使用的simple_preprocess函数默认仅保留拉丁字符,会直接过滤日语假名、汉字等非拉丁文字,导致非英文文档被处理为空列表或仅残留少量无效符号。这类无有效词汇的文档,其向量会趋向于模型初始化的均值,自然会和其他语言的无效文档向量高度相似。
  • 模型参数与数据适配性差:vector_size=50维度偏小,可能无法承载足够的语言区分特征;min_count=2会过滤掉低频次词汇,如果某些语言的词汇出现次数普遍低于2,对应的文档就没有有效词汇用于训练,向量无法得到有效更新;epochs=40的训练轮次可能不足,模型还没学到足够的区分性特征。
  • 无效文档占比高:数据集中可能存在大量空描述、重复描述或无意义的书籍描述,这类文档的向量会同质化,直接拉高跨语言的相似度数值。
解决建议
  • 替换预处理方式:针对不同语言使用对应的分词工具,比如日语用MeCab,意大利语用spaCy的意大利语模型,避免非英文文本被无差别过滤。先打印几个非英文文档的simple_preprocess结果,确认是否存在被过滤的情况。
  • 调整模型参数:尝试增大vector_size至100-300,降低min_count至1(如果低频次词汇是目标语言的有效词汇),增加epochs至80-100,给模型更多学习区分特征的机会。
  • 清理无效数据:检查数据集,过滤掉空描述、无意义描述的文档,避免这类数据干扰模型训练。
  • 加入语言标识辅助训练:可以在每个文档的标签中加入语言类型,或者按语言分别训练子模型,让模型明确学习不同语言的特征差异。
相关代码
import pandas as pd
from pathlib import Path
from gensim.models.doc2vec import TaggedDocument, Doc2Vec
from gensim.utils import simple_preprocess
import numpy as np
from tqdm import tqdm
from sklearn.metrics.pairwise import cosine_similarity
data_folder = Path.cwd().parent / 'data'
transformed_folder = data_folder / 'transformed'
BOOKS_PATH = Path(transformed_folder, "books_final.csv")
import seaborn as sns

book_df = pd.read_csv(BOOKS_PATH)
languages=book_df.language.unique()

training_corpus = np.empty(len(book_df), dtype=object)
for i, (isbn, desc) in tqdm(enumerate(zip(book_df['isbn'], book_df['description']))):
    training_corpus[i] = TaggedDocument(simple_preprocess(desc), [str(i)])
model=Doc2Vec(vector_size=50, min_count=2, epochs=40)
model.build_vocab(training_corpus)
#train the model
model.train(training_corpus, total_examples=model.corpus_count, epochs=model.epochs)
#get the keys of the trained model
model_keys=list(model.dv.key_to_index.keys())
matrix = model.dv.vectors
similarity_matrix = cosine_similarity(matrix)

indices_for_language = {}
for language, group_df in book_df.groupby('language'):
    indices_for_language[language] = group_df.index.to_list()

sim_japanese_italian = similarity_matrix[indices_for_language['Japanese']][:, indices_for_language['Italian']]
#make a heatmap
sns.heatmap(sim_japanese_italian)
相似度热力图

日语与意大利语文档相似度热力图

内容的提问来源于stack exchange,提问作者ksiar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:05:12