Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#10

AW: Was ist die beste Lösung für eine Keywort-Filterung per SQL ?

  Alt 12. Jul 2021, 10:33

Dann gibt es eine Tabelle Wörter: Sie enthält alle gefundenen Wörter und eine eindeutige ID für das Wort. (Jedes Wort kommt in dieser Tabelle natürlich nur einmal vor.)
Dann könnte das eine Art "Wörterbuch über Alles" werden, wächst das nicht extrem an ?
Auf der anderen Seite hatte ich schonmal vor Jahren mit solchen Text-Wörderbücher gearbeitet, das war durchaus überschaubar von der Größe.
Man benutzt eben doch nicht unendlich viele Kombinationen.
Wie groß wird Dein Wörterbuch denn ?
Bedenke bitte: Die Tabelle Wörter enthält jedes Wort genau einmal, egal wie oft es vorkommt.

Der deutsche Wortschatz beträgt ca. 75.000 Wörter, nimmt man alle Fremdwörter ... dazu, kommt man auf sowas von 300.000 bis 500.000 Wörtern.
Sollte in den von Dir zu "verarbeitenden" Daten das alles vorkommen, so kannst Du damit halt die Größe der Tabelle Wörter "dimensionieren".

Der aktive Wortschatz (also die Wörter, die wir im täglichen Bedarf nutzen) liegt bei ca. 12.000 bis 16.000 Wörtern, der passive Wortschatz (also die Wörter, die wir verstehen) liegt mit ca. 50.000 deutlich darüber. (Der Umfang des deutschen Wortschatzes.)

Mengengerüst einer Datenbank mit Texten ala ct:
SQL-Code:
select count(*) from FILES; -- Dateien = 269314

select count(*) from FILES_WORDLIST; -- 1:n-Beziehung Files zu Wordlist: 14090788 -> ca. 52 unterschiedliche Wörter pro Datei

select count(*) from WORDLIST; -- Wörter: 79313
Bei meinen gesammelten Onlinebüchern, Tutorials, ... (englisch, deutsch bunt gemischt) sieht es so aus:
SQL-Code:
select count(*) from files; -- Dateien = 497130

select count(*) from FILES_WORDLIST; -- 1:n-Beziehung Files zu Wordlist: 48458032 -> ca. 97 unterschiedliche Wörter pro Datei

select count(*) from WORDLIST; -- Wörter: 848999
Und nun noch meine Quelltextverwaltung (da sind neben den Sourcen auch die Readme, Dokumentationen, ... drinne):
SQL-Code:
select count(*) from files; -- Dateien = 748459

select count(*) from FILES_WORDLIST; -- 1:n-Beziehung Files zu Wordlist: 31176940 -> ca. 42 unterschiedliche Wörter pro Datei

select count(*) from WORDLIST; -- Wörter: 1732472
Beim Aufbau bzw. der Befüllung der Tabelle Wörter solltest oder könntest Du ggfls. etwas "sparen", indem Du dafür sorgst, dass "Dauerwörter" (sowas wie der die das ... ein eine einer ..., oder, auf, und, davon ... - also alles das, was für eine sinnvolle Suche irrelevant ist, erst garnicht in den Index aufnimmst. Das Zeugs kostet nur Platz und Laufzeit.
Was Du aus der Indexaufnahme ausklammerst ist natürlich von der Sprache und ggfls. der Fachlichkeit abhängig. Das könnte man ggfls. auch konfigurierbar machen oder als Grundregel z. B.: Wörter mit weniger als 4 Buchstaben werden grundsätzlich ignoriert, ...
Hier kann man nicht pauschal sagen: Mach das so und so, es kommt immer auf den zu "verindexenden" Inhalt an.

Handelt es sich z. B. um ausschließlich deutschsprachige Texte, so kannst Du hergehen und alle Umlaute durch den entsprechenden Vokal ersetzen. Dann wird alles "entmehrzahlt", sprich: Wortendungen wie en, er, es, ens werden radikal abgeschnitten. (Grob: ist der letzte, der vorletzte oder der drittletzte Buchstabe ein e, dann ab dort abschneiden.)

Warum? Ganz einfach: Wer nach Flughäfen sucht, findet dann auch den Flughafen. Wenn im Text der Genitiv genutzt wird, wird auch "des Flughafens" gefunden.

Baum, Bäume, des Baumes, ...
Haus, Häuser, des Hauses, ...
Höhle, Höhlen, ...
Kartoffelsalat, Kartoffelsalate, des Kartoffelsalates, den Kartoffelsalaten, ...

Weiterer Vorteil: Suchen mit Like werden dadurch ggfls. entbehrlich, was auf das Suchtempo sicherlich nicht unbedingt negative Auswirkungen hat

Wie gesagt: Es kommt auf die Fachlichkeit an, für die die Suche implementiert werden soll.

Geändert von Delphi.Narium (12. Jul 2021 um 19:53 Uhr) Grund: Schreibfehler, wie immer zu spät entdeckt ;-)
  Mit Zitat antworten Zitat