4. Erstellung paralleler Korpora (III). Alignment der heruntergeladenen Websites - mkappus1/DatenmanagementMTHS24 GitHub Wiki
1. Einleitung
Diese Woche werden wir das automatische Alignment von Dokumenten überprüfen, indem wir Dateien alignieren, die wir letzte Woche heruntergeladen haben. Darüber hinaus werden wir lernen, wie man in vergleichbaren Korpora nach parallelen Segmenten sucht. Viele der benötigten Dateien finden Sie auf der folgenden Seite auf Github
2. Empfohlene Lektüre
Ein etwas älterer Text über hunalign (von 2008), der sich an Übersetzr:innen richtet: Aligning texts with Hunalign
3. Einige Vorüberlegungen
In diesem Block werden wir einige der Methoden und Werkzeuge anwenden, die wir in den letzten Wochen bereits gesehen haben. Das Ziel ist, aus Daten einer bestimmten Webseite ein zweisprachiges Korpus zu erstellen und es so aufzubereiten, dass es später für das Training eines maschinellen Übersetzungssystems verwendet werden kann. Wir werden die einzelnen Schritte mit einem kleinen Ausschnitt der Website (ca. 10 Dateien pro Sprache) durchspielen, die jeweiligen resultierenden Dateien für die ganze Webseite (ca. 630 Dateien pro Sprache) werden im weiteren Verlauf des Kurses zur Verfügung gestellt.
Zunächst ein paar Vorüberlegungen: Als Datenquelle wollen wir die Seite des Bundesamtes für Gesundheit (BAG) verwenden. Dort finden wir Daten auf Deutsch, Italienisch und Englisch (und auch Französisch) zum Thema Gesundheit.
Aufgabe 1: Analyse der Mehrsprachigkeit des Web-Auftritts des BAG (anhand der folgenden Leitfragen):
- Wie parallel sind Inhalte des Web-Auftritts des BAG in den verschiedenen Sprachen? Sind alle Inhalte in allen Sprachen verfügbar?
- Wie wird die Mehrsprachigkeit auf der Webseite verwaltet? Wie lässt sich z.B. die Sprache einer bestimmten Seite anhand der Adresse erkennen? Gibt es hier Muster bei der Verwendung der Webadressen (URLS)?
- Welchen Einfluss könnten diese Punkte auf die Vorgehensweise bei der Korpuserstellung haben? Analysieren Sie die Webseite dahingehend und geben Sie ihre Ergebnisse stichwortartig unter Aufgabe 1 auf Moodle ab.
Als Ausgangspunkt für unsere Datensammlung sollen uns die Sitemaps der Webseite für die verschiedenen Sprachen dienen, die wir ja schon im letzten Block angeschaut und bearbeitet haben:
- https://www.bag.admin.ch/bag/de/home/sitemap.html (Deutsch)
- https://www.bag.admin.ch/bag/it/home/sitemap.html (Italienisch)
- https://www.bag.admin.ch/bag/en/home/sitemap.html (Englisch)
Aufgabe 2: Versuchen Sie in eigenen Worten zu beschreiben, wie man dabei vorgehen könnte, die Webseiten der BAG-Webseite zu identifizieren, die in allen (relevanten) Sprachen vorkommen?
Stellen Sie sich vor, sie wollen ein Python-Skript erstellen lassen, das Ihnen anhand der Sitemaps (oder einer anderen Liste der verfügbaren Links) die Links für die Seiten erstellt, die in allen Sprachen vorhanden sind. Wie erklären Sie dem Programmierer oder der Programmiererin (der/die mit der Struktur und dem Aufbau der BAG-Website nicht vertraut ist), was das Skript leisten soll? Formulieren Sie das Ganze aus und laden Sie Ihre "Anleitung" unter Aufgabe 2 auf Moodle hoch..
Herunterladen von Dateien in mehreren Sprachen
Mit dem Skript trafiList.py können Sie die Inhalte von Webseiten, die in einer Textdatei als eine Liste von Links angegeben sind, herunterladen. Die Inhalte jeder Webseite aus der Liste werden dann jeweils in einer Datei abgespeichert, die fortlaufend nach dem Schema Webseite_XXXX-.txt nummeriert werden.
Hinweis/Update: Auf Github finden sie angepasste Versionen des Skripts für die jeweiligen Sprachen, bei denen die Namen der resultierenden Textdateien einen Zusatz enthalten, der auf die Sprache hinweist (en/de/it):
Verwenden Sie im Folgenden die angepassten Skripts für den Download der Dateien in der jeweiligen Sprache
Aufgabe 3: Wählen Sie für 2 der Sprachen je 10 Links aus den Dateien
und erstellen sie für die zwei Sprachen je eine neue Textdatei mit diesen Links (in Listenform). Passen Sie das Skript _trafiliList-xy.py mit Hilfe eines Texteditors (Notepad ++ in der Windows Umgebung oder nano in der UNIX-Umgebung) für jede der beiden Sprachen so an, dass Ihre neuen Textdateien mit den 10 Links eingelesen werden.
Erstellen Sie einen neuen Ordner für die beiden Sprachen und kopieren Sie die jeweilige angepasste Version des Skriptes in diese Ordner. Laden Sie die Inhalte der 10 Webseiten herunter: Es kann sinnvoll sein, erst das entsprechende Skript für die Sprache und die Datei mit der Liste der Links in das jeweilige Unterverzeichnis für die Sprache zu verschieben (Befehl
mv
) oder zu kopieren (Befehlcp
).
Hier ein Beispiel. Im Verzeichnis für Deutsch mit dem Namen 10-BAG-Seiten-de finden Sie das Skript, das sich auf eine Liste mit 11 deutschsprachigen Links bezieht, sowie die Liste mit 11 Links aus der Gesamtliste der Links auf Deutsch für die deutschsprachigen Webseiten (BAG-Links-de-45-55.txt).
Die inkonsistente Benennung des Ordners 10-BAG-Seiten-de beruht auf einem Fehler beim Übernehmen der Links in die Liste (es sind 11 statt wie eigentlich geplant 10 :smile:)
Rufen Sie das Skript über den folgenden Befehl auf.
Es werden die Inhalte der Dateien aus der Liste heruntergeladen und unter den Namen webseite 1.txt bis webseite11.txt abgespeichert.
Lassen Sie sich die Inhalte der Unterverzeichnisse für die beiden Sprachen anzeigen, machen sie jeweils einen Screenshot davon und laden sie die beiden Screenshots unter Aufgabe 3 auf Moodle hoch.
4. Alignment
In diesem Abschnitt werden wir das Alignment der Dokumente von der Website/den Websites überprüfen, die wir im vorherigen Abschnitt heruntergeladen haben. Sie können die 10 (oder 11 :smile:) vorher heruntergeladenen Dateien verwenden oder falls es dabei Probleme gegeben habe sollte, können Sie sich pro Sprache eine ZIP Datei mit 11 Dateien herunterladen. Sie können diese Dateien direkt über die folgenden Links herunterladen, oder verwenden Sie die Dateien, die Sie bisher selbst erstellt haben. Entpacken Sie die Dateien dann.
- Link zu Zip-Datei mit 11 Textdateien auf Englisch
- Link zu Zip-Datei mit 11 Textdateien auf Deutsch
- Link zu Zip-Datei mit 11 Textdateien auf Italiensich
Wie Sie sehen, sind die Namen der Dateien auf Englisch, Italienisch und Deutsch identisch und unterscheiden sich nur in den Suffixen -en.txt, -de.txt und -it.txt)
Lassen Sie uns nun die einzelnen Schritte des Alignments mit diesen Dateien durchgehen:
- Segmentierung
- Alignment
- Auswahl der Segmente
Ich werde alle notwendigen Schritte aufführen, einschliesslich der Installation der Voraussetzungen. Denken Sie jedoch daran, dass Sie dies nicht noch einmal tun müssen, wenn Sie die Programme bereits heruntergeladen und die Voraussetzungen installiert haben.
4.1. Segmentierung
Für den nächsten Schritt habe ich ein neues Verzeichnis segmentierung erstellt. In diesem Verzeichnis habe ich je ein Unterverzeichnis für die beiden Sprachen (hier Deutsch und Englisch) erstellt. In diesen Unterverzeichnissen habe ich die ZIP-Dateien mit den 11 Textdateien abgelegt und mit dem Befehl unzip Dateiname.zip
entpackt.
Die Dateistruktur sieht also folgendermassen aus:
Für die Segmentierung können wir [MTUOC-segmenter] verwenden. Um ihn zu erhalten, können Sie Folgendes eingeben
git clone https://github.com/mtuoc/MTUOC-segmenter.git
Mit den Dateien gibt es wieder eine Datei namens requirements.txt mit den Voraussetzungen und Python-Bibliotheken für das Skript. Sie können alle Voraussetzungen installieren, indem Sie Folgendes eingeben:
sudo pip3 install -r requirements.txt
Bitte schauen Sie sich mindestens eine der Dateien vor der Segmentierung in einem Texteditor oder über die Tools less oder more an.
Da wir alle Dateien in einem Verzeichnis segmentieren wollen, verwenden wir das Programm MTUOC-segmenterDIR.py, das alle Dateien in einem angegeben Ordner segmentiert, mit den folgenden Parametern (die Namen und Speicherorte der verwendeten Ordner und Dateien können je nach Ordnerstruktur abweichen.
python3 MTUOC-segmenterDIR.py -i ../deutsch -o ../seg-deutsch -s segment.srx -l German -p
(für Deutsch)
und
python3 MTUOC-segmenterDIR.py -i ../english -o ../seg-english -s segment.srx -l English -p
(für Englisch)
bzw.
python3 MTUOC-segmenterDIR.py -i ../italiian -o ../seg-segitalian -s segment.srx -l Italian -p
(für Italienisch)
- Der Parameter
-i
steht dabei für den Ordner mit den Ausgangsdateien - Der Parameter
-o
für das Verzeichnis, in dem die segmentierten Dateien abgelegt werden - Der Paramter -s für die Datei mit den Segmentierungsregeln für alle Sprachen, diese liegt unter dem Namen segment.srx im gleichen Verzeichnis wie das Python-Skript.
- Mit dem Parameter "-l" geben Sie die Sprache der zu alignierenden Dateien an, damit die entsprechenden Regeln innerhalb der Datei segment.srx gefunden werden können (für uns English oder German oder Italian). Für andere Sprachen müssten Sie die srx-Datei in einem Text-Editor öffnen, um sicher zu gehen, dass Sie die richtige Schreibweise für die jeweilige Sprache haben.
- der Parameter -p fügt den Abschnitten ein Tag hinzu, das später für das Alignment mit hunalign sinnvoll ist.
In den Verzeichnissen seg-english und seg-deutsch haben wir nun die segmentierten Texte auf Englisch bzw. Deutsch.
Aufgabe 4 (ohne Abgabe): Suchen sie die segmentierte Version der Datei, die Sie vorher im Texteditor angeschaut haben, in einem Texteditor oder über die Tools less oder more an. Was hat sich durch die Segmentierung geändert?
4.2. Alignment
Um die Dateien zu alignieren, werden wir hunalign verwenden. Sie finden dieses Programm und andere Programme, die diese Aufgabe erleichtern, unter MTUOC-aligner(https://github.com/mtuoc/MTUOC-aligner). Holen Sie sich die Programme, mit dem folgenden Befehl:
git clone https://github.com/mtuoc/MTUOC-aligner.git
Um die Dateien zu alignieren, ist es ratsam, ein sogenanntes Alignment-Wörterbuch zu haben. In diesen Alignment-Wörterbüchern finden Sie zehntausende Wortpaare, in den beiden Sprachen, die nachher beim Alignment die Zuordnung erleichtern sollen. Hier ein kleiner Ausschnitt aus dem Alignment-Wörterbuch (englisch-Italienisch):
Das Englisch-Deutsch-Wörterbuch erhalten Sie, mit dem folgenden Befehl.
Das Englisch-Italienisch-Wörterbuch erhalten Sie mit dem Befehl
wget https://github.com/mkappus1/DatenmanagementMTHS24/raw/refs/heads/main/Woche%204/hunapertium-en-it.dic
Um das Alignment durchzuführen, erstellen wir in einem Zwischenschritt eine Batch-Datei, die einige der Parameter und die Liste der zu alignierenden Dateien für das Alignment zusammenfasst. Diese erstellen wir mit dem Programm MTUOC-create-batchfile.py das folgendermassen verwendet werden sollte:
- Wir müssen unter
--dirSL
also den Ordner angeben, in dem sich die zu alignierenden Dateien in der Ausgangssprache (Englisch) befinden - Unter
--DirTL
geben wir den Ordner mit den Dateien in der Zielsprache (Deutsch oder Italienisch) an - Beim Parameter --batchfile geben wir den Namen der Batchdatei an, die erstellt werden soll, und die wir später beim Alignment weiter verenden werden
- Die beiden Parameter
--r1
und--r2
geben an, welche Kennzeichnungen die Dateien für die jeweiligen Sprachen in den Dateinamen zu erwarten sind. Bei uns wäre das en.txt fürr1
und de.txt bzw. it.txt fürr2
.
Der folgende Befehl würde also die Dateien aus den Verzeichnissen seg-en und seg-de (die wenn sie so angegeben werden im gleichen Verzeichnis liegen müssen wie das Skript) für das Alignment verwenden, als Ausgabeverzeichnis für das Alignment das Verzeichnis ali-en-de im gleichen Verzeichnis wie das Skript kreieren und schliesslich die Batch-Datei batchENDe.txt_ im aktuellen Verzeichnis erstellen, die wir beim eigentlichen Alignmentvorgang dann als Parameter mitgeben.
python3 MTUOC-create-batchfile.py --dirSL seg-en --dirTL seg-de --dirALI ali-en-de --batchfile batchEnDe.txt --r1 en.txt --r2 de.txt
Je nachdem, wo die verschiedenen Dateien liegen, müssen entweder die Pfade bei den Parametern angepasst werden oder die Ordner mit den zu alignierenden Dateien in das Verzeichnis kopiert werden, von wo aus das Skript ausgeführt wird. Das könnte zum Beispiel so aussehen:
Wenn die Anzahl oder die Benennung der Dateien in den verschiedenen Sprachen nicht übereinstimmt, sehen Sie nach dem Ausführen des Skripts einen Liste der Dateien, die nicht aligniert werden können.
*** a624013-de.txt
*** a624014-de.txt
*** a624015-de.txt
*** anhanga-de.txt
*** anhangb-de.txt
Der Inhalt resultierenden Batch-Datei sieht dann so oder so ähnlich aus:
Nachdem wir die Batch-Datei erstellt haben, die wir als Vorlage für die Parameter für das Programm hunalign verwenden wollen, können wir das eigentliche Alignment durchführen, indem wir Folgendes eingeben:
./hunalign -batch hunapertium-en-de.dic -text -utf -realign batchEnDe.txt
Auch hier müssen die Dateinamen für der Alignmentwörterbuch (hier hunapertium-en-de.dic und die Batchdatei (hier batchEnDe.txt) je nach Sprache oder Ordnerstruktur möglicherweise angepasst werden.
Falls Sie beim Ausführen von hunalign die Fehlermeldung "Permission denied" erhalten, bedeutet das, dass die Datei keine Ausführungsberechtigung hat. Sie können die Berechtigungen recht einfach mit dem Befehl
chmod +x ./hunalign
hinzufügen. Wenn es viele Dokumente zu alignieren gibt, kann der Vorgang eine Weile dauern. Wenn das Alignment im Verzeichnis ali-en-de abgeschlossen ist, haben wir alle Alignments.
Die Inhalte der einzelnen Dateien sehen dann so (oder so ähnlich) aus:
Man findet den Englischen Satz, dann durch einen Tabulator getrennt den entsprechenden deutschen Satz und schliesslich noch den sogenannten Konfidenz-Index (Confidence Score), eine Zahl zwischen 0 und 1. Dieser Index drück aus, wie sicher sich das Programm ist, dass die beiden Sätzen in den jeweiligen Sprachen tatsächlich zusammengehören. je höher der Wert, desto verlässlicher die Zuordnung. Diesen Index werden wir im folgenden für die Auswahl sinnvoller Segmente verwenden.
4.3. Die Auswahl der Segmente
Anhand des Konfidenz-Index filtern wir nun die Alignments mit einem Konfidenz-Index grösser als 0 aus, indem wir das Skript selectAlignmentsDir.py verwenden.
Über den Befehl python3 selectAlignmentsDir.py -h
können wir uns zunächst die verfügbaren bzw. notwendigen Parameter für dieses Skript anzeigen lassen:
Wir müssen als wissen in welchem Ordner das Ergebnis unseres Alignments aus dem letzten Schritt liegt und dann mit dem Parameter -i
aufrufen, wir müssen weiterhin mit dem Parameter -o
einen Namen für eine Textdatei angeben, in die das Ergebnis geschrieben wird und als letztes noch mit dem Parameter -c
den Wert des Konfidenz-Index angeben, ab dem wir die Satzpaare weiterverwenden wollen. Je nachdem wo der Ordner und die Ergebnisdatei liegen bzw. später liegen sollen, könnte der entsprechende Befehl so aussehen (hie werden alle Zuordnungen übernommen, der Konfidenz-Index höher als 0 ist):
python3 selectAlignmentsDir.py -i ali-en-de -o bag-en-de.txt -c 0
In der Datei bag-en-de.txt finden wir das Ergebnis des Alignments . Wir können die Segmente zählen, indem wir Folgendes tun:
wc -l bag-en-de.txt
342 bag-en-de.txt
Wir haben also 342 Segmente in dieser Datei. Wie Sie noch aus dem ersten Block vielleicht im Hinterkopf haben, können innerhalb dieser Datei wiederholte Segmente entfernt werden, indem Sie folgendes eingeben:
cat bag-en-de.txt | sort | uniq | shuf > bag-uniq-en-de.txt
Dabei wird die Datei bag-en-txt sortiert (sort
), die Dubletten werden entfernt (uniq
) die Inhalte der Datei werden zufällig sortiert (shuf
) und das Ergebnis wird in einen neue datei mit dem Namen bag-uniq-en-de.txt geschrieben.
Und nun können wir die Ergebnisse zählen:
wc -l bag-uniq-en-de.txt
294 bag-uniq-en-de.txt
Wie Sie feststellen können, hat sich die Anzahl der Segmente auf 294 verringert. Überprüfen Sie die Datei in einem geeigneten Texteditor (oder mit less oder more , um festzustellen, ob die Ergebnisse des Alignments zufriedenstellend sind. Wenn die Ergebnisse schlecht sind, können Sie die Auswahl der Segmente mit einem höheren Vertrauensniveau wiederholen.
Aufgabe 4: Geben Sie die Liste mit den ausgewählten Segmenten (ohne Wiederholungen) Aufgabe 5 auf Moodle ab. Schauen Sie sich die Inhalt der Dateien stichprobenartig an und überlegen Sie ob es Segment geben könnte die für das Training eines maschinellen Übersetzungssystem mehr oder weniger relevant sein könnten. Schreiben sie sich Ihre Überlegungen stichwortartig auf und geben Sie diese ebenso unter Aufgabe 5 auf Moodle ab.
4. Suche nach parallelen Segmenten in nicht-parallelen Korpora - NOCH NICHT BEARBEITEN
Bisher haben wir parallele Dokumente aligniert, d.h. Dokumente, in denen die meisten Segmente des Dokuments in einer Sprache auch im Dokument in der anderen Sprache vorkommen. Die Programme, die wir gesehen haben, sind in der Lage, fehlende Segmente zu erkennen und sogar nach Alignments mit einem anderen Verhältnis als 1:1 zu suchen.
In diesem Abschnitt werden wir uns eine Technik ansehen, die es ermöglicht, nach Segmenten zu suchen, die Übersetzungsäquivalente zwischen zwei nicht parallelen Dokumenten sind. Dies ist mit Hilfe von Satzeinbettungen möglich, einem Konzept, das dem der Worteinbettungen ähnelt, aber statt ein Wort durch einen Vektor zu repräsentieren, wird ein ganzer Satz dargestellt. Für diese Aufgabe werden wir mehrsprachige Satzeinbettungsmodelle verwenden, die es uns ermöglichen, Sätze in verschiedenen Sprachen im selben Vektorraum darzustellen. Auf diese Weise haben Sätze, die im Vektorraum nahe beieinander liegen, eine gute Chance, übersetzungsäquivalent zu sein.
Die Schritte zur Suche nach übersetzungsgleichen Segmenten in nicht-parallelen Korpora sind wie folgt:
- Wir haben eine Datei mit Segmenten in einer bestimmten Sprache (L1) und eine andere mit Segmenten in einer anderen Sprache (L2)
- Wir repräsentieren die Segmente jeder Datei mit Hilfe eines mehrsprachigen Satzeinbettungsmodells.
- Wir vergleichen die resultierenden Vektoren, die den Segmenten in L1 entsprechen, mit allen Vektordarstellungen der Segmente in L2.
- Wenn ein L1-Segment ein L2-Segment mit ausreichend ähnlichen Vektoren hat, sind diese L1- und L2-Segmente wahrscheinlich Übersetzungsäquivalente.
Dieser Prozess kann mit den Programmen MTUOC-bitext_mining.py und MTUOC-bitext_mining-GPU.py aus dem Repository [GitHub - mtuoc/MTUOC-aligner: Scripts and programs to automatically align text files using Hunalign or SBERT.](https://github.com/mtuoc/MTUOC-aligner) durchgeführt werden. Die beiden Programme sind identisch, aber das zweite erlaubt die Verwendung von GPU-Einheiten. Der Prozess der Vektordarstellung und der Suche nach ähnlichen Vektoren ist rechenintensiv, so dass es oft notwendig ist, GPU-Einheiten zu verwenden.
Um diese Algorithmen zu testen, werden wir das Ergebnis der Konvertierung des Medline-Downloads in Text mit dem generischen Programm verwenden, das, wenn Sie sich erinnern, zwei Textdateien erstellt hat, eine mit allen Segmenten in Englisch und die andere mit allen Segmenten in Spanisch. Sie können diese Dateien über die folgenden Links herunterladen:
wget http://lpg.uoc.edu/seminarioTAN/semana_3/text-en.txt
wget http://lpg.uoc.edu/seminarioTAN/semana_3/text-es.txt
Wir werden die sich wiederholenden Segmente aus diesen Dateien entfernen:
cat text-de.txt | sort | uniq | shuf > text-uniq-de.txt
cat text-en.txt | sort | uniq | shuf > text-uniq-de.txt
Und nun können wir das Programm wie folgt ausführen:
python3 MTUOC-bitext_mining.py text-uniq-de.txt text-uniq-de.txt text-uniq-de.txt aliSBERT-uniq-brut-de.txt
(es kann sein, dass Ihnen einige Voraussetzungen fehlen, wenn Sie also Fehler erhalten, installieren Sie diese: sentence_transforms und faiss-cpu, wenn Sie keine GPU haben)
Der Prozess ohne GPU ist recht langsam, haben Sie also Geduld.
Sie können das Ergebnis direkt herunterladen von: http://lpg.uoc.edu/seminarioTAN/semana_4/aliSBERT-uniq-brut-eng-spa.txt
Das Alignment besteht aus dem Segment auf L1, tab, dem Segment auf L2, tab und einem Konfidenzindex. Die Ergebnisse werden nach diesem Vertrauensindex sortiert.
Hier ist es wichtig, eine Sichtprüfung vorzunehmen. Öffnen Sie die Datei des Alignierens mit einem Texteditor und blättern Sie nach unten, bis die Ergebnisse schlecht sind, um den niedrigsten Index zu ermitteln, ab dem die Ergebnisse verworfen werden sollen. Sie können dann das Programm selectAlignmentsFile.py verwenden, um die Segmente mit einem höheren Index als dem gefundenen auszuwählen.
Beachten Sie auch, dass es Alignments der Segmente L1 - L2, im Beispiel Englisch - Englisch, gibt. Das liegt daran, dass diese Segmente in den spanischen Texten vorkommen. Betrachten Sie sie vorerst als ein gutes Alignment. In Woche 6 werden wir lernen, wie wir den Korpus bereinigen und die Sprache der Segmente automatisch überprüfen können.