Mam ten plik tekstowy:
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,
...
i chciałbym go przeanalizować, aby pozostały tylko linie w języku innym niż angielski
czy to możliwe?
Odpowiedzi:
Jest trudny i znacznie łatwiejszy sposób. Najtrudniejszym sposobem jest użycie parsowania w języku naturalnym, aby dać prawdopodobieństwo, że dana linia jest w języku angielskim i odrzucić takie linie.
Najłatwiejszym sposobem jest pobranie listy angielskich słów stop i usunięcie wierszy zawierających elementy z tej listy. Jeśli chcesz zmniejszyć ryzyko błędnej kategoryzacji wiersza, możesz również poszukać w niemieckiej linii słów stop, których nie odrzucasz, aby sprawdzić, czy prawdopodobnie są niemieckie.
Oto bardzo szybki i nieprzyzwoity skrypt do korzystania z połączonej listy słów stop do wykonania filtrowania:
i wynik:
Nieco bardziej kompletna wersja powinna ignorować różne znaki interpunkcyjne, takie jak
,.
angielski apostrof, ale nie w'
obrębie słowa. Jeszcze większą dokładność można uzyskać, szukając punktów kodowych, które nigdy nie występują w języku angielskim (na przykład«ßü
), ale pozostawia to zadanie czytelnikowi.źródło
Na twojej próbce to zadziałałoby:
Detale
RS=
. Ustawia separator rekordów . Pusta wartość to szczególny przypadek, który oznacza, że rekord jest akapitem (sekwencja linii oddzielona pustymi liniami).-F '\n'
: ustawia separator pól ( pola w każdym rekordzie są wierszami).OFS='\n'
: ustawia separator pól wyjściowych.Dla każdego rekordu (akapitu):
NF=1+NF/2
(lubNF=2
(pierwsze 2 linie)+ (NF-2)/2
(połowa pozostałych linii)): zmień liczbę pól, aby wykluczyć te angielskie.printf "%s", $0 RT
: drukuje rekord, a następnie terminator rekordu (aby przywrócić taką samą odległość między akapitami). Aby zobaczyć, co robi powyższy kod, pomocne jest dodanie do mieszanki instrukcji drukowania. Coś takiego:To zakłada zakończenia linii uniksowych. Jeśli plik ma format MSDOS, co jest typowe dla plików z napisami, należy go wstępnie przetworzyć za pomocą
d2u
lubdos2unix
.źródło
NF-=NF/2-1
kawałkiem. Czy obliczenie głosuNF=4
dla pierwszego rekordu, 714. Więc masz wartościNF=4
iNF/2-1=1
, a następnie odjęcie1
odNF
zostawiając3
? Następnie drukujesz pierwsze3
„pola” rekordu, a zatem upuszczasz czwartą linię?Kluczem do tego typu podejścia jest dostęp do dobrej bazy danych angielskich słów. W moim systemie jest ten plik,
/usr/share/dict/words
który zawiera wiele słów, ale zamiast tego można użyć innych źródeł.Podejście
Moje ogólne podejście byłoby
grep
takie:Gdzie jest twój przykładowy wynik
sample.txt
.W moich ograniczonych testach rozmiar
words
słownika wydawał się zwalniaćgrep
. Moja wersja ma ponad 400k linii. Więc zacząłem robić coś takiego, żeby trochę to zepsuć:Przykładowe przebiegi (10 tys.)
Uruchom plik, używając pierwszych 10 000 słów z „słownika”.
UWAGA: To podejście zadziałało w ~ 1,5 sekundy na moim laptopie i5.
Wydaje się to realnym podejściem. Kiedy podniosłem go do 100 000 wierszy, zaczęło to jednak długo zajmować. Przerwałem go, zanim się skończyło, aby można było podzielić
words
słownik na kilka plików.UWAGA: Kiedy cofnąłem go do 50 000 linii, zajęło to 32 sekundy.
Nurkowanie głębiej (50 tys. Linii)
Kiedy zacząłem rozszerzać słownik do 50 000, natknąłem się na problem, którego się obawiałem, nakładający się na siebie języki.
Analizując problem
Jedną dobrą rzeczą w tym podejściu jest to, że możesz usunąć
-v
i zobaczyć, gdzie nakłada się:Słowo
auf
jest najwyraźniej w obu językach ... cóż, przynajmniej w moimwords
pliku, więc może to być podejście prób i błędów w celu dopracowania listy słów w razie potrzeby.UWAGA: Wiedziałem, że to słowo,
auf
ponieważgrep
pokolorowane na czerwono, które nie pojawia się na powyższym wyjściu z powodu ograniczonej natury SE 8-).źródło
grep -wf ...
robi. Przy większej liczbie słów takie podejście byłoby bardziej bezpośrednie. Inne rozwiązanie (Stephane'a) zależy od struktury danych i nie patrzy na nie w żaden kontekstowy sposób, ale podejście msw wydaje mi się lepsze.To wygląda jak
.srt
plik. Jeśli tak jest, a liczba angielskich wierszy w podtytule jest zawsze taka sama jak liczba niemieckich wierszy, możesz użyć:Gdzie
old.srt
i gdzienew.srt
są wybrane pliki wejściowe i wyjściowe.źródło