我有一个包含单词集的数据库。例如,我有一个数据库:
{happy, birthday, to, you}
{how, are, you}
...
给定一个查询集,假设 {how, was your,birthday},我想在数据库中找到与我的查询最相似的前 K 个集合。使用的相似度指标可以是 Jaccard 指数。现在,我一一浏览数据库并计算 Jaccard Index 并跟踪迄今为止找到的前 K 分数。我想知道是否有任何数据结构或方法可以让我更有效地找到前 K 分。现在是线性搜索。谢谢
我有一个包含单词集的数据库。例如,我有一个数据库:
{happy, birthday, to, you}
{how, are, you}
...
给定一个查询集,假设 {how, was your,birthday},我想在数据库中找到与我的查询最相似的前 K 个集合。使用的相似度指标可以是 Jaccard 指数。现在,我一一浏览数据库并计算 Jaccard Index 并跟踪迄今为止找到的前 K 分数。我想知道是否有任何数据结构或方法可以让我更有效地找到前 K 分。现在是线性搜索。谢谢
你有关于你的数据集的任何信息吗?它是稀疏的,大多数相似性会为零吗?总字典很小吗?您可以考虑倒排索引。例如
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。