n***@freenet.de
2009-12-08 02:49:37 UTC
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: <***@web.de>
--
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: <***@web.de>
--