У меня есть этот текстовый файл:
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,
...
и хотел бы разобрать, чтобы остались только неанглийские строки
Это возможно?
Ответы:
Есть трудный путь и намного более легкий путь. Сложный способ - использовать синтаксический анализ на естественном языке, чтобы получить вероятность того, что данная строка написана на английском языке, и отбросить такие строки.
Проще всего взять список английских стоп-слов и удалить строки, содержащие элементы из этого списка. Если вы хотите уменьшить вероятность неправильной категоризации строки, вы также можете найти наличие немецких стоп-слов в строках, которые вы не можете отклонить, чтобы убедиться, что они, вероятно, являются немецкими.
Вот очень быстрый и грязный скрипт для использования связанного списка стоп-слов для фильтрации:
и вывод:
Немного более полная версия должна игнорировать различные знаки препинания, такие как
,.
апостроф в английском языке, но не'
внутри слова. Еще большую точность можно получить, если искать кодовые точки, которые никогда не встречаются на английском языке (например«ßü
), но это оставлено в качестве упражнения для читателя.источник
На вашем примере это будет работать:
Детали
RS=
, Устанавливает разделитель записей . Пустое значение - это особый случай, который означает, что запись является абзацем (последовательность строк, разделенных пустыми строками).-F '\n'
: устанавливает разделитель полей ( поля в каждой записи являются строками).OFS='\n'
: устанавливает разделитель выходного поля.Для каждой записи (абзаца):
NF=1+NF/2
(илиNF=2
(первые 2 строки)+ (NF-2)/2
(половина оставшихся строк)): измените количество полей, чтобы исключить английские.printf "%s", $0 RT
: печатает запись с последующим ограничителем записи (для восстановления одинакового расстояния между абзацами). Чтобы увидеть, что делает приведенный выше код, полезно, если вы добавите несколько операторов print в смесь. Что-то вроде этого:Это предполагает окончания строки Unix. Если файл в формате MSDOS, как и файлы субтитров, необходимо предварительно обработать его с помощью
d2u
илиdos2unix
.источник
NF-=NF/2-1
битом. Вы рассчитываете, скажем,NF=4
для первой записи, 714. Таким образом, вы получаете значенияNF=4
иNF/2-1=1
, а затем вычитаете1
изNF
оставленных вами3
? Затем печатать первые3
«поля» записи, отсюда выбрасывая 4-ю строку?Ключевой частью этого подхода является доступ к хорошей базе данных английских слов. В моей системе есть этот файл, в
/usr/share/dict/words
котором много слов, но вместо этого можно использовать другие источники.Подходить
Мой общий подход заключается в следующем
grep
:Где находится ваш пример вывода
sample.txt
.В моем ограниченном тестировании размер
words
словаря, казалось, застрялgrep
. В моей версии более 400 тысяч строк. Поэтому я начал делать что-то вроде этого, чтобы немного разбить это:Пробные прогоны (10 Кб)
Запустите ваш файл, используя первые 10 тысяч слов из «словаря».
ПРИМЕЧАНИЕ. Этот подход выполняется на моем ноутбуке i5 за 1,5 секунды.
Кажется, это жизнеспособный подход. Когда я увеличил его до 100 тыс. Строк, это заняло много времени, но я прервал его до его завершения, чтобы вы могли разбить
words
словарь на несколько файлов.ПРИМЕЧАНИЕ. Когда я сохранил 50 тыс. Строк, это заняло 32 секунды.
Дайвинг глубже (50 тыс. Строк)
Когда я начал расширять словарь до 50 тыс., Я столкнулся с проблемой, которой я боялся, пересечения между языками.
Анализируя проблему
Одна хорошая вещь с этим подходом состоит в том, что вы можете удалить
-v
и посмотреть, где перекрытие:Слово,
auf
по-видимому, на обоих языках ... ну, по крайней мере, оно в моемwords
файле, так что это может быть метод проб и ошибок для уточнения списка слов по мере необходимости.ПРИМЕЧАНИЕ: я знал, что это слово,
auf
потому чтоgrep
закрасил его красным, что не отображается в приведенном выше выводе из-за ограниченного характера SE 8-).источник
grep -wf ...
делает. При лучшем предложении слов этот подход был бы более прямым. Другое решение (решение Стефана) зависит от структурируемых данных и не рассматривает их каким-либо контекстным образом, хотя подход msw кажется мне лучше.Это похоже на
.srt
файл. Если это так, и если количество английских строк в субтитре всегда совпадает с количеством немецких строк, то вы можете использовать:Где
old.srt
и гдеnew.srt
вы выбрали входные и выходные файлы.источник