annoy 是 高维空间求近似最近邻的框架,速率快,轻便实用。
GitHub地址:https://github.com/spotify/annoy
配合腾讯词向量,可以快速查找语义接近的向量:
tencent_annoy_index = AnnoyIndex(self.size,metric='angular') #存储
tencent_annoy_index.add_item(index, query_vector) #添加向量
tencent_annoy_index.get_nns_by_vector(query_sentence, 10) #查找前n个最近的向量
直接安装: pip install annoy
API:
AnnoyIndex(f, metric)
f 向量维度,metric 距离度量方式,取值 “angular”, “euclidean”, “manhattan”, “hamming”, or “dot”. 计算angular是使用的sqrt(2(1-cos(u,v)))这个公式,用的欧几里得距离。euc = sqrt(2(1-cos))。
a.add_item(i, v)
添加元素 i 和向量 v
a.build(n_trees, n_jobs=-1)
n_trees是森林的树数目,值越大结果越精确,n_jobs 进程数,默认-1使用所有的CPU。build调用之后,就不能再添加元素了。
a.save(fn, prefault=False)
保存到本地
a.load(fn, prefault=False)
从本地读取,prefault是预先读入内存,默认为False.
a.unload()
清除加载内容
a.get_nns_by_item(i, n, search_k=-1, include_distances=False)
返回n个最近元素。在查询过程中,它将检查search_k个节点,如果没有提供,默认为n_trees * n。search_k给了一个速度和准确率的折中。include_distances设为True,会提供一个由两个列表组成的二元组,第二个列表包含所有相关的距离。
a.get_nns_by_vector(v, n, search_k=-1, include_distances=False)
结果一样,不过是通过向量v来查询。
a.get_item_vector(i)
返回索引i对应的向量
a.get_distance(i, j)
返回元素i和j的距离,squared distance
a.get_n_items()
返回元素数量
a.get_n_trees()
返回树数目
a.on_disk_build(fn)
指定在除了RAM之外的其他文件上构建索引(在添加元素之前执行)
a.set_seed(seed)
在构建树之前可以指定随机数,这里面主要有两个参数需要调,n_trees和search_k,一个是构建时的参数,一个是搜索时的参数。
参考:annoy解读