基于Cosine Similarity的课程名称搜索异常:返回查询本身问题求助
问题解决方案
问题原因
- 你的课程名称列表
list_of_names中大概率存在与查询词aws完全一致的条目,余弦相似度计算结果自然为1.0,因此排在首位。 - 另外,
CountVectorizer默认仅按空格分词,若课程名称中的关键词是大写形式(如AWS),小写查询aws会被判定为不同词汇,导致匹配不到相关课程,反而让完全匹配的aws条目更突出。
修复步骤
1. 检查并清理数据集
先确认list_of_names中是否存在误加入的查询词条目,如有直接删除即可。
2. 优化文本向量化方式
用TfidfVectorizer替代CountVectorizer,它能更合理地评估词汇在文本中的重要性,比单纯词频计数更适合相似度匹配场景。同时添加参数强化匹配效果:
import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer # 替换为TF-IDF向量器 from sklearn.metrics.pairwise import cosine_similarity # 课程名称列表 documents = list_of_names # 初始化TF-IDF向量器,自动转小写、去除英文停用词 vectorizer = TfidfVectorizer(lowercase=True, stop_words='english') doc_vectors = vectorizer.fit_transform(documents) # 预存文档向量,避免重复计算 # 查询词 query = 'aws' query_vector = vectorizer.transform([query]) # 计算所有课程与查询的相似度 similarity_scores = cosine_similarity(query_vector, doc_vectors)[0] # 按相似度从高到低排序索引 sorted_indices = np.argsort(similarity_scores)[::-1] # 可选:过滤掉与查询词完全匹配的结果 filtered_indices = [idx for idx in sorted_indices if not (similarity_scores[idx] == 1.0 and documents[idx].lower() == query.lower())] # 取前10个结果,若无过滤结果则用原排序 top_10_indices = filtered_indices[:10] if filtered_indices else sorted_indices[:10] # 输出结果 for i, idx in enumerate(top_10_indices, 1): print(f'Rank: {i}') print(f'课程名称: {documents[idx]}') print(f'相似度得分: {similarity_scores[idx]:.4f}') print('---')
3. 可选调整
如果不需要排除完全匹配的课程,直接删除过滤逻辑即可。
内容的提问来源于stack exchange,提问作者Jerusha
相关产品推荐
相关产品推荐

