【文本去重】通俗易懂理解Minhash算法

Minhash算法直观理解

作者: @凌漪_ @板烧鱼仔 @Yuxn.

背景

  1. Jaccard相似度
    两个集合 A 和 B,我们关心它们的Jaccard相似度
    J ( A , B ) = ∣ A ∩ B ∣ ​ ∣ A ∪ B ∣ J(A,B)=\frac{∣A∩B∣​}{∣A∪B∣} J(A,B)=ABAB
    Jaccard相似度描述了两个集合之间的相似程度。
    使用场景1:两个文档之间的相似度。注意: jaccard相似度并没有提取文档的任何语义,只是在查看它们是否包含相同的单词。因此,“大王八”和“八大王”的jaccard相似度为1。在计算文档之间的相似度时,通常不会基于词级别,而是n-gram(n个连续单词),再计算交集和并集的元素的个数,得到jaccard相似度。
    使用场景2:你的歌单和我的歌单之间的相似度
  2. 计算Jaccard效率低下
    当拥有一个大型的文档集合时(比如里面有N篇文档),我们需要找出其中相似度高的文档对。此时就需要对文档进行来两两比较,计算Jaccard,得到一个 N ∗ N N * N NN的矩阵。(当然,为了避免重复进行2次计算:文档A与文档B,文档B与文档A,其中有一半上三角的值为0),所需要的比较次数为 ( N 2 ) / 2 N^2) /2 N2)/2,计算复杂度为 O ( N 2 ) O(N^2) O(N2)。而在每次进行jaccard比较时,需要交集和并集,计算复杂度取决于文档的大小,假设所有文档的长度相等,都包含M个单词,则计算复杂度为 O ( N 2 ⋅ M ) O(N^2 · M) O(N2M)。就会耗费很长时间,计算和内存消耗变得不可承受
  3. Jaccard的计算替代方式:Minhash算法
    Minhash的好处:Minhash可以实现把一篇文章用一个较短的signature表示,这个signature有个很好的性质: 两个minhash signature的Jaccard相似度和原始文本的Jaccard相似度在概率上是一致的。 比较一次的所耗费的时间为numHash,总的计算复杂度为 O ( N 2 ⋅ n u m H a s h ) O(N^2 · numHash) O(N2numHash)。而numHash是可以自己设置的大小,这就远小于M。

minhash如何工作?

先介绍它的工作方式,可能能帮助你更好理解这个算法。
前提假设:如果两个集合非常相似 → 那么对这两个集合应用同一种变化,得到的变化结果也很相似 → 对这两个变化结果选取某种特征(比如选最小值),它们有很高的概率是相等的。

  1. 假设我们拥有2个集合
# 设置2个集合A和B
A = {
   
   1, 2, 3, 4, 5}
B = {
   
   3
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值