在PHP中,我使用函数levenshtein()计算Levenshtein距离。对于简单字符,它可以按预期工作,但对于音调字符,如示例
echo levenshtein('à', 'a');
它返回“ 2”。在这种情况下,只需进行一次替换,因此我希望它返回“ 1”。
我想念什么吗?
levenshtein()
像许多PHP函数一样,默认的PHP不支持多字节。因此,在处理带有Unicode字符的字符串时,它将分别处理每个字节并更改两个字节。
没有多字节版本(即mb_levenshtein()
),因此您有两个选择:
1)使用mb_
功能自己重新实现功能。要点可能的示例代码:
<?php
function levenshtein_php($str1, $str2){
$length1 = mb_strlen( $str1, 'UTF-8');
$length2 = mb_strlen( $str2, 'UTF-8');
if( $length1 < $length2) return levenshtein_php($str2, $str1);
if( $length1 == 0 ) return $length2;
if( $str1 === $str2) return 0;
$prevRow = range( 0, $length2);
$currentRow = array();
for ( $i = 0; $i < $length1; $i++ ) {
$currentRow=array();
$currentRow[0] = $i + 1;
$c1 = mb_substr( $str1, $i, 1, 'UTF-8') ;
for ( $j = 0; $j < $length2; $j++ ) {
$c2 = mb_substr( $str2, $j, 1, 'UTF-8' );
$insertions = $prevRow[$j+1] + 1;
$deletions = $currentRow[$j] + 1;
$substitutions = $prevRow[$j] + (($c1 != $c2)?1:0);
$currentRow[] = min($insertions, $deletions, $substitutions);
}
$prevRow = $currentRow;
}
return $prevRow[$length2];
}
2)将字符串的Unicode字符转换为ASCII。但是,如果您特别想计算从变音符号到非变音符号的Levenshtein差异,则可能不是您想要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句