使用Jaro-Winkler,A和B之间的距离是否等于B和A?

时间:2019-07-16 09:07:17

标签: php fuzzy-comparison jaro-winkler

我正在使用以下class来计算两个字符串之间的Jaro-Winkler distance。我注意到的是,字符串A和B之间计算出的距离并不总是与字符串B和A相同。这是可以预期的吗?

RAMADI ~ TRADING
0.73492063492063

TRADING ~ RAMADI
0.71825396825397

Demo

1 个答案:

答案 0 :(得分:0)

结果是,在网上找到了很多地方的Jaro-Winkler字符串比较方法的PHP版本中存在一个错误。

当前,与字符串B相比,字符串A与字符串B的结果与字符串B的结果不同。当字符串A或B包含两个字符串中都存在的字符时,在一个字符串中找到一个以上字符串。这是不正确的。 在比较A与B的匹配值与B与A的匹配值时,Jaro-Winkler方法应产生相同的结果。

为此,在识别公共字符时,不应重复相同的字符。常见字符变量需要删除重复数据后才能返回。

以下代码将公共字符串替换为使用公共字符作为键的数组,以避免重复。通过使用下面的代码,与B相比,A与B的结果相同。

这与该方法的C#版本一致。

//$commonCharacters='';
# The Common Characters variable must be an array
$commonCharacters = [];
for( $i=0; $i < $str1_len; $i++){
    $noMatch = True;
    // compare if char does match inside given allowedDistance
    // and if it does add it to commonCharacters
    for( $j= max( 0, $i-$allowedDistance ); $noMatch && $j < min( $i + $allowedDistance + 1, $str2_len ); $j++) {
        if( $temp_string2[(int)$j] == $string1[$i] ){ // MJR
            $noMatch = False;
            //$commonCharacters .= $string1[$i];
            # The Common Characters array uses the character as a key to avoid duplication.
            $commonCharacters[$string1[$i]] = $string1[$i];
            $temp_string2[(int)$j] = ''; // MJR
        }
    }
}
//return $commonCharacters;
# When returning, turn the array back to a string, as expected
return implode("", $commonCharacters);