在大数据中如何寻找相似的文档(shingle, minhash, LSH)(二)

来源:互联网 发布:template.js 编辑:程序博客网 时间:2024/06/11 18:48
接上篇译文;
     1.尽管我们利用minhashing技术将大数据量的文档压缩到小数据量的signatures,并且能够保证文档对之间的相似度大致不变。但是由于文档对的数目可能非常的大,我们仍然不能很有效的找到最相似的文档对。
     如果我们的目标是计算每一对文档对之间的相似度,那么我们就没有更好的办法了,或者可以用并行的方法减少运行的时间规模;但是如果我们的目的仅仅是找到的最相似的文档对或者相似度在某种程度之上的文档对,这时候我们就可以采用LSH技术(locality-sensitive hashing or near-neighbor search)。
     2.    应用于寻找相似文档的LSH技术
     一般来说,我们这样应用LSH技术:将所有的items(要比较的东西)进行多次的hash,从而能够将可能相似的文档hash到同一个bucket中;然后我们会只考虑那些hash到同一个bucket中的items,认为他们组成的item对才有可能是我们要找的item对。  这其中就会产生两个概念,一个是 false positives: 就是指那些本来不相似的item对却被hash到一个bucket中;另一个是false negatives: 指那些本来相似的items对却没有被hash到同一个bucket中。
     如何具体使用lsh技术呢?  一个比较有效的hashing方法是将signature matrix(由所有文档的signature组成,每一列存储一个文档的signature)分为b个bands,每个band包含r行(相当于将每个文档的b*r 个signatures分成b组); 对于每一个band用一个hash函数(输入是每个文档的r个signature,相当于将一列考虑为hash的输入),将每一列的signature hash到一些大数量的bucket中。(我们可以对不同的band使用相同的hash函数,但是不同的band的bucket要放在不同的位置,从而保证不同band中相同的列不会被hash到同样的bucket中。)
     3. 对lsh的banding技术的分析
     将设我们有b bands而且每个band有r行。并且假设一个特定的文档对的jaccard距离是s。  从前文的minhash技术的分析(没有翻译 o(╯□╰)o)中可以知道该文档对的任何一行的signature相同的概率是s。  然后我们就可以计算着文档对成为一个候选的文档对(被hash到同一个bucket中)的概率,过程如下:
     在一个特定的band中,该文档对的所有的signature都相等的概率是 s^r;  那么不相等的概率就是 1-s^r;
     所有的band中,该文档对的signature都不相等的概率是 (1-s^r)^b;  该文档对至少会在一个band中相等的概率就是 1-(1-s^r)^b.
     分析: 将b r看作一个常量,可以看出该概率是s的函数而且是一个典型的S型曲线. 该曲线横轴是 文档对的相似度; 纵轴为该文档对被放到一个bucket中成为候选文档对的概率;两者之间的关系是一条我们非常熟知s型曲线,对于s型曲线,中间有一段非常陡峭的上升部分,可以将这个部分的横轴看作相似度的阈值,高于这个相似度的一般以接近于1的概率(具体的概率可以通过前边的分析计算出来)被分到同一个bucket中,而低于这个相似度阈值的则以接近于0的概率被分到同一个bucket中;而且这个阈值是b,r的函数:s=(1/b)^(1/r)。   这种函数的s型特性就满足了我们对于LSH技术的要求,即将相似的文档hash到同一bucket中,而将不相似的文档hash到不同的bucket中,至于具体的false positive 和false negatives 与具体的b和r取值有关。(这种方法会产生一定的false positives 和 false negatives)

4.     最后我们总结下如何在大数据量的文档对中找到相似的文档对
     1) 针对文档特性选取合适的k值,对每一个文档进行k-shingle,并对shingle结果映射为整数。
     2) 对每个文档的shingle标签进行排序。?
     3)  利用前文所述算法,计算每个文档的signature(signature的长度n的选择是一个需要tradeoff的量)
     4) 选取合适的阈值t, 用来决定相似度多高的文档对会被放到同一个bucket中作为候选对;然后选取bands:b以及rows:r,使得b*r=n,而且 t ≈ (1/b)^(1/r)。 如果希望false negatives尽量的低,可以选取b r使得t尽量小;如果追求速度,那就是的t尽量大。
     5) 利用LSH技术计算出候选文档对; 并对文档对的最初的signatures进行检测,确保其相似度确实在t之上。
     6) 最后回到文档对最原始的字符状态,进行检测文档对是否确实相似。

0 0
原创粉丝点击