寻找前 K 个最相似的集合

数据挖掘 相似 信息检索
2022-01-24 17:29:25

我有一个包含单词集的数据库。例如,我有一个数据库:

{happy, birthday, to, you}
{how, are, you}
...

给定一个查询集,假设 {how, was your,birthday},我想在数据库中找到与我的查询最相似的前 K 个集合。使用的相似度指标可以是 Jaccard 指数。现在,我一一浏览数据库并计算 Jaccard Index 并跟踪迄今为止找到的前 K 分数。我想知道是否有任何数据结构或方法可以让我更有效地找到前 K 分。现在是线性搜索。谢谢

1个回答

你有关于你的数据集的任何信息吗?它是稀疏的,大多数相似性会为零吗?总字典很小吗?您可以考虑倒排索引。例如

word  query_id
W1    [1, 3, 6]
W2    [2, 5]
W3    [1, 3, 4]
W4    [2, 3, 4]
W5    [2, 3, 6]

query_id  query
1         W1 W3
2         W2 W4 W4
3         W1 W3 W4 W5
4         W3 W4
5         W2
6         W1 W5

这里 W_i 是一个单词,例如生日,query_id 是数据库中查询的 id。例如 {how, are, you} 的 id 可能是 22。现在你得到一个查询 {W1 W3 W5}。倒排索引上的聚合计数。W1 出现在查询 1、3 和 6 中。W3 出现在 1、3 和 4 等中。

query_id  count
1         2
2         1
3         3
4         1
6         2

计数将与传入查询相同的单词数,这是 jaccard 相似度的分子。因此,要找到前 k 个,您可以从计数最多的查询开始。query_id 3 的计数最高,相似度为 3/4。

如果您有一个庞大的数据库,则可以使用诸如局部敏感哈希之类的技术,这些技术基本上会将搜索空间减少到一个小存储桶中。传入的查询被散列并落在存储桶中。然后,您可以对该存储桶中的所有查询进行线性搜索,以找到最近的 k。