作者:峰子 | 来源:互联网 | 2023-01-29 02:47
我们一直在使用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
这段代码看起来正确,但是以某种方式与Wikipedia文章中有关前缀长度提取的规范不匹配:
l是字符串开头的公共前缀长度,最多四个字符
根据我的理解,前缀匹配大小不得超过4。
Apache Commons Text实现确实可以提高带有长公共前缀的字符串的得分。例如:
"john.fernandez@onepointltd.com" - "john.fernandez@onepointlt.co"
如果由Apache Commons文本实现评估,则将返回1.0,这意味着我们完全匹配。这感觉不对。
我对社区的问题是:Apache实现不应将前缀长度限制为最多4个吗?