Rouven: TextMining - Datenbank vs. ?

Hallo,

ich hätte mal gerne einen Vorschlag, wie man in JAVA folgenden Vorgang effizient abbilden könnte:

Ausgangspunkt: Eine Liste von Wörtern, die für die folgende Bearbeitung irrelevant ist (das werden viele, in dieser Klammer steht nicht viel, was nicht unter irrelevant fiele außer vielleicht Klammer/relevant/irrelevant...).
(Format beliebig: rel. Datenbank, Liste, ...)

Ereignis: Einlesen eines Textes mit irrelevanten (s.o.) und relevanten Wörtern

Vorgang: Wandele den Text so um, dass lediglich die relevanten Wörter übrig bleiben.

Frage: Wie macht man das am Besten? Ich wäre ja "geneigt" (ist gelogen, mir gefällt die Lösung nicht wirklich, aber sie klingt auf den ersten Gedanken schnell) die irrelevanten Wörter in einer Tabelle unterzubringen, den neuen Text Wortweise in eine Tabelle zu bringen und anschließend eine Art
DELETE FROM texttab
WHERE ... NOT IN (SELECT ... FROM irrelevanttab)

Es ist aber eigentlich VÖLLIG unsinnig, Wörter in eine Datenbank zu bringen um sie dann wieder zu löschen. Endergebnis des Vorganges ist in jedem Fall eine Speicherung der relevanten Wörter, d.h. nach diesem löschen wäre man quasi fertig.
Was sind jetzt die Alternativen? Ich kann mir nicht vorstellen, dass eine regular Expression x-Mal oder mit x Wörtern auszuführen noch sehr effizient möglich wäre.
Gibt es eine andere Möglichkeit (Array, Liste), diese Umsetzung vorzunehmen?

MfG
Rouven

--

-------------------
ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  1. Moin!

    Was sollte schneller sein, als in einer schnellen Programmiersprache
    (C, CPP, Java...)
    die Liste der relevanten Wörter in einem Array zu speichern und den zu siebenden Text, in einer Variable eingelesen, dann in einer Iteration über den Array mittels regex zu behandeln?

    Für welche dieser Funktionen erzeugt die DB keinen Overhead?

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
    1. Tag,

      Was sollte schneller sein, als in einer schnellen Programmiersprache
      (C, CPP, Java...)
      die Liste der relevanten Wörter in einem Array zu speichern und den zu siebenden Text, in einer Variable eingelesen, dann in einer Iteration über den Array mittels regex zu behandeln?

      Ähm, also ich geh mal davon aus, du meintest die Liste der irrelevanten Wörter, die andere kenne ich nicht, die relevanten Wörter sind ja genau die, die über bleiben.
      Ich stell dann auch in diesem Ast die Frage noch mal: Das Array und die RegExp "stört" das dann auch nicht, wenn sie 4-5stellige Wortzahlen an irrelevanten Wörten bearbeiten muss?
      Also das heißt, die Liste der Wörter die ich habe ist 4-5stellig, nun kommt ein Text rein, z.B. Webseite oder so, aus der ich die raushaben will.

      MfG
      Rouven

      --

      -------------------
      ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
      1. Moin!

        Also das heißt, die Liste der Wörter die ich habe ist 4-5stellig, nun kommt ein Text rein, z.B. Webseite oder so, aus der ich die raushaben will.

        Ja... klar. Sind ja alles keine 286er mehr. Eine Webseite ist eher noch  klein.

        Was ganz anderes: kennt die "Programmiersprache Deiner Wahl"[tm] auch sowas wie "strOutput=str_replace(strSuche,strErsetzeDurch,strInput)"?

        Das wäre performanter als ein regelrechter Regex. Immerhin willst Du ja 5-10000 mal "drüber".

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
        1. Hmpf,

          na ja, der Fairness halber sollte ich sagen, dass ich in den letzten 2 Jahren dafür gesorgt habe, dass meine JAVA-Kenntnisse eingerostet sind. Ich würde schon davon ausgehen, dass ein String(-Buffer) sowas irgendwie unterstützt, aber genau weiß ich es nicht.
          Ich dachte nur, gerade diese String-Operationen wären "ganz übel".

          MfG
          Rouven

          --

          -------------------
          ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
          1. Moin!

            Hmpf,

            Hm. Wenn JAVA soooooOOOooooo schlecht Texte manipulieren kann muss man über Alternativen nachdenken.

            Da wäre noch was. Wenn die Geschichte auf UNIX/Linux- Systemen laufen soll: Da gibts ein sehr altes, performantes Progrämmchen zur Textmanipulation (nein, nicht Perl, das ist "neu").

            Wenn also Java externe Programme starten kann, dann solltest Du Dir mal das Manual zu awk (unter UNIX) oder gawk (unter Linux, normalerweise auf awk verlinkt, unter Windows mit Cygwin auch, läuft aber wahrscheinlich mit 30% weniger Performance) reinziehen. Es könnte sein, dies ist performanter, ich vermute ja, Du willst Dein Data-Mining nicht auf eine Seite beschränken.

            "Lieber Gott, lass mich hier keinem helfen, der Emailadressen grabben will!"

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix®

            --
            Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
            1. Na gut,

              ich werde in jedem Fall mal experimentieren. Die Umgebung ist allerdings flexibel zu gestalten, das ganze ist eingebettet in eine umfangreichere Aufgabe für die Uni und soll ohne besondere Anforderungen abgegeben werden, d.h. wenn ich da erst noch bis ins kleinste Detail Anforderungen an die Umgebung stelle.... - Das mit der Datenbank würde schon eng genug.

              Na ja, danke jedenfalls für die Anregungen, ich schau mal!

              MfG
              Rouven

              --

              -------------------
              ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
              1. Moin!

                Das mit der Datenbank würde schon eng genug.

                Na, da ist das standardmäßig vorhandene awk / gawk besser. Wenn es aber kein Unix/Linux ist, dann lass die Finger davon.

                MFFG (Mit freundlich- friedfertigem Grinsen)

                fastix®

                --
                Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
  2. Also so wie ich dich verstehe hast Du eine liste von irrelevanten Wörtern und einen (mehrere) Text(e).
    Ziel: Wort-Liste (vom Text) von dem keines ein irrelevantes Wort sein darf.

    Das ist nicht schwierig:
    Speichere alle irrelevanten Wörter in einem Set ab (HashSet ist hier vorteilhaft).

    Um die Wort-Liste zu erstellen machst du zuerst eine LinkedList und iterierst durch alle Wörter im Text:

    Set set = getIrrelevantWordSet(); // static wordSet
    List list = new LinkedList();
    String[] strArray = text.split("\s");
    for (int i=0; i<strArray.length; i++) {
       if (set.contains(strArray[i]) continue;
       list.add(strArray[i];
    }

    Natürlich sollten die irrelevanten Wörter nur einmal für alle Texte kreiiert werden.

    Hallo,

    ich hätte mal gerne einen Vorschlag, wie man in JAVA folgenden Vorgang effizient abbilden könnte:

    Ausgangspunkt: Eine Liste von Wörtern, die für die folgende Bearbeitung irrelevant ist (das werden viele, in dieser Klammer steht nicht viel, was nicht unter irrelevant fiele außer vielleicht Klammer/relevant/irrelevant...).
    (Format beliebig: rel. Datenbank, Liste, ...)

    Ereignis: Einlesen eines Textes mit irrelevanten (s.o.) und relevanten Wörtern

    Vorgang: Wandele den Text so um, dass lediglich die relevanten Wörter übrig bleiben.

    Frage: Wie macht man das am Besten? Ich wäre ja "geneigt" (ist gelogen, mir gefällt die Lösung nicht wirklich, aber sie klingt auf den ersten Gedanken schnell) die irrelevanten Wörter in einer Tabelle unterzubringen, den neuen Text Wortweise in eine Tabelle zu bringen und anschließend eine Art
    DELETE FROM texttab
    WHERE ... NOT IN (SELECT ... FROM irrelevanttab)

    Es ist aber eigentlich VÖLLIG unsinnig, Wörter in eine Datenbank zu bringen um sie dann wieder zu löschen. Endergebnis des Vorganges ist in jedem Fall eine Speicherung der relevanten Wörter, d.h. nach diesem löschen wäre man quasi fertig.
    Was sind jetzt die Alternativen? Ich kann mir nicht vorstellen, dass eine regular Expression x-Mal oder mit x Wörtern auszuführen noch sehr effizient möglich wäre.
    Gibt es eine andere Möglichkeit (Array, Liste), diese Umsetzung vorzunehmen?

    MfG
    Rouven

    1. Hi!

      Das ist nicht schwierig:
      Speichere alle irrelevanten Wörter in einem Set ab (HashSet ist hier vorteilhaft).

      Danke erst einmal für den Tipp. Ich komme ja immer mehr zu der Erkenntnis, dass man sich bei den heutigen Speicherdimensionen keine Sorgen mehr um solche Sachen machen muss, aber das HashSet und eine FOR-Schleife sind auch bei 4-5stelligen Wortzahlen noch schnell genug ja?
      Ich werd das aber auf jeden Fall mal praktisch ausprobieren, wenn ich mich einigermaßen an eine strukturierte Gliederung meines Programmes halte, dann sollte ich so eine Einles-Klasse ja recht schnell austauschen können...

      MfG
      Rouven

      --

      -------------------
      ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
      1. Ein HashSet ist eigentlich immer die schnellst und vernünftige Variante um ein Element schnell aufzufinden (Ausser man hat unendlich viel Speicher...). In den meisten Fällen (Zugriff) erhält man das Element in einem Schritt (O(1)). Ich habe schon HashSet und HashMap benutzt, welche zehntausende Objekte enthielten. Man sollte aber darauf achten, bei eigenen Objekten die Methode "equal" zu überschrieben und die Grösse des HashSet zu Beginn auf etwa das zweifache der zu erwartende Element-Zahl setzen.
        Zudem sollte man den Speicher der VM raufschrauben wenn OutOfMemoryExceptions auftreten (Standardeinstellung bei 64MB).

        MfG
            Andreas

        Hi!

        Das ist nicht schwierig:
        Speichere alle irrelevanten Wörter in einem Set ab (HashSet ist hier vorteilhaft).

        Danke erst einmal für den Tipp. Ich komme ja immer mehr zu der Erkenntnis, dass man sich bei den heutigen Speicherdimensionen keine Sorgen mehr um solche Sachen machen muss, aber das HashSet und eine FOR-Schleife sind auch bei 4-5stelligen Wortzahlen noch schnell genug ja?
        Ich werd das aber auf jeden Fall mal praktisch ausprobieren, wenn ich mich einigermaßen an eine strukturierte Gliederung meines Programmes halte, dann sollte ich so eine Einles-Klasse ja recht schnell austauschen können...

        MfG
        Rouven

  3. Hi,

    ich hätte mal gerne einen Vorschlag, wie man in JAVA folgenden Vorgang effizient abbilden könnte:

    Nach Lesung des ganzen Threads scheinen das wohl "Schulaufgaben" zu sein. Deshalb hier kein Code oder Link, sondern eine Erklärung (Plus Hinweis auf ein passendes Programm, soooo bin ich natürlich nicht ;-).

    Das Ganze hört sich schwer nach "Indizierung" an. So, wie das alle Suchmaschinen machen. Entweder haust Du alle Stopwörter raus (und, oder, der, die, das, einer usw) oder hast eine Liste mit Startwörtern (Dafür wäre ein Spezialthesaurus nützlich), bei "Datamining" ist es beides.

    Effizienz ist dabei ein Frage des Gebrauchs. Möchtest Du einen großen Datensatz indizieren (ein paar GiB an Textdokumenten), um einfach und schnell etwas finden zu können ist der Ansatz mit Stopwörtern recht effektiv, der Index selber ist dann aber recht groß. Möchtest Du dagegen den Datensatz nach Fachgebieten sortieren (Knowledge Base) sind Startwörter (Spezialthesauri mit jeweils passendem "Fachchinesisch") besser geeignet.

    Passende Literatur gibt's bei Citeseer.org.
    Passendes Programm zum "spielen" ist 'ptx' aus den GNU-Textutils.

    Sowas ist ein recht interessantes Feld und sollte nicht so einfach nebenbei abgearbeitet werden.

    so short

    Christoph Zurnieden

    1. Guten Morgen!

      Nach Lesung des ganzen Threads scheinen das wohl "Schulaufgaben" zu sein. Deshalb hier kein Code oder Link, sondern eine Erklärung (Plus Hinweis auf ein passendes Programm, soooo bin ich natürlich nicht ;-).

      Jo, das hätte ich dir auf Anfrage aber auch sicherlich gesagt, genau gesagt ist es eine "Uni-Aufgabe". Ich will ja auch keinen Quellcode, nur ein paar Anregungen zur effizienten Umsetzung (vs. meinem eigenen stundenlangen herumspielen mit diversen Lösungen)... Bin da doch schon mehr der Programmierer, der das selber umsetzen will.

      Um Startwörter geht es nicht, die Grundidee ist eine Stoppwortliste. Dazu kommen noch eine Stammformen-Liste, eine Art Thesaurus-Liste, evtl. (d.h. wenn ich noch die Zeit finde) Wortabstände und Vor-/Nachsilben. Zu Onthologien werde ich wohl eher nicht mehr kommen...

      Sowas ist ein recht interessantes Feld und sollte nicht so einfach nebenbei abgearbeitet werden.

      Da stimme ich dir voll zu, ich bin froh, dass ich endlich mal ein paar Methoden lerne, wie man solche Dokument-/Worteinordnungen in der Praxis macht. Vorlesungen wie DataMining höre ich erst ab nächstem Jahr, die Aufgabe läuft daher etwas im Vorgriff.
      Na gut, dann werde ich mich mal meinen ANDEREN Projekten zuwenden. Wenn ich doch nur die Zeit hätte um der Sache die notwendige Aufmerksamkeit zu widmen...

      MfG
      Rouven

      --

      -------------------
      ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(