Schorsch: Worte aus Glossar hervorheben

Guten Tag

Ziel

Die Worte, welche im Glossar (MySQL Datenbank) eingetragen sind, sollen auf der HTML-Seite hervorgehoben werden.

Mein Lösungsansatz:
Ich nehme aus dem Text jedes einzelne Wort heraus.
Wenn es sich nicht um ein Wort aus der "Stop-List" handelt,
schaue ich, ob es dazu einen Eintrag im Glossar gibt.
Wenn ja, hebe ich es hervor.

Meine Bedenken:
Dieser Lösungsansatz braucht duzende von Datenbank abfragen.

Frage:
Ist dieser Lösungsansatz OK oder gibt einen besseren?

Gruss
Schorsch

  1. Hi,

    Mein Lösungsansatz:
    Ich nehme aus dem Text jedes einzelne Wort heraus.
    Wenn es sich nicht um ein Wort aus der "Stop-List" handelt,
    schaue ich, ob es dazu einen Eintrag im Glossar gibt.
    Wenn ja, hebe ich es hervor.

    Meine Bedenken:
    Dieser Lösungsansatz braucht duzende von Datenbank abfragen.

    Wieso? Es braucht genau eine Abfrage, um die Worte aus dem Glossar zu laden. So viele Millionen werden das ja nicht sein.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Salut Andreas

      OK, mit ungefähr:

      WHERE tbl.glossar_wort = 'wort1'
        OR tbl.glossar_wort = 'wort2'
        OR tbl.glossar_wort = 'wort3'
        ...

      bringe ich alle Glossar-Worte, die zur Seite gehören, heraus.

      Dann kann ich die Glossar-Worte in einen Array laden.
      Dann schaue ich für jedes Wort der Seite, ob es im
      Glossar-Worte-Array vorkommt. Wenn ja, zeichne ich es aus.

      Was hältst du von dieser Lösung?

      Gruss
      Schorsch

      1. Hallo Schorsch,

        OK, mit ungefähr:

        WHERE tbl.glossar_wort = 'wort1'
          OR tbl.glossar_wort = 'wort2'
          OR tbl.glossar_wort = 'wort3'
          ...

        bringe ich alle Glossar-Worte, die zur Seite gehören, heraus.

        Andreas meinte das wohl eher so, dass Du Dir alle Suchbegriffe auf einmal aus dem Glossar in ein Array lädst, mit dem Du dann jedes Wort des Textes vergleichst.

        Allerdings sehe ich da noch ein anderes Problem. Die Begriffe im text tauchen nicht unbedingt in ihrer Stammform auf. Da wird ein automatischer Vergleich sowieso noch einiges Kopfzerbrechen bedeuten.

        LG
        Chris©

        1. Andreas meinte das wohl eher so, dass Du Dir alle Suchbegriffe auf einmal aus dem Glossar in ein Array lädst

          Meinst du das gesamte Glossar?

          Macht das Sinn, weil es schneller ist alles auszulesen und dann einen riesen Array zu vergleichen als eine komplizierte DB-Abfrage zugunsten eines kleineren Arrays?

          Gruss
          Schorsch

          1. Hallo Schorsch,

            Andreas meinte das wohl eher so, dass Du Dir alle Suchbegriffe auf einmal aus dem Glossar in ein Array lädst

            Meinst du das gesamte Glossar?

            Ich meine, dass Andreas das wohl gemeint hat.
            Eigentlich ist es schmuddelig, da man mit der Gefahr spielt, dass der Arbeitsspeicher nicht ausreicht. Die Lösung ist also nicht dynamisch. Uneigentlich ist es aber die praktikabelste Lösung, bis zu einer bestimmten Anzahl von Begriffen eben.

            Macht das Sinn, weil es schneller ist alles auszulesen und dann einen riesen Array zu vergleichen als eine komplizierte DB-Abfrage zugunsten eines kleineren Arrays?

            Der Vergleich im Speicher geht wesentlich schneller, als lauter einzelne DB-Abfragen oder eine quasi Fulltext-Abfrage ( where suchwort in ('wort1','wort2','wort3',...)    )

            Wobei die letztere Variante auch schnell gebaut ist. Die einzelnen Worte wirst Du sowieso in einem Array sammeln. Das kannst Du dann einfach mit implode() zum in()-Statement zusammenbauen. Dann liegt aber die Hauptlast beim DBMS.

            Bei der Schmuddellösung liegt die Hauptlast beim PHP-Runtime

            LG
            Chris©

            1. Hi,

              Andreas meinte das wohl eher so, dass Du Dir alle Suchbegriffe auf einmal aus dem Glossar in ein Array lädst
              Meinst du das gesamte Glossar?

              Nein, nur die im Glossar erklärten Worte. Die Erklärungen werden ja nicht benötigt.

              Ich meine, dass Andreas das wohl gemeint hat.

              Nein, s.o.

              Eigentlich ist es schmuddelig, da man mit der Gefahr spielt, dass der Arbeitsspeicher nicht ausreicht. Die Lösung ist also nicht dynamisch. Uneigentlich ist es aber die praktikabelste Lösung, bis zu einer bestimmten Anzahl von Begriffen eben.

              Laß es ein Riesen-Glossar sein mit 50000 Worten. Mit je 20 Buchstaben. Gibt grade mal 1000000 Zeichen.

              Der Vergleich im Speicher geht wesentlich schneller, als lauter einzelne DB-Abfragen oder eine quasi Fulltext-Abfrage ( where suchwort in ('wort1','wort2','wort3',...)    )

              Und beim "in" ist ggf. auch die Anzahl der Werte begrenzt (bei MySQL durch max_allowed_packet, also nicht über die Anzahl, sondern über die Gesamtgröße der Anfrage)

              Klar, bei PHP hat man natürlich den Nachteil, daß man sowas (nicht wie bei einem Java-Servlet) einmalig aus der DB in einen Vektor holt, sondern bei jedem einzelnen Scriptaufruf ...

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              O o ostern ...
              Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
              1. Hallo Andreas,

                Andreas meinte das wohl eher so, dass Du Dir alle Suchbegriffe auf einmal aus dem Glossar in ein Array lädst
                Meinst du das gesamte Glossar?

                Nein, nur die im Glossar erklärten Worte. Die Erklärungen werden ja nicht benötigt.

                Ich meine, dass Andreas das wohl gemeint hat.

                Nein, s.o.

                Mmmh, in meiner femininen Logik ist das das Gleiche, aber deshalb passen Männer und Frauen wahrscheinlich auch nicht zusammen?

                LG
                Chris©

              2. Hallo Andreas,

                Laß es ein Riesen-Glossar sein mit 50000 Worten. Mit je 20 Buchstaben. Gibt grade mal 1000000 Zeichen.

                zuzüglich Overhead für das Array, wenn man das Erbebnis denn in eines packen will.
                Das können dann schon leicht 3-5MByte extra werden.

                LG
                Chris©

                1. Hi,

                  Laß es ein Riesen-Glossar sein mit 50000 Worten. Mit je 20 Buchstaben. Gibt grade mal 1000000 Zeichen.

                  (Ergänzung: im Durchschnitt dürften die Wörter kürzer als 20 Zeichen sein)

                  zuzüglich Overhead für das Array, wenn man das Erbebnis denn in eines packen will.
                  Das können dann schon leicht 3-5MByte extra werden.

                  Du meinst, der Array-Overhead kann in PHP ~ 100 Byte pro String-Eintrag betragen?
                  Diese Zahl ergibt sich aus 5MByte overhead für 50000 Einträge.

                  Wenn das tatsächlich so wäre, wäre PHP extrem ineffektiv.

                  Ach ja, auf die 50000 bin ich gekommen, weil mein Englisch-Wörterbuch 50000 Wörter enthält.

                  Ein recht umfangreiches Glossar (eher schon Lexikon), das foldoc, enthält knapp 14559 Einträge, die Schlagworte sind 165636 Zeichen (inkl. Zeilenumbrüchen zwischen den Einträgen).

                  cu,
                  Andreas

                  --
                  Warum nennt sich Andreas hier MudGuard?
                  O o ostern ...
                  Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                  1. Hallo Andreas,

                    Du meinst, der Array-Overhead kann in PHP ~ 100 Byte pro String-Eintrag betragen?
                    Diese Zahl ergibt sich aus 5MByte overhead für 50000 Einträge.

                    etwa 70 bis 160 Bytes pro Element
                    http://forum.de.selfhtml.org/archiv/2007/11/t161805/#m1053145
                    Ich habe das nachvollzogen und es stimmt.

                    Man müsste mal in den Quellcode gucken, wie die Verwaltung der Arrays tatsächlich funktioniert.

                    LG
                    Chris©

                    1. Hi,

                      etwa 70 bis 160 Bytes pro Element
                      http://forum.de.selfhtml.org/archiv/2007/11/t161805/#m1053145
                      Ich habe das nachvollzogen und es stimmt.

                      Ach Du meine Scheiße.
                      Noch ein Grund mehr, warum ich PHP nicht mag ...

                      cu,
                      Andreas

                      --
                      Warum nennt sich Andreas hier MudGuard?
                      O o ostern ...
                      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.