Question #3570   Proposée par Answiki le 01/12/2021 à 19:19:14 UTC

Comment calculer la distance de Levenshtein lorsque les chaînes de caractères contiennent des accents en PHP ?

Answer   Submitted by Answiki on 12/01/2021 at 07:19:42 PM UTC

La fonction native levenshtein() ne permet pas de gérer correctement des chaînes avec des caractères Unicode (typiquement des accents). La meilleure solution est d'utiliser la version ci-dessous de la fonction :

<?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 events in history
Answer by Answiki on 12/01/2021 at 07:19:42 PM

La fonction native levenshtein() ne permet pas de gérer correctement des chaînes avec des caractères Unicode (typiquement des accents). La meilleure solution est d'utiliser la version ci-dessous de la fonction :

<?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];
}

Question by Answiki 12/01/2021 at 07:19:14 PM
Comment calculer la distance de Levenshtein lorsque les chaînes de caractères contiennent des accents en PHP ?
# ID Query URL Count

Icons proudly provided by Friconix.