简述
本文讨论一种在数据量较大的情况下计算两个集合(比如文本)相似度的算法,以及在互联网行业的应用。
原始问题
当数据量较小时,计算两个文本的相似度可以直接将两个文本表示为向量,然后计算他们的cosine相似度或jaccard相似度。本文所阐述的方法基于后者。jaccard相似度可以看成两个集合A,B的交集占并集的比例:
Jaccard Sim = (A∩B) / (A∪B)
其实就是计算A与B产生重叠的程度。如果数据量不大,A,B的交集与并集中的元素个数可以遍历A,B数出,复杂度为O(n^2)。
衍生问题
文本中的单词往往是可以计数的,但在一个衍生问题中,计算量会很庞大。在互联中,我们往往需要检查两个url的相似性(比如过滤相似度很高的网页,为某一url查找与之类似的白名单,或产生作弊的黑名单等等)。如果把每个url看成文本,那么访客记录则为它的单词。我们需要计算的是两个url的访客重合度。然而,每个url的访客数目是非常庞大的,而且如果需要计算的url pair很多的话