Facebook
Twitter
Google+
Kommentare
0

Funktion der Woche: similar_text()

similar_text()

Mit der Funktion “similar_text” lässt sich die Ähnlichkeit zweier Strings berechnen. Als Rückgabewert erhält man die Anzahl übereinstimmenden Zeichen.

Wenn man eine Variable (als Referenz) als drittes Argument mitgibt, berechnet “similar_text” die Ähnlichkeit als Prozentzahl.

Wofür könnte ich diese Funktion gebrauchen?

Man könnte so zum Beispiel verhindern, dass jemand bei einer Registration ein Passwort wählt welches zu ähnlich mit dem Benutzernamen ist.

Wenn man Texte abspeichert, könnte man mit dieser Funktion überprüfen, ob schon ein ähnlicher Text existiert (zum Beispiel bei einer Witze-Datenbank).

Ich bin mir sicher, dir fallen noch ein paar mehr Beispiele ein…

Worauf muss ich achten?

Die Funktion “similar_text” hat laut Doku eine Komplexität von 0(N**3), wobei N die Länge des längeren der beiden zu vergleichenden Zeichenketten ist.

Dies ist eine ziemlich hohe Komplexität. Damit ist gemeint, dass diese Funktion “viel” Zeit benötigt. Man sollte sich gut überlegen ob man diese Funktion verwendet. Vor allem wenn man die Funktion, z.B. in einer Schleife, mehrmals aufruft.

Beispiel


$username = "DeDu";
$pass = "DeDu1234fgh7j4j";
$percent = 0.0;
$anz = similar_text($pass, $username, $percent);

echo "Übereinstimende Zeichen: ".$anz.". Das sind ".$percent."% Ähnlichkeit...";

Ausgabe:

Übereinstimende Zeichen: 4. Das sind 42.105263157895% Ähnlichkeit...

Levenshtein-Distanz

In Zusammenhang mit “similar_text” möchte ich euch noch eine weitere Funktion vorstellen.

Die Funktion “levenshtein” berechnet die Levenshtein-Distanz. Dies ist die minimale Anzahl an Zeichen die ersetzt, eingefügt oder gelöscht werden müssen um einen String in einen anderen umzuwandeln.

Diese Funktion berechnet also auch die Ähnlichkeit zweier Strings. Denn: Je niedriger der Rückgabewert der Funktion, desto ähnlicher sind die Strings.

Wofür könnte ich diese Funktion gebrauchen?

Wenn man zum Beispiel eine Autokorrektur bauen will, empfehle ich diese Funktion. So könnte man dem User “Apfel” vorschlagen, wenn er “apfl” eintippt (Siehe Beispiel später im Artikel).

Worauf muss ich achten?

Die Funktion ist von der Komplexität her deutlich besser als “similat_text”, aber immer noch ziemlich teuer (benötigt also auch viel Zeit und Ressourcen).

Die Komplexität ist 0(m*n), wobei “m” und “n” die Länge der Strings darstellen (laut Doku).

Aufpassen muss man auch mit Strings, die länger als 255 Zeichen sind. Denn Levenshtein() kann diese nicht verarbeiten. In diesem Fall wird -1 zurückgegeben.

Beispiel

$input = "apfl";

$liste = array("Apfel", "Karotte", "Ananas");

$last = -1;
$gefunden = "";
foreach($liste as $val){
	$anz = levenshtein($input, $val);

	if($anz < $last || $last < 0){
		$last = $anz;
		$gefunden = $val;
	}
}

echo "Ähnlichstes Wort: ".$gefunden." (Input: ".$input.")";

Ausgabe:

Ähnlichstes Wort: Apfel (input: apfl)

Weiterführende Links

Über den Autor

DeDu

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen