Sto cercando di allineare stringhe in PHP usando l'algoritmo di distanza Levenshtein. Il problema è che il mio codice di tracciabilità posteriore non funziona correttamente per tutti i casi. Ad esempio quando il secondo array ha inserito le righe all'inizio. Quindi il tracciamento posteriore andrà solo fino a quando i = 0.Distanza di Levenshtein con tracciatura posteriore in PHP
Come implementare correttamente il back tracing per la distanza di Levenshtein?
Levenshtein distanza, $ s e $ t sono array di stringhe (righe)
function match_rows($s, $t)
{
$m = count($s);
$n = count($t);
for($i = 0; $i <= $m; $i++) $d[$i][0] = $i;
for($j = 0; $j <= $n; $j++) $d[0][$j] = $j;
for($i = 1; $i <= $m; $i++)
{
for($j = 1; $j <= $n; $j++)
{
if($s[$i-1] == $t[$j-1])
{
$d[$i][$j] = $d[$i-1][$j-1];
}
else
{
$d[$i][$j] = min($d[$i-1][$j], $d[$i][$j-1], $d[$i-1][$j-1]) + 1;
}
}
}
// backtrace
$i = $m;
$j = $n;
while($i > 0 && $j > 0)
{
$min = min($d[$i-1][$j], $d[$i][$j-1], $d[$i-1][$j-1]);
switch($min)
{
// equal or substitution
case($d[$i-1][$j-1]):
if($d[$i][$j] != $d[$i-1][$j-1])
{
// substitution
$sub['i'][] = $i;
$sub['j'][] = $j;
}
$i = $i - 1;
$j = $j - 1;
break;
// insertion
case($d[$i][$j-1]):
$ins[] = $j;
$j = $j - 1;
break;
// deletion
case($d[$i-1][$j]):
$del[] = $i;
$i = $i - 1;
break;
}
}
PHP ha [levenshtein] (http://php.net/manual/en/function.levenshtein.php) perché scrivere il tuo ??? – Baba
Rintracciare la matrice di levenshtein è importante per me. Non sono interessato al valore effettivo della distanza di modifica. Uso gli opcode dalla matrice per allineare le righe corrispondenti di due file di testo. Un po 'simile a diff. – mixxu
Per un calcolo corretto della distanza di Levenshtein, con il backtracking, potresti voler dare un'occhiata a questo algoritmo: http://www.cs.toronto.edu/~frank/csc401/tutorials/Levenshtein.pdf – eyecatchUp