Anzeige:
Ergebnis 1 bis 13 von 13

Thema: Statistik-Krempel mit awk

  1. #1
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762

    Statistik-Krempel mit awk

    Wie kann ich mit awk die Häufigkeit von Wörtern in einem Text ermitteln?
    Wie kann ich mit awk die Häufigkeit von Buchstaben in einem Text ermitteln?

    Die Doku von awk erschlägt mich leider, anstatt mir zu helfen...

    Der Hammer kommt dann noch: Die häufigsten Buchstabenpaare und -tripel im Text finden... :-/
    I haven't lost my mind - It's somewhere on a backup-disc

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Naja, k.A. von AWK, naja, fast keine.

    Also besser was anderes. Auch ok?

    1)
    cat text | sed "s# #\n#g" | grep $WORT | wc -l

    2)
    cat text | sed "s#\(.\)#\1\n#" | grep $WORT | wc -l

    oder so ähnlich

    Der Hammer - ähm, tja, schon was schwieriger. Da musst du ja wie verrückt rumiterieren, oder? Da würd ich wohl ein "richtiges" Programm schreiben dafür.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819

    Post

    Darf's auch Python sein?
    Code:
    hist={}
    
    import re
    
    # Wörter
    #searchre = re.compile(r"\w+",re.LOCALE)
    #fuer englische Texte besser:
    #searchre = re.compile(r"[-a-zA-Z']+")
    
    # Buchstabenpaare
    #searchre = re.compile(r"\w(?=\w)",re.LOCALE)
    
    # Buchstabentriplets
    searchre = re.compile(r"\w(?=\w\w)",re.LOCALE)
    
    for line in open("textfile"):
        for x in searchre.finditer(line):
            # +0 bei Wörtern (kein Lookahead)
            # +1 bei Paaren (Lookahead von einem Zeichen)
            # +2 bei Tripeln (Lookahead von zwei Zeichen)
            match = line[x.start(0):x.end(0)+2].lower()
            # Zählen
            try:
                hist[match] += 1
            except KeyError:
                hist[match] = 1
    
    # Dictionary als Liste von (key,value)-Paaren
    res = hist.items()
    
    # sortieren, allerdings nach dem zweiten Eintrag und nicht nach dem ersten
    res.sort(lambda a,b:-cmp(a[1],b[1]))
    
    # Ausgabe
    for x,n in res:
        print "%8i %s"%(n,x)
    Geändert von Joghurt (27-10-2005 um 21:00 Uhr)

  4. #4
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von SeeksTheMoon
    Wie kann ich mit awk die Häufigkeit von Wörtern in einem Text ermitteln?
    Wie kann ich mit awk die Häufigkeit von Buchstaben in einem Text ermitteln?

    Die Doku von awk erschlägt mich leider, anstatt mir zu helfen...

    Der Hammer kommt dann noch: Die häufigsten Buchstabenpaare und -tripel im Text finden... :-/
    Muß es den unbedingt awk||sed sein?

    cat micki_mouse.h | wc -l
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  5. #5
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    ja, muss leider awk sein - oder auch etwas anderes das man auf jedem Unix-System findet. Moderne Scriptsprachen wie Perl/Python und Co fallen deshalb leider weg.

    Ein paar Sachen habe ich schon mit Shellscripten gemacht, aber die brauchen wegen Arrays und vielen Kommandoaufrufen rund 2 Minuten und das suckt ziemlich... :-/
    awk ist die einzige mir bekannte Sprache die außer Shellscripten in Frage käme.
    awk wird auch explizit vorgeschlagen...
    I haven't lost my mind - It's somewhere on a backup-disc

  6. #6
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von SeeksTheMoon
    ja, muss leider awk sein - oder auch etwas anderes das man auf jedem Unix-System findet. Moderne Scriptsprachen wie Perl/Python und Co fallen deshalb leider weg.

    Ein paar Sachen habe ich schon mit Shellscripten gemacht, aber die brauchen wegen Arrays und vielen Kommandoaufrufen rund 2 Minuten und das suckt ziemlich... :-/
    awk ist die einzige mir bekannte Sprache die außer Shellscripten in Frage käme.
    awk wird auch explizit vorgeschlagen...
    In awk bekommst Du auf jeden Fall Ärger mit Sonderzeichen.
    Das klaut dir viel Zeit.
    Vielleicht ist es sogar besser dein Programm gleich in C zu schreiben.
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  7. #7
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    in dem Text sind keine Sonderzeichen, die habe ich vorher schon rausgefiltert.
    Da ich das für eine f**king Übungsaufgabe brauche, kann ich das leider nicht in C oder einer "neueren" Scriptsprache schreiben, sondern muss dazu Unix-Systemkommandos benutzen.

    ("Einführung in Unix" nennt sich das - LOL. Ich kann dank Ausbildung und jahrelanger Erfahrung mit Unix hervorragend umgehen, aber so einen Statistik-Müll musste ich noch nie machen. Was machen die anderen Studenten ohne Info-Ausbildung? Sich den Kopfschuss setzen? Und wer denkt sich so einen praxisfernen Schrott aus? Fragen über Fragen )

    btw: Normalerweise wäre C auch angebracht, da einige der Scripte 2 Minuten an dem Text rumrödeln, was ich für einen Praxiseinsatz als suboptimal einstufen würde. Aber die Aufgabenstellung hat ja schon gezeigt dass es offenbar auf Praxisferne mit maximaler Schwierigkeit ankommt
    I haven't lost my mind - It's somewhere on a backup-disc

  8. #8
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von SeeksTheMoon
    ("Einführung in Unix" nennt sich das - LOL. Ich kann dank Ausbildung und jahrelanger Erfahrung mit Unix hervorragend umgehen, aber so einen Statistik-Müll musste ich noch nie machen. Was machen die anderen Studenten ohne Info-Ausbildung? Sich den Kopfschuss setzen? Und wer denkt sich so einen praxisfernen Schrott aus? Fragen über Fragen )

    btw: Normalerweise wäre C auch angebracht, da einige der Scripte 2 Minuten an dem Text rumrödeln, was ich für einen Praxiseinsatz als suboptimal einstufen würde. Aber die Aufgabenstellung hat ja schon gezeigt dass es offenbar auf Praxisferne mit maximaler Schwierigkeit ankommt
    Zu beneiden bist du nicht.
    Dein Script wird relativ groß, da Du dir einige
    Hilfsfunktionen schreiben mußt.

    Hat du hier schon nachgeschaut?
    http://www.gnu.org/software/gawk/manual/gawk.html
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  9. #9
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819

    Post

    Wenn du die ganze Unixtoolchain nutzen darfst, kannst du es so machen:
    Code:
    awk '{for(n=1;n<=NF;n++) print tolower($n)}' DATEI|sed 's/[^a-z]//g'|egrep "[a-z]"|sort|uniq -c|sort -rn
    Hoffnungslos ineffizient, aber besser als nichts. (Der egrep verhindert, dass leere Zeilen (wenn z.B. geplenkt wurde) gezählt werden.

    Die Buchstabenverteilung kannst du so zählen:
    Dupletts zählen ginge mit:
    Code:
    awk '{for(n=0;n<length($0);n++) print tolower(substr($0,n,2));}' DATEI|egrep "^[a-z]+$"|sort|uniq -c|sort -nr
    HTH

    So vollkommen praxisfern ist es nicht, man könnte z.B. einen kleinen Spamdetektor (mit hoher Fehlerquote ) damit machen. Also nur 99% praxisfern.
    Geändert von Joghurt (29-10-2005 um 12:21 Uhr)

  10. #10
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von Joghurt
    So vollkommen praxisfern ist es nicht, man könnte z.B. einen kleinen Spamdetektor (mit hoher Fehlerquote ) damit machen. Also nur 99% praxisfern.
    Soll er nicht alles in awk coden?
    Also ohne egrep, unique, sort etc...?
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  11. #11
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Zitat Zitat von Romanday
    Soll er nicht alles in awk coden?
    Daher mein errster Satz.

  12. #12
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    nein, nicht alles, aber für die komplexen Sachen ist awk meiner Meinung nach entweder aus Mächtigkeits- oder Geschwindigkeitsgründen die einzige Wahl.
    Danke schonmal für die Beispiele, ich werde mir das jetzt alles genau ansehen und dann diese freakige Aufgabe abschließen.
    Falls ich dann noch Fragen hab, weiß ich ja wo ich posten kann
    I haven't lost my mind - It's somewhere on a backup-disc

  13. #13
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Normalerweise legst du ein dictionary/map an, in der du jedes Wort zählst, also in awk: NameDesArrays[WORT] += 1.
    Das Problem ist nur nachher, dass sämtliche awk-interne sort-Funktionen nicht POSIX-kompatibel, sondern GNU Erweiterungen sind. In dem Falle wirst du eh auf das externe sort ausweichen müssen.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •