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
分享到:
相关推荐
是用C扩展编写的算法的实现,在MRI / KRI以外的其他平台(如JRuby或Rubinius)上,将回纯Ruby版本。... jaro_distance "MARTHA" , "MARHTA"# => 0.9444444444444445 没有JaroWinkler.jaro_winkler_
Jaro-Winkler 相似度(Jaro-Winkler Similarity)是一种用于衡量两个字符串相似度的算法,特别适用于比较短字符串或需要考虑字符顺序的情况。它在信息检索、数据清洗和拼写校正等领域广泛应用。 主要特点 基本原理...
当前实现了十二种算法(包括Levenshtein编辑距离和同级,Jaro-Winkler,最长公共子序列,余弦相似性等)。 查看下面的摘要表以获取完整列表... 下载 使用Maven: <groupId>info.debatty <artifactId>java-...
JARO_WINKLER_SIMILARITY(s1, s2)函数返回一个介于 0 和 1 之间的浮点数,其中 0 表示根本没有相似性,1 表示完全匹配。 仅供参考,有很多替代/附加算法来计算语音相似度。 这绝不是一个完整的列表: (也有可用的...
Oracle提供了多个字符相似度函数,其中最常用的包括`SIMILARITY()`和`UTL_MATCH`包中的几个函数,如`JARO_WINKLER()`, `EDITDISTANCE()` 和 `SIMILARITY()`。 1. **SIMILARITY()** 函数: 这个函数基于Jaccard...
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 ...
Sara Cohen在其2013年发表于SIGMOD的文章中,探讨了如何使用树编辑距离(Tree Edit Distance)来解决大规模树集合中的子树相似性搜索问题。 首先,文章定义了树编辑距离。在比较树结构时,编辑距离是指将一棵树转换...
java-string-similarity, 各种字符串相似性和距离算法 java-string-similarity 实现不同字符串相似度和距离... 目前已经实现了许多算法( 包括Levenshtein编辑距离和 sibblings,jaro winkler,最长公共子序列,余弦相
- **Hybrid Word Similarity Calculation (HWSC) 方法**:这是一种混合词相似度计算方法,结合了HowNet(汉语知识库)和TongYiCi CiLin(同义词词林)两种资源。 - **HowNet**:提供了丰富的语义信息,包括词汇的...
贝达 获取BEDA ...介绍 BEDA是一个golang库,用于检测两个单词或...Jaro&Jaro Winkler Distance:一个字符串度量,用于测量两个序列之间的编辑距离。 BEDA是印度尼西亚语中“不同”的意思。 用法 import "github.com/h
Algorithm-java-string-similarity.zip,各种字符串相似度和距离算法的实现:levenshtein、jaro winkler、n-gram、q-gram、jaccard索引、最长公共子序列编辑距离、余弦相似度……,算法是为计算机程序高效、彻底地完成...
推荐系统是互联网技术发展的一个重要分支,它通过智能分析用户行为和偏好,为用户主动提供个性化的信息和服务,极大提升了用户体验。在众多推荐系统技术中,协同过滤(Collaborative Filtering, CF)算法因其出色的...
各种字符串相似度和距离算法的实现:Levenshtein,Jaro-winkler,n-Gram,Q-Gram,Jaccard索引,最长公共子序列编辑距离,余弦相似度......
1. 各种字符串距离度量算法的实现,如Levenshtein距离、Jaccard相似度、Jaro-Winkler距离等。 2. 余弦相似度计算,可能包括对预处理后的词频向量进行处理的方法,如TF-IDF(词频-逆文档频率)转换。 3. 本体相关的...
3. **Jaro-Winkler距离**:Jaro距离基础上增加了前几个字符匹配的加权项,更适合于名字或短字符串的比较。 4. **Hamming距离**:如果两个等长字符串在相同位置的字符不同,那么它们的Hamming距离就是这些位置的数量...
Jaro-Winkler是Jaro算法的改进版,它在字符串开头相似的部分给予更高的权重,提高了对短字符串的匹配性能。在某些情况下,如名字匹配,Jaro-Winkler效果更好。 6. **Pair letters Similarity**: 这种方法可能...
当前实现了十二种算法(包括Levenshtein编辑距离和同级,Jaro-Winkler,最长公共子序列,余弦相似性等)。 查看下面的摘要表以获取完整列表...下载使用NuGet: Install-Package F23.StringSimilarity总览下面介绍了...
《Similarity V1.8.4 beta:音乐文件相似度检测工具详解》 在数字化的音乐世界里,我们经常遇到一个问题:如何有效地管理和查找重复或相似的音乐文件。"Similarity V1.8.4 beta"就是为此目的设计的一款强大工具,它...
WordNet Similarity是自然语言处理领域中一个重要的工具,它主要用来衡量两个词语在语义上的相似程度。WordNet是一个大型英语词汇数据库,由多个层级的词汇网络组成,每个节点代表一个词汇,节点间通过各种关系...
在这个主题中,我们将深入探讨如何在Haskell这种纯函数式编程语言中高效地实现几种常见的字符串指标:Levenshtein距离、Jaccard相似性、Jaro-Winkler距离、Hamming距离以及Jaro距离。 首先,让我们从Levenshtein...