meyer88

Fehlertolerante Systeme oder Fehlertolerante Suchalgorithmen sind in der Lage, auftretende Fehler abzufangen und entsprechend, auch auf die Fehlermeldung abgestimmt, zu reagieren. Unvollständigkeiten  oder Fehler bei der Eingabe in ein Suchenfeld sollten dem Nutzer nicht einfach als 'error messages' quittiert werden. Eine mögliche Strategie für fehlertolerantes Suchen mit PHP und MySQL ist:

  1. Eine Datenbankabfrage sucht nach einem Stichwort im Klartext.

// (...)
$Titel_Stichwort="Mainboard";
$STRSQL_01="SELECT master.idmaster, master.titel, master.body
  FROM master WHERE master.titel = \"$Titel_Stichwort\"
Order by master.titel asc limit 0,1 ";
// (...)

  2. Liefert die MySQL-Abfrage keine Ergebnismenge wird das Suchwort mit einer "function" in ein phonetisches Suchmuster umgewandelt.
  2.1 Dies könnte in PHP mit dem Befehl soundex() geschehen oder
2.2 mit einer 'eigenen' buchstabenorientierten Substitutionsmethode:

  // Basierend aus dem Artikel "Schreibweisentolerante Suchroutine in dBase implementiert"
// c't - Magazin für Computertechnik 1988, Heft 10, Georg Wilde, Carsten Meyer

function meyer88($Substitution){

  // Alle Buchstaben werden zunächst in Großbuchstaben umgewandelt

$Substitution=strtoupper($Substitution);

// Buchstabenorientierte Substitutionsmethode:
// wandelt Buchstabenkombinationen in gleichlautendes Equivalent um

  $finde = array(

"SC","SZ","CZ","TZ","TS","DS","PH","PF",
"QU","UE","EU","AE","OE","KS","EI","EY",
"K","G","Q","Ü","I","J","ß","F","W","P","T");

  $ersetze = array(

"C","C","C","C","C","C","V","V",
"KV","Y","OY","E","Ö","X","AY","AY",
"C","C","C","Y","Y","Y","S","V","V","B","D");

  for($I=0;$I<27;$I++){
$Substitution = str_replace($finde[$I],$ersetze[$I],$Substitution);
// Doppelte Buchstaben werden entfernt
$Substitution = preg_replace('/(.)\1/', '$1', $Substitution);
}

  return $Substitution
}

3. Die nächste Datenbankabfrage sucht nun das neue Suchmuster. Denkbar ist ein relationales Datenbanksystem: Mit der Tabelle "master" und einer 1:n-Beziehung zu einer Detail-Tabelle: "slave" mit dem Feld: "phonetik"    ⇔ Bedingung hierfür ist, dass zuvor in der Tabelle ein mit demselben Algorithmus (meyer88) indexiertes Feld "phonetik" generiert wurde.

$Titel_Schlagwort_Phonetik=meyer88($Titel_Stichwort);

  $STRSQL_02="SELECT distinct master.idmaster, master.titel, master.body
FROM slave Right JOIN master ON
slave.idslave = master.idmaster
  WHERE slave.phonetik = \"$Titel_Schlagwort_Phonetik\"
Order by slave.phonetik asc";

4. Die Ergebnismenge der Schlagwörter aus $STRSQL_02 lassen sich nun auf mehrere Arten mit dem ursprünglichen Suchwort:  "$Titel_Stichwort" vergleichen.
⇒ In PHP gibt es hierfür zwei Methoden, um ein Maß für die Unterschiede zweier Wörter zurückzuliefern:
  similar_text() => Berechnet die Ähnlichkeit zweier Zeichenketten und
  levenshtein() => Die Levenshtein-Distanz wurde erstmalig 1965 von dem russischer Mathematiker Wladimir Iossifowitsch Lewenstein, als die "minimale Anzahl von Löschungen, Einfügungen und Ersetzungen" definiert, die ein Wort X in das Wort Y umwandelt.

                     
Siehe auch:    Semantische-Suchmachine   NEOGRID   Künstliche-Intelligenz   Objektorientierte-Programmierung