2016-07-07 17 views
0

Ich möchte alle Varianten eines Wortes innerhalb 1-Edit-Abstand mit Levenshtein Abstand zu generieren.Wie kann ich alle Varianten eines Wortes innerhalb von 1-Edit-Entfernung (Levenshtein) generieren?

PHP hat eine Funktion, die zwei Strings als Parameter akzeptiert und nur die Zahl (int) der Operationen insert, replace und delete zurückgibt, die benötigt werden, um str1 in str2 umzuwandeln. PHP Manual - levenshtein

int levenshtein (string $str1 , string $str2) 

Ich suche eine PHP-Lösung, einen Algorithmus zu erstellen, die die Varianten eines bestimmten Wortes erzeugt.

+1

Mögliche Duplikat (http [Wie alle Strings zu einem bestimmten Bearbeitungs Abstand von einem gegebenen String finden]: // stackoverflow.com/questions/12886997/how-to-find-all-strings-at-a-given-edit-distance-from-a-given-string) –

+0

Hallo Daniel, ich habe diesen Artikel bereits gelesen, aber es steht geschrieben mit Python und sie sprechen darüber, wie Google-Suche funktioniert. Ich glaube nicht, dass meine Frage doppelt ist. Ich suche hier eine PHP Lösung. –

+0

Wie würden Sie diese Aufgabe mit Stift und Papier erledigen? Nehmen wir an, Ihr Wort ist "AB" und Ihr Alphabet ist "A", "B", "C". Ich denke, es ist einfach für Sie, dies auf dem Papier zu lösen. Schreiben Sie einfach PHP-Code, der dieselben Operationen ausführt wie Sie. –

Antwort

2

Das ist ziemlich einfach für die Entfernung 1. Das Erzeugen aller Möglichkeiten für Entfernungen> 1 wird etwas komplexer.

Beginnen Sie mit einem Wort:

$input = 'word'; 

Split das Wort in Buchstaben und eine Liste der Ersatz zu erzeugen.

$letters = str_split($input); 

$alphabet = range('a', 'z'); 

Löschungen sind die einfachste, nur eine Schleife über jede Position und ersetzen mit '':

foreach ($letters as $i => $letter) { 
    $variants[] = substr_replace($input, '', $i, 1); 
} 

Einfügungen und Ersetzungen können zur gleichen Zeit durchgeführt werden, weil sie werden sowohl eine Schleife über die erfordern Buchstaben in der Eingabe verschachtelt in einer Schleife über dem Alphabet.

foreach ($alphabet as $variation) { 
    foreach ($letters as $i => $letter) { 

     // insertion 
     $variants[] = substr($input, 0, $i) . $variation . substr($input, $i); 

     // substitution 
     // (check that the letter is different or you'll get multiple copies of the input) 
     if ($variation != $letter) { 
      $variants[] = substr_replace($input, $variation, $i, 1); 
     } 
    } 
    $variants[] = $input . $variation; // handle insertion at the end 
} 

Sie können die Ergebnisse überprüfen die levenshtein Abstände korrekt sind, um zu überprüfen:

foreach ($variants as $variant) { 
    $result[$variant] = levenshtein($input, $variant); 
} 
+0

Ihre Antwort ist perfekt. Ich entwickelte gerade meine eigene Lösung, die gute Ergebnisse erzielt. Es war eine ähnliche Vorgehensweise wie deine, aber deine ist noch besser. Danke für die Mühe. –

+1

Danke, dass du mir nicht gelangweilt hast. –