Apache Jaro Winkler实现中的潜在错误?

gil*_*des 5 java apache fuzzy

我们一直在使用Apache Commons文本中的Jaro Winkler模糊匹配算法实现,并且在研究代码时发现了潜在的缺陷。

似乎此实现是基于有关Jaro-Winkler的非常容易理解的Wikipedia文章:

https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance

Jaro Winkler使用公式来计算两个字符串的接近度。输出通常是0.0到1.0的两倍。Jar-Winkler的内部公式使用匹配项换位符和公共前缀的数量长度作为输入。

在研究Apache Commons Jaro Winkler实现(请参阅https://commons.apache.org/sandbox/commons-text/jacoco/org.apache.commons.text.similarity/JaroWinklerDistance.java.html)时,我们看到了此代码的前缀长度提取:

int prefix = 0;
for (int mi = 0; mi < min.length(); mi++) {
    if (first.charAt(mi) == second.charAt(mi)) {
        prefix++;
    } else {
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码看起来正确,但是以某种方式与Wikipedia文章中有关前缀长度提取的规范不匹配:

l是字符串开头的公共前缀长度,最多四个字符

根据我的理解,前缀匹配大小不得超过4。

Apache Commons Text实现确实可以提高带有长公共前缀的字符串的得分。例如:

"john.fernandez@onepointltd.com" - "john.fernandez@onepointlt.co"
Run Code Online (Sandbox Code Playgroud)

如果由Apache Commons文本实现评估,则将返回1.0,这意味着我们完全匹配。这感觉不对。

我对社区的问题是:Apache实现不应将前缀长度限制为最多4个吗?