如何在大数据中进行模糊搜索

Posted

技术标签:

【中文标题】如何在大数据中进行模糊搜索【英文标题】:how to do fuzzy search in big data 【发布时间】:2012-11-10 23:05:40 【问题描述】:

我是该领域的新手,我主要想知道最先进的技术是什么以及我可以在哪里阅读有关它的信息。

假设我只有一个键/值存储,并且以某种方式定义了一些距离(key1,key2)(不确定它是否必须是一个度量,即三角不等式是否必须始终保持)。

我想要的主要是一个 search(key) 函数,它返回所有带有键的项目到搜索键一定距离。也许距离限制是可配置的。也许这也只是一个惰性迭代器。也许也可以有一个计数限制,并且一个项目(键,值)在返回的集合中具有一定的概率 P,其中 P = 1/距离(键,搜索键)左右(即,完美匹配肯定是在集合和接近匹配中至少有很高的概率)。


一个示例应用程序是MusicBrainz 中的指纹匹配。他们使用AcoustId 指纹并定义了this compare function。他们使用 PostgreSQL GIN 索引,我猜(虽然我还没有完全理解/阅读 acoustid-server 代码)GIN Partial Match Algorithm,但我还没有完全理解这是否是我所要求的以及它是如何工作的。


对于文本,我目前发现的是使用一些phonetic algorithm 来根据单词的发音来简化单词。一个例子是here。这主要是将搜索空间分解为更小的空间。但是,这有几个限制,例如在更小的空间里它仍然是一个完美的匹配。

但无论如何,我也在寻找更通用的解决方案,如果存在的话。

【问题讨论】:

不是一个完整的答案,但请查看 VP-trees(en.wikipedia.org/wiki/Vp-tree 和 stevehanov.ca/blog/index.php?id=130)。它们允许在度量空间中进行快速查询。 【参考方案1】:

没有(快速)通用解决方案,每个应用程序都需要不同的方法。

这两个示例实际上都没有进行传统的最近邻搜索。 AcoustID(我是作者)只是在寻找精确匹配,但它会搜索大量哈希值,希望其中一些匹配。拼音搜索示例使用变音位将单词转换为其拼音表示,并且只查找完全匹配。

您会发现,如果您有大量数据,则使用巨大的哈希表进行精确搜索是您唯一可以实际做的事情。那么问题就变成了如何将模糊匹配转换为精确搜索。

一种常见的方法是将locality-sensitive hashing (LSH) 与智能哈希方法一起使用,但正如您在两个示例中所见,有时您可以使用更简单的方法。

顺便说一句,您正在寻找专门的文本搜索,最简单的方法是将您的输入拆分为N-grams 并将其编入索引。根据您的距离函数的定义方式,这可能会为您提供正确的候选匹配,而无需太多工作。

【讨论】:

非常感谢!我没想到会在这里得到你的答复。 :) 这就是我喜欢互联网的原因。 -- 您能否推荐任何有关这方面的文献(一般大数据中的模糊搜索,一些概述)以及最近的研究结果? 另外,还有一个问题:您在 AcoustId 中搜索多少散列变体?只是汉明距离为 1 左右的所有哈希? 抱歉,我不知道任何有关这方面的文献。通常,您只需要获取有关特定域的信息。关于 AcoustID,它不搜索散列变化,但指纹是散列向量,因此搜索向量中的所有项目,其中一个可能会完全匹配。【参考方案2】:

我建议你看看 FLANN Fast Approximate Nearest Neighbors。大数据中的模糊搜索也称为近似最近邻。

该库为您提供不同的度量,例如 Euclidian、Hamming 和不同的聚类方法:例如 LSH 或 k-means。

搜索始终分为两个阶段。首先,您向系统提供数据以训练算法,这可能会很耗时,具体取决于您的数据。 我在不到一分钟的时间内成功地聚集了 1300 万个数据(使用 LSH)。

然后是搜索阶段,非常快。您可以指定最大距离和/或最大邻居数。

正如 Lukas 所说,没有好的通用解决方案,每个域都会有自己的技巧来提高速度或找到更好的方法来利用您使用的数据的内部属性。

Shazam 使用一种特殊的几何投影技术来快速找到您的歌曲。在计算机视觉中我们经常使用 BOW:Bag of words,最初出现在文本检索中。

如果您可以将数据视为图形,则还有其他方法可以使用谱图理论进行近似匹配。

让我们知道。

【讨论】:

另外,非常感谢您的参考!对你同样的问题:你能推荐任何关于这个领域的最新文献吗? 当然这取决于您的数据。是图像处理还是音频处理? 我对通用解决方案感兴趣,主要是它背后的理论。或者一些至少涵盖大多数情况的文献。此外,FLANN 看起来很一般。我想你可以将它用于图像或音频,不是吗? dl.acm.org/… NV-trees 例如。 Flann 可以用于两者都是。但距离可能不合适。在图像处理中,根据您的描述符,您可能想要使用 Hamming 和 Lsh 而不是 kmeans 和欧几里得距离。您应该探索每个概念,其中很少有通用资源。【参考方案3】:

取决于您的键/值是什么样的,Levenshtein 算法(也称为 Edit-Distance)可以提供帮助。它计算修改一个字符串以获得另一个字符串所需的最少编辑操作数。

http://en.wikipedia.org/wiki/Levenshtein_distance http://www.levenshtein.net/

【讨论】:

以上是关于如何在大数据中进行模糊搜索的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Redis 中进行模糊搜索

如何在PHP的二维数组中进行模糊搜索?

如何使用 Lodash java-script 库进行模糊搜索?

如何在 PDO 中使用绑定参数进行模糊搜索?

搜索框实现模糊查询方法 - js

如何进行模糊查找文件