मैं टेक्स्टफाइल से सभी अंग्रेजी लाइनें कैसे हटा सकता हूं?


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(पहले 2 लाइनें) + (NF-2)/2(शेष लाइनों का आधा): अंग्रेजी वाले को बाहर करने के लिए फ़ील्ड की संख्या बदलें।
  • printf "%s", $0 RT: प्रिंट रिकॉर्ड रिकॉर्ड टर्मिनेटर के बाद (पैराग्राफ के बीच रिक्ति की एक ही राशि बहाल करने के लिए)। यह देखने के लिए कि उपर्युक्त कोड क्या कर रहा है यदि आप मिश्रण में कुछ प्रिंट स्टेटमेंट जोड़ते हैं तो यह सहायक है। कुछ इस तरह:

यह यूनिक्स लाइन अंत मानता है। यदि फ़ाइल MSDOS प्रारूप में है जैसा कि उपशीर्षक फ़ाइलों के साथ आम है, तो आपको इसे d2uया उसके साथ पूर्वप्रक्रमित करने की आवश्यकता है dos2unix


यह मानता है कि अंग्रेजी की पंक्तियाँ 3 या 4 की स्थिति में बिल्कुल सही हैं?
slm

2
@slm। नहीं, वह आधी लाइनें अंग्रेजी हैं।
स्टीफन चेजलस

थोड़ा और देखना, यह रिकॉर्ड में लाइनों को तोड़ता है। फिर आप फ़ील्ड्स (NF) की संख्या के लिए प्रत्येक रिकॉर्ड के भीतर देखते हैं। एक NF इस मामले में एक पंक्ति है, है ना? मुझे अभी भी वह नहीं मिला है जो आप NF-=NF/2-1बिट के साथ कर रहे हैं । आप कहते हैं गणना कर रहे हैं NF=4तो क्या आप मान प्राप्त पहले रिकॉर्ड, 714. के लिए NF=4और NF/2-1=1, और फिर घटाकर 1से NFसाथ छोड़ 3? फिर 3रिकॉर्ड के पहले "फ़ील्ड" को प्रिंट करना , इसलिए 4 वीं पंक्ति को छोड़ना है?
स्लम

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, जो कि एसई 8- की सीमित प्रकृति के कारण उपरोक्त आउटपुट में दिखाई नहीं देता है)।

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

अंग्रेजी भाषा में "auf" शब्द मौजूद है? उस शब्द फ़ाइल में एक बग होना चाहिए। यह निश्चित रूप से नहीं है, कम से कम स्टैंडअलोन नहीं है (जो यहां के लिए एकमात्र रास्ता होना चाहिए) वैसे भी
वाक्यविन्यास

@syntaxerror - जैसा कि मैंने कहा कि यह शब्द सूची फ़ाइल में है जिसका मैं उपयोग कर रहा था। मैं स्टैंडअलोन पार्स कर रहा हूं। वही grep -wf ...करता है। शब्दों की बेहतर आपूर्ति के साथ यह दृष्टिकोण अधिक प्रत्यक्ष होगा। अन्य समाधान (स्टीफन का) संरचित होने वाले डेटा पर निर्भर करता है और इसे किसी भी प्रासंगिक तरीके से नहीं देखता है, msw के दृष्टिकोण को मेरे लिए हालांकि बेहतर पैर हैं।
SLM

मुझे लगता है कि आप स्टैंडअलोन पार्स कर रहे थे । जो भी हो, मैं पुष्टि करता हूं कि यदि "auf" शब्द वास्तव में अंग्रेजी भाषा की शब्द सूची का हिस्सा है , तो मैं उस शब्दकोश संदर्भ को देखना चाहता हूं जहां इसका अस्तित्व प्रलेखित है। सबसे अधिक संभावना है, आप एक ... कभी नहीं मिलेगा। लेकिन जैसा कि आप देख सकते हैं, एक मात्र शब्द सभी प्रकार के पार्सरों में कुल भ्रम पैदा कर सकता है।
वाक्यविन्यास

@syntaxerror - भ्रम के लिए खेद है, मैं आपके साथ "auf" एक वास्तविक शब्द होने के बारे में असहमत नहीं था, बस यह शब्दकोश फ़ाइल में होना चाहिए जो मैं उपयोग कर रहा था। संयोग से मैंने उस फ़ाइल के वंश को दोगुना कर दिया और यह मेरे फेडोरा 14 लैपटॉप पर एक पैकेज से आया है जिसे शब्द कहा जाता है। : यह शब्द सूचियों के प्रवर्तक है कि यह उपयोग कर रहा है, क्योंकि इस 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.srtऔर कहां new.srtहैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.