텍스트 파일에서 모든 영어 줄을 제거하는 방법은 무엇입니까?

텍스트 파일에서 모든 영어 줄을 제거하는 방법은 무엇입니까?

다음 텍스트 파일이 있습니다.

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,
...

영어가 아닌 줄만 유지되도록 구문 분석하고 싶습니다.

가능합니까?

답변1

어려운 방법과 쉬운 방법이 있습니다. 어려운 방법은 자연어 구문 분석을 사용하여 주어진 줄이 영어일 확률을 제공하고 해당 줄을 삭제하는 것입니다.

더 쉬운 방법은 영어 목록을 얻는 것입니다중지 단어해당 목록에서 요소가 포함된 행을 삭제합니다. 행을 잘못 분류할 가능성을 줄이려면 거부하지 못한 행에서 독일어 중지 단어를 찾아 해당 단어가 독일어인지 확인할 수도 있습니다.

다음은 연결된 제외어 목록으로 필터링하기 위한 매우 빠르고 더러운 스크립트입니다.

#!/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, 

,.약간 더 완전한 버전에서는 단어 내의 영어 아포스트로피 와 같은 다양한 구두점을 생략해야 합니다 . '예를 들어 영어에서는 전혀 발생하지 않는 코드 포인트를 찾아 더 나은 정확도를 얻을 수 있지만 «ßü이는 독자의 연습 문제로 남겨 둡니다.

답변2

귀하의 예에서는 다음과 같이 작동합니다.

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

세부 사항

  • RS=. 설정기록 구분 기호. null 값은 특별한 경우입니다.레코드는 단락이다(빈 줄로 구분된 일련의 줄)
  • -F '\n': 필드 구분 기호 설정(필드각 레코드의 행).
  • OFS='\n': 출력 필드 구분자를 설정합니다.

각각기록(절):

  • NF=1+NF/2(또는 NF=2(처음 2행) + (NF-2)/2(나머지 행의 절반)): 영어 필드를 제외하도록 필드 수를 변경합니다.
  • printf "%s", $0 RT: 인쇄기록그 뒤에는 레코드 종결자가 옵니다(문단 사이의 간격을 동일하게 복원하기 위해). 위 코드가 수행하는 작업을 이해하려면 여기에 인쇄 문을 추가하는 것이 도움이 될 것입니다. 이 같은:

유닉스 줄 끝을 가정합니다. 파일이 MSDOS 형식(자막 파일과 마찬가지로)인 경우 해당 파일을 사용하거나 d2u전처리 해야 합니다 dos2unix.

답변3

이 접근 방식의 핵심은 좋은 영어 단어 데이터베이스에 접근할 수 있다는 것입니다. 내 시스템에는 /usr/share/dict/words많은 단어가 포함된 이 파일이 있지만 대신 다른 소스를 사용할 수 있습니다.

방법

grep나의 일반적인 접근 방식은 다음과 같이 사용하는 것입니다.

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

예제 출력은 에 있습니다 sample.txt.

제한된 테스트에서 사전 크기 words가 느려지는 것 같습니다 grep. 내 버전에는 줄이 400,000개가 넘습니다. 그래서 나는 그것을 깨기 위해 다음과 같은 일을 시작했습니다.

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

샘플 실행(10k)

사전에 있는 처음 10,000개의 단어를 사용하여 파일을 실행하세요.

$ 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,

노트:내 i5 노트북에서는 이 방법이 약 1.5초 안에 실행됩니다.

이는 실현 가능한 접근 방식인 것 같습니다. 100,000행으로 늘렸을 때 시간이 오래 걸리기 시작했지만 사전을 words여러 파일로 분할할 수 있도록 완료하기 전에 중단했습니다.

노트:50,000행으로 줄였더니 32초가 걸렸습니다.

심층 분석(50,000개 라인)

사전을 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

답변4

파일 인 것 같습니다 .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

관련 정보