精华内容
下载资源
问答
  • 文件相似度 介绍 该项目的目的是通过实施多种方法来处理商品的数据集,以衡量商品... Jaccard相似度是用于文档比较的常用度量,即两个不同文档(交集)之间的共享组件与它们的总独立数量(联合)的比率。 可以使用带
  • 使用jaccard距离计算文本相似度

    千次阅读 2020-02-10 14:18:05
    4. jaccard系数计算文本相似度 4.1 jaccard系数 jaccard系数反映了两个向量(元素取值为0或1)间的关系。即对于A⃗\vec AA和B⃗\vec BB,定义: NA0B0N_{A_0B_0}NA0​B0​​ = A⃗\vec AA中元素值为0且B⃗\vec BB中...

    1. 使用simhash计算文本相似度
    2. 使用余弦相似度计算文本相似度
    3. 使用编辑距离计算文本相似度
    4. jaccard系数计算文本相似度

    4. jaccard系数计算文本相似度

    4.1 jaccard系数

    jaccard系数反映了两个向量(元素取值为0或1)间的关系。即对于 A ⃗ \vec A A B ⃗ \vec B B ,定义:
    N A 0 B 0 N_{A_0B_0} NA0B0 = A ⃗ \vec A A 中元素值为0且 B ⃗ \vec B B 中元素值为0的个数
    N A 1 B 0 N_{A_1B_0} NA1B0 = A ⃗ \vec A A 中元素值为1且 B ⃗ \vec B B 中元素值为0的个数
    N A 0 B 1 N_{A_0B_1} NA0B1 = A ⃗ \vec A A 中元素值为0且 B ⃗ \vec B B 中元素值为1的个数
    N A 1 B 1 N_{A_1B_1} NA1B1 = A ⃗ \vec A A 中元素值为1且 B ⃗ \vec B B 中元素值为1的个数
    则 jaccard系数可以表示为:

    J ( A , B ) = N A 0 B 0 + N A 1 B 1 N A 0 B 0 + N A 1 B 0 + N A 0 B 1 + N A 1 B 1 ( 1 ) J(A,B)=\frac{N_{A_0B_0}+N_{A_1B_1}}{N_{A_0B_0}+N_{A_1B_0}+N_{A_0B_1}+N_{A_1B_1}} (1) J(A,B)=NA0B0+NA1B0+NA0B1+NA1B1NA0B0+NA1B1(1)

    当向量中为0的元素远大于为1的元素的个数时, N A 0 B 0 N_{A_0B_0} NA0B0 需要从计算中移除,而只关注均为1的元素的个数。因为当 N A 0 B 0 N_{A_0B_0} NA0B0较大时,整个计算结果将区域稳定,无明显特征了。所以以上公式变为:

    J ( A , B ) = N A 1 B 1 N A 1 B 0 + N A 0 B 1 + N A 1 B 1 ( 2 ) J(A,B)=\frac{N_{A_1B_1}}{N_{A_1B_0}+N_{A_0B_1}+N_{A_1B_1}} (2) J(A,B)=NA1B0+NA0B1+NA1B1NA1B1(2)

    另一种用集合表示的方法:

    J ( A , B ) = ∣ A ⋂ B ∣ ∣ A ⋃ B ∣ = ∣ A ⋂ B ∣ ∣ A ∣ + ∣ B ∣ − ∣ A ⋂ B ∣ ( 3 ) J(A,B)=\frac{|A\bigcap{B}|}{|A\bigcup{B}|}=\frac{|A\bigcap{B}|}{|A|+|B|-|A\bigcap{B}|}(3) J(A,B)=ABAB=A+BABAB(3)

    4.2 jaccard系数相似度

    jaccard系数值越大,相似度越高,另一种说法是用jaccard距离表示相似度即: 1 − J ( A , B ) 1-J(A,B) 1J(A,B),本质一样,但jaccard距离越大相似度越小。

    一般的 jaccard系数只适用于计算元素取值为0或1的集合,但是要注意的是这里取值为0或1并不是值集合中的值为0或1,而仅仅是集合中元素的取值为0或1,而计算出的jaccard系数是和元素本身相关的。

    4.2.1 jaccard系数衡量维度相似性

    jaccard系数很适合用来分析多个维度间的相似性,也多被用于推荐系统中用来给用户推荐相似的产品或业务。
    举个例子,要计算某网站的两个用户的相似性,可以从性别、地区、年龄、浏览时间等等维度进行分析,我们把这些维度再进行细化:
    男性、女性、小于18岁、18岁-40岁、40岁以上、浏览时间为早上、浏览时间为中午、浏览时间为下午
    将以上维度作为一个集合,对两个用户 A A A B B B,将符合以上维度的指标值置为1,其他置为0。
    假设用户 A A A=[男性=1, 女性=0, 小于18岁=0, 18岁-40岁=1, 40岁以上=0, 浏览时间为早上=0, 浏览时间为中午=0, 浏览时间为下午=1]
    假设用户 B B B=[男性=1, 女性=0, 小于18岁=1, 18岁-40岁=0, 40岁以上=0, 浏览时间为早上=0, 浏览时间为中午=0, 浏览时间为下午=1]
    即他们只有年龄不同,则根据计算公式,得到的jaccard系数值为:

    J ( A , B ) = N A 1 B 1 N A 1 B 0 + N A 0 B 1 + N A 1 B 1 = 2 4 = 0.5 J(A,B)=\frac{N_{A_1B_1}}{N_{A_1B_0}+N_{A_0B_1}+N_{A_1B_1}}=\frac{2}{4}=0.5 J(A,B)=NA1B0+NA0B1+NA1B1NA1B1=42=0.5

    即他们的相似度为0.5

    用matlab验证下:

    在这里插入图片描述

    4.2.1 jaccard系数衡量文本相似性

    虽然jaccard主要是在维度分析这样的稀疏向量中作用比较大,但是在文本相似度计算时也可用jaccard。

    仍然用之前的文本作为输入样本:

    样本1:今天天气真好
    样本2:今天天气不错

    首先要做的还是分词:

    A = [今天,天气,真好]

    B = [今天,天气,不错]

    J ( A , B ) = ∣ A ⋂ B ∣ ∣ A ⋃ B ∣ = 2 4 = 0.5 J(A,B)=\frac{|A\bigcap{B}|}{|A\bigcup{B}|}=\frac{2}{4}=0.5 J(A,B)=ABAB=42=0.5

    转化为01向量,用matlab验证下:
    在这里插入图片描述

    4.3 jaccard系数计算实现(java)

    public static double jaccard(String s1, String s2) {
            List<String> words1 = splitWords(s1);
            List<String> words2 = splitWords(s2);
    
            List<String> temp = new ArrayList<>();
            temp.addAll(words1);
            temp.addAll(words2);
            List<String> union = temp.stream().distinct().collect(Collectors.toList());
            List<String> intersect = new ArrayList<>();
    
            List<String> a = words1.stream().
                    map(x -> words2.contains(x) ? x : null).
                    collect(Collectors.toList());
    
            List<String> b = words2.stream().
                    map(x -> words1.contains(x) ? x : null).
                    collect(Collectors.toList());
    
            intersect.addAll(a);
            intersect.addAll(b);
            intersect = intersect.stream().distinct().collect(Collectors.toList());
            intersect.removeAll(Collections.singleton(null));
    
            return 1.0 * intersect.size() / union.size();
        }
    

    4.4 总结

    以上只是简单的从字符出现或者没有出现的角度进行相似度计算,而没有考虑其他因素。实际上,还可以结合词义进行近义词替换,来进一步达到语义层面的相似度计算,这样结果会更为准确。
    下面时jaccard的耗时:

    在这里插入图片描述

    展开全文
  • 余弦距离与jaccard距离以及python实现

    千次阅读 2020-10-07 15:39:10
    最近在看一些文章跟代码的时候碰到了余弦距离跟jaccrd距离的概念。刚开始有些混淆不清楚特,特别是再用scipy代码实现的过程中更是搞得一塌糊涂。现在自己整明白了就将自己的理解写下来。 余弦距离 简单讲余弦距离...

    前言

       最近在看一些文章跟代码的时候碰到了余弦距离跟jaccrd距离的概念。刚开始有些混淆不清楚特,特别是在用scipy代码实现的过程中更是搞得一塌糊涂。现在自己整明白了就将自己的理解写下来。主要的区别就是cos计算出来的是余弦相似度,只有1减去计算出来的余弦相似度才是余弦距离。

    1. 余弦距离
      简单讲余弦距离就是
      在这里插入图片描述

      也就是1减去在这里插入图片描述
      如果用scipy库中的包实现的话如下所示

    import numpy as np
    vec1 = [1,2,3,4]
    vec2 = [5,6,7,8]
     
    #法一:根据公式求解
    dist1 = np.dot(vec1,vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2))
    print("余弦距离为:\t"+str(1-dist1))
     
    #法二:根据scipy库求解
    from scipy.spatial.distance import pdist
    Vec = np.vstack([vec1,vec2])
    dist2 = pdist(Vec,'cosine')
    print("余弦距离为:\t"+str(dist2))
    

    上面这段代码是从另一个博主那里借鉴来的不过他写的有错(上面的代码是我改正过的),按照他的计算方式算的不是余弦距离而是余弦相似度。我之所以困惑也是看了他的代码才晕的(博主抱歉了)原博主的文章链接。进一步看一下scipy库pdist给出的说明文档也验证了我的想法
    在这里插入图片描述
    用函数包算出来的直接就是余弦距离。

    1. jaccard距离
      在这里插入图片描述
      以上内容来自百度百科说的而已经很详细了。
      代码实现如下:
    import numpy as np
    from scipy.spatial.distance import pdist
    x=np.random.random(10)>0.5
    y=np.random.random(10)>0.5
    
    x=np.asarray(x,np.int32)
    y=np.asarray(y,np.int32)
    
    #方法一:根据公式求解
    up=np.double(np.bitwise_and((x != y),np.bitwise_or(x != 0, y != 0)).sum())
    down=np.double(np.bitwise_or(x != 0, y != 0).sum())
    d1=(up/down)
               
    
    #方法二:根据scipy库求解
    X=np.vstack([x,y])
    d2=pdist(X,'jaccard')  # 算出来的就是jaccard距离,需要计算jaccard系数的话就需要1-d2
    

    参考文献

    [1]余弦距离与余弦相似度的区别以及应用

    展开全文
  • Jaccard距离和海明距离

    2020-04-23 14:49:46
    两种向量距离的测度Jaccard(杰卡德)相似度如何度量两个向量之间的Jaccard相似度?特点海明距离 Jaccard(杰卡德)相似度 Jaccard相似度常用于计算两个文本的字面相似度。将文本分为词的序列。两个文本中一样的词汇...

    Jaccard(杰卡德)相似度

    Jaccard相似度常用于计算两个文本的字面相似度。将文本分为词的序列。两个文本中一样的词汇集合的个数为A,所有词汇构成的集合为B。最终用A除以B得到的结果就是Jaccard相似度。

    用一个例子来说明:

    		今天天气很好==>今天/天气/很好
    		今天天气不好==>今天/天气/不好
    

    所有词汇的集合:
    word_set = {今天,天气,很好,不好}
    两个句子中相同的词汇集合:
    same_set = {今天,天气}
    J a c c a r d _ s i m i l a r i t y = l e n ( s a m e _ s e t ) l e n ( w o r d _ s e t ) = 2 4 = 0.5 Jaccard\_similarity=\frac{len(same\_set)}{len(word\_set)}=\frac{2}{4}=0.5 Jaccard_similarity=len(word_set)len(same_set)=42=0.5

    把这个问题抽象出来可以给出Jaccard相似度的定义:

    	给定两个集合A,B,Jaccard系数(相似度)定义为A与B交集大小与并集大小的比值,公式如下:
    

    J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ = ∣ A ∩ B ∣ ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ J(A,B)=\frac{|A\cap B|}{|A\cup B|}=\frac{|A\cap B|}{|A| + |B| - |A\cap B|} J(A,B)=ABAB=A+BABAB

    	Jaccard值越大说明相似度越高。
    

    Jaccard距离用于描述不相似的程度: d ( A , B ) = 1 − J ( A , B ) d(A,B)=1-J(A,B) d(A,B)=1J(A,B)

    如何度量两个向量之间的Jaccard相似度?

    前提条件就是:这两个向量的维度一定要相等,否则对于相似性的度量既没有意义,也不好度量。

    Jaccard针对二值向量可进行相似性度量。

    假设拥有两个向量 v e c 1 vec_1 vec1 v e c 2 vec_2 vec2

    1. 其中对应位置均为0的个数记作 M 00 M_{00} M00
    2. 其中 v e c 1 vec_1 vec1中为0 v e c 2 vec_2 vec2中为1的个数记作 M 01 M_{01} M01
    3. 其中 v e c 1 vec_1 vec1中为1 v e c 2 vec_2 vec2中为0的个数记作 M 10 M_{10} M10
    4. 其中对应位置均为1的个数记作 M 11 M_{11} M11

    如果 M 00 M_{00} M00 M 11 M_{11} M11相差不大,则两个向量的Jaccard相似度为:
    J ( v e c 1 , v e c 2 ) = M 00 + M 11 M 00 + M 01 + M 10 + M 11 J(vec_1, vec_2)=\frac{M_{00}+M_{11}}{M_{00}+M_{01}+M_{10}+M_{11}} J(vec1,vec2)=M00+M01+M10+M11M00+M11

    如果 M 00 > > M 11 M_{00}>>M_{11} M00>>M11或者为0时代表的含义并无实际意义,则两个向量的Jaccard相似度为:
    J ( v e c 1 , v e c 2 ) = M 11 M 01 + M 10 + M 11 J(vec_1, vec_2)=\frac{M_{11}}{M_{01}+M_{10}+M_{11}} J(vec1,vec2)=M01+M10+M11M11

    特点

    Jaccard相似性与余弦相似度的关键区别在于:Jaccard针对重复性的元素不敏感,也就是一个词汇出现100次在Jaccard的相似性度量中与出现1次的结果一样。而余弦相似度有较大的区别。

    海明距离

    海明距离也是用于度量两个向量之间的差异程度。同时也是SimHash的御用距离度量方法。

    统计两个向量中不一样元素的个数的和,其实就是 J a c c a r d Jaccard Jaccard M 01 + M 10 M_{01}+M_{10} M01+M10的结果。
    同时也可以计算两个向量异或之后的元素1的个数之和。

    展开全文
  • Jaccard距离 余弦距离

    距离的基本特征

    假定有一些点组成的集合,我们称这个集合为空间(space)。这个空间下的距离测度为一个函数d(x,y),以空间中的x点与y点作为参数,输出一个实数值。该函数必须满足以下准则:

    1. d(x,y)≥0 【距离非负数】
    2. d(x,y)=0 当且仅当x点与y点重合
    3. d(x,y)=d(y,x)
    4. d(x,y)≤d(x,z)+d(z,y) 【三角不等式】
      这其中最难满足的是第五条三角不等式

    欧几里得距离 Euclidean Distance

    在这里插入图片描述

    Jaccard距离

    d(x,y) = 1 - SIM(x,y)
    SIM(x,y)为x与y的jaccard相似度。计算方法为:SIM(x,y)=|X∩Y|/|X∪Y|

    余弦距离 Cosine Distance

    类似高中学的余弦角度计算。。。
    在这里插入图片描述

    在这里插入图片描述

    编辑距离 Edit Distance

    在这里插入图片描述

    展开全文
  • Jaccard系数与Jaccard距离

    千次阅读 2018-07-16 15:17:55
    公式为: jaccard系数相反的即为jaccard距离,用两个集合中不同元素所占元素的比例来衡量两个样本之间的相似度,公式为: Jaccard系数主要的应用的场景有 1.过滤相似度很高的新闻,或者网页去重 2.考试防作弊...
  • 将数据点描述为所属模型的倾向集,把倾向集问的Jaccard距离描述为数据点的一种属性,基于该属性使用改进的Cobweb算法进行聚类。该方法无需预知模型数目和参数变换,可有效克服漏检、交叉模型误检等情况。实验结果...
  • R语言利用Jaccard距离聚类

    千次阅读 2020-01-15 20:43:11
    Jaccard系数与Jaccard距离 什么时候应该用Jaccard距离 R 语言实现方法 Jaccard系数与Jaccard距离 Jaccard 系数定义为A与B交集的大小与A与B并集的大小的比值。 Jaccard系数为相似度的指标,系数越大,相似度越高...
  • 用数字实例,一步一步求jaccard距离,清晰易懂,保证能够理解,后面还有python源码实现这个公式
  • 基于Jaccard距离与概念聚类的多模型估计.pdf
  • 上一篇说了simhash,本质是降维...就是simhash和汉明距离配套一样,和minhash配套的是Jaccard距离。minhash是LSH(局部敏感哈希)的一种,快速检索大量数据。特征矩阵特征矩阵是推荐系统必须要做的事,不管是用户-用户...
  • 本文主要讲一下文本相似度计算的几个距离公式,主要包括:欧氏距离、余弦相似度、Jaccard距离、编辑距离。 距离计算在文本很多场景下都可以用到,比如:聚类、K近邻、机器学习中的特征、文本相似度等等。
  • jaccard距离udf函数: def jaccardDistance = udf { (string1: String, string2: String) => var result = false val set1: Set[Char] = string1.toSet val set2: Set[Char] = string2.toSet val ...
  • ngraph.jaccard 羽毛的鸟儿聚集在一起。 原来在我的编程生涯中激发我灵感的人也激发我去追随他们追随的其他人。 我们可以解决反向问题吗? 在我追随的所有人中,谁追随我的追随者呢? 事实证明,“杰卡德相似性”...
  • 一、余弦距离 形式化描述: 余弦夹角也可以叫余弦相似度。几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。 余弦取值范围为[-1,1]。求得两个向量的夹角,并得出...
  • 1、余弦距离余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。向量,是多维空间中有方向的线段,如果两个向量的方向一致,即夹角接近零,那么这两个向量就相近...
  • 用sim(C1,C2)表示文档之间的Jaccard 相似度 用d(C1,C2)表示文档之间的距离 那么d(C1,C2) = 1 - sim(C1,C2) 例如上图中,从左数第一列和第二列的sim是3/6,d是1-3/6 如果对于每两个document都计算距离,计算量太大了...
  • 在计算基于字面的文本相似性的时候,通常有欧氏距离、cosine余弦相似度、编辑距离jaccard相似度等方式,下面一一介绍。 余弦相似度 余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个...
  • Jaccard距离: 用于测量集合间的距离,交集大小/并集大小=Jaccard系数,1- Jaccard系数为其距离。 l  Hamming距离: 统计不同的位的总数。   调用的API: from sklearn.merics import euclidean_distances等
  • 所以要先做一步粗召回,用string column1的前几个字(或者ngram)作为key1,用string column2的前几个字(或者ngram)作为key2,然后key1 join key2,即得到粗召回的结果,再每行计算jaccard距离 ...
  • 采用Jaccard距离计算就是Num(A∩B)/Num(A∪B),假设在计算的样本集中A和B出现的次数很多,那么结果基本接近1,在视频推荐中,会让很热,曝光很多的视频继续曝光。采用关联规则来分析,只取出A-&gt;B这种简单的...
  • jaccard距离udf函数: def jaccardDistance = udf { (string1: String, string2: String) => var result = false val set1: Set[Char] = string1.toSet val set2: Set[Char] = string2.toSet val ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,011
精华内容 2,004
关键字:

jaccard距离