如何在 Python 中从头开始构建矢量搜索

了解如何使用 Python 从头开始构建具有嵌入、相似度评分和基本检索逻辑的矢量搜索引擎。

来源:KDnuggets

简介

您可能在搜索栏中输入了一个问题,并得到了与您的单词匹配的结果,但完全错过了您的意思。或者看到推荐引擎显示出一些奇怪的相关内容,即使你从未直接搜索过它。 “找到准确的单词”和“理解某人的实际意思”之间的差距是搜索功能有用的地方。

矢量搜索通过将文本表示为高维空间中的点来缩小这一差距,其中几何接近度编码语义相似性。两个句子可以共享零个单词,但最终仍然是邻居,因为模型了解到它们的含义很接近。

本文仅使用 NumPy 在 Python 中从头开始构建矢量搜索引擎,因此您可以准确地看到每一步发生的情况:如何存储和规范化嵌入、为什么余弦相似性会减少为点积,以及当您将其投影到二维时,结果搜索空间实际上是什么样子。

您可以在 GitHub 上获取代码。

什么是矢量搜索?

传统的关键字搜索会寻找精确的单词匹配。向量搜索的工作方式有所不同:它将文档和查询转换为称为嵌入的数值向量,然后查找高维空间中彼此最接近的向量。

关键的见解是向量空间中的接近意味着语义相似性。两个表示相同意思的句子——即使它们没有共享单词——也会有彼此接近的嵌入。

用于测量“接近度”的距离度量是驱动整个系统的因素。最常见的是余弦相似度,它测量两个向量之间的角度而不是它们的绝对距离。这使得它具有比例不变性——当您关心方向或含义而不是大小或字数时非常有用。

设置数据集

输出:

嵌入形状:(15, 8)

每行都是一个产品。每列都是其嵌入的一个维度。产品名称不会被搜索引擎使用;只有嵌入很重要。