Python中怎么利用Faiss库实现向量近邻搜索,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
1、读取预训练好的Embedding数据
import pandas as pdimport numpy as npdf = pd.read_csv("./datas/movielens_sparkals_item_embedding.csv")# 提取要使用的电影ID列表,注意要转换成int64ids = df["id"].values.astype(np.int64)# 记录ID列表的大小ids_size = ids.shape[0]# 读取内容embedding数据,转换成二维arrayimport jsonimport numpy as npdatas = []for x in df["features"]: datas.append(json.loads(x))# 变成二维arraydatas = np.array(datas).astype(np.float32)# 记录数据维度dimension = datas.shape[1]
2、使用faiss建立索引
import faissindex = faiss.IndexFlatL2(dimension)index2 = faiss.IndexIDMap(index)index2.add_with_ids(datas, ids)
3、实现近邻搜索
# 读取user embedding数据df_user = pd.read_csv("./datas/user_embedding.csv")df_user.head()# 挑选一条user的embedding,转换成1行N列的二维arrayuser_embedding = np.array(json.loads(df_user[df_user["id"] == 10]["features"].iloc[0]))user_embedding = np.expand_dims(user_embedding, axis=0).astype(np.float32)user_embedding# 实现搜索,这里的I就是近邻ID列表tok = 30D, I = index.search(user_embedding, topk) # actual search
4、拼接得到内容列表
# 把搜索出来的ID变成Seriestarget_ids = pd.Series(I[0], name="MovieID")# 读取电影数据df_movie = pd.read_csv("./datas/ml-1m/movies.dat", sep="::", header=None, engine="python", names = "MovieID::Title::Genres".split("::"))# 实现内容JOINdf_result = pd.merge(target_ids, df_movie)
看完上述内容,你们掌握Python中怎么利用Faiss库实现向量近邻搜索的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/czant/blog/4471032