Как я могу удалить все английские строки из текстового файла?

Я не рекомендовал бы смешать и соответствовать типам оболочки в рамках сценария.

  1. Вы теряете эффективность в запуске оболочки, чтобы выполнить команду и возвратить результат.
  2. Одна из причин сохранить все, в чем сценарий нужен в сценарии, - то, что тот сценарий имеет доступ ко всем переменным, объявленным и возвращенным из функций и т.д. При передаче всего переменного стека другой оболочке только, чтобы выполнить пару команд и затем возвратиться, кажется немного парадоксальным.

Я сказал бы, что Ваш лучший выбор будет состоять в том, чтобы скопировать известный сценарий и изменить оболочку вызова и затем видеть, какие повреждения, таким образом, Вы знаете, где различия в синтаксисе, это должно быть разработано.

Но, короче говоря, попытка к смешиванию и подгонке в рамках сценария просто походит на плохую идею. (лично)

11
31.08.2013, 15:41
4 ответа

Существует трудный путь и намного более легкий путь. Трудный путь состоит в том, чтобы использовать синтаксический анализ естественных языков для предоставления вероятности, что данная строка находится на английском языке, и отбросьте такие строки.

Более легкий путь состоит в том, чтобы взять список английских стоп-слов и удалить строки, которые содержат элементы из того списка. Если бы Вы хотели уменьшить шанс неправильной категоризации строки, то Вы могли бы также искать присутствие немецких стоп-слов в строках, которые Вам не удается отклонить, чтобы проверить, что они, вероятно, немцы.

Вот очень быстрый и грязный сценарий для использования связанного списка стоп-слова, чтобы сделать фильтрацию:

#!/usr/bin/python
english_stop = set()
with open('english-stop-words.txt') as estop:
    for line in estop:
        bar = line.find('|')
        if bar > -1:
            line = line[0:bar]
        line = line.strip()
        if line:
            english_stop.add(line)

with open('mixed-german.txt') as mixg:
    for line in mixg:
        for word in line.lower().split():
            if word in english_stop:
                break
        else:
            print line[:-1]

и вывод:

714
01:11:22,267 --> 01:11:27,731
Auch wenn noch viele Generationen auf einen Wechsel hoffen,

715
01:11:27,732 --> 01:11:31,920
werde ich mein Bestes geben
und hoffe, dass andere das gleiche tun.

716
01:11:31,921 --> 01:11:36,278
Wir haben eine harte Arbeit vor uns, 
um den Lauf der Dinge zu ändern. 

717
01:11:36,879 --> 01:11:42,881
Wenn man die Zentren künstlicher Besamung, 
die Zuchtlaboratorien und die modernen Kuhställe besichtigt, 

Немного больше полной версии должно проигнорировать различную пунктуацию как ,. но не английский апостроф ' когда в слове. Еще большая точность могла быть получена путем поиска кодовых точек, которые никогда не происходят на английском языке (например, «ßü) но это оставляют как осуществление для читателя.

13
27.01.2020, 19:57
  • 1
    Очень хороший подход. Намного лучше, чем мой взлом и 8-) –  slm♦ 31.08.2013, 17:12
  • 2
    Danke (использующий стоп-слова, поскольку диагностика языка прибыла из части моего ума, который я не знал, был там ;) –  msw 31.08.2013, 17:58

На Вашем образце это работало бы:

awk -v RS= -F '\n' -v OFS='\n' '{NF=NF/2+1;printf "%s", $0 RT}'

Подробнее

  • RS=. Устанавливает разделитель записей. Пустое значение является особым случаем, который означает, что запись является абзацем (последовательность строк, разграниченных пустыми строками).
  • -F '\n': устанавливает разделителя полей (поля в каждой записи являются строками).
  • OFS='\n': устанавливает выходного разделителя полей.

Для каждой записи (абзац):

  • NF=1+NF/2 (или NF=2 (первые 2 строки) + (NF-2)/2 (половина остающихся строк)): измените количество полей для исключения английских.
  • printf "%s", $0 RT: печатает запись, сопровождаемую рекордным разделителем (для восстановления того же объема интервала между абзацами). Для наблюдения, что делает вышеупомянутый код, полезно, если Вы добавляете некоторые операторы печати в соединение. Что-то вроде этого:

Это принимает окончания строки Unix. Если файл находится в формате MS-DOS, как распространено с файлами подзаголовка, необходимо предварительно обработать его с d2u или dos2unix.

5
27.01.2020, 19:57
  • 1
    Это предполагает, что английские строки являются alway в 3-м или 4-м положении, правильно? –  slm♦ 31.08.2013, 16:46
  • 2
    @slm. Нет, та половина строк является английской. –  Stéphane Chazelas 31.08.2013, 16:50
  • 3
    подхода наклонной черты, Смотрящий немного больше, это разбивает строки в записи. Вы затем смотрите в каждой записи для количества полей (NF). NF является строкой в этом случае, правильно? Я все еще не получаю то, что Вы делаете с NF-=NF/2-1 бит. Вы вычисляющий, говорят NF=4 для первой записи, 714. Таким образом, Вы получаете значения NF=4 и NF/2-1=1, и затем вычитание 1 от NF отъезд Вас с 3? Затем печать первого 3 "поля" записи, следовательно отбрасывая 4-ю строку? –  slm♦ 31.08.2013, 17:36

Основная часть к этому типу подхода имеет доступ к хорошей базе данных английских слов. Существует этот файл в моей системе, /usr/share/dict/words который имеет много слов, но другие источники могли использоваться вместо этого.

Подход

Мой общий подход должен был бы использовать grep как так:

$ grep -vwf /usr/share/dict/words sample.txt

Где Ваш вывод в качестве примера находится в sample.txt.

В моем ограниченном тестировании размера words словарь, казалось, тонул в трясине grep вниз. Моя версия имеет 400k + строки в ней. Таким образом, я начал делать что-то вроде этого для разбивания его немного:

$ head -10000 /usr/share/dict/words > ~/10000words

Демонстрационные выполнения (10k)

Выполнение Ваш файл посредством использования 1-х 10k слов из "словаря".

$ grep -vwf ~/10000words sample.txt
714
01:11:22,267 --> 01:11:27,731
Auch wenn noch viele Generationen auf einen Wechsel hoffen,

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,

Примечание: Этот подход работал через ~1.5 секунды на моем i5 ноутбуке.

Это, кажется, жизнеспособный подход. Когда я ударил его до 100k строк, это начало занимать много времени, хотя, я прервал его, прежде чем это закончилось, таким образом, Вы могли повредиться words словарь в несколько файлов.

Примечание: Когда я замедлил его к 50k строкам, потребовалось 32 секунды.

Дайвинг глубже (50k строки)

Когда я начал разворачивать словарь до 50k, я столкнулся с проблемой, я боялся, перекрытие между языками.

$ grep -vwf ~/50000words sample.txt
714
01:11:22,267 --> 01:11:27,731

715
01:11:27,732 --> 01:11:31,920
werde ich mein Bestes geben
und hoffe, dass andere das gleiche tun.
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. 

717
01:11:36,879 --> 01:11:42,881
Wenn man die Zentren künstlicher Besamung, 
die Zuchtlaboratorien und die modernen Kuhställe besichtigt, 
the selection center, modern stables,

Анализ проблемы

Одна хорошая вещь с этим подходом - Вы, может удалить -v и посмотрите, где перекрытие:

$ grep -wf ~/50000words sample.txt
Auch wenn noch viele Generationen auf einen Wechsel hoffen,
Even if it takes many generations hoping for a change,
I'm giving mine, I'm doing my best
it's going to be hard work
for things to turn around.
When visiting artificial insemination centers,

Слово auf находится, по-видимому, на обоих языках... хорошо, по крайней мере, это находится в моем words файл, таким образом, это могло бы быть определенным подходом метода проб и ошибок для совершенствования списка слов по мере необходимости.

Примечание: Я знал, что это было слово auf потому что grep окрашенный этим красный, который не обнаруживается в вышеупомянутом выводе из-за ограниченного характера SE 8-).

$ grep auf ~/50000words 
auf
aufait
aufgabe
aufklarung
auftakt
baufrey
Beaufert
beaufet
beaufin
Beauford
Beaufort
beaufort
bechauffeur
3
27.01.2020, 19:57
  • 1
    Слово "auf" существует на английском языке? Это ДОЛЖНО быть ошибкой в файле слова. Это определенно не делает, по крайней мере, не автономный (который должен быть единственным путем, проанализированным для здесь), так или иначе –  syntaxerror 05.09.2013, 16:50
  • 2
    @syntaxerror - поскольку я сказал, что это находится в файле списка слов, который я использовал. Я анализирую автономный. Это что grep -wf ... делает. С лучшим предоставлением слов этот подход был бы более прямым. Другое решение (Stephane's) зависит от структурируемых данных и не смотрит на него никаким контекстным способом, подход msw, кажется, имеют лучшие участки хотя мне. –  slm♦ 05.09.2013, 16:55
  • 3
    , я принял Вас, анализировал автономный. Безотносительно, я подтверждаю, что, если слово "auf" является действительно частью англоязычного списка слов, я хочу видеть ссылку словаря, где ее существование документируется. Скорее всего, Вы не найдете тот... никогда. Но как Вы видите, одно простое слово может создать общий беспорядок в синтаксических анализаторах всех видов. –  syntaxerror 05.09.2013, 20:40
  • 4
    @syntaxerror - извините за беспорядок, я не не соглашался с Вами о "auf" быть фактическим словом, просто что это, оказывается, находится в файле словаря, который я использовал. Случайно я проверил происхождение дважды того файла, и это прибывает из пакета на моем ноутбуке Fedora 14, названном словами. Это получает этот URL как инициатора списков слов, которые это использует: вид en.wikipedia.org/wiki/Moby_Project –  slm♦ 05.09.2013, 21:45

Это похоже на a .srt файл. Если это, и если количество английских строк на подзаголовок всегда является тем же как количеством немецких строк, то можно использовать:

awk 'BEGIN { RS="\r\n\r\n"; FS="\r\n"} {for (i=1;i<=(NF-2)/2+2; i++) print $i "\r"; print "\r"}' old.srt > new.srt

Где old.srt и new.srt Ваши выбранные входные и выходные файлы.

1
27.01.2020, 19:57

Теги

Похожие вопросы