You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:57:21