路径搜索算法 python实现_教程 | 如何在Python中快速进行语料库搜索:近似最近邻算法...

本文介绍了如何使用Python的Annoy库进行近似最近邻搜索,特别是在大规模语料库中查找词嵌入的相似性。通过创建Annoy索引和使用余弦距离来提高搜索效率,该方法适用于任何类型的数据嵌入,如词嵌入、音乐推荐或图像搜索。文章提供了一个创建Annoy索引和进行推断的Python脚本,并展示了如何使用命令行工具进行查询。
摘要由CSDN通过智能技术生成

原标题:教程 | 如何在Python中快速进行语料库搜索:近似最近邻算法

选自Medium

作者:Kevin Yang

参与:路雪

最近,我一直在研究在 GloVe 词嵌入中做加减法。例如,我们可以把「king」的词嵌入向量减去「man」的词嵌入向量,随后加入「woman」的词嵌入得到一个结果向量。随后,如果我们有这些词嵌入对应的语料库,那么我们可以通过搜索找到最相似的嵌入并检索相应的词。如果我们做了这样的查询,我们会得到:

King + (Woman - Man) = Queen

我们有很多方法来搜索语料库中词嵌入对作为最近邻查询方式。绝对可以确保找到最优向量的方式是遍历你的语料库,比较每个对与查询需求的相似程度——这当然是耗费时间且不推荐的。一个更好的技术是使用向量化余弦距离方式,如下所示:

vectors = np.array(embeddingmodel.embeddings)

ranks = np.dot(query,vectors.T)/np.sqrt(np.sum(vectors**2,1))

mostSimilar = []

[mostSimilar.append(idx) for idx in ranks.argsort()[::-1]]

想要了解余弦距离,可以看看这篇文章:http://masongallo.github.io/machine/learning,/python/2016/07/29/cosine-similarity.html

矢量化的余弦距离比迭代法快得多,但速度可能太慢。是近似最近邻搜索算法该出现时候了:它可以快速返回近似结果。很多时候你并不需要准确的最佳结果,例如:「Queen」这个单词的同义词是什么?在这种情况下,你只需要快速得到足够好的结果,你需要使用近似最近邻搜索算法。

在本文中,我们将会介绍一个简单的 Python 脚本来快速找到近似最近邻。我们会使用的 Python 库是 Annoy 和 Imdb。对于我的语料库,我会使用词嵌入对,但该说明实际上适用于任何类型的嵌入:如音乐推荐引擎需要用到的歌曲嵌入,甚至以图搜图中的图片嵌入。

制作一个索引

让我们创建一个名为:「make_annoy_index」的 Python 脚本。首先我们需要加入用得到的依赖项:

'''

Usage: python2 make_annoy_index.py

--embeddings=

--num_trees=

--verbose

Generate an Annoy index and lmdb map given an embedding file

Embedding file can be

1. A .bin file that is compatible with word2vec binary formats.

There are pre-trained vectors to download at https://code.google.com/p/word2vec/

2. A .gz file with the GloVe format (item then a list of floats in plaintext)

3. A plain text file with the same format as above

'''

import annoy

import lmdb

import os

import sys

import argparse

from vector_utils import get_vectors

最后一行里非常重要的是「vector_utils」。稍后我们会写「vector_utils」,所以不必担心。

接下来,让我们丰富这个脚本:加入「creat_index」函数。这里我们将生成 lmdb 图和 Annoy 索引。</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值