首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Python中快速进行语料库搜索:近似最近邻算法

选自Medium

作者:Kevin Yang

机器之心编译

参与:路雪

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

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

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

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

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

制作一个索引

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

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

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

1. 首先需要找到嵌入的长度,它会被用来做实例化 Annoy 的索引。

2. 接下来实例化一个 Imdb 图,使用:「env = lmdb.open(fn_lmdb, map_size=int(1e9))」。

3. 确保我们在当前路径中没有 Annoy 索引或 lmdb 图。

4. 将嵌入文件中的每一个 key 和向量添加至 lmdb 图和 Annoy 索引。

5. 构建和保存 Annoy 索引。

我已经推断出 argparse,因此,我们可以利用命令行启用我们的脚本:

添加主函数以启用脚本,得到 make_annoy_index.py:

现在我们可以仅利用命令行启用新脚本,以生成 Annoy 索引和对应的 lmdb 图!

写向 量Utils

我们在 make_annoy_index.py 中推导出 Python 脚本 vector_utils。现在要写该脚本,Vector_utils 用于帮助读取.txt, .bin 和 .pkl 文件中的向量。

写该脚本与我们现在在做的不那么相关,因此我已经推导出整个脚本,如下:

测试 Annoy 索引和 lmdb 图

我们已经生成了 Annoy 索引和 lmdb 图,现在我们来写一个脚本使用它们进行推断。

将我们的文件命名为 annoy_inference.py,得到下列依赖项:

现在我们需要在 Annoy 索引和 lmdb 图中加载依赖项,我们将进行全局加载,以方便访问。注意,这里设置的 VEC_LENGTH 为 50。确保你的 VEC_LENGTH 与嵌入长度匹配,否则 Annoy 会不开心的哦~

有趣的部分在于「calculate」函数。

1. 从 lmdb 图中获取查询索引;

2. 用 get_item_vector(id) 获取 Annoy 对应的向量;

3. 用 a.get_nns_by_vector(v, num_results) 获取 Annoy 的最近邻。

再次,这里使用 argparse 来使读取命令行参数更加简单。

主函数从命令行中启用 annoy_inference.py。

现在我们可以使用 Annoy 索引和 lmdb 图,获取查询的最近邻!

代码

本教程所有代码的 GitHub 地址:https://github.com/kyang6/annoy_tutorial

原文地址:https://medium.com/@kevin_yang/simple-approximate-nearest-neighbors-in-python-with-annoy-and-lmdb-e8a701baf905

本文为机器之心编译,转载请联系本公众号获得授权。

✄------------------------------------------------

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180124B066CY00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券