1:首先是安装上的坑:

第一个就是faiss根本没有windows的版本,只支持mac和linux。

再然后,如果你要是用的contos6版本的虚拟机,那就要更新glibc这个库(不难,但很容易出问题),因为centos6的这个库最大支持版本是2.12,而faiss运行的时候需要2.14的版本支持。而centos7就没这问题了。这是虚拟机版本的选择。

后面就是安装,如果没有很好的linux下编译安装其他软件的经验,可以先安装一下anaconda然后用conda命令安装faiss。不过在安装anaconda时要注意,要安装anaconda3,2好像安装不上去。安装好anaconda3后要更新conda命令和mkl库,然后再安装faiss。这样基本就能安装了。

2:再就是使用的时候的坑:

faiss本来是开发给图像用的,所以它的输入被限定成了ndarray类型。而我们一般的推荐问题的输入是个dataframe。且推荐问题一般想返回的是最近邻的几个物品的id。这个时候我们首先把id列作为索引:

 df = df.set_index('id')

 而且我们每个id对应多个列,但是faiss中一个id对应一行数据,所以要对df中的数据进行合并(这里的数据是已经经过编码后的数据)。然后faiss中只有一部分索引类型支持自定义添加id,其他有很多都不支持,都是自动生成索引。如果你想返回值是你自定义的id,就要选择好index类型,不然就要做一个index到id的dict,在返回index后再查dict,取出id。

 dimensions = 75
INDEX_KEY = "IDMap,Flat"
findex = faiss.index_factory(dimensions, INDEX_KEY)

for i in index:
    a = []
    for j in col:
        a += result.loc[i,j]
    b = np.array(a)
    b = b.astype("float32")
    i = np.array([i])
    findex.add_with_ids(b.reshape(1,75),i)

 然后这其中还有坑,首先是输入的数据跟id要行数相等,然后所有数据只能是float32,不能是float64,不然会报错。

最后search的时候也要注意向量的shape,一定不能错(所有vector都默认是列向量,要转为行向量)。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐