用于估计聚合字符串相似性的Java库方法或算法?

时间:2012-01-09 21:11:02

标签: java database algorithm cluster-analysis hash

我有用户对多项选择问题的回复,例如: (大约):

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

2 个答案:

答案 0 :(得分:6)

好吧,如果它是一个多选题,你可以枚举选择。那就是编号。为什么不使用1-1-223-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)adebdg或(变体2)ababbc。然后字符串的固定长度应为50(如果你有50个问题)并且可以非常有效地存储。

要比较答案,只需访问字符串的n字符即可。也许您的数据库也允许索引子字符串查询。正如您在上面的示例中所看到的,两个字符串仅在第二个字符上一致,就像答案一致。