テキストファイルからすべての英語の行を削除するにはどうすればよいですか?


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
各言語で常に同じ行数があると安全に想定できますか?ドイツ語の行が2つある場合、常に英語の行も2つありますか?
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

ダンケ(ストップワードを言語の診断に使用したのは、私の心の一部だったので、知らなかった;)
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(最初の2行)+ (NF-2)/2(残りの行の半分)):英語のフィールドを除外するようにフィールド数を変更します。
  • printf "%s", $0 RTレコードを出力し、その後にレコードターミネータを続けます(段落間の間隔を同じに戻すため)。上記のコードが何をしているのかを確認するには、いくつかの印刷ステートメントをミックスに追加すると便利です。このようなもの:

これはUnixの行末を想定しています。ファイルが字幕ファイルと同様にMSDOS形式の場合は、d2uまたはで前処理する必要がありますdos2unix


これは、英語の行が常に3番目または4番目の位置にあることを前提としています。
slm

2
@slm。いいえ、その半分の行は英語です。
ステファンChazelas

もう少し見てみると、これは行をレコードに分割します。次に、各レコード内でフィールド数(NF)を調べます。この場合、NFは線ですよね?私はまだあなたがNF-=NF/2-1ビットでやっていることを理解していません。NF=4最初のレコード714の言い分を計算していますか。値NF=4とを取得しNF/2-1=11から、を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

サンプル実行(10,000)

「辞書」の最初の1万語を使用してファイルを実行します。

$ 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秒以内に実行されました。

それは実行可能なアプローチのようです。10万行に増やすと時間がかかり始めましたが、完了する前に中止したので、words辞書をいくつかのファイルに分割できます。

注: 5万行に戻したところ、32秒かかりました。

より深くダイビング(5万ライン)

辞書を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,

問題の分析

このアプローチの良い点の1つは、を削除して-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ファイルにあるので、これは必要に応じて単語リストを調整するための試行錯誤のアプローチになるかもしれません。

注: SE 8)の制限された性質のため、上記の出力には表示されないaufためgrep、赤色に着色されているため、この単語であることがわかりました。

$ grep auf ~/50000words 
auf
aufait
aufgabe
aufklarung
auftakt
baufrey
Beaufert
beaufet
beaufin
Beauford
Beaufort
beaufort
bechauffeur

「auf」という言葉は英語で存在しますか?それはワードファイルのバグでなければなりません。とにかく、少なくともスタンドアロンではありません(ここで解析される唯一の方法であるべきです)
syntaxerror

@syntaxerror-私が言ったように、私が使用していたのは単語リストファイルです。スタンドアロンで解析しています。それが何をするかgrep -wf ...です。より良い言葉の供給があれば、このアプローチはより直接的になります。他の解決策(Stephaneの)は、構造化されているデータに依存し、状況に応じてそれを見ていないので、mswのアプローチは私には良い脚本を持っているようです。
slm

スタンドアロンで解析していると思いました。とにかく、「auf」という単語が実際に英語の単語リストの一部である場合、その存在が文書化されている辞書の参照を確認したいと思います。ほとんどの場合、1つも見つかりません... しかし、ご覧のとおり、たった1つの単語であらゆる種類のパーサーを完全に混乱させる可能性があります。
Syntaxerror

@syntaxerror-混乱して申し訳ありませんが、「auf」が実際の単語であることについては、私が使用していた辞書ファイルに偶然含まれていることについては、あなたに反対していません。ちなみに、私はそのファイルの系統を再確認しました。これは、wordsと呼ばれる私のFedora 14ラップトップのパッケージからのものです。このURLは、使用している単語リストの発信元として次のように提供されます。en.wikipedia.org
wiki

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.