Mailinglisten-Archive |
Hallo, > Ich möchte eine "weiche" Suchmaschine programmieren. Das heißt es können vom > Benutzer komplette Fragen zu einem bestimmten Thema aus der Datenbank > (MySQL) gestellt werden. > > Beispiel: Man nehme an, es gäbe eine Datenbank mit allen Adressen und > Öffnungszeiten aller Schwimmbäder, Sporthallen, etc. Deutschlands. Der User > könnte dann folgende Frage an die Datenbank stellen: > > "Wo kann ich am Samstag in Düsseldorf schwimmen gehen?" Das klingt nach einem ziemlich ambitionierten Vorhaben. Was Du Da beschreibst, ist im Prinzip eine Suchmaschine die mit der Suchanfrage eine linguistische Analyse durchführt. Prinzipiell möglich, aber recht kompliziert. Und ob PHP dafür die richtige Sprache ist... Für das Front-End wohl schon, aber sonst...? Naja, Viel Glück und Ausdauer wünsche ich Dir jedenfalls. > Dann sind ja nur die Wörter "Samstag", "Düsseldorf" und "Schwimmen" wichtig. Wenn Du das so siehst, brauchst Du natürlich keine linguistische Analyse. Einfach nur die Stopwörter rauswerfen ist natürlich ein gängiger und pragmatischer Ansatz. (Und IMHO machen viele der Engines, die behaupten Dich zu verstehen, auch nix anderes). > Alle anderen Wörter würden anhand einer Ausschlußliste wegfallen und an die > Datenbank würde nur ein SELECT mit den genannten Wörtern gestellt. Naja. Ganz so einfach ist es dann doch nicht. Um sinnvolle Ergebnisse zu liefern, sollte das System am besten wissen, daß "Düsseldorf" eine Stadt ist, und "Samstag" ein Tag bzw. eine Zeitangabe. Nur dann kannst Du auch eine strukturierte, also auf einzelnen Attributen bzw. Datenbankfeldern aufsetzende Suche durchführen. Das grundlegende Problem an der Sache ist halt: Menschliche Sprache ist unpräzise: Wenn Du nur im Volltext nach diesen Worten suchst, bekommst Du auch nur Dokumente, in denen diese Worte GENAU SO drin stehen. Wenn der User z.B. fragen würde "Wo ist im Ruhrgegebiet ein Schwimmbad, daß auch am Wochenende geöffnet hat?", bekommt er das Dokument mit "Samstag", "Düsseldorf", "Schwimmen" nämlich nicht. Selbst bei ein und demselben Wort kann es schon Probleme geben: Da in so einer solchen "natürlichsprachlichen Anfrage" der User ja nicht selbst trunkiert (sprich: Wildcards wie z.B. * benutzt), kann theoretisch ja auch jede Wortform vorkommen. Klar, Du kannst einen Stemmer (also einen Algorithmus, der Wörter auf ihre Stammform oder sogar ihre Grundform zurückführt) einsetzen, der dann einfach die gängigen Wort-Endungen "abschneidet". Im Englischen funktioniert das z.T. sogar ganz gut, im Deutschen jedoch nicht unbedingt. Angenommen man sagt: Stammform = Wort ohne Endungen "er" und "en". Dann geht das bei z.B bei "Burgen" -> "Burg", "Düsseldorfer" -> "Düsseldorf" usw. Die Stammform von Schwimmbäder ist dann aber "Schwimmbäd"... Und wenn im Index "Schwimmbad" steht, hast Du schon wieder verloren. Du siehst, wenn man das ganze "richtig" machen will, wird es ziemlich komplex (und sprengt definitiv den Rahmen dieser Mail - zumal es ja gar nix mehr mit PHP zu tun hat.) Ich sehe im Prinzip zwei (ggf. miteinander kombinierbare) Ansätze für Dein Vorhaben: 1. mit Hilfe von diversen mehr oder minder ausgefallenen Methoden des Information Retrieval (wie oben z.T. angedeutet: Stemming, Clustering, Relevance Feedback, Linguistische Analyse, Vektorbasiertes Retrieval etc.etc...) 2. mit Hilfe von Verfahren der KI (Künstliche Intelligenz. D.h. Dein System bekommt - z.B. mit dem schon erwähnten Prolog - "Weltwissen" eingeimpft, in Form von Regeln wie: "Düsseldorf"->Stadt, "Bonn"->Stadt, "Schwimmgelegenheit"->Schwimmbad, "Schwimmgelegenheit"->Freibad, usw.usf... BTW: Die Prolog-Fans mögen es mir nachsehen, wenn ich die Pfeile jetzt genau falschrum gemacht haben sollte) In jedem Fall empfehle ich: Besorg Dir weiterführende Literatur. > Wo bekomme ich Listen mit solchen Auschlußwörtern her (der, die, das, wo, > wann, ich, du, er, sie, etc.)? Naja, da hast Du doch schon mal die wichtigsten. Ggf. lies halt einfach mal ein paar beliebige, möglichst "alltägliche" Texte durch und notiere Dir weitere Wörter die Dir auffallen. > es werde ja mit Sicherheit mehrere 1000 > Wörter sein. Eher nicht. Die typischen Stopwort-Listen heutiger Search-Engines sind IMHO recht klein. Speicherplatz spielt ja keine Rolle mehr, und das "Wegwerfen" möglicherweise doch "brauchbarer" Wörter richtet unter Umständen größeren "Schaden" an, als ein paar "zuviel" im Index stehen zu haben. Bei Deiner obigen Liste könnte man sich z.B. schon fragen, ob es besonders klug ist die Fragewörter "Wo", "Wann", etc. rauszuwerfen. Schließlich soll Deine Maschine doch mal Fragen beantworten... (Wobei man dafür widerum zwei Verschiedene Stopwort-Listen benutzen könnte: Eine für die Indexierung, eine für die Query) Aber lassen wir das. Schluß jetzt. ;-) > Oder gibts es sogar fertige Tools (Löhn-, Share- oder Freeware), die man > dafür verwenden könnte? Keine die mir spontan einfallen... Aber such halt mal im Web. Ich könnte mir schon vorstellen, daß es da Ansätze gibt. CU, Manuel
php::bar PHP Wiki - Listenarchive