Supportnet / Forum / Skripte(PHP,ASP,Perl...)
"Ähnlichstes" Wort raussuchen
Frage
Hallo allerseits,
ich möchte, dass wenn jemand ein Wort eingibt, das nicht in der Datenbank existiert, angezeigt wird, welches Wort am ehesten dem entspricht, das man eingegeben hat.
Dazu habe ich folgendes Script:
[code]$sqll = "SELECT deutsch FROM words";
$resultt = mysql_query ($sqll);
while($row = mysql_fetch_array($resultt)){
// eingegebenes falsch geschriebenes Wort
$input = $search;
// Wörterarray als Vergleichsquelle
$words = array($row["deutsch"]);
// noch keine kürzeste Distanz gefunden
$shortest = -1;
// durch die Wortliste gehen, um das ähnlichste Wort zu finden
foreach ($words as $word) {
// berechne die distanz zwischen Inputwort und aktuellem Wort
$lev = levenshtein($input, $word);
// auf einen exakten Treffer prüfen
if ($lev == 0) {
// das nächste Wort ist das Wort selbst (exakter Treffer)
$closest = $word;
$shortest = 0;
// Schleife beenden, da wir einen exakten Treffer gefunden haben
break;
}
// Wenn die Distanz kleiner ist als die nächste gefundene kleinste Distanz
// ODER wenn ein nächstkleineres Wort noch nicht gefunden wurde
if ($lev <= $shortest || $shortest < 0) {
// setze den nächstliegenden Treffer und die kürzestes Distanz
$closest = $word;
$shortest = $lev;
}
}}
echo "Eingegebenes Wort: $input\n";
if ($shortest == 0) {
echo "Exakter Treffer gefunden: $closest\n";
} else {
echo "Meinten Sie: $closest?\n";
}[/code]
Ich glaube allerdings, dass der Teil am Anfang, wo $words = array($row["deutsch"]) steht, falsch ist. Auf jeden Fall bekomme ich - egal was ich im Textfeld eingebe - immer die gleiche Meldung: Meinten Sie "Hut"? Es ist völlig egal, was ich eingebe, es erscheint immer diese Meldung!
Was mache ich falsch?
Antwort 1 von Supermax
richtig wäre es so:
Der Rest des Codes dann wie gehabt, nur die schließende Klammer am Schluß muß noch weg (die mysql_fetch_array()-Schleife wird ja bereits oben abgeschlossen).
Erklärung:
durch
$words = array();
while($row = mysql_fetch_array($resultt)) {
array_push($words,$row["deutsch"]);
}
mysql_free_result($resultt);
$shortest = -1;
// durch die Wortliste gehen, um das ähnlichste Wort zu finden
foreach ($words as $word) {
...Der Rest des Codes dann wie gehabt, nur die schließende Klammer am Schluß muß noch weg (die mysql_fetch_array()-Schleife wird ja bereits oben abgeschlossen).
Erklärung:
durch
$words = array($row["deutsch"]); erzeugst du immer ein Array mit nur einem Element, nämlich dem zuletzt aus der DB gelesenen Wort. Mit array_push() wird stattdessen immer das aktuelle Wort an das Array angehängt.Antwort 2 von Uesch
Danke erstmal,
so müsste es doch jetzt stimmen, oder? Er zeigt nämlich trotzdem nur das letzte Wort an:
so müsste es doch jetzt stimmen, oder? Er zeigt nämlich trotzdem nur das letzte Wort an:
$sqll = "SELECT deutsch FROM words";
$resultt = mysql_query ($sqll);
$words = array();
while($row = mysql_fetch_array($resultt)) {
array_push($words,$row["deutsch"]);
}
mysql_free_result($resultt);
$shortest = -1;
// durch die Wortliste gehen, um das ähnlichste Wort zu finden
foreach ($words as $word) {
// berechne die distanz zwischen Inputwort und aktuellem Wort
$lev = levenshtein($input, $word);
// auf einen exakten Treffer prüfen
if ($lev == 0) {
// das nächste Wort ist das Wort selbst (exakter Treffer)
$closest = $word;
$shortest = 0;
// Schleife beenden, da wir einen exakten Treffer gefunden haben
break;
}
// Wenn die Distanz kleiner ist als die nächste gefundene kleinste Distanz
// ODER wenn ein nächstkleineres Wort noch nicht gefunden wurde
if ($lev <= $shortest || $shortest < 0) {
// setze den nächstliegenden Treffer und die kürzestes Distanz
$closest = $word;
$shortest = $lev;
}
}
if ($shortest != 0) {
echo "<br><br>Meinten Sie: <a href=\"http://www.tierbild.net/lexikon/index.php?search=$closest&button=%3E%3E+Suche\">$closest</a>?";}
}Antwort 3 von Supermax
Wo kommt denn das $search her? Wenn du eine neuere PHP-Version verwendest (>= 4.3), ist die Option register_globals meistens deaktiviert, d.h. du kannst auf per POST oder GET übergebene Variablen nur mit $_POST[] bzw. $_GET[] zugreifen.
Wenn $search also aus einem FORM mit method="get" kommt, mußt du
Du solltest dir generell angewöhnen, nur noch $_SESSION, $_GET und $_POST für den Zugriff auf Session- und Formulardaten zu verwenden, da die Verwendung von register_globals große Sicherheitslücken in deinem Programm aufreißen kann und bei den meisten Server inzwischen ohnehin standardmäßig deaktiviert ist.
Wenn $search also aus einem FORM mit method="get" kommt, mußt du
$input = $_GET['search']; schreiben.Du solltest dir generell angewöhnen, nur noch $_SESSION, $_GET und $_POST für den Zugriff auf Session- und Formulardaten zu verwenden, da die Verwendung von register_globals große Sicherheitslücken in deinem Programm aufreißen kann und bei den meisten Server inzwischen ohnehin standardmäßig deaktiviert ist.
Antwort 4 von Uesch
Perfekt, danke! Klappt jetzt!

