1.6 Grundlegende Korpusvorbereitung mit Unix Befehlen - mkappus1/DatenmanagementMTHS24 GitHub Wiki
1.6 Grundlegende Korpusvorbereitung mit Unix-Befehlen
6.1 Beschaffung des Korpus
In diesem Abschnitt werden wir eine grundlegende Korpusvorverarbeitung mit Unix-Befehlen und einigen einfachen Dienstprogrammen durchführen. In dieser Ausgabe des Seminars wollen wir ein medizinisches Englisch-Spanisch NMT-System 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/en-es.txt.zip
(Englisch - Spanisch)
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 en-es.zip
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
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.en-en-es.en: der englische Teil des Korpus
- EMEA.en-es.es: der deutsche Teil des Korpus
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. Dies Syntax des Befhel 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.en-es.e?
1098333 EMEA.en-en-es.en
1098333 EMEA.en-en-es.es
2196666 insgesamt
Wie erwartet, haben die beiden Dateien die gleiche Anzahl von Zeilen, da es sich um Prallelkorpora handelt. Dieses parallele Korpusformat mit zwei zeilenweise ausgerichteten Dateien wird als Moses-Format bezeichnet.
Wir wollen nun dieses Korpus im Moses-Format in ein Korpus im tabellenförmigen Textformat zu konvertieren (mit Paste verbinden wir jede Zeile jeder Datei mit einem Tabulator). 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.en-es.en EMEA.en-es.en | sort | uniq | shuf > EMEA-uniq-eng-spa.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-spa.txt
366888 EMEA-eng-spa.txt
Wie wir sehen können, ist die Anzahl der Segmente geringer, da es sich um wiederholte Segmente handelt. 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 groß 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-spa.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 genau dasselbe.
more EMEA-uniq-eng-spa.txt
tail: zeigt die letzten Zeilen der Datei an.
tail EMEA-uniq-eng-spa.txt
6.4 Zwei Dateien konkatenieren und Wiederholungen entfernen
Wie wir gesehen haben, ist unser EMEA-Korpus nach dem Entfernen der wiederholten Segmente zu klein geworden. Wenn wir uns die Ressourcen in Opus Corpora ansehen, sehen wir, dass wir das Korpus ELRC-EMEA zur Verfügung haben. Führen Sie die folgenden Operationen aus:
wget https://object.pouta.csc.fi/OPUS-ELRC-EMEA/v1/moses/en-es.txt.zip`
(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)
unzip en-en.txt.zip
paste ELRC-EMEA.en-en.en ELRC-EMEA.en-en.es | sort | uniq | shuf > ELRC-EMEA-uniq-eng-spa.txt
wc -l ELRC-EMEA-uniq-eng-spa.txt
777372 ELRC-EMEA-uniq-eng-spa.txt
Nun wollen wir die beiden Korpora wie folgt kombinieren:
cat EMEA-uniq-eng-spa.txt ELRC-EMEA-uniq-eng-spa.txt | sort | uniq | shuf > corpusEMEA-uniq-eng-spa.txt
Und wir zählen, wie viele verschiedene Segmente wir haben:
wc -l korpusEMEA-uniq-eng-spa.txt
1144260 corpusEMEA-uniq-eng-spa.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. Zusammenfassendes Video
Video(link)