PHP7.4下UTF8字符Levenshtein距离计算函数修正求助
UTF-8字符的Levenshtein距离计算问题
我参考了Stack Overflow上的《Levenshtein distance on diacritic characters》一文,使用以下PHP函数计算UTF-8字符的Levenshtein距离:
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]; }
当传入测试字符串:$string1 = 'încat de counștițe',$string2= 'încântat'
时,函数返回的Levenshtein距离为13,我认为该结果有误。
我梳理了两种修改$string1以匹配$string2的方案:
方案1
- 步骤a:添加字符'ânt',得到
$string1 = 'încântat de counștițe' - 步骤b:删除字符' de counștițe',得到
$string1 = 'încântat'
总修改次数为17次
方案2
- 步骤a:将'a'替换为'â',得到
$string1 = 'încât de counștițe' - 步骤b:删除't de cou',得到
$string1 = 'încânștițe' - 步骤c:删除'ș',得到
$string1 = 'încântițe' - 步骤d:添加字符'at',得到
$string1 = 'încântatițe' - 步骤e:删除字符'ițe',得到
$string1 = 'încântat'
总修改次数为15次
两种方案的修改次数分别为17和15,均与函数返回的13不符。现求助修正该levenshtein_php函数以得到正确结果,或推荐适用于PHP7.4的替代函数(已知无mb_levenshtein函数)。
内容的提问来源于stack exchange,提问作者MMT
相关产品推荐
相关产品推荐

