1. 搜索去重算法设计背景
在搜索引擎和推荐系统的实际业务场景中,用户输入的搜索词往往存在大量语义重复的情况。比如"宾馆"、"酒店"、"旅馆"这三个词虽然字面不同,但实际指向相同的需求。传统的关键词匹配会将这些结果分别返回,导致搜索结果冗余、用户体验下降。
我在某电商平台的搜索业务中曾遇到一个典型案例:当用户搜索"苹果手机"时,系统会返回包含"iPhone"、"苹果手机"、"Apple手机"等多个相似结果的商品列表。这不仅浪费展示位资源,还会让用户产生"搜索结果不精准"的负面感受。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法整体架构设计
2.1 核心解决思路
我们的解决方案采用"离线计算+在线查询"的两阶段架构:
- 离线计算层:通过词向量相似度计算挖掘语义相似的keyword组
- 在线服务层:使用内存数据库存储同义词映射关系,实时过滤重复结果
这种架构设计主要基于以下考虑:
- 词向量计算耗时较长(万级keyword需要约5000万次cosine计算)
- 同义词关系相对稳定,不需要实时更新
- 在线服务需要毫秒级响应
2.2 技术选型说明
词向量模型:选用Sentence-BERT而非Word2Vec,因为:
- 能更好处理短语级语义(如"附近宾馆")
- 对未登录词有更好的泛化能力
- 实测在旅游领域词相似度任务上准确率提升23%
相似度计算:采用cosine相似度而非欧式距离,因为:
- 只关注向量方向而非大小
- 计算效率更高(可省略归一化步骤)
- 行业通用标准,便于结果对比
存储方案:选择Tair而非Redis,主要考虑:
- 阿里云生态下的专有优化
- 支持更大的value存储(单个value可达1MB)
- 自动冷热数据分层
3. 离线计算实现细节
3.1 词向量生成流程
python复制from sentence_transformers import SentenceTransformer
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
keywords = ["宾馆", "酒店", "旅馆"...] # 10000个关键词
embeddings = model.e
