【问题标题】:Peculiar behaviour of Jaro Distance in JellyFishJellyFish 中 Jaro 距离的特殊行为
【发布时间】:2013-11-29 04:28:15
【问题描述】:

我正在尝试使用 Jellyfish 来处理模糊字符串。我注意到 jaro_distance 算法的一些奇怪行为。

我之前在使用 damerau_levenshtein_distance 算法时遇到了一些问题,这似乎是代码中的一个错误,然后堆栈用户在 github 上将其作为问题提出。

我不确定我是否在考虑测量错误,或者它是否是一个真正的错误。我查看了源代码(http://goo.gl/YVMl8k),但我不熟悉 C,所以我很难知道这是一个实现问题,还是我错了。

注意以下几点:

In [1]: S1 = Poverty
In [2]: S2 = Poervty
In [3]: jf.jaro_distance(S3, S4)
Out[3]: 0.95238095

现在如果我对 jarrow 距离度量的理解是正确的,我相信结果应该是0.9285714285

我已经确定了计算出错的原因。要计算度量,我认为以下是正确的:

(7.0/7.0 + 7.0/7.0 + ((7.0 - (3.0/2.0))/7.0) * (1.0/3.0) = 0.9285714285

该表达式中的关键数字是 3.0。这个数字必须代表“匹配的数量(但顺序不同)”(维基百科)。在我看来,在 S1 和 S2 中,匹配但顺序不同的字符是 'e'、'r'、'v'。

但是,JellyFish 在计算时似乎只识别出两个换位:

(7.0/7.0 + 7.0/7.0 + ((7.0 - (2.0/2.0))/7.0) * (1.0/3.0) = 0.95238095

这是我错了,还是函数中有什么不好的地方?

【问题讨论】:

    标签: string python-2.7 fuzzy-comparison


    【解决方案1】:

    如果您查看Jellyfish source code jaro.c,您会看到转置数存储在变量trans_count 中,其类型为long。这意味着当它被二除时:

    trans_count /= 2;
    

    这使用了 C 的整数除法,它会截断结果。因此,在您的示例中(POVERTY/POERVTY),换位次数为 3,但除以 2 时变为 1。

    这是对的吗?好吧,我尝试了以下研究途径:

    1. Wikipedia article 无济于事,因为所有示例都有偶数个转置。 (它给出了 MARTHA-MARHTA 的 Jaro 得分为 0.944,Jaro-Winkler 得分为 0.961。)

    2. Jaro's 1989 paper 未开放访问。

    3. Winkler's 1990 paper 不明确。他只说:

      不匹配的字符数除以 2 得到转置数。

      没有指示除法后是否要截断。尽管 Winkler 给出了许多示例,但我发现使用他在论文中描述的算法无法重现这些值。例如,他给 MARTHA-MARHTA 的 J-W 分数为 0.9667(见表 1),我不知道如何解释文本以使其正确。所以这篇论文是没有用的。也许值得写信给温克勒解释一下?

    4. 如果您查看“official string comparator to be used for matching during the 1995 Test Census”的代码(该代码基于“Bill Winkler、George McLaughlin 和 Matt Jaro 编写的代码,并由 Maureen Lynch 修改”),您会发现它计算了变量N_trans,其类型为long,因此截断了除法,与Jellyfish 一致。

      (由于额外的“长字符串调整”,此代码给出的 MARTHA–MARHTA 得分为 0.9708。)

    所以在我看来,水母的行为至少在历史资料的基础上是合理的。但这似乎是一个错误,因为它无缘无故地丢失了有关换位次数的信息。

    【讨论】:

    • 令人着迷!我向开发人员发送了有关 Levensthein 距离错误的邮件,他回复了我,我提到了这一点,所以也许他会告诉我为什么他们做出这个决定。在我发现这个问题后,我只是认为这是一个错误。似乎测试感觉来源应该是相当可靠的。
    猜你喜欢
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多