andy : Frequenzliste mit Perl erstellen

Hallo Freunde,

ich würde gerne mit Perl aus einer Textdatei eine Frequenzliste erstellen, aller darin vorkommenden Wörter. Eine Frequenzliste heisst, eine Aufzählung wie oft kommt jeder Wort in dem Text vor, Nur für den Anfang habe ich alle Wörter, die im Text vorkommen in einer Array gespeichert. Wie soll ich weiter gehen. Bin leider mit Perl nicht so vertraut. Hat jemand mal eine Frequenzliste erstellt und wie? Danke.

Gruss, Andy

  1. Hallo Andy,

    ich würde gerne mit Perl aus einer Textdatei eine Frequenzliste erstellen, aller darin vorkommenden Wörter. Eine Frequenzliste heisst, eine Aufzählung wie oft kommt jeder Wort in dem Text vor, Nur für den Anfang habe ich alle Wörter, die im Text vorkommen in einer Array gespeichert. Wie soll ich weiter gehen.

    prinzipiell bietet sich für Dein Vorhaben ein Hash (Schlüssel-Wert-Paare) an. Hier ein Verfahren in sowas ähnlichem wie Pseudocode:

    Für jedes Wort im Text
        Überprüfe ob das Wort als Schlüssel im Hash vorkommt
        Wenn ja
            Inkrementiere den Wert, der diesem Schlüssel zugeordnet ist
        sonst
            Lege einen neuen Eintrag mit dem Wort als Schlüssel und dem Wert 1 an.
        Ende Wenn
    Ende Für

    Bin leider mit Perl nicht so vertraut.

    Das kannst Du ändern :-)

    Hat jemand mal eine Frequenzliste erstellt und wie? Danke.

    Nein, aber eine Frage meinerseits: Zählst Du jede Beugungsform extra, d.h. gibt es je einen eigenen Eintrag für

    - Wort
      - Wortes
      - Wörter
      - ...

    Wenn ja, dann ist die Aufgabe recht einfach. Wenn nein, dann wird es richtig kompliziert.

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      danke für deine Hilfe.  Ja eich Zähle jedes einzelne Wort extra. Für mich sind
           - Wort
           - Wortes
           - Wörter
      drei verschiedene Wörter. Kannst bischen konkreter werden? Mit Hashes habe ich noch nie gearbeitet, Wie könnte es die inkrementierung des Wertes im Hash aussehen? Danke für die Hilfe,

      Gruss Andy

      1. Tag andy.

        Wie könnte es die inkrementierung des Wertes im Hash aussehen?

        Schau dir mal das SelfHTML-Kapitel über Hashes an, dort insbesondere den Abschnitt Manipulieren von Hashes. Versuche, daraus was zu machen und melde dich bei Fragen wieder.

        Siechfred

        1. vielen Dank für die Hilfe,

          die Links habe ich vorher angeschaut, ansonsten hätte ich euch hier nicht gefragt.
          Mir ist trotzdem nich klar wie die schlüsseln im Hash gespeichrt werden.
          bsp: ich habe

          @array = alle Worte im Text;

          wie mache ich, dass alle die im array enthaltene wörter im hash als schlüssel gespeichert werden?

          Danke

          MfG Anri Qato

          1. Tag andy.

            @array = alle Worte im Text;
            wie mache ich, dass alle die im array enthaltene wörter im hash als schlüssel gespeichert werden?

            Für den Durchlauf benutzt du eine foreach-Schleife.

            In der Schleife fragst du für jedes Wort mit Hilfe des vordefinierten Skalar $_ ab, ob bereits ein Schlüssel mit dem Wortnamen existiert. Hierfür bietet sich eine if..else-Anweisung an.

            Wenn nicht, legst du den Schlüssel an und weist ihm den Wert 1 zu (es ist ja das erste Wortvorkommen), siehe hierzu Manipulation von Hashes - Werte ändern oder hinzufügen.

            Wenn der Schlüssel existiert, erhöhst du den Wert des Hasheintrages um 1 (siehe Berechnungsoperator "++").

            Das war's.

            Siechfred

            1. Hallo,

              leider funktioniert der script noch nicht.
              Ich zeige mal den code.

              my @NeueZeilen;
              my $Zaehler=1;
              my %Daten;

              @NeueZeilen = ("wort", "wort1", "wort2", "wort", "wort1", "wort1");

              foreach (@NeueZeilen){

              if (exists $Daten{$_}){
                  $Zaehler++;
                  $Daten{$_} = $Zaehler;
               }
               else{

              $Daten{$_} = 1;
               }
              }

              Irrgend was mache ich falsch? Ich weiss es leider warum der Script nicht das macht was ich will? danke für eine Antwort,

              Gruss, Andy

              1. my @NeueZeilen;

                my $Zaehler=1;

                my %Daten;

                @NeueZeilen = ("wort", "wort1", "wort2", "wort", "wort1", "wort1");

                foreach (@NeueZeilen){

                #if (exists $Daten{$_}){
                #    $Zaehler++;
                #    $Daten{$_} = $Zaehler;

                }

                else{

                #             $Daten{$_} = 1;

                }

                $Daten{$_}}++;

                }

                Irrgend was mache ich falsch? Ich weiss es leider warum der Script nicht das macht was ich will? danke für eine Antwort,

                Du brauchst keine Schleife.

                Gruss, Andy

                1. $Daten{$_}}++;

                  Ups, natürlich $Daten{$_}++;

                  So long,
                  Michael_B

                  1. Hallo,

                    Danke an allen, jetzt geht es :)

                    Gruss, Andy

              2. Tag andy.

                leider funktioniert der script noch nicht.

                foreach (@NeueZeilen){

                if (exists $Daten{$}){
                    $Zaehler++;
                    $Daten{$
                } = $Zaehler;
                  }
                  else {
                    $Daten{$_} = 1;
                  }
                }

                  
                Eigentlich ganz einfach, das Problem ist $Zaehler. Der aktuelle Wert dieser Variable hat absolut nichts mit der bisherigen Häufigkeit von $Daten{$\_} zu tun. Wenn du statt dessen den Wert von $Daten{$\_} direkt erhöhst, also schreibst:  
                  
                ~~~perl
                if (exists $Daten{$_}){  
                  $Daten{$_}++;  
                }  
                else {  
                  $Daten{$_} = 1;  
                }
                

                dann wird alles gut :-)

                Siechfred

    2. Hi,

      Nein, aber eine Frage meinerseits: Zählst Du jede Beugungsform extra, d.h. gibt es je einen eigenen Eintrag für

      - Wort
        - Wortes
        - Wörter
        - ...

      Wenn ja, dann ist die Aufgabe recht einfach. Wenn nein, dann wird es richtig kompliziert.

      Nein, das kann ich nicht nachvollziehen:
      http://www.nihongo.org/snowhare/utilities/modules/lingua-stem/
      http://search.cpan.org/search?query=stemming&mode=all

      so short

      Christoph Zurnieden

      1. Tag Christoph.

        Wenn ja, dann ist die Aufgabe recht einfach. Wenn nein, dann wird es richtig kompliziert.
        Nein, das kann ich nicht nachvollziehen:
        http://www.nihongo.org/snowhare/utilities/modules/lingua-stem/
        http://search.cpan.org/search?query=stemming&mode=all

        Naja, da gehört ein ganzer Rattenschwanz an Packages dazu, insofern ist die Installation schon ziemlich kompliziert. Darüber hinaus scheint das Päckchen auch noch unvollständig zu sein ;-)

        Siechfred

        1. Hi,

          Wenn ja, dann ist die Aufgabe recht einfach. Wenn nein, dann wird es richtig kompliziert.
          Nein, das kann ich nicht nachvollziehen:
          http://www.nihongo.org/snowhare/utilities/modules/lingua-stem/
          http://search.cpan.org/search?query=stemming&mode=all

          Naja, da gehört ein ganzer Rattenschwanz an Packages dazu, insofern ist die Installation schon ziemlich kompliziert.

          Nicht, wenn man den Perl-Installer nutzt. Beschreibung z.B. hier http://www.rcbowen.com/imho/perl/modules.html. Normalerweise loest der alle Abhaengigkeiten auf und installiert alle noetigen Pakete automatisch.

          Darüber hinaus scheint das Päckchen auch noch unvollständig zu sein ;-)

          Wie Du daraus liest, das es unvollstaendig ist weis ich zwar nicht, aber der Porter-Stemmer (und die anderen, die ich noch kennengelernt habe) ist keineswegs grammtikalisch perfekt, das ist durchaus korrekt.

          Ich wollte auch nur drarauf hinaus, das es schon fetige Pakete gibt, deren Benutzung recht einfach ist. Zur Wortschatzsammlung ist Lingua::Stem zudem voellig ausreichend.

          so short

          Christoph Zurnieden

          1. Tag Christoph.

            Darüber hinaus scheint das Päckchen auch noch unvollständig zu sein ;-)
            Wie Du daraus liest, das es unvollstaendig ist weis ich zwar nicht

            "This is a rather incomplete implementaion of work done by Gudrun Putze-Meier."

            Ich wollte auch nur drarauf hinaus, das es schon fetige Pakete gibt, deren Benutzung recht einfach ist. Zur Wortschatzsammlung ist Lingua::Stem zudem voellig ausreichend.

            Ich wollte auch nur darauf hinweisen, dass nicht alles schon aus dem Beta-Stadium heraus ist, und so ist es - wie mir scheint - zumindest bei dem Päckchen "Lingua::Stem::De". Einigkeit?

            Siechfred

            1. Hi,

              Wie Du daraus liest, das es unvollstaendig ist weis ich zwar nicht

              "This is a rather incomplete implementaion of work done by Gudrun Putze-Meier."

              Ja, brauch' ich denn schon wieder eine neue Brille? Ich hab' das glatt ueberlesen!
              Wenn ich beruflich viel lesen muss, kann ich die Augenglaeser dann von der Steuer absetzen? :-}

              Ich wollte auch nur darauf hinweisen, dass nicht alles schon aus dem Beta-Stadium heraus ist, und so ist es - wie mir scheint - zumindest bei dem Päckchen "Lingua::Stem::De". Einigkeit?

              Das sowieso nie! ;-)

              Es ist auch die Frage, ob vollstaendig automatisiertes Stemming ueberhaupt moeglich ist, da schon wir selbst es nicht immer vermoegen wenn ein Wort ohne Kontext da steht und zudem die Sprache unbekannt ist. Auch ist es die Frage, ob vollstaendiges Stemming ueberhaupt erwuenscht ist, da es teilweise zuviel abschneidet.

              so short

              Christoph Zurnieden

              1. Tag Christoph.

                Wenn ich beruflich viel lesen muss, kann ich die Augenglaeser dann von der Steuer absetzen? :-}

                Nur, wenn du mittels eines Brillenbenutzungsbuches nach amtlich vorgeschriebenem Vordruck nachweist, dass du die Brille nicht privat nutzt 8-P

                Das sowieso nie! ;-)

                Na gut, dann eben nur Recht und Freiheit ;-)

                Siechfred

      2. Hallo Christoph,

        Wenn ja, dann ist die Aufgabe recht einfach. Wenn nein, dann wird es richtig kompliziert.

        Nein, das kann ich nicht nachvollziehen:

        schön zu wissen, dass es Ansätze für Stemming gibt.

        http://www.nihongo.org/snowhare/utilities/modules/lingua-stem/
        http://search.cpan.org/search?query=stemming&mode=all

        Ich verbessere mich deswegen zu:

        "Wenn nein, dann wird es komplizierter" :-)

        Freundliche Grüße

        Vinzenz