Giter VIP home page Giter VIP logo

faisssearcher's Introduction

FaissSearcher

A common faiss searcher based on pandas dataFrame

基于pandas DataFrame 检索的Faiss封装,pandas尽量使用1.3.5,如不能保证精确版本,也要保证在1.0以上。

  • 新特性:可以纯embedding检索,并且支持附加一个候选检索list,检索时会将其一并带出。

特点

简单易上手,只要是能encode成向量的都可以,不局限于文本、图像、搜广推等场景。

  • 安装:pip install faiss_searcher
  • 前提:事先装好faiss,由于faiss的特殊性,自动安装容易出错,需要手动安装faiss,安装faiss一般pip install faiss-cpu或者conda install faiss-cpu -c pytorch,进入python后import faiss成功代表faiss安装成功

需要准备

  • 1.encoder,一般来说是自己定义的,里面必须有encode方法,代表将文本或者图片encode成向量,用来检索,建议直接继承BaseEncoder,如果原始数据本来就是向量,而不是图片、文本这种需要encode的数据集,也很好办,将encode方法中输入向量原封不动的输出即可。可以参考自带的bert_encoder,用起来很方便,事先需要下载tf版本的bert预训练权重。
  • 2.vecs_whitening,一种处理向量空间坍缩的有效方法,非必须,如果需要,可见本项目vecs_whitening.py代码,用法和sklearn的pca一致。可以将训练好的vecs_whitening模型地址输入bert_encoder中,也可以自己用本代码训练模型保存,再传入bert_encoder中。
  • 3.items。必须是pandas DataFrame格式,要求只需要第一列为目标item列,其余列随意,检索时会自动带入到结果中。
  • 4.index_param,faiss的构建参数,代表构建什么类型的索引,这个需要你对Faiss的传参模式了解下,可以看下我写的这片文章的第3节:https://zhuanlan.zhihu.com/p/357414033
  • 5.measurement,度量方法,最常用的是cos余弦相似度,l2欧氏距离,还支持1范数、无穷范数、p范数等等
  • 6.is_nrom,是否需要对象量归一化,根据自己的度量方法或者工程场景来使用,cos默认为True。

FaissSearcher使用分为两种情况:

1.需要将物料encode成向量的情况:

encoder = BertEncoder(config_path, checkpoint_path, dict_path)  # 预训练权重自己得准备好,也可以是自己写的encoder,必须有encode或者predict方法,基本只要通过keras/tf2实现的模型都可以,作用是将物料encode成向量。
items = pd.read_csv(item_path)  # 候选物料集合csv文件,需要自备,需要df第一列是候选物料,其他列会在检索时自动带出。
index_param = 'HNSW64'
measurement = 'cos'

# 接下来就开始
searcher = FaissSearcher(encoder, items, index_param, measurement)
# 构建index
searcher.train()
# 开始搜索,以文本为例
target = ['你好我叫小鲨鱼', '很高兴认识你', '有一种踏实,是你心中有我名字~']
df_res = searcher.search(targettopK=10)  # df_res即为结果

2.只提供embedding的情况:

index_param = 'HNSW64'
measurement = 'cos'
searcher = FaissSearcher(
  items=you_vecs_array(...),  # 物料向量,事先embedding好
  item_list=you_items_array(...),  # 物料向量所对应的物料候选list(顺序需和向量一致)。此项可不输入,如果不输入则检索时输出为embedding所对应的index
  index_param=index_param, 
  measurement=measurement
)

searcher.train()
# 开始检索
target = you_target_array(...)
df_res = searcher.search(targettopK=10)  # df_res即为结果

支持保存index,方便下次加载

searcher.save_index('demo.index')
searcher.load_index('demo.index')

faisssearcher's People

Contributors

mechsihao avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

faisssearcher's Issues

怎么添加新数据呢?

刚刚开始用faiss, 你的这个wrapper 挺好用的

items = pd.read_csv(item_path)

弱弱的咨询一下如果我的csv文件有新的数据
能不能有种方法 addToIndex()
而不用重新reindex 所以数据呢

谢谢

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.