phpbar.de logo

Mailinglisten-Archive

[php] "weiche" Suchmaschine

[php] "weiche" Suchmaschine

Manuel Hossfeld lists_(at)_hossfeld.de
Thu, 4 Nov 1999 00:27:02 +0100


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