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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:47:52