我有用户对多项选择问题的回复,例如: (大约):
Married/Single
Male/Female
American/Latin American/European/Asian/African
我想要的是通过将所有响应聚合到单个字段中来估计相似性,该字段可以在数据库中的用户之间进行比较 - 而不是针对每个列运行查询。
因此,例如,某些回复可能如下所示:
Married-Female-American
Single-Female-European
但我不想存储一个大型文本对象来表示所有可能的连接响应,因为它们可能有50个。
那么,是否有某种方法可以使用某种类型的Java库方法更简洁地表示一组响应。
换句话说,此方法需要Married-Female-American
并生成代码,比如abc
,而Single-Female-European
会生成代码,例如def
这样,如果我想知道两个用户是否为Married-Female-Americans
,我只需查询一列代码abc
。
答案 0 :(得分:6)
好吧,如果它是一个多选题,你可以枚举选择。那就是编号。为什么不使用1-1-2
和23-1-75
呢?即使你有50个答案,它仍然可以管理。
现在,如果您碰巧需要相似性,聚合是您想要的最后一件事。你想要的是一个简单的id答案数组和一个定义两个答案数组之间的距离的函数。不要使用字符串,不要聚合。保留干净漂亮的矢量,所有ML库都将为您服务。
引用Java ML库,请尝试http://www.cs.waikato.ac.nz/~ml/weka/
更新:您可能想要尝试的另一件事是locality sensitive hashing。在你的情况下,我不认为这是一个好主意,但你的问题看起来像是一个请求。试一试。
答案 1 :(得分:1)
您是否拥有有限数量的选项(多项选择似乎暗示了这一点)?
通过对可用字符串进行索引,从字符串到数字数据集的性能是一种常见的技术。只要你只需要身份,这就是完美的。比较一个整数比比较一个字符串快得多,它们通常也会占用更少的内存。
字符本质上是0-255
中的整数,所以你当然可以使用它。
所以只需定义一个字母:
a Married
b Single
c Male
d Female
e American
f Latin American
g European
h Asian
i African
实际上你可以使用它,即使你有超过256个单词,如果它们是位置的(并且没有单个问题有超过256个选项)。然后你会使用
a Q1: Married
b Q1: Single
a Q2: Male
b Q2: Female
a Q3: American
b Q3: Latin American
c Q3: European
d Q3: Asian
e Q3: African
然后,您的示例将被编码为(变体1)ade
和bdg
或(变体2)aba
和bbc
。然后字符串的固定长度应为50(如果你有50个问题)并且可以非常有效地存储。
要比较答案,只需访问字符串的n
字符即可。也许您的数据库也允许索引子字符串查询。正如您在上面的示例中所看到的,两个字符串仅在第二个字符上一致,就像答案一致。