`
cooliufang
  • 浏览: 129905 次
社区版块
存档分类
最新评论

【Similarity calculation】Jaro Winkler distance

阅读更多
based on
http://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance


import java.util.Arrays;

public class JaroDistance {

	public static double jaroDistance(String source, String target) {
		int slen = source.length();
		int tlen = target.length();
		int i, j;
		
		// the match window
		int matchWindow = Math.max(slen, tlen)/2 - 1;
		
		//the number of matching characters
		int m = 0;
		
		//half the number of transposition
		int t = 0;
		
		boolean[] smatched = new boolean[slen];
		boolean[] tmatched = new boolean[tlen];
		
		Arrays.fill(smatched, false);
		Arrays.fill(tmatched, false);
		
		
		if (slen == 0) {
			return tlen == 0 ? 1.0 : 0.0;
		}		
		
		for (i = 0; i < slen; ++i) {
			int start = Math.max(0, i-matchWindow);
			int end = Math.min(i+matchWindow, tlen);
			for (j = start; j < end; j++) {
				if (tmatched[j]) continue;
				if (source.charAt(i) != target.charAt(j))
					continue;
				smatched[i] = true;
				tmatched[j] = true;
				++m;
				break;
			}
		}
		
		if (m == 0) return 0.0;
		
		j = 0;		
		for (i = 0; i < slen; ++i) {
			if (!smatched[i]) continue;
			while (!tmatched[j]) ++j;
			if (source.charAt(i) != target.charAt(j)) 
				++t;
			++j;
		}		
		t = t / 2;
//		System.out.println(m + " " + t);
		
		return ((double)m/slen + (double)m/tlen + (double)(m-t)/m) / 3.0;		
	}
	
	public static double jaroWinklerDistance(String source, String target) {
		int max = Math.min(4, Math.min(source.length(), target.length()));
		int len = 0;
		for (int i = 0; i < max; ++i) {
			if (source.charAt(len) == target.charAt(len)) 
				++len;
		}

		double jaro = jaroDistance(source, target);
		return jaro + 0.1 * len * (1.0 - jaro);
	}
	public static void main(String[] args) {
		String source = "MARTHA";
		String target = "MARHTA";
		System.out.println("Dj = " + jaroDistance(source, target));
		System.out.println("Dw = " + jaroWinklerDistance(source, target));
		System.out.println();
		
		source = "DICKSONX";
		target = "DIXON";
		System.out.println("Dj = " + jaroDistance(source, target));
		System.out.println("Dw = " + jaroWinklerDistance(source, target));
		System.out.println();
	}

}



Output:
Dj = 0.9444444444444445
Dw = 0.9611111111111111

Dj = 0.7666666666666666
Dw = 0.8133333333333332

分享到:
评论

相关推荐

    jaro_winkler:Jaro-Winkler距离算法的Ruby&C实现,支持UTF-8字符串

    是用C扩展编写的算法的实现,在MRI / KRI以外的其他平台(如JRuby或Rubinius)上,将回纯Ruby版本。... jaro_distance "MARTHA" , "MARHTA"# =&gt; 0.9444444444444445 没有JaroWinkler.jaro_winkler_

    JaroWinklerSimilarity

    Jaro-Winkler 相似度(Jaro-Winkler Similarity)是一种用于衡量两个字符串相似度的算法,特别适用于比较短字符串或需要考虑字符顺序的情况。它在信息检索、数据清洗和拼写校正等领域广泛应用。 主要特点 基本原理...

    Java字符串相似度:各种字符串相似度和距离算法的实现:Levenshtein,Jaro-winkler,n-Gram,Q-Gram,Jaccard索引,最长公共子序列编辑距离,余弦相似度..

    当前实现了十二种算法(包括Levenshtein编辑距离和同级,Jaro-Winkler,最长公共子序列,余弦相似性等)。 查看下面的摘要表以获取完整列表... 下载 使用Maven: &lt;groupId&gt;info.debatty &lt;artifactId&gt;java-...

    mysql-doctrine-jaro-winkler-function:与 MySQL 一起使用的 jaro-winkler 相似度函数的 Doctrine 扩展

    JARO_WINKLER_SIMILARITY(s1, s2)函数返回一个介于 0 和 1 之间的浮点数,其中 0 表示根本没有相似性,1 表示完全匹配。 仅供参考,有很多替代/附加算法来计算语音相似度。 这绝不是一个完整的列表: (也有可用的...

    Oracle字符相似度函数

    Oracle提供了多个字符相似度函数,其中最常用的包括`SIMILARITY()`和`UTL_MATCH`包中的几个函数,如`JARO_WINKLER()`, `EDITDISTANCE()` 和 `SIMILARITY()`。 1. **SIMILARITY()** 函数: 这个函数基于Jaccard...

    Naxi sentence similarity calculation based on improved chunking edit-distance

    Aiming at the characteristics of Naxi language, a method is proposed for Naxi sentence similarity calculation. First, according to the characteristics of Naxi language that verbs set back, and nouns ...

    Indexing for Subtree Similarity-Search using Edit Distance

    Sara Cohen在其2013年发表于SIGMOD的文章中,探讨了如何使用树编辑距离(Tree Edit Distance)来解决大规模树集合中的子树相似性搜索问题。 首先,文章定义了树编辑距离。在比较树结构时,编辑距离是指将一棵树转换...

    java-string-similarity, 各种字符串相似性和距离算法.zip

    java-string-similarity, 各种字符串相似性和距离算法 java-string-similarity 实现不同字符串相似度和距离... 目前已经实现了许多算法( 包括Levenshtein编辑距离和 sibblings,jaro winkler,最长公共子序列,余弦相

    Text similarity calculation method based on ontology model

    - **Hybrid Word Similarity Calculation (HWSC) 方法**:这是一种混合词相似度计算方法,结合了HowNet(汉语知识库)和TongYiCi CiLin(同义词词林)两种资源。 - **HowNet**:提供了丰富的语义信息,包括词汇的...

    beda:Beda是一个golang库,用于检测两个字符串的相似程度

    贝达 获取BEDA ...介绍 BEDA是一个golang库,用于检测两个单词或...Jaro&Jaro Winkler Distance:一个字符串度量,用于测量两个序列之间的编辑距离。 BEDA是印度尼西亚语中“不同”的意思。 用法 import "github.com/h

    Algorithm-java-string-similarity.zip

    Algorithm-java-string-similarity.zip,各种字符串相似度和距离算法的实现:levenshtein、jaro winkler、n-gram、q-gram、jaccard索引、最长公共子序列编辑距离、余弦相似度……,算法是为计算机程序高效、彻底地完成...

    An Integrated Item Similarity Calculation Method for Collaborative Filtering

    推荐系统是互联网技术发展的一个重要分支,它通过智能分析用户行为和偏好,为用户主动提供个性化的信息和服务,极大提升了用户体验。在众多推荐系统技术中,协同过滤(Collaborative Filtering, CF)算法因其出色的...

    java-string-similarity

    各种字符串相似度和距离算法的实现:Levenshtein,Jaro-winkler,n-Gram,Q-Gram,Jaccard索引,最长公共子序列编辑距离,余弦相似度......

    java-string-similarity-master.zip_similarity

    1. 各种字符串距离度量算法的实现,如Levenshtein距离、Jaccard相似度、Jaro-Winkler距离等。 2. 余弦相似度计算,可能包括对预处理后的词频向量进行处理的方法,如TF-IDF(词频-逆文档频率)转换。 3. 本体相关的...

    Algorithm-python-string-similarity.zip

    3. **Jaro-Winkler距离**:Jaro距离基础上增加了前几个字符匹配的加权项,更适合于名字或短字符串的比较。 4. **Hamming距离**:如果两个等长字符串在相同位置的字符不同,那么它们的Hamming距离就是这些位置的数量...

    ETL模糊匹配

    Jaro-Winkler是Jaro算法的改进版,它在字符串开头相似的部分给予更高的权重,提高了对短字符串的匹配性能。在某些情况下,如名字匹配,Jaro-Winkler效果更好。 6. **Pair letters Similarity**: 这种方法可能...

    StringSimilarity.NET:Java字符串相似性的.NET端口

    当前实现了十二种算法(包括Levenshtein编辑距离和同级,Jaro-Winkler,最长公共子序列,余弦相似性等)。 查看下面的摘要表以获取完整列表...下载使用NuGet: Install-Package F23.StringSimilarity总览下面介绍了...

    Similarity V1.8.4 beta ...

    《Similarity V1.8.4 beta:音乐文件相似度检测工具详解》 在数字化的音乐世界里,我们经常遇到一个问题:如何有效地管理和查找重复或相似的音乐文件。"Similarity V1.8.4 beta"就是为此目的设计的一款强大工具,它...

    WordNet Similarity 词语相似度

    WordNet Similarity是自然语言处理领域中一个重要的工具,它主要用来衡量两个词语在语义上的相似程度。WordNet是一个大型英语词汇数据库,由多个层级的词汇网络组成,每个节点代表一个词汇,节点间通过各种关系...

    文本指标:在Haskell中有效地计算各种字符串指标

    在这个主题中,我们将深入探讨如何在Haskell这种纯函数式编程语言中高效地实现几种常见的字符串指标:Levenshtein距离、Jaccard相似性、Jaro-Winkler距离、Hamming距离以及Jaro距离。 首先,让我们从Levenshtein...

Global site tag (gtag.js) - Google Analytics