テキストファイルからすべての英語の行を削除する方法は?

テキストファイルからすべての英語の行を削除する方法は?

次のテキストファイルがあります。

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: 印刷記録その後にはレコードの終端が続きます(段落間の間隔を同じに戻すため)。上記のコードが何をしているのかを理解するには、ここに印刷ステートメントを追加すると便利です。このような:

Unix 行末を想定します。ファイルが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このアプローチの1つの利点は、重なっている部分を削除して確認できることです。

$ 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

関連情報