我有一个搜索引擎。搜索关键字时,搜索引擎会生成结果。我需要的是找到产生类似结果的所有其他关键字。
例如关键字 k1 给出结果集 R1 = {1,2,3,4,5,... 40},其中包含最多40个文档ID 。我需要获取所有其他关键字 K1 的列表,这些关键字生成类似于 k1 生成的结果。
两个结果集 R1 和 R2 之间的相似性S( R1 , R2 )计算如下:
2 * (number of same elements both in _R1_ and _R2_) / ( (total number of elements in _R1_) + (total number of elements in _R2_) )
。示例: R1 = {1,2,3}和 R2 = {2,3,4,5}给出S( R1 ,< em> R2 )=(2 * | {2,3} |)/ | {1,2,3} | + | {2,3,4,5} | =(2 * 2)/(3 + 4)= 4/7 = 0.57。
有超过100,000个关键字,因此超过100,000个结果集。到目前为止,我只能用O(N ^ 2)的方法来解决这个问题,其中每个结果集都被压缩到每个其他集合。这需要很多时间。
有人有更好的主意吗?
一些类似的帖子并没有完全解决问题:
答案 0 :(得分:0)
一个问题是排序顺序的结果?
想到的东西结合了两个集合,对它进行排序并找到重复的东西。它可以减少到O(nlogn)
答案 1 :(得分:0)
为了使问题变得简单,假设所有关键词都有10个结果,而k1是要比较的关键词。您从每个关键字的集合中删除9个结果。现在将最后的结果与k1进行比较,并将具有相同最后结果的关键词与您想要的结果进行比较。如果一个关键词与k1有1个共同结果,则只剩下1%概率。与k1共同的5个关键词将保留25%概率。也许你会认为1%太大了,那么你可以重复上述过程n次,并且1个结果共同的关键词将有1%^ n概率保留。 时间 O(N)。
答案 2 :(得分:0)
您的相似性标准是已修复,还是我们可以应用一些变化以实现更快的搜索引擎?
<强>替代:强>
我想到了另一种选择:
根据结果集R1,您可以浏览文档并创建直方图,而不是其他关键字,这些文档将与之匹配。然后,如果给出替代关键字,例如,至少#R1 / 2命中,则将其列为“相似”。
最大的区别在于,您根本不考虑不在R1中的文档。
<强>精确吗
如果您需要一个符合您要求的解决方案,我相信只为那些满足上述“替代”标准的关键字计算R2集就足够了。我认为(需要数学证明!)如果不满足“替代”标准,那么你的机会就不会存在。