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]>
 

--

Antwort per Email an