Christian Zill: Volltextsuche: Retrieval, Ranking & Mapping

Beitrag lesen

Liebes Forum, hallo,

ich möchte mein Posting v. 07. Januar 2008, 18:46 erläutern dürfen, wo ich
anhand eines Beispiels mir 3 Punkte angedacht hatte bzgl. der gegebenen
Fragestellung "Volltextsuche: Diskussion zur Relevanz von Suchergebnissen":

Ich schrieb ca. folgendes, jetzt leicht verbessert, wie ich finde:

  
  
GESUCHT WIRD DER "Affe":  
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_  
  
Ich teile das Problem zunächst auf in seine Teilprobleme: Der Volltext wird  
gesplittet in "Wörter". Trivial wäre z.B. anhand der Leerzeichen, mgl. wäre also  
"Alles, was zwischen 2 Leerzeichen steht", oder auch "Die ununterbrochene Menge  
von Zeichen, die im Alphabet enthalten sind". Oder einfach "So viele  
Nicht-Leerzeichen wie möglich". Der Volltext ist jetzt schon mal eine Folge von  
Wörtern. Wenn wir schon mal da sind, streichen wir gleich die  
"Ich-sage-eigentlich-nie-was-wichtiges-aus-Wörter", also diese "der, die, das,  
einer, eine, warum, weshalb, darum" oder ähnliche( o.ä. ). Dbzgl. empfiehlt sich  
die Führung einer Bannliste von "Unwörtern", am besten in einer Text-Datei, die  
leichter zu pflegen ist. Bis jetzt könnte das Ganze als kleines C-Programm  
geschrieben werden, in Form einer Schleife, die solange läuft, bis der Volltext  
"aufgegessen" ist: Suche nächstes Leerzeichen, pack' in der Folge alle  
Nichtleerzeichen in die Variable "Wort", und wenn ein Leerzeichen kommt, schieb'  
den aktuellen Inhalt der Variablen "Wort" in die Liste der bisher gefundenen  
Wörter. Ich glaube, das ist mithilfe von Zeigern und C schnell genug. Zu prüfen  
wäre noch die Möglichkeit eines sogenannten Parsers, wg. der Schnelligkeit.  
Schön wäre auch die Möglichkeit, den Volltext schon hier weiter unterteilen zu  
können, ich will Teiltextblöcke. In einem Forumstext böte sich hier an der  
Thread. In einem HTML-Quelltext böte sich hier an der HTML-Quelltext. Zu  
letzterem:  
  
1\. Wenn der HTML-Text NICHT geparst wird, verliert man, meines Erachtens( m.E. )  
unnötigerweise, vielleicht später doch noch wichtige "Information". Ich meine damit  
folgendes: In HTML sollte der Text hierarchisch strukturiert sein, und er ist es in  
der Regel( i.d.R. ) auch. Wenn wir uns diese Hierarchien erhalten, können  
wir später z.B. von der Hierarchiestufe des "höchsten" Treffers nach unten hin  
wandernd alles das ausgeben, was drunter ist. Sozusagen, und( & ) besser m.E:  
Vom Allgemeinen ins Spezifischere. Erlaubt sei bitte folgendes, bevor ich's  
vergess' wieder mal, ein Beispiel( also ein Beispiel im Beispiel, grmpf.( ?! ) ):  
  
Gesucht wird "DIV-Layout". Gemeint ist aber vielleicht eher float-Layout, und das  
Kernproblem, welches beim Auffinden einen qualitativ wertvollen Treffer  
darstellen würde, bestünde für den User im Hinweis auf ein nötiges  
Clear:[left/right/both], "wann?" und "wo?" und "etc.?" ... . Also der User hat  
sich verrannt, im Tunnel, und da ist kein Licht. Da muß dann halt gebohrt  
werden, m.E., und es TUT weh. Deswegen fände ich an dieser Stelle  
"Schlagwortlinks" eine sehr gute Idee: Die gäben schon mal die Himmelsrichtung  
des Lichts( jaja, der Erkenntnis, nein, ich will's mir nicht immer verkneifen  
müssen, bitte ) an.  
  
Oder aber: Gemeint ist vielleicht eher 3-col-Layout( Der heilige Gral ): Das  
Kernproblem, welches beim Auffinden einen qualitativ wertvollen Treffer  
darstellen würde, bestünde für den User im Hinweis auf eine Komplettlösung, die  
in der Hierarchie nicht unterhalb seines eingegebenen "DIV-Layouts" liegt,  
sondern drüber.  
  
Ingesamt sollte es also in dem Text sowas wie oben, unten, Norden, Süden, Osten  
geben. Und das ist schön. Das gibt es ja auf einer Website. Man müßte diese  
Struktur also abbilden, und wir hätten ein baumartiges Gebilde. Ich denke jetzt  
an Wurzeln, Stämme, Zweige und Blätter im Wald( jaja, nein, es ging, danke ).  
Tragfähig wäre auch das Bild eines Bergwerkgebietes, dort wird gediggert, soll  
heißen "nach Treffern geschürft". Es gibt in diesem Gebiet Schatzkammern, und da  
müssen breite Tunnel gebohrt werden, insgesamt ein richtiges Netzgeflecht von  
Schatzkammern und Tunneln. Also richtiger Wahnsinn an totaldurchlöchertem  
Ruhrgebiet erstmal. Von jeder Schatzkammer zu jeder Schatzkammer einen  
Direktdurchgang. Jetzt könnte man zählen: Welche Tunnel haben wieviele  
Kreuzungen. Je mehr Kreuzungen, umso autobahnähnlicher sollte der Tunnel  
ausgebaut werden. Es ergibt sich u.U. sowas wie die allergrößte Autobahn( A0 ).  
Und vielleicht sowas wie A0-0, A0-1, A0-2, .., A0-n. Und seien die Kreuzungen K,  
und die Schatzkammern S, und in den Schatzkammern jeweils die Menge aller  
stetigen Folgen von Nicht-Leerzeichen, nämlich W. Und danns seien diese "W"s  
doch bitte auch noch in den richtigen Schatzkammern "S"s. Also packen wir doch  
diese Wortfolgen einfach gleich in diese Schatzkammern, wo sie gefunden wurden.  
Was? Ja genau, nur die "Goldenen Worte", also die oben ja schon geparsten. Also  
ich denke langsam an die 7 Zwerge, und Schneewittchen ist auch noch nicht  
gefunden, also weiter jetzt.  
  
Nehmen wir jetzt mal an, wir könnten das ganze Ruhrgebiet so stauchen und  
zerren, daß diese ganzen Tunnel entweder parallel oder rechtwinklig zueinander  
verlaufen. Wir haben dann eine Tabelle von Schatzkammern, und nicht nur eine,  
sondern in die Tiefe gestaffelt, viele, sozusagen eine 3D-Tabelle. Eisen & Kohle  
... . Desgleichen( =dito, also dto., grmpf;( ) eine 3D-Tabelle von den  
Autobahnen. Wir hätten also, wenn wir jetzt mal noch mehr basteln würden, in  
unserem Text ein Oben, Unten, und die Himmelsrichtungen, meines, vielleicht  
vorschnellen, Erachtens. Und wir hätten das Erz geschmolzen, die Kohle  
gereinigt. Das Ruhrgebiet ist jetzt quadratisch, praktisch gut, & die Briketts  
sind sauber gestapelt. Im Tunnelsystem brennt noch kein Licht, wofür auch, es  
gibt ja, - noch - , keine Hinweisschilder, und dbzgl. kriegen die Schatzkamern  
jetzt mal Namen?  
  
OK, wir machen extremes TF-IDF. Soll heißen wir denken mal nach, was suchen wir  
eigentlich? Eisen, Kohle, Kobalt, Nickel, Kupfer, Zinn, arghs, nein. Vielleicht  
steht das schon irgendwo? Also m.E. evtl. schon im Schlagwortindex, den wir aber  
noch nicht haben. Also stop, und ich glaube jetzt müssen wirklich WIR denken, &  
nicht der Computer. Wir müssen uns eine Liste der Wörter erarbeiten, die wichtig  
sind, also VIP-Wörter. Das sind, bei wie immer gebotener Userzentriertheit, DIE  
Worte, die die Menge aller User jemals eingegeben hat, und die keine "Unworte"  
sind, siehe oben( s.o. ). Also wir rennen jetzt einfach mal los. PAUUUUTZ! Wir  
sind mit dem Kopf gegen die Wand gerannt, totzdem, wir haben was gelernt. Wir  
sind jetzt bescheiden und werten nur noch Fragen aus, die von wenigen  
Auserwählten gestellt werden. Sozusagen Volksvertretern. Das sind dann schon mal  
weniger, und dann klappt das auch, selbst wenn alle dureinanderreden wie an der  
Börse ja auch. Zumindest ein Anfang wäre gemacht, der ja dann ergänzt werden  
könnte ... . Wir haben also jetzt also eine ganze Menge an möglichen  
Suchwörtern. Und jetzt? TF-IDF( ->WIKIpedia ). Also kurz: Wir zählen bzgl. jedes  
Suchwortes in jeder Schatzkammer, wie oft wir an die dortigen Briketts ein  
Schild "Treffer" hängen könnten. Machen wir das einfach mal. Und nochmal und  
nochmal. Am Ende hängen meinetwegen an jedem Brikett 100 Schilder, egal erstmal.  
Und meinetwegen werden die Hauptbriketts vergoldet, per Grammatik, später das  
auch noch, aber erstmal wird verglichen. Die Menge aller Briketts mit dem  
gleichen Schild wird jeweils pro Schatzkammer gezählt. Wovon am meisten drin ist  
das schreiben wir an eine Eingangstafel, die wir an den Höhleneingang hängen.  
Selbstverständlich, als ordentliche Wichtel, gewichten wir noch rum, und wägen  
ab. In den anderen Schatzkammern ist von derselben Sorte Briketts auch ein  
Haufen. Also die Schatzkammer mit dem größten Brikettstapel hat sich ein Schild  
verdient, sozusagen einen Wegweiser: "Hier sind die meisten DIVs". Weil es gibt  
DIVs zwar überall, die lauern zwar an jeder Ecke, aber DA kommen die scheinbar  
her, wir haben das Nest entdeckt, wovon die Plage ausgeht. Wir hängen gleich ein  
Schild hin: "Achtung! DIVS!", an den Eingang, und an jeden Eingang eins, so in  
der Art: "Also hier liegt zwar alles mögliche, aber in der Hauptsache eher DIVS".  
Fertig? Schön wär's. Und Schneewittchen? Also weiter.  
  
Wir geben uns mehr Mühe jetzt mit den Schildern. Wenn 118 DIVs in der Höhle  
sind, ist die Tafel 118x118, und die Höhle "Layout" z.B. hat 212x212. Simsalabim  
und voodoo, Quadratabweichung und eine Fehlertoleranz, wir wichteln weiter und  
hängen an jede Tür eine ganze Menge Schilder. Die grossen Schilder nach oben,  
die Kleinen nach unten. Und wir katalogisieren alle diese Schilder, in der  
Zentrale. Wir führen dort Listen. Z.B. eine Liste "DIV"s und eine Liste  
"Layout"s. Alarm in der Zentrale: Gefragt ist nach "DIV-Layout: Probleme beim  
Clearing. Hilfe!". Und, klappt's?  
  
Also: "DIV"s in den Schatzkammer S17, S23, S45, .. Sn, schön. "Layout"s in  
S18, S4711 und S69, auch schön. Schön für sich ist garnix, es muss harmonieren.  
Also wo sind zusammengezählt die "DIV"s und "Layouts"s am meisten. Schicken wir  
mal jemanden hin, kucken, ob dort auch noch "Clearing" zu finden ist. Wir finden  
"Clear", "Clearing", "Clear-Bug", "unclear". Wir bewerten die Treffer: "Clear"  
kriegt eine Eins+, "unclear" imerhin noch eine 4. Wir müssen gerecht sein. in  
"Clearing" ist zwar alles nötige gesagt worden, aber leider auch viel Falsches.  
Fehlerabzug. In "unclear" finden sich 4 Totalübereinstimmungen bzgl. der  
Buchstaben, aber das kleine c gilt nur halb. Oder alt gewichtet. Wir wichteln  
uns einen Wert von 0.75 für ein "OK, nur die Gross- & Kleinschreibung stimmt  
nicht". Also Trefferqualitat insgesamt 4,75 IdentischEinheiten( IE ). Aber  
ausserdem steht der Suchbegriff nicht am Wortanfang. 2 Punkte Abzug, 3? Also  
kurz gesagt: Fuzzy-Matching, die Qualität des Matchings wird gemapt auf eine  
normierte Skala, warum nicht [ 0, 0.25, 0.5, 0.75 .. 1 ]?  
  
Wir geben unsere Ergebnisse an die Zentrale. Die Zentrale sammelt die Ergebnisse  
der anderen Trupps. Und rechnet.  
  
S1: 4.75\*( (118x118) + (212x212) ) = soviel,  
S2: 4.75\*( (218x218) + (212x212) ) = soviel,  
S3: 3.75\*( (118x118) + (212x212) ) = soviel.  
  
Und der beste Treffer ist in S2. Wir machen Licht, und der Kunde fährt los.  
  
  
\-------------------------------------------------  
  
Phfftt, das war's. Lang geworden. Und grob, schnell, überfliegermäßig. Bin  
dankbar für jedes bischen Kritik am Text. Vielleicht a la "Käse\_Käse\_Käse" sollte  
besser heißen "So\_So\_So". Und schlagt mich nicht tot. Ich bin zwar ein alter  
Knochen, aber, was Foren angeht, ein junger Hund. Mit großen Pfoten.  
Und müde jetzt mal wieder. Darf ich das jetzt einfach mal so abschicken?  
  
Best regards  
Christian