相似性匹配算法

时间:2016-01-08 16:44:46

标签: sql algorithm performance categories

我的产品具有不同属性的不同细节,我需要开发一种算法来找到与我试图找到的最相似的算法。

例如,如果产品具有:

  • 重量:100磅
  • 颜色:黑色,棕色,白色
  • 身高:10英寸
  • 条件:新

其他人可以有不同的颜色,重量等。然后我需要先搜索最相似的返回。例如,如果一切都匹配但颜色只有黑色而不是棕色,那么它比另一种只有黑色但不是白色或棕色的产品更好。

我很乐意接受建议,因为项目刚刚开始。

例如,我可以做的一种方法是将每个属性(权重,颜色,大小)限制为一组有限的选项,因此我可以构建二进制表示。所以我对每种产品都有这样的东西:

Colors       Weight    Height    Condition
00011011000  10110110  10001100  01

然后,如果我在产品的二进制表示和搜索之间进行异或,我可以计算设置位的数量,看它们的相似程度(全零表示完全匹配)。

这种方法的问题在于我无法在数据库上对其进行索引,因此我需要阅读所有产品以进行比较。

有关我如何处理此事的任何建议?理想情况下,我希望能够在数据库上编制索引,以便查询速度快。

进一步的问题:如果我可以为每个属性使用不同的权重,那就太棒了。

3 个答案:

答案 0 :(得分:1)

您想要做的是elasticsearch和其他类似搜索导向数据库的完美用例。我认为你不需要使用bitmasks / etc。

您通常会在现有数据库中维护主数据(sql / cassandra / mongo / etc ......一切正常),并将需要搜索的内容复制到elasticsearch。

答案 1 :(得分:1)

您基本上需要提出距离度量来定义两个对象之间的距离。计算从有问题的物体到每个其他物体的距离,然后您可以按最小距离排序或只选择最佳距离。

如果没有基于完整数据集的高度专业化算法,您可以做的最好的是与其他项目进行线性时间距离比较。

您可以通过保持某些字段(如高度和重量)的排序列表来估算最近的值,并将距离设置为阈值(如宽相位碰撞检测),然后将全距离比较限制为仅限那些符合门槛的物品。

答案 2 :(得分:1)

你在说什么与BK树非常相似? BK树构造搜索树,其中一些度量与该树的键相关联。这种树的最常见用途是与Levenshtein或Damerau-Levenshtein距离进行字符串校正。这不是静态数据结构,因此它支持将来插入元素。 当您搜索精确元素(或插入元素)时,您需要查看此树的节点并转到权重等于此节点的键与元素之间的距离的链接。如果你想找到类似的对象,你需要同时去几个节点,这些节点支持你对距离约束的愿望。 (也许甚至可以使用A *快速找到一个最相似的对象)。

BK树的简单示例(来自第二个链接)

          BOOK
         /    \
        /(1)   \(4)
       /        \
    BOOKS      CAKE
      /       /    \
     /(2)    /(1)   \(2)
    /        |      |
  BOO      CAPE    CART

您的指标应该是汉明距离(两个对象的位表示之间的差异计数)。

BUT!比较两个整数作为其表示中不同位的计数是否很好?汉明距离HD(10000,00000)== HD(10000,10001)。即数字16和0之间的差异,以及16和17是相等的。这真的是你需要的吗?

BK-tree详细信息: https://hamberg.no/erlend/posts/2012-01-17-BK-trees.html https://nullwords.wordpress.com/2013/03/13/the-bk-tree-a-data-structure-for-spell-checking/