Hallo, durch Ulfs Beitrag¹ angeregt (vielen Dank!), in dem Bigramme einer Testdatei mittels Linux-Befehl bestimmt werden, kann nun eine erweitertete Schritt-für-Schritt-Anleitung vorgestellt werden. Mit nur geringem weiteren Aufwand (aber entsprechender Rechenzeit) können nach dem Prinzip der Anleitung auch Tetragramme bestimmt werden. ==========
Anleitung zum Erstellen von möglichst viele Zeichen enthaltenden 1-, 2- und 3-grammen aus einer Textdatei mittels Linux-Befehlen ========== gegeben: Die im Leipziger Textkorpus enthaltende Datei sentences.txt, bestehend aus 3 Millionen deutschsprachiger Sätze (ein Satz pro Zeile): http://corpora.informatik.uni-leipzig.de/resources/flatfiles/de05_3M.zip Da jede Zeile nur einen Satz hat, der mit einer Zeilennummer und einem Tabstop beginnt, werden die Zeilenanfänge bereinigt sowie jeweils 5 Sätze (von einem Leerzeichen getrennt) zu einem Absatz zusammengeführt. Die dann vorliegende Datei mit über 330 Millionen Zeichen (im Beispiel s.txt genannt) eignet sich als Rohtext für statistische Analysen. Weitere Korpora siehe: http://corpora.informatik.uni-leipzig.de/resources/flatfiles Ein paar Informationen über die Leipziger Korpora stehen den PDF-Dateien der Seite: http://corpora.informatik.uni-leipzig.de/download ========== gesucht: Listen für Zeichenhäufigkeit, Bigrammhäufigkeit und Trigrammhäufigkeit. Für die Weiterverarbeitung in Tabellenkalkulationen sollen zusätzliche Dateien mit Tabstops als Abgrenzungszeichen vorliegen. ========== möglicher Lösungsweg: (In Ubuntu-Linux wurde die Terminal-Zeichenkodierung auf unicode (UTF-8) gestellt. Um die Lösung auf einen 330-Millionen-Zeichen-Text anzuwenden, sollten 10 GB auf der Festplatte frei sein, sofern die Dateien mit den Zwischenergebnissen erst zum Schluss gelöscht werden. Anhaltspunkt: Während die Ursprungsdatei s.txt ca. 330 MB groß war, wurde s.triroh.txt 1,3 GB groß.) Zuvor die Zeichenkodierung an Standard anpassen: recode l1.. < sentences.txt > s.l1.txt Zeilennummern incl. folgenden Tabstop entfernen: sed 's/[0-9]*\t//' s.l1.txt > s.l1.wln.txt Jeweils 5 Sätze zu einem Absatz zusammenfügen: sed '1n;N;N;N;N;s/\n/ /g' s.l1.wln.txt > s.txt Nun liegt der Text in der Datei s.txt so vor, dass er für statistische Analysen als Rohtext brauchbar ist. Ab jetzt folgen die Schritte, die mit jeder anderen Textdatei anstelle von s.txt gegangen werden können. Ein Zeichen pro Zeile (Liste mit allen Zeichen): cat s.txt | grep -o '.' > s.1st.txt Erste Zeile löschen (Liste mit Zeichen der 2. Bigrammstelle) sed '1d' s.1st.txt > s.bi2st.txt Erste Zeile löschen (Liste mit Zeichen der 3. Trigrammstelle) sed '1d' s.bi2st.txt > s.tri3st.txt Letzte Zeile löschen (Liste mit Zeichen der 1. Bigrammstelle) sed '$d' s.1st.txt > s.bi1st.txt Letzte Zeile löschen (Liste mit Zeichen der 1. Trigrammstelle) sed '$d' s.bi1st.txt > s.tri1st.txt Letzte Zeile löschen (Liste mit Zeichen der 2. Trigrammstelle) sed '$d' s.bi2st.txt > s.tri2st.txt Listen zeilenweise ohne Trennzeichen zusammenführen: paste -d '' s.bi1st.txt s.bi2st.txt > s.biroh.txt paste -d '' s.tri1st.txt s.tri2st.txt s.tri3st.txt > s.triroh.txt _gramm-Dateien erstellen: sort s.1st.txt | uniq -c | sort -nr > 1gramme.txt sort s.biroh.txt | uniq -c | sort -nr > 2gramme.txt sort s.triroh.txt | uniq -c | sort -nr > 3gramme.txt Leerzeichen am Zeilenanfang entfernen: sed 's/^[ ]*//' 1gramme.txt > 1gramme.tmp.txt sed 's/^[ ]*//' 2gramme.txt > 2gramme.tmp.txt sed 's/^[ ]*//' 3gramme.txt > 3gramme.tmp.txt Leerzeichen zwischen Häufigkeit und n-gramm durch Tabstop ersetzen: sed 's/[ ]/\t/' 1gramme.tmp.txt > 1gramme.tab.txt sed 's/[ ]/\t/' 2grammetmp.txt > 2gramme.tab.txt sed 's/[ ]/\t/' 3gramme.tmp.txt > 3gramme.tab.txt n-gramm-Stellen mit Tabstops trennen: sed 's/\(.$\)/\t\1/' 2gramme.tab.txt > 2grammetab.tab.txt sed 's/\(.\)\(.$\)/\t\1\t\2/' 3gramme.tab.txt > 3grammetab.tab.txt Diese Dateien mit Zwischenergebnissen können gelöscht werden: s.l1.txt s.l1.wln.txt s.1st.txt s.bi2st.txt s.tri3st.txt s.bi1st.txt s.tri1st.txt s.tri2st.txt s.biroh.txt s.triroh.txt 1gramme.tmp.txt 2gramme.tmp.txt 3gramme.tmp.txt ========== Ergebnisse zum Leipziger 3-Millionen-Sätze-Korpus (über 330 Millionen Zeichen): s.txt # Textkörper für zukünftige Arbeitsgrundlage 1gramme.txt # absolute Häufigkeiten der Zeichen 2gramme.txt # absolute Häufigkeiten der Bigramme 3grammetxt # absolute Häufigkeiten der Trigramme 1gramme.tab.txt # absolute Häufigkeiten mit Tabstop der Zeichen 2grammetab.tab.txt # absolute Häufigkeiten der Bigramme mit Tabstops 3grammetab.tab.txt # absolute Häufigkeiten der Zeichen mit Tabstops Die Ergebnisse (außer s.txt) können ab jetzt heruntergeladen werden: gepacktes Format: http://freenet-homepage.de/nexusboard/Neo/ngramme/ngramme.7z ungepackt (unicode UTF-8): http://freenet-homepage.de/nexusboard/Neo/ngramme/1gramme.txt http://freenet-homepage.de/nexusboard/Neo/ngramme/2gramme.txt http://freenet-homepage.de/nexusboard/Neo/ngramme/3gramme.txt http://freenet-homepage.de/nexusboard/Neo/ngramme/1gramme.tab.txt http://freenet-homepage.de/nexusboard/Neo/ngramme/2grammetab.tab.txt http://freenet-homepage.de/nexusboard/Neo/ngramme/3grammetab.tab.txt Mit netten Grüßen Karl ¹ Message-ID: <[email protected]> --
