Bir metin dosyasındaki tüm ingilizce satırlarını nasıl silebilirim?


11

Bu metin dosyası var:

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

ve ayrıştırmak istiyoruz, böylece sadece İngilizce olmayan satırlar

Mümkün mü?


3
Her dilde her zaman aynı sayıda satır olacağından emin olabilir misiniz? İki Alman hattı varsa, her zaman iki İngiliz hattı vb.
terdon

Yanıtlar:


13

Zor bir yol ve çok daha kolay bir yol var. Zor yol, belirli bir satırın İngilizce olması olasılığını vermek ve bu satırları atmak için doğal dil ayrıştırma yöntemini kullanmaktır.

Daha kolay yol, İngilizce dur sözcüklerinin bir listesini almak ve bu listeden öğe içeren satırları silmek. Bir satırı yanlış kategorize etme şansını azaltmak istiyorsanız, muhtemelen Almanca olduklarını kontrol etmek için reddetmediğiniz satırlarda Almanca durdurma kelimelerinin varlığını da arayabilirsiniz.

Filtrelemeyi yapmak için bağlantılı durma kelime listesini kullanmak için çok hızlı ve kirli bir komut dosyası:

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

ve çıktı:

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, 

Biraz daha eksiksiz bir sürüm, bir kelime içinde ,.İngiliz kesme işareti gibi çeşitli noktalama işaretlerini göz ardı etmelidir '. İngilizce'de hiç bulunmayan (örneğin «ßü) kod noktalarını arayarak daha yüksek doğruluk elde edilebilir, ancak bu okuyucu için bir alıştırma olarak bırakılır.


Çok hoş bir yaklaşım. Benim kesmek ve eğik çizgi yaklaşım 8-) çok daha iyi
slm

Danke (durdurma kelimelerini bir dilin teşhisi olarak kullanmak, aklımın orada olduğunu bilmediğim bir kısmından geldi;)
msw

5

Örneğinizde bu işe yarar:

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

ayrıntılar

  • RS=. Kayıt ayırıcıyı ayarlar . Boş bir değer, kaydın bir paragraf (boş satırlarla ayrılmış satır sırası) anlamına gelen özel bir durumdur .
  • -F '\n': alan ayırıcısını ayarlar ( her kayıttaki alanlar satırdır).
  • OFS='\n': çıkış alanı ayırıcısını ayarlar.

Her kayıt için (paragraf):

  • NF=1+NF/2(veya NF=2(ilk 2 satır) + (NF-2)/2(kalan satırların yarısı)): İngilizce olanları hariç tutmak için alan sayısını değiştirin.
  • printf "%s", $0 RT: önce kaydı ve ardından kayıt sonlandırıcıyı yazdırır (paragraflar arasında aynı miktarda boşluğu geri yüklemek için). Yukarıdaki kodun ne yaptığını görmek için karışıma bazı baskı ifadeleri eklemeniz yararlı olur. Bunun gibi bir şey:

Bu Unix satır sonlarını varsayar. Dosya, MSDOS biçiminde olduğu gibi altyazı dosyalarıyla ortaksa, d2uveya ile önişleme yapmanız gerekir dos2unix.


Bu, İngilizce hatlarının daima 3. veya 4. konumda olduğunu varsayar, değil mi?
slm

2
@slm. Hayır, bu çizgilerin yarısı İngiliz.
Stéphane Chazelas

Biraz daha baktığımızda, bu satırları rekorlara böler. Daha sonra her kayıt içinde alan sayısını (NF) ararsınız. Bu durumda bir NF bir çizgidir, değil mi? Hala biraz ne yaptığını anlamıyorum NF-=NF/2-1. Eğer söz hesaplıyoruz NF=4değerleri almak Yani ilk kayıt, 714 için NF=4ve NF/2-1=1ve sonra çıkarılarak 1elde NFsize bırakarak 3? Sonra 3kaydın ilk "alanlarını" yazdırmak , böylece 4. satır düşüyor?
slm

3

Bu tür bir yaklaşımın anahtar parçası, iyi bir İngilizce kelime veritabanına erişim sağlamaktır. Sistemimde /usr/share/dict/wordsçok fazla kelime olan bu dosya var , ancak bunun yerine başka kaynaklar da kullanılabilir.

Yaklaşmak

Benim genel yaklaşım şöyle kullanmak olacaktır grep:

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

Örnek çıktınızın bulunduğu yer sample.txt.

Sınırlı testlerimde wordssözlüğün boyutu bataklık gibi görünüyordu grep. Sürümümde 400k + satır var. Bu yüzden biraz parçalamak için böyle bir şey yapmaya başladım:

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

Örnek koşu sayısı (10k)

Dosyanızı "sözlükten" ilk 10 bin kelime kullanarak çalıştırın.

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

NOT: Bu yaklaşım, i5 dizüstü bilgisayarımda ~ 1.5 saniye içinde koştu.

Bu uygulanabilir bir yaklaşım gibi görünüyor. 100k satıra kadar çarptığımda uzun bir süre almaya başladı, bitmeden önce iptal ettim, böylece wordssözlüğü birkaç dosyaya bölebilirsiniz.

NOT: 50k hatta yedeklediğimde 32 saniye sürdü.

Daha derine dalma (50 bin satır)

Sözlüğü 50k'ye kadar genişletmeye başladığımda korktuğum konuya girdim, diller arasında çakışma.

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

Sorunu analiz etme

Bu yaklaşımla ilgili iyi bir şey -v, çakışmayı kaldırabilir ve nerede olduğunu görebilirsiniz:

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

Kelime aufgörünüşe göre her iki dilde ... en azından benim wordsdosyamda, bu yüzden kelime listesini gerektiği gibi hassaslaştırmak için bir deneme yanılma yöntemi olabilir.

NOT: Ben kelime olduğunu biliyordum aufçünkü grepnedeniyle SE'nin sınırlı doğası 8-) Yukarıdaki çıktıda görünmüyor yani, kırmızı renkli.

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

İngilizce dilinde "auf" kelimesi var mı? Bu kelime dosyasında bir hata OLMALIDIR. Kesinlikle, en azından bağımsız değil (bu sadece burada ayrıştırılması gerekir)
sözdizimi hatası

@syntaxerror - Dediğim gibi kullandığım kelime listesi dosyasında. Bağımsız olarak ayrıştırıyorum. İşte grep -wf ...böyle yapar. Daha iyi bir kelime tedariki ile bu yaklaşım daha doğrudan olacaktır. Diğer çözüm (Stephane) yapılandırılan verilere bağlıdır ve herhangi bir bağlamsal şekilde bakmamaktadır, msw'nin yaklaşımı benim için daha iyi bacaklara sahip gibi görünmektedir.
slm

Bağımsız olarak ayrıştığınızı varsaydım . Her neyse, "auf" kelimesi gerçekten İngilizce bir kelime listesinin parçasıysa , varlığının belgelendiği yerde sözlük referansını görmek istiyorum. Büyük olasılıkla, bir tane bulamazsınız ... hiç. Ancak gördüğünüz gibi, sadece bir kelime her türlü ayrıştırıcıda tam bir karışıklık yaratabilir.
sentaksör

@syntaxerror - karışıklık için özür dilerim, "auf" un gerçek bir kelime olduğu konusunda seninle aynı fikirde değildim, sadece kullandığım sözlük dosyasındaydı. Bu arada, o dosyanın kökenini iki kez kontrol ettim ve Fedora 14 dizüstü bilgisayarımdaki kelimeler adı verilen bir paketten geliyor. Bu URL'yi, kullandığı kelime listelerinin kaynağı olarak kullanır: en.wikipedia.org/wiki/Moby_Project
slm

1

Bu bir .srtdosyaya benziyor . Öyleyse ve altyazı başına İngilizce satır sayısı her zaman Almanca satır sayısıyla aynı ise, şunları kullanabilirsiniz:

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

Nerede old.srtve new.srtseçtiğiniz girdi ve çıktı dosyaları.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.