| Projekt: WDB / Version: 0.2 | Home | Download | Links | Status | Stuff |
Projekt: Wissensdatenbank
Meistens fangen solche Telefonate oder Mails mit den Worten
"Sag mal, Du kennst Dich doch mit Computern aus ..." an.
Danach folgt dann eine un/detailierte Problembeschreibung und
die Bitte für eine entsprechende Lösung.
In vielen Fällen kann ich helfen, vorausgesetzt ich habe die Zeit dazu.
Um nicht nur mir, sondern eben allen, daß Leben zu erleichtern,
hatte ich die Idee, erfolgreich gelöste Probleme, mit entsprechendem
Lösungsweg in einer Datenbank zu speichern und diese Datenbank
durchsuchbar zu machen. Taucht ein Problem dann erneut auf, brauche ich
nur noch einen entsprechenden Link zu verschicken und fertig.
Alternativ kann man sogar direkt selbst suchen und sein Problem lösen.
Da man sich bei Problemen allerdings nicht erst durch 100+ Treffer ackern
will, muß die Suche entsprechend effizient sein. Und das soll so aussehen:
Wenn eine Problemlösung in der Datenbank gespeichert wird, so durchläuft
sie zuvor einen Indizierungsprozess, der erstmal den gesamten Text in seine
einzelnen Wörter zerlegt. Diese Wörter werden dann einzeln in der Datenbank
gespeichert und mit einer eindeutigen Nummer versehen. Danach werden diese
eindeutigen Nummern zusammen mit der entsprechenden Text-ID in der Datenbank
gespeichert. Beispiel:
Text-Datenbank:
217 Onkel Otto sitzt auf einem Baum.
Wort-Datenbank:
... 2739 Onkel ... 2740 Otto ... 2741 sitzt ...
Verbindungsdatenbank
... 2739 217 ... 2740 217 ... 2741 217 ...
Sucht jetzt jemand nach Onkel Otto so wird in der Wort-Datenbank geguckt,
gefunden wird 2739 & 2740, diese Werte werden in der Verbindungsdatenbank
abgefragt und heraus kommt 2 x Text 217. Also hat Text 217 irgendwas mit
Onkel Otto zu tun und wird als Suchtreffer ausgegeben.
Soweit die noch recht einfache Theorie. Weiter zur Praxis.
Das erste Problem was sich mir stellt und woran ich mich derzeit
versuche, ist das Runterbrechen des gesamten Textes auf seine
einzelnen Wörter. Das ist nicht ganz so easy wie es sich anhört.
Um die einzelnen Wörter zu bekommen, trenne ich erstmal den Text
anhand seiner Leerzeichen, bzw. seiner Zeilenumbrüche.
Das habe ich mit Hilfe der ord()-Funktion von PHP gelöst. Diese gibt
den ASCII-Zahlenwert eines Zeichens zurück. Ein Leerzeichen
entspricht der 32 und ein Zeilenumbruch der 13. Problem sind nun die
Satzzeichen. Bei "Onkel Otto sitzt auf einem Baum." haben wir am Ende
das Wort "Baum.", es sucht aber hinterher kein Mensch nach "Baum.",
sondern nach "Baum". Genau so verhät es sich mit "!, ?, und ,.
Derzeit bastel ich also an einem regex gestützen Code, der sowas
entsprechend filtert. Dabei bin ich mir allerdings nicht sicher, ob ich nun
nur Worte zulasse, oder beispielsweise auch Datumsangaben,
oder E-Mail Adressen, wo man nicht einfach einen Punkt rausnehmen darf.
Ein weiteres Problem liegt auf der anderen Seite, nämlich der
eigentlichen Suche. Je mehr Texte in der Datenbank stehen, desto mehr
Entsprechungen, werden zu einem Suchwort gefunden. Dabei müssen
Suchwörter und Suchtreffer nicht zwingend korellieren. Ich kann also
nach z.B. drei Suchbegriffen suchen und bekomme für Wort 1 vielleicht
13 Treffer, für Wort 2 vielleicht 3 Treffer und für Wort 3 noch was anderes,
z.B. 8 Treffer. Um mir nicht den ganzen Aufwand, mit der Wortindizierung,
nutzlos zu machen, muß ich jetzt die Trefferhäufigkeit in Abhängigkeit von
den gefundenen Texten und den Suchwörtern untereinander bewerten.
Ich muß also irgendwie rauskriegen, in welchem Text habe ich die größte
Schnittmenge aller Suchwörter.
Dazu mal wieder ein kleines Beispiel:
Suchbegriffe: Onkel Otto Baum
Folgendes Suchergebnis wird angenommen:
| Suchbegriff | Texte in denen der Suchbegriff gefunden wurde | Anzahl |
| Onkel | 1,2,18,40,77,78,82,89,93,110,152,171,215 | 13 |
| Otto | 1,18,51 | 3 |
| Baum | 7,9,12,15,18,80,110,201 | 8 |
Die 18 kommt 3 mal vor.
Die 1 kommt 2 mal vor.
Die 110 kommt 2 mal vor.
Alle restlichen Zahlen kommen jeweils nur 1 mal vor.
Momentan sehe ich als einzige Möglichkeit, jede Trefferreihe für sich
durchzugehen und dabei zu gucken, welche Zahl davon auch in den
anderen Reihen vorkommt. Das wiederum, wird dann auf einer Art
Strichliste festgehalten.
Die Methode funktioniert, erscheint mir allerdings etwas "quick & dirty".
Falls ich etwas besseres finde, werde ich da nochmal dran schrauben.
« Zurück zur Übersicht, über alle Projekte «


