python如何实现Dice系数
作者:码奋
python实现Dice系数
维基百科,自由的百科全书
跳到导航跳到搜索
Disambig gray.svg 关于与“Dice系数”名称相近或相同的条目,请见“Dice”。
Dice系数, 根据 Lee Raymond Dice[1] 命名,是一种集合相似度度量函数,通常用于计算两个样本的相似度:
{\displaystyle s={\frac {2|X\cap Y|}{|X|+|Y|}}} {\displaystyle s={\frac {2|X\cap Y|}{|X|+|Y|}}}
它和Sørensen 相似度指数相同, 也称作Sørensen-Dice系数。
它在形式上和Jaccard指数没多大区别,但是有些不同的性质。
和Jaccard类似,它的范围为0到1。 与Jaccard不同的是,相应的差异函数
{\displaystyle d=1-{\frac {2|X\cap Y|}{|X|+|Y|}}} {\displaystyle d=1-{\frac {2|X\cap Y|}{|X|+|Y|}}}
不是一个合适的距离度量措施,因为它没有三角形不等性的性质。
例如给定 {a}, {b}, 和 {a,b}, 前两个集合的距离为1, 而第三个集合和其他任意两个集合的距离为三分之一。
与Jaccard类似, 集合操作可以用两个向量 A 和B的操作来表示:
{\displaystyle s_{v}={\frac {2|A\cdot B|}{|A|^{2}+|B|^{2}}}} {\displaystyle s_{v}={\frac {2|A\cdot B|}{|A|^{2}+|B|^{2}}}}
上式给出了两个向量的距离输出,也给出了更一般情况下向量之间的相似度度量措施。
Dice 系数可以计算两个字符串的相似度:Dice(s1,s2)=2*comm(s1,s2)/(leng(s1)+leng(s2))。
其中,comm (s1,s2)是s1、s2 中相同字符的个数leng(s1),leng(s2)是字符串s1、s2 的长度。
在信息检索中, 给定关键词集合X 和Y ,相似度定义为两倍的共同信息(重叠部分)除以基数的总和 :[2]
当作为字符串之间的相似度度量时, 计算两个字符串之间的系数, x 和y,使用 bigrams 公式如下:[3]
{\displaystyle s={\frac {2n_{t}}{n_{x}+n_{y}}}} {\displaystyle s={\frac {2n_{t}}{n_{x}+n_{y}}}}
其中nt 是两个字符串共有的bigrams的个数, nx 是 x中bigrams的个数 ,ny 是 y中bigrams的个数。
例如:要计算下面两个字符串之间的相似度:
night
nacht
我们可以在各个单词中得出如下bigrams集合:
{ni,ig,gh,ht}
{na,ac,ch,ht}
每个集合有4个元素, 这个两个集合只有一个相同的元素: ht.
代入公式我们可以计算出, s = (2 · 1) / (4 + 4) = 0.25.
Dice距离用于度量两个集合的相似性,因为可以把字符串理解为一种集合,因此Dice距离也会用于度量字符串的相似性。
此外,Dice系数的一个非常著名的使用即实验性能评测的F1值。
Dice系数定义
如下:
其中分子是A与B的交集数量的两倍,分母为X和Y的长度之和,所以他的范围也在0到1之间。
从公式看,Dice系数和Jaccard非常的类似。
Jaccard是在分子和分母上都减去了|A∩B|。
与Jaccard不同的是,相应的差异函数
不是一个合适的距离度量措施,因为它没有三角形不等性的性质。
例如:
给定 {a}, {b}, 和 {a,b}, 前两个集合的距离为1, 而第三个集合和其他任意两个集合的距离为三分之一。
与Jaccard类似,集合操作可以用两个向量A和B的操作来表示:
def dice_coefficient(a, b): """dice coefficient 2nt/na + nb.""" a_bigrams = set(a) b_bigrams = set(b) overlap = len(a_bigrams & b_bigrams) return overlap * 2.0/(len(a_bigrams) + len(b_bigrams)) if __name__ == '__main__': a=dice_coefficient('你好daadsffda','你你好ihiuhiihibiuhiuhiuhiuhiuhiuhuya妹aaa') print(a)
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。