levenshtein în PHP

Calculează câte modificări de caractere sunt necesare ca un text să devină altul (distanța Levenshtein).

Sintaxă
levenshtein(string $string1, string $string2, int $insertion_cost = 1, int $replacement_cost = 1, int $deletion_cost = 1): int

Ce face levenshtein

levenshtein numără inserările, înlocuirile și ștergerile de caractere prin care primul text devine al doilea. Cu cât numărul este mai mic, cu atât textele sunt mai apropiate; 0 înseamnă identice.

Este folosită pentru sugestii de tip „Ai vrut să scrii…?”. Costul fiecărei operații poate fi schimbat prin ultimii trei parametri. Funcția lucrează pe octeți, deci o diacritică înlocuită contează ca 2 modificări.

Parametri

Parametru Descriere
$string1 Primul text.
$string2 Al doilea text.
$insertion_cost Opțional. Costul unei inserări. Implicit 1.
$replacement_cost Opțional. Costul unei înlocuiri. Implicit 1.
$deletion_cost Opțional. Costul unei ștergeri. Implicit 1.

Ce returnează

Numărul minim de modificări.

Exemple

Exemplul 1: Distanța dintre două cuvinte

<?php
echo levenshtein("Cluj", "Cluj") . "\n";
echo levenshtein("Brasov", "Bracov") . "\n";
echo levenshtein("Iasi", "Iași");

Rezultat

0
1
2

Exemplul 2: Sugestie „Ai vrut să scrii…?”

<?php
$orase = ["Iasi", "Cluj", "Timisoara", "Constanta", "Brasov"];
$scris = "Timisoar";

$cel_mai_bun = null;
$distanta_minima = PHP_INT_MAX;
foreach ($orase as $oras) {
    $d = levenshtein(strtolower($scris), strtolower($oras));
    if ($d < $distanta_minima) {
        $distanta_minima = $d;
        $cel_mai_bun = $oras;
    }
}
echo "Ai vrut să scrii $cel_mai_bun?";

Rezultat

Ai vrut să scrii Timisoara?

Greșeli frecvente

  • Compari cuvinte cu diacritice și distanța pare prea mare: „Iasi” și „Iași” au distanța 2, nu 1, pentru că „ș” are 2 octeți.

Comenzi înrudite

  • similar_text: Calculează cât de asemănătoare sunt două texte, ca număr de caractere comune și ca procent.
  • strcmp / strcasecmp / strncmp: Compară două texte și spune dacă primul este mai mic, egal sau mai mare decât al doilea.