我正在使用以下class来计算两个字符串之间的Jaro-Winkler distance。我注意到的是,字符串A和B之间计算出的距离并不总是与字符串B和A相同。这是可以预期的吗?
RAMADI ~ TRADING
0.73492063492063
TRADING ~ RAMADI
0.71825396825397
答案 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);