这是一种计算两个字符串之间相似度的方法,想必都听过Edit Distance,Jaro-Winkler Distance 是Jaro Distance的一个扩展,而Jaro Distance(Jaro 1989;1995)据说是用来判定健康记录上两个名字是否相同,也有说是是用于人口普查,具体干什么就不管了,让我们先来看一下Jaro Distance的定义。
两个给定字符串S1和S2的Jaro Distance为:
- m是匹配的字符数;
- t是换位的数目。
两个分别来自S1和S2的字符如果相距不超过
时,我们就认为这两个字符串是匹配的;而这些相互匹配的字符则决定了换位的数目t,简单来说就是不同顺序的匹配字符的数目的一半即为换位的数目t,举例来说,MARTHA与MARHTA的字符都是匹配的,但是这些匹配的字符中,T和H要换位才能把MARTHA变为MARHTA,那么T和H就是不同的顺序的匹配字符,t=2/2=1.
那么这两个字符串的Jaro Distance即为:
而Jaro-Winkler则给予了起始部分就相同的字符串更高的分数,他定义了一个前缀p,给予两个字符串,如果前缀部分有长度为
的部分相同,则Jaro-Winkler Distance为:
这样,上面提及的MARTHA和MARHTA的Jaro-Winkler Distance为:
- d w = 0.944 + (3 * 0.1(1 − 0.944)) = 0.961
以上资料来源于维基百科:
http://en.wikipedia.org/wiki/Jaro-Winkler_distance
这样一来很容易写出这个算法的代码:
1: double jaro_distance(string s1,string s2)2: {3: if(s1.empty()||s2.empty())4: {5: if(s1.empty()&&s2.empty())6: return 1.0;7: return 0.0;8: }9: int allowrange=max(s1.length(),s2.length())/2-1;10: int i,j;11: bool is_match=false;12: int *matches=new int[s2.length()];13: //将s2中匹配的字符标号,这个标号的意义在于计算t的值,14: //从前往后遍历,如果顺序不对,则肯定要调换15: //DWAYEN16: //0-132 这是一个matches的例子17: //DUANE18: for(i=0;i<s2.length();++i)19: matches[i]=-1;20: double m=0;//匹配的数目21: for(i=0;i<s1.length();++i)22: {23: is_match=false;24: for(j=i;is_match==false && j>=0 && j>=i-allowrange;--j)25: {26: if(s2[j]==s1[i])27: {28: matches[j]=m++;29: is_match=true;30: }31: }32: for(j=i;is_match==false && j<s2.length() && j<=i+allowrange;++j)33: {34: if(s2[j]==s1[i])35: {36: matches[j]=m++;37: is_match=true;38: }39: }40: }41: double t=0;42: i=0;43: for(j=0;j<s2.length();++j)44: {45: if(matches[j]!=-1)46: {47: if(matches[j]!=i++)48: ++t;49: }50: }51: delete []matches;52: return (m/s1.length()+m/s2.length()+(m-t/2)/m)/3;53:54: }55: double jaro_winkler_distance(string s1,string s2)56: {57: int i;58: double p=0.1;59: int len=0;60: for(i=0;i<4;++i)61: {62: if(s1[i]!=s2[i])63: break;64: ++len;65: }66: double dj=jaro_distance(s1,s2);67: return dj+p*len*(1-dj);68: }
Jaro-Winkler Distance 浅析
最新推荐文章于 2025-04-03 11:01:39 发布
Jaro-Winkler Distance是Jaro Distance的扩展,主要用于衡量两个字符串的相似度。它在计算Jaro Distance的基础上,对起始部分相同的字符串给予更高的评分。公式涉及到匹配字符数、换位数目和前缀匹配长度的调整。该算法在诸如姓名比对等领域有应用。
部署运行你感兴趣的模型镜像
您可能感兴趣的与本文相关的镜像
ComfyUI
AI应用
ComfyUI
ComfyUI是一款易于上手的工作流设计工具,具有以下特点:基于工作流节点设计,可视化工作流搭建,快速切换工作流,对显存占用小,速度快,支持多种插件,如ADetailer、Controlnet和AnimateDIFF等


7084

被折叠的 条评论
为什么被折叠?



