Scripts

Damerau-Levenshtein

Deze functie berekent de Damerau-Levenshteinafstand tussen twee strings, dat is het minimumaantal bewerkingen (invoegen, vervangen of verwijderen) per teken om van de ene string de andere string te maken. Het aantal bewerkingen kan gezien worden als de mate van gelijkenis tussen twee woorden, als beide strings één byte per karakter hebben. Toepassingen: - wachtwoorden afkeuren die te veel lijken op de accountnaam - andere woorden voorstellen bij spelfouten - ... Afhankelijkheden: - Intl-extentie voor Unicode support Zie: - https://nl.wikipedia.org/wiki/Levenshteinafstand - https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance

damerau-levenshtein.php
<?php

/**
 * Damerau-Levenshtein afstand
 * @param string $s Bron
 * @param string $t Doel
 * @return int
 */

function dl_afstand(string $s, string $t) : int
{
  $d = [];  // 2D matrix
  $n = grapheme_strlen($s); // Stap 1
  $m = grapheme_strlen($t);
  if (0 === $n) {return $m;}
  if (0 === $m) {return $n;}
  for ($i = $n; $i >= 0; $i--) {$d[$i] = [];}  // Maak array van arrays aan
  for ($i = $n; $i >= 0; $i--) {$d[$i][0] = $i;} // Stap 2
  for ($j = $m; $j >= 0; $j--) {$d[0][$j] = $j;}
  for ($i = 1; $i <= $n; $i++) {  // Stap 3
    $s_i = grapheme_substr($s, $i - 1, 1);
    for ($j = 1; $j <= $m; $j++) {  // Stap 4
      // Controleer de kartelige Lehvenstein-afstand totaal tot nu toe
      if ($i === $j and isset($d[$i][$j]) && $d[$i][$j] > 4) {return $n;}
      $t_j = grapheme_substr($t, $j - 1, 1);
      $cost = ($s_i === $t_j) ? 0 : 1;  // Stap 5
      $mi = $d[$i - 1][$j] + 1;  // Bereken het minimum
      $b = $d[$i][$j - 1] + 1;
      $c = $d[$i - 1][$j - 1] + $cost;
      if ($b < $mi) {$mi = $b;}
      if ($c < $mi) {$mi = $c;}
      $d[$i][$j] = $mi;  // Stap 6
      // Damerau transpositie
      if ($i > 1 and $j > 1 && $s_i == grapheme_substr($t, $j - 2, 1)
        and grapheme_substr($s, $i - 2, 1) == $t_j)
      {
        $d[$i][$j] = min([$d[$i][$j], $d[$i - 2][$j - 2] + $cost]);
      }
    }
  }
  // Stap 7
  return $d[$n][$m];
}

Reacties

0
Nog geen reacties.