텍스트 파일에서 영어 줄을 모두 삭제하려면 어떻게해야합니까?


11

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

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

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

이게 가능해?


3
각 언어마다 항상 같은 수의 줄이 있다고 가정 할 수 있습니까? 두 개의 독일어 줄이 있다면 항상 두 개의 영어 줄 등이 있습니까?
terdon

답변:


13

어려운 방법과 훨씬 쉬운 방법이 있습니다. 어려운 방법은 자연어 구문 분석을 사용하여 주어진 줄이 영어로되어있을 가능성을주고 그러한 줄을 버리는 것입니다.

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

다음은 링크 된 단어 목록을 사용하여 필터링을 수행하는 매우 빠르고 더러운 스크립트입니다.

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

약간 더 완전한 버전은 단어 내 ,.에서 영어 어포 스트로피 와 같은 다양한 문장 부호를 무시해야합니다 '. 영어로는 절대 발생하지 않는 코드 포인트 (예 :)를 찾으면 더 큰 정확도를 얻을 수 «ßü있지만 독자에게는 연습으로 남아 있습니다.


아주 좋은 접근법. 내 핵 앤 슬래시 접근법 8-)보다 훨씬 낫다
slm

Danke (언어의 진단은 내 마음의 한 부분에서 온으로 정지 단어를 사용하여 나는 알고 있었다하지 않았다)
MSW

5

샘플에서 다음과 같이 작동합니다.

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(처음 두 줄) + (NF-2)/2(나머지 줄의 절반)) : 영어 줄을 제외하도록 필드 수를 변경하십시오.
  • printf "%s", $0 RT: 기록을 인쇄 그 뒤에 레코드 종결자를 (단락 사이의 간격을 동일하게 복원합니다). 위의 코드가 무엇을하는지 보려면 믹스에 print 문을 추가하면 도움이됩니다. 이 같은:

그것은 유닉스 줄 끝을 가정합니다. 자막 파일에서 일반적으로 파일이 MS-DOS 형식으로되어있는 경우, 당신은 그것을 사전 처리해야 d2u하거나 dos2unix.


이것은 영어 줄이 항상 세 번째 또는 네 번째 위치에 있다고 가정합니다.
slm

2
@slm. 아니요, 그 절반은 영어입니다.
Stéphane Chazelas

좀 더 살펴보면, 줄을 레코드로 나눕니다. 그런 다음 각 레코드 내에서 필드 수 (NF)를 찾습니다. 이 경우 NF는 선입니다. 나는 아직도 당신이 NF-=NF/2-1비트로 하고있는 것을 얻지 못합니다 . 당신은 말을 계산할 NF=4당신이 값을 얻을 그래서 첫 번째 레코드, 714에 대한 NF=4그리고 NF/2-1=1다음을 뺀 1에서 NF당신을 떠나 3? 그런 다음 3레코드 의 첫 번째 "필드"를 인쇄하여 4 번째 줄을 삭제 하시겠습니까?
slm

3

이 유형의 접근 방식의 핵심은 영어 단어 데이터베이스에 액세스하는 것입니다. 내 시스템 에이 파일이 있는데 /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)

"사전"의 첫 번째 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,

참고 : 이 방법은 i5 랩탑에서 ~ 1.5 초 안에 실행되었습니다.

실행 가능한 접근법 인 것 같습니다. 내가 그것을 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

"auf"라는 단어가 영어로 존재합니까? 단어 파일의 버그 여야합니다. 어쨌든 그것은 독립형이 아닙니다 (여기서는 파싱 해야하는 유일한 방법이어야 함)
오류

@ syntaxerror-내가 사용하고있는 단어 목록 파일에 있다고 말했습니다. 독립형 구문 분석 중입니다. 그것이하는 일 grep -wf ...입니다. 단어를 더 잘 공급할수록이 방법이 더 직접적입니다. 다른 솔루션 (Stephane 's)은 ​​구조화되는 데이터에 의존하며 어떤 상황에서도 데이터를 보지 않습니다 .msw의 접근 방식은 나에게 더 나은 다리를 가지고있는 것 같습니다.
slm

나는 당신 독립형 파싱 한다고 가정했다 . 어쨌든, "auf"라는 단어가 실제로 영어 단어 목록의 일부라면, 그 존재가 문서화 된 사전 참조를보고 싶습니다. 아마도 하나도 찾지 못할 것입니다. 그러나 보시다시피, 단 하나의 단어가 모든 종류의 파서에서 완전히 혼란을 일으킬 수 있습니다.
syntaxerror

@syntaxerror-혼란을 드려 죄송합니다. "auf"가 실제 단어라는 것에 동의하지 않았습니다. 단지 내가 사용하던 사전 파일에 있다는 것입니다. 우연히 나는 그 파일의 계보를 두 번 확인했으며 Fedora 14 랩톱의 단어 패키지라는 단어에서 비롯되었습니다. 다음 URL을 사용하는 단어 목록의 출처로이 URL을 제공합니다. en.wikipedia.org/wiki/Moby_Project
slm

1

이것은 .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.srtnew.srt선택한 입력 및 출력 파일입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.