1.6 Grundlegende Korpusvorbereitung mit Unix Befehlen - mkappus1/DatenmanagementMTHS24 GitHub Wiki
1.6 Grundlegende Korpusvorbereitung mit Unix-Befehlen
1.6.1 Beschaffung des Korpus
In diesem Abschnitt werden wir eine grundlegende Korpusvorverarbeitung mit Unix-Befehlen und einigen einfachen Dienstprogrammen durchführen. In diesem Kurs wollen wir ein NMT-System für das Fachgebiet Medizin und das Sprachpaar Englisch - Deutsch (oder Englisch - Italienisch) trainieren. Um mit der Vorverarbeitung zu beginnen, müssen wir auf unser Linux-Terminal zugreifen und das Korpus herunterladen. Zunächst einmal möchten wir das Opus Corpora EMEA-Korpus im Moses-Format herunterladen. Sie können die Website von Opus Corpora besuchen und mit Hilfe der Suchmaschine den Download-Link auswählen und ihn von der Website herunterladen, oder Sie kopieren den Download-Link und laden ihn mit wget herunter:
wget https://object.pouta.csc.fi/OPUS-EMEA/v3/moses/de-en.txt.zip
(Englisch - Deutsch)
wget https://object.pouta.csc.fi/OPUS-EMEA/v3/moses/en-it.txt.zip
(Englisch - Italienisch)
Wenn Sie eine Fehlermeldung erhalten, dass Sie wget nicht installiert haben, können Sie es installieren (unter Ubuntu 22.04 und anderen Debian-basierten Distributionen):
sudo apt-get install wget
Sobald das Korpus heruntergeladen wurde, müssen wir es entpacken, da es als Zip-Datei heruntergeladen wird. Gehen Sie dazu im Terminal in das Verzeichnis, in dem sich die Datei befindet, und geben Sie folgenden Befehl ein:
unzip de-en.txt.zip
unzip en-it.txt.zip
(Italienisch)
Achtung: Wenn die Anwendung unzip auf Ihrem Linux-System unzip nicht installiert ist und dieser Befehl eine Fehlermeldung ausgibt, können Sie es mit dem folgenden Befehl installieren:
sudo apt-get install unzip
1.6.2 Grundlegende Vorverarbeitungen
Sobald die Dateien entpackt sind, sehen Sie mehrere Dateien, darunter (die Namen können je nach Sprachpaar oder Korpus, das Sie gewählt haben, variieren):
- EMEA.de-en.en: der englische Teil des Korpus
- EMEA.de-en.de: der deutsche Teil des Korpus
Segmente zählen
Wir können die Anzahl der Segmente (Zeilen) im Korpus mit Hilfe des Befehls wc
zählen. Der Befehl wc
, erlaubt es die Anzahl der Zeilen, Wörter und Bytes in den Dateien zu zählen, die mit dem Parameter _Datei _angegeben wurden. Die Syntax des Befehls sieht folgendermassen aus:
wc [Option] [Datei]
Dabei gibt es die folgenden Optionen:
- -c: Zählt lediglich die Bytes innerhalb einer Datei.
- -L: Gibt die Länge der längsten Zeile aus.
- -l: Zählt nur die Zeilen innerhalb der Datei.
- -m: Gibt ausschliesslich die Zeichen innerhalb der Datei an.
- -w: Zählt nur die Wörter in der Datei.
wc -l EMEA.de-en.??
1108752 EMEA.de-en.de
1108752 EMEA.de-en.en
2217504 total
Wie erwartet, haben die beiden Dateien die gleiche Anzahl von Zeilen, da es sich um Parllelkorpora handelt. Dieses parallele Korpusformat mit zwei zeilenweise ausgerichteten Dateien wird als Moses-Format bezeichnet.
Tabellenförmiges Format erstellen
Wir wollen nun dieses Korpus im Moses-Format in ein Korpus im tabellenförmigen Textformat zu konvertieren (mit _Paste_verbinden wir nacheinander jede Zeile der ersten Datei mit einem Tabulator und der entsprechenden Zeile der zweiten Datei). Gleichzeitig entfernen wir die Wiederholungen (mit sort | uniq
) und wir sortieren das Korpus nach dem Zufallsprinzip (mit shuf):
Eine kleine Übung zu diesem Vorgehen zusammen mit einer detaillierteren Erklärung der verwendeten Befehle finden Sie hier: Übung-Inhalt von 2 Dateien in einer Datei tabellenförmig zusammenfassen.
Was macht der Befehl paste?
Ähnlich wie cat
ermöglicht das Kommandozeilenprogramm paste
die Ausgabe von Dateiinhalten auf die Standardausgabe. Während cat
jedoch Inhalte einfach aneinanderreiht, werden sie mit paste
spaltenweise aneinandergereiht. Das Grundschema des Befehls ist:
paste [OPTIONS] DATEI1 DATEI2 ...
Das von paste
verwendete Trennzeichen kann mit der Option -d angepasst werden. Standardmässig werden Tabulatoren verwendet. Mit der Option _-s _ (serial) kann ein zweiter Modus aktiviert werden. In diesem werden alle Zeilen der ersten Eingabedatei in einer eigenen Zeile in die Ausgabe übernommen. Jede Zeile der Ausgabe enthält somit nur den Inhalt einer Eingabedatei.
paste EMEA.de-en.en EMEA.de-en.de | sort | uniq | shuf > EMEA-uniq-eng-deu.txt
Wenn auf Ihrem System shuf nicht installiert ist, geben Sie ein:
apt-get install coreutils
Jetzt können wir die Anzahl der Zeilen in der resultierenden Datei zählen:
wc -l EMEA-uniq-eng-deu.txt
366888 EMEA-eng-deu.txt
Wie wir sehen können, ist die Anzahl der Segmente geringer, da es in der ursprünglichen Datei sich wiederholende Segmente gab. Tatsächlich gab es in diesem Korpus eine Menge wiederholter Segmente, da sich die Zahl von mehr als 1 Mio. Segmente auf etwas mehr als 350.000 Segmente reduziert hat.
Wir haben gelernt, wie man vom Moses-Format zu tabellarischem Text übergeht, aber es ist auch möglich, mit dem Befehl cut
von tabellarischem Text zu Moses überzugehen:
cut -f 1 EMEA-uniq-eng-spa.txt > EMEA-uniq.en
cut -f 2 EMEA-uniq-eng-spa.txt > EMEA-uniq.de
6.3 Anzeigen von Dateien im Terminal
Unter Unix können Sie den Inhalt von Dateien, wie gross sie auch sein mögen, mit den folgenden Befehlen anzeigen:
cat: Dieser Befehl verkettet den Inhalt von Dateien und zeigt ihn auf dem Bildschirm an, wenn nicht angegeben ist, wo er abgelegt werden soll, etwa so
cat EMEA-uniq-eng-deu.txt
zeigt den Inhalt schnell und ohne Unterbrechung an. Um es zu stoppen, drücken Sie Strg+C
more
: zeigt den Inhalt der Datei an, hält aber an, wenn der Bildschirm voll ist, und um fortzufahren, müssen Sie Enter drücken. Der Befehl less bewirkt übrigens genau dasselbe.
more EMEA-uniq-eng-deu.txt
tail
: zeigt die letzten Zeilen der Datei an.
tail EMEA-uniq-eng-spa.txt
6.4 Zwei Dateien konkatenieren (aneinanderhängen) und Wiederholungen entfernen
Wie wir gesehen haben, ist unser EMEA-Korpus nach dem Entfernen der wiederholten Segmente zu klein geworden. Wie können wir unser Korpus sinnvoll erweitern um eine ausreichende Datenmenge zu erhalten? Wenn wir uns die Ressourcen in Opus ansehen, sehen wir, dass wir das Korpus ELRC-EMEA zur Verfügung haben.
Um die Inhalte diese Korpus zu unserem bereinigten Korpus hinzuzufügen, führen Sie die folgenden Operationen aus (analog zum EMEA-Koprus):
Laden Sie das ELRC-EMEA Korpus im Moses Format herunter (ACHTUNG: wenn Sie dies im gleichen Verzeichnis wie die EMEA-Dateien tun, löschen Sie zuerst die en-es.txt.zip mit rm en-en.txt.zip
oder benennen Sie die ursprüngliche ZIP-Datei mit dem Befehl mv alterdateiname neuerdateiname
um (mv steht eigentlich für move))
wget https://object.pouta.csc.fi/OPUS-ELRC-EMEA/v1/moses/de-en.txt.zip
Entpacken Sie die heruntergeladenen ZIP-Datei:
unzip de-en.txt.zip
Zählen Sie die Inhalte der beiden heruntergeladenen Dateien.
wc ELRC-EMEA.de-en.*
Entfernen Sie Doubletten und führen Sie die beiden einsprachigen Dateien zusammen.
paste ELRC-EMEA.de-en.en ELRC-EMEA.de-en.de | sort | uniq | shuf > ELRC-EMEA-uniq-eng-deu.txt
wc -l ELRC-EMEA-uniq-eng-deu.txt
777372 ELRC-EMEA-uniq-eng-deu.txt
Nun wollen wir die beiden bereinigen Korpora wie folgt kombinieren:
cat EMEA-uniq-eng-deu.txt ELRC-EMEA-uniq-eng-deu.txt | sort | uniq | shuf > corpusEMEA-uniq-eng-deu.txt
Wir verwenden den Befehl cat statt wie vorher paste, weil wir die Inhalte beiden Dateien ja hintereinander zusammenführen wollen und nicht wie vorher Inhalte von beiden Dateien auf einer Zeile zusammenführen wollen.
Dann zählen wir, wie viele unetrschiedliche Segmente wir haben:
wc -l korpusEMEA-uniq-eng-eu.txt
1144260 corpusEMEA-uniq-eng-deu.txt
Am Ende haben wir ein Korpus mit etwas mehr als 1 Mio. Segmenten aus dem Bereich Medizin erhalten. Dieses Korpus wird die Grundlage für die Engine sein, die wir in diesem Kurs trainieren werden. Geben Sie Ihre Korpusdatei hier auf Moodle ab.
Ein zusammenfassenden Video zu diesen Schritten gibt es auf Moodle.