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

在大数据中如何寻找相似的文档(shingle, minhash, LSH)(二)接上篇译文 nbsp nbsp nbsp 1 尽管我们利用 minhashing 技术将大数据量的文档压缩到小数据量的 signatures 并且能够保证文档对之间的相似度大致不变 但是由于文档对的数目可能非常的大 我们仍然不能很有效的找到最相似的文档对 nbsp nbsp nbsp 如果我们的目标是计算每一对文档对之间的相似度 那么我们就没有更好的办法了 或者可以用并行的方法减少运行的时间规模 但是如果我们的目的仅仅是找到的最相似的

接上篇译文;

     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) 最后回到文档对最原始的字符状态,进行检测文档对是否确实相似。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217656.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午9:04
下一篇 2026年3月18日 上午9:05


相关推荐

  • conda pycharm 虚拟环境_PyCharm远程调试

    conda pycharm 虚拟环境_PyCharm远程调试软硬件环境 ubuntu18 0464bitpycha 1 2windows1064 7 前言首先说说我的环境 2 台电脑 一台是笔记本 安装的是 windows 系统 主要撸代码和写文档 另一个性能更好些 带 GPU 跑的是 ubuntuserver 写 python 的主力 IDE 是 pycharm 刚好 pycharm 也有远程 deb

    2026年3月27日
    2
  • Java 定时器_Javaweb定时器

    Java 定时器_Javaweb定时器上篇提到了阻塞队列,本篇我们将优先级队列和阻塞队列结合,得到阻塞优先队列,以此来实现一个定时器~定时器定义应用场景定时器的实现:定时器构成代码实现:代码分析:忙等一处唤醒,两处阻塞附最终全部代码:完整的执行过程:定义定时器,是多线程编程中的一个重要/常用组件定时器可以强制终止请求:浏览器内部都有一个定时器,发送请求后,定时器就开始计时;若在规定时间内,响应数据没有返回,就会强制终止请求定时器,有些逻辑不想立刻执行,而是要等一定的时间之后,再来执行好比一个闹钟,在我们设定好闹钟时间后,到时

    2026年1月20日
    3
  • 百度文心一言ERNIE-4.5-0.3B-PT开源大模型本地私有化部署

    百度文心一言ERNIE-4.5-0.3B-PT开源大模型本地私有化部署

    2026年3月12日
    2
  • 记录关于我与SCOM的事情

    记录关于我与SCOM的事情

    2022年3月13日
    40
  • Cursor-Stats 项目最佳实践教程

    Cursor-Stats 项目最佳实践教程

    2026年3月15日
    2
  • TiKV 源码解析系列文章(十三)MVCC 数据读取

    TiKV 源码解析系列文章(十三)MVCC 数据读取作者:施闻轩在《TiKV源码解析系列文章(十二)分布式事务》中,我们介绍了如何在满足事务特性的要求下进行数据写入。本文将介绍数据读取的流程。由于顺序扫(ForwardScan)比较具有代表性,因此本文只介绍顺序扫的流程,而不会介绍点查或逆序扫。点查是顺序扫的简化,相信读者理解了顺序扫的流程后能自己想出点查的实现,而逆序扫与顺序扫也比较类似,主要区别在于从后向前扫,稍复杂一些,相信大家在阅…

    2026年2月20日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号