Bagaimana saya bisa menghapus semua baris bahasa Inggris dari file teks?

11

Saya punya file teks ini:

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

dan ingin menguraikannya sehingga hanya baris non-bahasa Inggris yang tetap

apakah ini mungkin?

Deele Ma
sumber
3
Dapatkah Anda dengan aman berasumsi bahwa akan selalu ada jumlah baris yang sama di setiap bahasa? Jika ada dua garis bahasa Jerman apakah akan selalu ada dua garis bahasa Inggris dll?
terdon

Jawaban:

13

Ada cara yang sulit dan jauh lebih mudah. Cara yang sulit adalah dengan menggunakan penguraian bahasa alami untuk memberikan kemungkinan bahwa suatu baris diberikan dalam bahasa Inggris dan membuang garis-garis tersebut.

Cara yang lebih mudah adalah dengan mengambil daftar kata - kata berhenti berbahasa Inggris dan menghapus baris yang mengandung elemen dari daftar itu. Jika Anda ingin mengurangi kemungkinan salah mengkategorikan suatu garis, Anda juga bisa mencari keberadaan kata-kata berhenti berbahasa Jerman di baris-baris yang tidak Anda tolak untuk memastikan bahwa itu adalah bahasa Jerman.

Berikut ini skrip yang sangat cepat dan kotor untuk menggunakan daftar kata berhenti yang ditautkan untuk melakukan pemfilteran:

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

dan hasilnya:

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, 

Versi yang sedikit lebih lengkap harus mengabaikan berbagai tanda baca seperti ,.tetapi bukan tanda kutip bahasa Inggris 'ketika dalam sebuah kata. Bahkan akurasi yang lebih besar dapat diperoleh dengan mencari «ßütitik-titik kode yang tidak pernah terjadi dalam bahasa Inggris (misalnya ) tetapi itu dibiarkan sebagai latihan bagi pembaca.

msw
sumber
Pendekatan yang sangat bagus. Jauh lebih baik daripada pendekatan hack and slash saya 8-)
slm
Danke (menggunakan kata-kata berhenti sebagai diagnostik bahasa berasal dari bagian pikiran saya, saya tidak tahu ada di sana;)
msw
5

Pada sampel Anda, ini akan berhasil:

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

Detail

  • RS=. Mengatur pemisah rekaman . Nilai kosong adalah kasus khusus yang berarti catatan adalah paragraf (urutan garis yang dibatasi oleh baris kosong).
  • -F '\n': mengatur pemisah bidang ( bidang dalam setiap catatan adalah garis).
  • OFS='\n': mengatur pemisah bidang keluaran.

Untuk setiap catatan (paragraf):

  • NF=1+NF/2(atau NF=2(2 baris pertama) + (NF-2)/2(setengah dari sisa baris)): ubah jumlah kolom untuk mengecualikan yang berbahasa Inggris.
  • printf "%s", $0 RT: mencetak catatan diikuti oleh terminator catatan (untuk mengembalikan jumlah jarak yang sama antara paragraf). Untuk melihat apa yang dilakukan kode di atas, sangat membantu jika Anda menambahkan beberapa pernyataan cetak ke dalam campuran. Sesuatu seperti ini:

Itu mengasumsikan ujung garis Unix. Jika file dalam format MSDOS seperti yang biasa terjadi pada file subtitle, Anda harus memprosesnya dengan d2uatau dos2unix.

Stéphane Chazelas
sumber
Ini mengasumsikan bahwa garis-garis bahasa Inggris alway di posisi 3 atau 4, kan?
slm
2
@slm. Tidak, setengah kalimat itu adalah bahasa Inggris.
Stéphane Chazelas
Terlihat lebih banyak, ini memecah garis menjadi catatan. Anda kemudian mencari di dalam setiap catatan untuk jumlah bidang (NF). NF adalah garis dalam hal ini, kan? Aku masih tidak mengerti apa yang kamu lakukan dengan NF-=NF/2-1bit. Apakah Anda menghitung katakan NF=4untuk catatan pertama, 714. Jadi, Anda mendapatkan nilai NF=4dan NF/2-1=1, lalu mengurangi 1dari NFmeninggalkan Anda dengan 3? Kemudian mencetak 3"bidang" pertama dari catatan, lalu menjatuhkan baris ke-4?
slm
3

Bagian penting dari jenis pendekatan ini adalah memiliki akses ke database kata-kata bahasa Inggris yang baik. Ada file ini di sistem saya, /usr/share/dict/wordsyang memiliki banyak kata, tetapi sumber lain dapat digunakan sebagai gantinya.

Pendekatan

Pendekatan umum saya adalah menggunakan grepseperti:

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

Di mana contoh output Anda berada sample.txt.

Dalam pengujian terbatas saya, ukuran wordskamus tampaknya grepmacet. Versi saya memiliki 400k + baris di dalamnya. Jadi saya mulai melakukan sesuatu seperti ini untuk memecahnya sedikit:

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

Pengerjaan sampel (10k)

Jalankan file Anda dengan menggunakan kata 10k pertama dari "kamus".

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

CATATAN: Pendekatan ini berjalan dalam ~ 1,5 detik, di laptop i5 saya.

Tampaknya menjadi pendekatan yang layak. Ketika saya menabraknya hingga 100k baris itu mulai memakan waktu lama, saya membatalkannya sebelum selesai, sehingga Anda dapat memecah wordskamus menjadi beberapa file.

CATATAN: Ketika saya memundurkannya ke garis 50k butuh waktu 32 detik.

Menyelam lebih dalam (garis 50k)

Ketika saya mulai memperluas kamus hingga 50k saya mengalami masalah yang saya takuti, tumpang tindih antara bahasa.

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

Menganalisis masalah

Satu hal yang baik dengan pendekatan ini adalah Anda dapat menghapus -vdan melihat di mana tumpang tindihnya adalah:

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

Kata aufini tampaknya dalam kedua bahasa ... paling tidak itu ada dalam wordsfile saya , jadi ini mungkin sedikit pendekatan coba-coba untuk memperbaiki daftar kata yang diperlukan.

CATATAN: Saya tahu itu adalah kata aufkarena grepdiwarnai merah, yang tidak muncul dalam output di atas karena sifat SE SE yang terbatas).

$ grep auf ~/50000words 
auf
aufait
aufgabe
aufklarung
auftakt
baufrey
Beaufert
beaufet
beaufin
Beauford
Beaufort
beaufort
bechauffeur
slm
sumber
Kata "auf" ada dalam bahasa Inggris? Itu HARUS bug dalam file kata. Jelas tidak, setidaknya tidak mandiri (yang seharusnya menjadi satu-satunya cara diuraikan untuk di sini)
sintaksis
@syntaxerror - seperti yang saya katakan ada di file daftar kata yang saya gunakan. Saya mengurai mandiri. Itu yang grep -wf ...dilakukannya. Dengan pasokan kata yang lebih baik, pendekatan ini akan menjadi lebih langsung. Solusi lain (Stephane) tergantung pada data yang terstruktur dan tidak melihatnya dengan cara kontekstual, pendekatan msw tampaknya memiliki kaki yang lebih baik bagi saya.
slm
Saya berasumsi Anda sedang parsing mandiri. Apa pun, saya menegaskan bahwa jika kata "auf" benar-benar bagian dari daftar kata berbahasa Inggris , saya ingin melihat referensi kamus di mana keberadaannya didokumentasikan. Kemungkinan besar, Anda tidak akan menemukan ... pernah. Tapi seperti yang Anda lihat, satu kata saja dapat membuat kebingungan total dalam parser dari segala jenis.
syntaxerror
@syntaxerror - maaf untuk kebingungan, saya tidak setuju dengan Anda tentang "auf" menjadi kata yang sebenarnya, hanya saja itu ada di file kamus yang saya gunakan. Kebetulan saya mengecek ulang silsilah file itu dan itu berasal dari paket di laptop Fedora 14 saya yang disebut kata-kata. Ini sumber URL ini sebagai pencetus daftar kata yang menggunakan: en.wikipedia.org/wiki/Moby_Project
slm
1

Ini terlihat seperti .srtfile. Jika ya, dan jika jumlah baris bahasa Inggris per subtitle selalu sama dengan jumlah baris bahasa Jerman, maka Anda dapat menggunakan:

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

Di mana old.srtdan new.srtfile input dan output pilihan Anda.

wingedsubmariner
sumber