Ich habe diese Textdatei:
714
01:11:22,267 --> 01:11:27,731
Auch wenn noch viele Generationen auf einen Wechsel hoffen,
Even if it takes many generations hoping for a change,
715
01:11:27,732 --> 01:11:31,920
werde ich mein Bestes geben
und hoffe, dass andere das gleiche tun.
I'm giving mine, I'm doing my best
hoping the other will do the same
716
01:11:31,921 --> 01:11:36,278
Wir haben eine harte Arbeit vor uns,
um den Lauf der Dinge zu ändern.
it's going to be hard work
for things to turn around.
717
01:11:36,879 --> 01:11:42,881
Wenn man die Zentren künstlicher Besamung,
die Zuchtlaboratorien und die modernen Kuhställe besichtigt,
When visiting artificial insemination centers,
the selection center, modern stables,
...
und möchte es analysieren, damit nur die nicht englischen Zeilen bleiben
Ist das möglich?
Antworten:
Es gibt einen schwierigen und einen viel einfacheren Weg. Der schwierige Weg besteht darin, das Parsen in natürlicher Sprache zu verwenden, um die Wahrscheinlichkeit zu bestimmen, dass eine bestimmte Zeile auf Englisch ist, und solche Zeilen zu verwerfen.
Der einfachere Weg ist, eine Liste mit englischen Stoppwörtern zu erstellen und Zeilen zu löschen, die Elemente aus dieser Liste enthalten. Wenn Sie die Wahrscheinlichkeit einer falschen Kategorisierung einer Zeile verringern möchten, können Sie auch nach deutschen Stoppwörtern in Zeilen suchen, die Sie nicht ablehnen, um zu überprüfen, ob sie wahrscheinlich deutsch sind.
Hier ist ein sehr schnelles und schmutziges Skript, mit dem die verknüpfte Stoppwortliste zum Filtern verwendet wird:
und die Ausgabe:
Eine etwas vollständigere Version sollte verschiedene Satzzeichen wie
,.
den englischen Apostroph ignorieren,'
wenn sie sich innerhalb eines Wortes befinden. Eine noch größere Genauigkeit könnte erzielt werden, wenn nach Codepunkten gesucht wird, die beispielsweise auf Englisch nie vorkommen«ßü
, die dem Leser jedoch als Übung überlassen bleiben.quelle
Bei Ihrer Stichprobe würde dies funktionieren:
Einzelheiten
RS=
. Legt das Datensatztrennzeichen fest . Ein leerer Wert ist ein Sonderfall, dh ein Datensatz ist ein Absatz (Folge von Zeilen, die durch leere Zeilen begrenzt sind).-F '\n'
: Legt das Feldtrennzeichen fest ( Felder in jedem Datensatz sind Zeilen).OFS='\n'
: Legt das Trennzeichen für das Ausgabefeld fest.Für jeden Datensatz (Absatz):
NF=1+NF/2
(oderNF=2
(die ersten 2 Zeilen)+ (NF-2)/2
(die Hälfte der verbleibenden Zeilen)): Ändern Sie die Anzahl der Felder, um die englischen auszuschließen.printf "%s", $0 RT
: Druckt den Datensatz, gefolgt vom Datensatzabschlusszeichen (um den gleichen Abstand zwischen den Absätzen wiederherzustellen). Um zu sehen, was der obige Code tut, ist es hilfreich, wenn Sie dem Mix einige print-Anweisungen hinzufügen. Etwas wie das:Dies setzt Unix-Zeilenenden voraus. Wenn die Datei im MSDOS-Format vorliegt, wie es bei Untertiteldateien üblich ist, müssen Sie sie mit
d2u
oder vorverarbeitendos2unix
.quelle
NF-=NF/2-1
Stück machst . Berechnen Sie etwaNF=4
für den ersten Datensatz, 714. Sie erhalten also die WerteNF=4
undNF/2-1=1
und subtrahieren dann die Werte1
von dem, mitNF
dem Sie verlassen haben3
? Dann die ersten3
"Felder" des Datensatzes drucken und damit die 4. Zeile löschen?Das Schlüsselelement für diese Art von Ansatz ist der Zugriff auf eine gute Datenbank mit englischen Wörtern. Es gibt diese Datei auf meinem System,
/usr/share/dict/words
die viele Wörter enthält, aber andere Quellen könnten stattdessen verwendet werden.Ansatz
Mein allgemeiner Ansatz wäre,
grep
wie folgt zu verwenden:Wo sich Ihre Beispielausgabe befindet
sample.txt
.In meinen begrenzten Tests
words
schien die Größe des Wörterbuchs ins Stocken zu geratengrep
. Meine Version enthält mehr als 400.000 Zeilen. Also habe ich so etwas gemacht, um es ein bisschen aufzubrechen:Probeläufe (10k)
Führen Sie Ihre Datei mit den ersten 10.000 Wörtern aus dem "Wörterbuch" durch.
HINWEIS: Dieser Ansatz lief auf meinem i5-Laptop in ca. 1,5 Sekunden.
Es scheint ein praktikabler Ansatz zu sein. Als ich es auf 100.000 Zeilen anstieß, dauerte es allerdings lange. Ich habe es abgebrochen, bevor es fertig war, sodass Sie das
words
Wörterbuch in mehrere Dateien aufteilen konnten.HINWEIS: Als ich es auf 50.000 Zeilen zurückgesetzt habe, dauerte es 32 Sekunden.
Tiefer tauchen (50k Linien)
Als ich anfing, das Wörterbuch auf 50.000 zu erweitern, stieß ich auf das Problem, vor dem ich Angst hatte, Überschneidungen zwischen den Sprachen.
Das Problem analysieren
Eine gute Sache bei diesem Ansatz ist, dass Sie die entfernen
-v
und sehen können, wo die Überlappung ist:Das Wort
auf
ist anscheinend in beiden Sprachen ... zumindest in meinerwords
Datei. Dies könnte also ein Versuch und Irrtum sein, um die Wortliste nach Bedarf zu verfeinern.HINWEIS: Ich wusste, dass es das Wort war,
auf
weilgrep
es rot gefärbt war und in der obigen Ausgabe aufgrund der eingeschränkten Natur von SE 8-) nicht angezeigt wird.quelle
grep -wf ...
macht der. Mit einer besseren Wortversorgung wäre dieser Ansatz direkter. Die andere Lösung (die von Stephane) hängt von der Struktur der Daten ab und betrachtet sie in keiner kontextuellen Weise. Der Ansatz von msw scheint mir jedoch bessere Beine zu haben.Das sieht aus wie eine
.srt
Datei. Wenn dies der Fall ist und die Anzahl der englischen Zeilen pro Untertitel immer der Anzahl der deutschen Zeilen entspricht, können Sie Folgendes verwenden:Wo
old.srt
undnew.srt
sind Ihre ausgewählten Eingabe- und Ausgabedateien.quelle