没有合适的资源?快使用搜索试试~ 我知道了~
首页Python利用Faiss库实现ANN近邻搜索的方法详解
资源详情
资源评论
资源推荐

Python利用利用Faiss库实现库实现ANN近邻搜索的方法详解近邻搜索的方法详解
主要介绍了Python利用Faiss库实现ANN近邻搜索的方法,文中通过示例代码介绍的非常详细,对大家的学习或
者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
Embedding的近邻搜索是当前图推荐系统非常重要的一种召回方式,通过item2vec、矩阵分解、双塔DNN等方式都能够产出
训练好的user embedding、item embedding,对于embedding的使用非常的灵活:
输入user embedding,近邻搜索item embedding,可以给user推荐感兴趣的items
输入user embedding,近邻搜搜user embedding,可以给user推荐感兴趣的user
输入item embedding,近邻搜索item embedding,可以给item推荐相关的items
然而有一个工程问题,一旦user embedding、item embedding数据量达到一定的程度,对他们的近邻搜索将会变得非常慢,
如果离线阶段提前搜索好在高速缓存比如redis存储好结果当然没问题,但是这种方式很不实时,如果能在线阶段上线几十MS
的搜索当然效果最好。
Faiss是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜
索,是目前最为成熟的近似近邻搜索库。
接下来通过jupyter notebook的代码,给大家演示下使用faiss的简单流程,内容包括:
读取训练好的Embedding数据
构建faiss索引,将待搜索的Embedding添加进去
取得目标Embedding,实现搜索得到ID列表
根据ID获取电影标题,返回结果
对于已经训练好的Embedding怎样实现高速近邻搜索是一个工程问题,facebook的faiss库可以构建多种embedding索引实现
目标embedding的高速近邻搜索,能够满足在线使用的需要
安装命令:安装命令:
conda install -c pytorch faiss-cpu
提前总结下提前总结下faiss使用经验:使用经验:
1. 为了支持自己的ID,可以用faiss.IndexIDMap包裹faiss.IndexFlatL2即可
2. embedding数据都需要转换成np.float32,包括索引中的embedding以及待搜索的embedding
3. ids需要转换成int64类型
1. 准备数据准备数据
import pandas as pd
import numpy as np
df = pd.read_csv("./datas/movielens_sparkals_item_embedding.csv")
df.head()
id features
0 10 [0.25866490602493286, 0.3560594320297241, 0.15…
1 20 [0.12449632585048676, -0.29282501339912415, -0…
2 30 [0.9557555317878723, 0.6764761805534363, 0.114…
3 40 [0.3184879720211029, 0.6365472078323364, 0.596…
4 50 [0.45523127913475037, 0.34402626752853394, -0….
构建ids
ids = df["id"].values.astype(np.int64)
type(ids), ids.shape
(numpy.ndarray, (3706,))
ids.dtype
dtype('int64')
ids_size = ids.shape[0]
ids_size
3706
构建datas
import json
import numpy as np














安全验证
文档复制为VIP权益,开通VIP直接复制

评论0