我正在尝试使用LSH构建类似的产品,我有以下查询。
我的数据有以下架构
id: long,
title: string,
description: string,
category: string,
price: double,
inventory_count: int,
active: boolean,
date_added: datetime
我应该单独对各个功能执行LSH然后以某种方式组合它们,可能是加权平均值吗?
或
我是否应该在所有功能上一起构建LSH(基本上在创建像title_iphone,title_nexus,price_1200.25,active_1 ......这样的带状疱疹时附加功能名称)然后使用词袋方法执行LSH在这个包上?
如果有人可以指导我查看如何在电子商务等结构化数据上执行LSH的文档,那将非常棒。
P.S。我打算在LSH中使用spark和min-hash函数。如果您需要更多详细信息,请与我们联系。
答案 0 :(得分:1)
我会采用你的第一种方法,但是连接我们从每个单独的LSH哈希获得的二进制代码,而不是平均它们。
例如,假设您使用4位来表示散列(对于每个要素族):
data_0:
hash(id) 0101
hash(title) 1001
hash(date_added) 0001
hash(data_0) = 0101,1001,0001
weighted_average = (5+9+1)/3 = 15/3 = 5
现在假设你有data_1
的另一个哈希:
hash(data_1) = 111100000000
weighted_average = (15+0+0)/3= 15/3 = 5
在检索过程中,可以首先计算查询数据的哈希值来执行相似性搜索:例如,
hash(data_x) = 010010000011
weighted_average = (4+8+3)/3 = 15/3 = 5
假设您发现data_1
和data_0
是仅与data_x
一起散列到同一个数据桶的两个数据,那么您只需要计算汉明距离(这可以计算出来
data_1
和data_x
- >汉明距离= 6,相似度= 6/12 data_0
和data_x
- >汉明距离= 3,相似度= 9/12 因此,在此示例中,data_0
是与查询最相似的数据。
注意如果您对它们进行平均,您将丢失在单个二进制代码中编码的相似性信息。请参阅上面的示例,您将获得data_1
和data_0
的相同编码,即5或1001.但是,如果您查看每个单独的功能,显然data_1
与data_x
比data_0
。
另请注意如果您觉得某些功能系列更重要,因此值得更多重量,您可以为该功能系列使用更多位。