Woche 6: Korpusbereinigung - mkappus1/DatenmanagementMTHS24 GitHub Wiki

1. Einführung


Unabhängig davon, ob Sie ein paralleles Korpus aus dem Internet bezogen oder selbst erstellt haben, ist es sehr ratsam, das Korpus zu bereinigen. Parallelkorpora können eine Reihe von Problemen aufweisen:

  • Das Vorhandensein von Zeichen, die durch ihre html/xml-Entität dargestellt werden. Wir können zum Beispiel einige „ oder á zusammen mit einigen Instanzen des entsprechenden Zeichens im Korpus finden.
  • Leere Segmente in einigen der Sprachen.
  • Segmente in anderen als den gewünschten Sprachen.
  • Segmente mit einem hohen Anteil an numerischen Ausdrücken.
  • Segmente mit XML/HTML-Tags. Systeme werden normalerweise mit Korpora trainiert, aus denen diese Tags entfernt wurden.
  • Fehler in der Zeichenkodierung.
  • Segmente mit nicht druckbaren Zeichen.
  • und viele mehr

Ausserdem ist es möglich, dass selbst wenn das Ausgangssegment in der Ausgangssprache und das Zielsegment in der Zielsprache ist, es sich nicht wirklich um Übersetzungsäquivalente handelt. In dieser Woche lernen Sie, wie man verschiedene Bereinigungsoperationen an Parallelkorpora automatisiert durchführen kann. Als Beispiel-Korpus für diese Übungen können Sie folgende Korpora verwenden, die durch die in Woche 4 beschriebenen Schritte mit Daten von der Webseite des BAG erstellt wurden. BAG Korpus (EN-DE) (ca. 16 000 Segmente) BAG Korpus (EN-IT) (ca. 11 000 Segmente)

In den nächsten Tagen stelle ich noch weitere Beispielkorpora zur Verfügung, Sie können aber auch die Korpora verwenden, die Sie in den ersten beiden Wochen erstellt haben.

2. Empfohlene Lektüre

Diese Woche empfehle ich Ihnen eine Blick in die Folien von Janine Aeberhardt aus dem CAS Translation Technology and AI aus dem Jahr 2021 (ab Folie 59). Mehr zu den dort erwähnten Tools in der kommenden Woche.

Und als weitere Referenz zwei Artikel zu Tools, die ähnliche Operationen durchführen wie die, die wir diese Woche verwenden werden:

Ramírez‐Sánchez, G., Zaragoza-Bernabeu, J., Bañón, M., & Ortiz-Rojas, S. (2020, November). Bifixer and bicleaner: two open-source tools to clean your parallel data. In Proceedings of the 22nd Annual Conference of the European Association for Machine Translation (pp. 291-298).

Zaragoza-Bernabeu, J., Ramírez‐Sánchez, G., Bañón, M., & Ortiz-Rojas, S. (2022, June). Bicleaner AI: Bicleaner goes neural. In Proceedings of the Thirteenth Language Resources and Evaluation Conference (pp. 824-831).

3. Korpusbereinigung

Die gesamte Skriptsammlung können Sie hier herunterladen https://github.com/mtuoc/MTUOC-clean-parallel-corpus/archive/refs/heads/main.zip oder über den Befehl git clone https://github.com/mtuoc/MTUOC-clean-parallel-corpus.git.

Im Verzeichnis MTUOC-clean-parallel-corpus sollten Sie folgenden Programme und Skripte finden:

grafik

Als erstes können sie das Skript MTUOC-clean-parallel-corpus.py benutzen.

Denken sie daran die in der Datei _requirements.txt _aufgeführten Module zu importieren pip install -r requirements.txt bzw. pip3 install -r requirements.txt

Lassen Sie sich über die Option -h, die verschiedenen Parameter für das Skript anzeigen python3 MTUOC-clean-parallel-corpus.py -h

 python3 MTUOC-clean-parallel-corpus.py -h
usage: MTUOC-clean-parallel-corpus.py [-h] -i INPUTFILE -o OUTPUTFILE [-a] [--remove_control_characters]
                                      [--remove_non_printable] [--norm_apos] [--norm_unicode] [--remove_tags]
                                      [--unescape_html] [--fixencoding] [--remove_empty] [--remove_short REMOVE_SHORT]
                                      [--remove_equal] [--remove_NUMPC REMOVE_NUMPC] [--remove_URLPC REMOVE_URLPC]
                                      [--remove_URL] [--remove_long REMOVE_LONG] [--remove_non_latin]
                                      [--remove_non_script] [--check_weights] [--escapeforMoses]
                                      [--stringFromFile STRINGFROMFILE] [--regexFromFile REGEXFROMFILE] [--vSL VSL]
                                      [--vTL VTL] [--vSetLanguages VSETLANGUAGES] [--vTNOTL VTNOTL] [--noUPPER]
                                      [--verbose]

MTUOC program for cleaning tab separated parallel corpora.

options:
  -h, --help            show this help message and exit
  -i INPUTFILE, --in INPUTFILE
                        The input file.
  -o OUTPUTFILE, --out OUTPUTFILE
                        The output file.
  -a, --all             Performs default cleaning actions.
  --remove_control_characters
                        Remove control characters.
  --remove_non_printable
                        Remove control characters.
  --norm_apos           Normalize apostrophes.
  --norm_unicode        Normalize unicode characters to NFC.
  --remove_tags         Removes html/XML tags.
  --unescape_html       Unescapes html entities.
  --fixencoding         Tries to restore errors in encoding.
  --remove_empty        Removes segments with empty SL or TL segments.
  --remove_short REMOVE_SHORT
                        Removes segments with less than the given number of characters.
  --remove_equal        Removes segments with equal SL or TL segments.
  --remove_NUMPC REMOVE_NUMPC
                        Removes segments with a percent of numbers higher than the given.
  --remove_URLPC REMOVE_URLPC
                        Removes segments with a percent of URLs higher than the given.
  --remove_URL          Removes segments with URLs.
  --remove_long REMOVE_LONG
                        Removes segments with more characters than the given number.
  --remove_non_latin    Removes chars outside the latin extended.
  --remove_non_script   Removes chars outside the Unicode script chars.
  --check_weights       Removes segments not having a valid weight.
  --escapeforMoses      Replaces [ ] and | with entities.
  --stringFromFile STRINGFROMFILE
                        Removes segments containing strings from the given file (one string per line).
  --regexFromFile REGEXFROMFILE
                        Removes segments matching regular expressions from the given file (one regular expression per
                        line).
  --vSL VSL             Verify language of source language segments.
  --vTL VTL             Verify language of target language segments.
  --vSetLanguages VSETLANGUAGES
                        Set the possible languages (separated by ",". For example: en,es,fr,ru,ar,zh.)
  --vTNOTL VTNOTL       Verify target language not being a given one (to avoid having SL in TL, for example).
  --noUPPER             Deletes the segment if it is uppercased (either source or target segment).
  --verbose             If set, shows the actions on standard output.

Wenn Sie sich das Programm ansehen, gibt es sehr viele Optionen. Der Einfachheit halber hat es auch die Option -a --all, die die häufigsten Bereinigungsoptionen durchführt, nämlich die folgenden:

  • Steuerzeichen entfernen
  • Entfernen von nicht druckbaren Zeichen
  • Normalisierung von Apostrophen
  • Normalisierung von Unicode-Zeichen
  • Entfernen von Tags
  • Unescape html-Zeichen
  • Kodierungsfehler beheben
  • Leere Segmente entfernen
  • Entfernen von kurzen Segmenten (weniger als 5 Zeichen)
  • Entfernen von Segmenten mit mehr als 60% numerischen Zeichen
  • Entfernen von Segmenten mit gleichen Quell- und Zielsegmenten
  • Entfernen von Segmenten mit mehr als 10% der Segmente in URLs

Jetzt schauen wir uns ein paar Anwendungsbeispiele mit den Dateien an, die wir in den letzten Wochen erstellt haben (siehe Links ZU BAG Korpora oben), Zunächst führen wir eine grundlegende Bereinigung des Korpus bag-uniq-en-it.txt bzw. bag-uniq-en-de.txt durch, Dazu habe ich die beiden Korpora in das gleiche Verzeichnis kopiert, wie das Skript MTUOC-clean-parallel-corpus.py.

Um die Bereinigung mit den gängigsten Optionen durchzuführen, verwenden Sie die Option -a. Sie können den Befehl also folgendermassen anpassen:

python3 MTUOC-clean-parallel-corpus.py -i bag-uniq-en-de.txt -o clean-bag-uniq-en-de.txt -a python3 MTUOC-clean-parallel-corpus.py -i bag-uniq-en-it.txt -o clean-bag-uniq-en-it.txt -a

Jetzt können Sie die Segmente in den beiden Dateien zählen und die Anzahl vergleichen, um zu sehen, ob tatsächlich Segmente entfernt worden sind. Dazu verwenden Sie den Befehl wc -l, den Sie schon in anderen Lektionen gesehen haben. Sie können die ursprüngliche Datei und die bereinigte Datei nacheinander einzeln zählen.

Erst:

wc -l bag-uniq-en-de.txt
11476 bag-uniq-en-de.txt

und dann:

wc -l clean-bag-uniq-en-de.txt
11157 clean-bag-uniq-en-de.txt

Oder Sie können über einen regulären Ausdruck die Segmente in beiden Dateien mit einem einzigen Befehl zu Zählen:

 wc -l *bag-uniq-en-de.txt
  11476 bag-uniq-en-de.txt
  11157 clean-bag-uniq-en-de.txt
  22633 total

Sie sehen, dass ca 300 Segmente auf diese Art entfernt wurden. Hier die Segmentzählung für die Italienische Version:

wc -l *bag-uniq-en-it.txt
  11851 bag-uniq-en-it.txt
  10960 clean-bag-uniq-en-it.txt
  22811 total

Aufgabe 1: Machen Sie einen Screenshot, der die Zeilenzahlen der ursprünglichen Datei und der bereinigten Datei zeigt, und laden Sie ihn unter Aufgabe 1 auf Moodle hoch.

Sie können die Dateien, die aus der Bereinigung resultieren, unter folgenden Links herunterladen:

Jetzt könnte es interessant sein, einen Blick auf die Segmente zu werfen, die bereinigt wurden (also aus der Datei entfernt wurden) um zu sehen, was das Skript eigentlich gemacht hat. Das Pythonskript MTUOC-clean-parallel-corpus.py bietet leider keine direkte Möglichkeit, eine Datei mit den entfernten Inhalte zu erstellen. Das Unix-Tool grep bietet uns aber die Möglichkeit die ursprüngliche Datei mit der bereinigten Datei zu vergleichen und die Segmente (Zeilen), die nur in der ursprünglichen Datei vorkommen. in eine neue Datei zu schrieben. Der entsprechende Befehl sieht schematisch so aus:

grep -Fxv -f kleinere_datei.txt groessere_datei.txt > unterschiede.txt

Wobei kleinere_datei.txt für die bereinigte Datei steht und groessere_datei.txt für die ursprüngliche Datei. Die Segmente, die in der kleineren Datei nicht mehr vorhanden sind, werden in die Datei unterschiede.txt geschrieben. Das sind die Parameter für grep, die hier benutzt werden:

  • -F: Behandelt die Muster als feste Strings (kein Regex).
  • -x: Nur Zeilen, die genau übereinstimmen.
  • -v: Gibt die Zeilen aus, die nicht übereinstimmen.
  • -f kleinere_datei.txt: Nutzt die kleinere Datei als Vergleichsmuster.

In unserem Fall könnte der Befehl so aussehen:

grep -Fxv -f clean-bag-uniq-en-de.txt bag-uniq-en-de.txt > unterschiede-de.txt

oder folgendermassen für Italienisch:

grep -Fxv -f clean-bag-uniq-en-it.txt bag-uniq-en-it.txt > unterschiede-it.txt

Aufgabe 2: Erstellen Sie eine solche Datei mit den entfernten Segmenten (Zeilen). Öffnen Sie sie in einem geeigneten Texteditor (in wsl/UNIX oder Windows). Entspricht das Ergebnis Ihren Erwartungen? Was für Segmente wurden entfernt? Notieren Sie Ihre Beobachtungen stichwortartig und laden Sie sie (zusammen mit der Datei mit den Unterschieden) unter Aufgabe 2 auf Moodle hoch..

Das Bereinigungsprogramm ermöglicht es Ihnen auch, die Sprachen der Segmente zu überprüfen und Segmente zu löschen, wenn sie nicht in der richtigen Sprache sind. Sie können auch das anhand der bereits oben verwendeten BAG-Korpora ausprobieren. Dazu führen wir das Skript _MTUOC-clean-parallel-corpus.py _ noch einmal - aber mit zusätzlichen Parametern - aus.

Stellen Sie sicher, dass Sie Ihre bisherigen Ergebnisse und bereinigten Dateien im folgenden nicht überschrieben. Kopieren Sie die bisherigen Ergebnisse in ein anderes Verzeichnis oder stellen Sie ganz sicher, dass Sie bei der nächsten Ausführung des Bereinigungsskripts MTUOC-clean-parallel-corpus.py einen anderen Dateinamen für die bereinigte Datei angeben als vorher.

python3 MTUOC-clean-parallel-corpus.py -i bag-uniq-en-de.txt -o clean-neu-bag-uniq-en-de.txt --vSL en --vTL de --vSetLanguages en,de --verbose > test.txt

Mit der Option --vSL geben wir die Ausgangssprache und mit --vTL die Zielsprache an. Mit --vSetLanguages können wir die Anzahl der zu erkennenden Sprachen begrenzen. Das kann nützlich sein, wenn wir uns sehr sicher sind, dass keine anderen Sprachen im Spiel sein können. Mit der Option --verbose können wir uns die Aktionen bzw. Ergebnisse des Bereinigungsprogramms auf dem Bildschirm ansehen. Über den Befehl > text.txt lassen wir das, was am Bildschirm ausgegeben würde, in eine Textdatei mit dem Namen text.txt schrieben. Wenn wir sie uns ansehen (more. less, ...), sieht das etwa so aus:

grafik

Die Ausgabe des Skripts ist folgendermassen zu interpretieren: TARGET NOT MATCHING: de en - Palliative Care - Hier wurde in der Zielsprache ein deutsches Segment erwartet, das Skript hat das Zielsegment als Englisch erkannt bzw. eingestuft. SOURCE NOT MATCHING: en de - Faktenblatt: KVG-Solvenztest 2024 (in German) (PDF, 273 kB, 26.09.2024) - Hier wurde in der Ausgangssprache ein Englisches Segment erwartet, das Segment wurde vom Skript aber als Deutsch interpretiert.

Die Spracherkennung ist bei kurzen Segmenten oft nicht zuverlässig, und wir können damit -- fälschlicherweise -- korrekte Segmente ausschliessen. Wenn das Korpus jedoch gross genug ist, ist es in der Regel besser, fälschlicherweise richtige Inhalte zu entfernen, als falsche Inhalte im Korpus zu belassen.

Aufgabe 3: Suchen Sie in Ihrer Datei text.txt 3 Beispiele, bei denen die Spracherkennung (also hier die Erkennung der falschen Sprache) gut funktioniert hat und 3 Segmente bei denen sie ein falsches Ergebnis geliefert hat. Erklären Sie, warum die Spracherkennung sich geirrt hat. Laden Sie Ihre Beobachtungen unter Aufgabe 3 auf Moodle hoch..

4. Korpus-Re-Scoring

Bitte lesen Sie diesen Abschnitt (4. Korpus-Re-Scoring) aufmerksam durch. Nach Möglichkeit sollten Sie die Skripte und Prozesse auch durchführen, es kann jedoch sein, dass einzelne Schritte mehr Zeit ins Anspruch nehmen als die Übungen in den vorherigen Abschnitten.

Im vorherigen Abschnitt haben wir eine Reihe von Bereinigungsoperationen für parallele Korpora gesehen. Unter anderem gibt es die Möglichkeit, die Sprachen der Segmente zu überprüfen, um sicherzustellen, dass es sich um die richtigen Sprachen handelt. Aber bei keinem dieser Vorgänge wird überprüft, ob das ursprüngliche Segment und das übersetzte Segment wirklich übersetzungsgleich sind. Es ist möglich, dass die Sprachen des Ausgangs- und des Zielsegments zwar korrekt sind, die beiden Segmente aber keine Übersetzungsäquivalente darstellen.

In diesem Abschnitt erläutern wir einen Algorithmus, der die Ausgangs- und die Zielsprache wiederherstellt und ausserdem prüft, ob das ursprüngliche und das übersetzte Segment übersetzungsäquivalent sind. Für diese Prüfung werden die ursprünglichen und die übersetzten Segmente mit demselben mehrsprachigen Satzeinbettungsmodell dargestellt.

Achtung :warning: MATHE - muss aber für die Anwendung nicht im Detail verstanden werden

Sobald die beiden Segmente durch ihre Satzeinbettungen repräsentiert sind, befinden sie sich im gleichen Vektorraum und wir können ein Ähnlichkeitsmass berechnen, das z. B. auf dem Kosinus zwischen den Vektoren basiert. Wenn dieses Ähnlichkeitsmass ausreichend hoch ist, können wir daraus schliessen, dass die Segmente übersetzungsmässig äquivalent sind. Ist die Ähnlichkeit hingegen gering, können wir daraus schliessen, dass sie nicht translatorisch äquivalent sind. Es gibt keinen konkreten Wert, der unterscheidet, was übersetzungsmässig äquivalent ist und was nicht. Wir müssen also einen Kompromiss finden, um sicher zu sein, dass sie äquivalent sind, und um nicht zu viele parallele Segmente zu eliminieren.

Der folgende Artikel beschreibt die Funktionsweise dieses Algorithmus genauer (für diejenigen, die mehr Details wissen wollen, ist er eine empfehlenswerte Lektüre, aber es ist nicht zwingend notwendig, der Aktivität zu folgen): Oliver, A., & Álvarez, S. (2023). Filtering and rescoring the CCMatrix corpus for Neural Machine Translation training. In Proceedings of the 24th Annual Conference of the European Association for Machine Translation (S. 39-45).

Laden Sie die Dafür benötigte Skriptsammlung mit dem Befehl git clone https://github.com/mtuoc/MTUOC-PCorpus-rescorer.git herunter.

Der Rescoring-Prozess kann langsam sein und bei sehr grossen Korpora ist Geduld gefragt. Um den Algorithmus zu testen, habe ich (basierend auf die Dateien von Antoni Oliver) eine Datei mit 100 Segmenten erstellt, die etwa die Hälfte der Segmentpaare enthält, die übersetzungsäquivalent sind, und die Hälfte, die es nicht sind:

Aufgabe 4: Laden Sie die beiden Dateien herunter und suche Sie 3 Segmente, die tatsächlich übersetzungäquivalent und 3 Segmente, die es nicht sind.

Geben Sie dann folgenden Befehl ein, um das Programm MTUOC-PCorpus-rescorer.py auszuführen:

Vorher muss das Spracherkennungsmodell herunter geladen werden - diese Operation kann eine Weile dauern wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin

grafik

Denken sie daran die in der Datei _requirements.txt _aufgeführten Module zu importieren pip install -r requirements.txt bzw. pip3 install -r requirements.txt - das kann in diesem Fall länger dauern (bei mir waren es ca. 20 Minuten). Wahrscheinlich ist es sinnvoll, den Befehl sudo pip3 install -r requirements.txt zu verwenden

  • python3 MTUOC-PCorpus-rescorer.py -i medline-part-toscore-en-de-neu.txt -d medline-part-rescore-database.sqlite
  • python3 MTUOC-PCorpus-rescorer.py -i medline-part-toscore-en-it-neu.txt -d medline-part-rescore-database.sqlite

Möglicherweise erhalten Sie einige Warnungen, die Sie jedoch ignorieren können. Sobald der Vorgang abgeschlossen ist, wird die SQLite-Datenbank medline-part-rescore-database.sqlite erstellt, die alle Informationen enthält.


:warning::warning::warning::warning::warning::warning:

Mit dem Befehl ls -sh können Sie die Grösse der Dateien im Verzeichnis sehen. grafik

Die erstellte SQLITE Datenbank sollte ca. 36KB gross sein (wie die beiden Datenbanken medline-part-rescore-database-it.sqlite und medline-part-rescore-database-de.sqlite hier im Screenshot). Wenn die Datei nur 8 KB gross ist (wie die Datei medline-part-rescore-database.sqlite im Screenshot), dann ist im vorherigen Schritt etwas schief gelaufen. Dieser Fehler ist ab und zu vorgekommen, ich kann ihn aber bisher nicht zuverlässig reproduzieren und habe daher keine endgültige Lösung dafür.

Um den letzten Schritt trotzdem durchführen zu können, können sie eine Version der Datenbank über die folgenden Befehl herunterladen:

  • wget https://github.com/mkappus1/DatenmanagementMTHS24/raw/refs/heads/main/Woche6/medline-part-rescore-database-de.sqlite

  • wget https://github.com/mkappus1/DatenmanagementMTHS24/raw/refs/heads/main/Woche6/medline-part-rescore-database-it.sqlite

Mit diesen Datenbanken sollten Sie im nächsten Schritt eine "nicht-leere" Textdatei erhalten.


grafik

Da es sich um eine SQLite-Datenbank handelt, kann sie direkt mit sqlite3 durchsucht werden. Um die Verwendung dieses Programms zu erleichtern, wird das Skript _MTUOC-PCorpus-selector.py _bereitgestellt, das auch die Option -h hat, um die Hilfe zu erhalten:

python3 MTUOC-PCorpus-selector.py -h
usage: MTUOC-PCorpus-selector.py [-h] -d DATABASE --sl SL --sldc SLDC --tl TL --tldc TLDC [-m MINSBERT] [-l LIMIT] -o
                                 OUTFILE

MTUOC-PCorpus-selector: a script to select parallel segments from a rescorer database created with MTUOC_PCorpus-
rescorer.

options:
  -h, --help            show this help message and exit
  -d DATABASE, --database DATABASE
                        The SQLITE database file.
  --sl SL               The source language code.
  --sldc SLDC           The minimum source language detection confidence.
  --tl TL               The target language code.
  --tldc TLDC           The minimum target language detection confidence.
  -m MINSBERT, --minSBERT MINSBERT
                        The minimum value for SBERT score.
  -l LIMIT, --limit LIMIT
                        The number of segments to be selected.
  -o OUTFILE, --outfile OUTFILE
                        The output file containing the parallel corpus.

Wenn Sie nur die Segmente erhalten wollen, die Englisch als Ausgangssprache und Deutsch bzw. Italienisch als Zielsprache haben und die mit einer Konfidenz von 0,75 für die Spracherkennung übersetzungsäquivalent sind, schreiben Sie:

  • python3 MTUOC-PCorpus-selector.py -d medline-part-rescore-database.sqlite --sl en --sldc 0.75 --tl de --tldc 0.75 -m 0.75 -o medline-part-rescored-de.txt

  • python3 MTUOC-PCorpus-selector.py -d medline-part-rescore-database.sqlite --sl en --sldc 0.75 --tl it --tldc 0.75 -m 0.75 -o medline-part-rescored-it.txt

Das Programm zeigt die Anzahl der resultierenden Segmente in der Ausgabe an (für Deutsch z.B. 35) und erstellt die Ausgabedatei medline-part-rescored-de.txt oder medline-part-rescored-it.txt.

Aufgbe 5 - optional: Schauen Sie sich die Ausgabedatei medline-part-rescored-de.txt oder medline-part-rescored-it.txt an und prüfen Sie ob es sich tatsächlich um Übersetzungsequivalente handelt. Laden Sie Ihre medline-part-rescored-de.txt oder medline-part-rescored-it.txt Dateien mit den "echten" Überstezungen unter Aufgabe 5 auf Moodle hoch..

5. Training eines Spracherkennungsmodells - nicht zu bearbeiten

In den vorherigen Beispielen haben wir ein Spracherkennungsmodell verwendet, das mit dem fasttext-Tool geliefert wird. Dieses Modell ist in der Lage, zwischen vielen verschiedenen Sprachen zu unterscheiden. In diesen mehrsprachigen Modellen sind „kleinere“ Sprachen in der Regel weniger vertreten. Wenn ein Satz in zwei ähnlichen Sprachen vorliegt, zum Beispiel Spanisch und Asturisch, neigt der Algorithmus dazu, ihn als Spanisch zu klassifizieren. Es kann sinnvoll sein, ein eigenes Modell zu trainieren, das nur eine Gruppe von Arbeitssprachen enthält, vor allem wenn diese Sprachen weniger Ressourcen haben. In diesen Fällen kann es interessant sein, die Grösse des verwendeten Korpus für die kleinere Sprache zu kompensieren.

Hier erklären wir, wie man ein Fasttext-Modell für zwei Sprachen trainiert, aber das Verfahren ist für eine grössere Anzahl von Sprachen dasselbe. Hier werden wir einen kleinen Korpus verwenden, zum Beispiel den Wikimedia-Korpus für Asturisch und Spanisch, der etwa 45.000 Segmente enthält. Sie können das Korpus direkt herunterladen, indem Sie wget https://object.pouta.csc.fi/OPUS-wikimedia/v20230407/moses/ast-es.txt.zip herunterladen und nach dem Entpacken die folgenden Schritte durchführen: Fügen Sie den Sätzen in jeder Sprache eine bestimmte Vorsilbe hinzu. Dieses Präfix muss, in unserem Beispiel, __label__ast für Asturisch und __label_es für Spanisch sein. Für weitere Sprachen würden wir das Gleiche tun. Unter Linux können wir jeder Zeile ein Präfix hinzufügen, indem wir Folgendes eingeben:

sed 's/^/__label__ast /' wikimedia.ast-es.ast > wikimedia-prefix-ast.txt

sed 's/^/__label__ast /' wikimedia.ast-en.ast > wikimedia-prefix-ast.txt

Alternativ können Sie auch das Skript addPrefix.py verwenden, das mit MTUOC-PCorpus-rescorer verteilt wird, indem wir Folgendes eingeben: python3 addPrefix.py wikimedia.ast-en.ast wikimedia-prefix-ast.txt ast python3 addPrefix.py wikimedia.ast-es.es wikimedia-prefix-es.txt es

Jetzt fügen wir die Dateien zusammen und verbinden sie:

cat wikimedia-prefix-ast.txt wikimedia-prefix-en.txt | shuf > korpus-training.txt In corpus-training.txt befindet sich unser Trainingskorpus. Trainiere das Modell: Um das Modell zu trainieren, müssen Sie Folgendes schreiben: python3 trainFasttextModel.py corpus-training.txt model-ast-de.bin Das Modell wird in der Datei model-ast-de.bin gespeichert. Wenn Sie die Trainingsparameter ändern möchten, Können Sie die folgende Zeile des Skripts trainFasttextModel.py bearbeiten: model = fasttext.train_supervised(input=training_data, epoch=25, lr=1.0, wordNgrams=2, verbose=2, minCount=1)