আমি কীভাবে পাঠ্য ফাইল থেকে সমস্ত ইংরেজী লাইন মুছতে পারি?


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

এবং এটি পার্স করতে চান তাই কেবল ইংরেজী নয় lines

এটা কি সম্ভব?


3
আপনি কি নিরাপদে ধরে নিতে পারেন যে প্রতিটি ভাষায় সর্বদা একই সংখ্যক লাইন থাকবে? দুটি জার্মান লাইন থাকলে সেখানে কি সবসময় দুটি ইংলিশ লাইন ইত্যাদি থাকবে?
টেরডন

উত্তর:


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-)
স্ল্যাম

ড্যাঙ্ক (কোনও ভাষার ডায়াগনস্টিক হিসাবে স্টপ শব্দটি ব্যবহার করা আমার মনের একটি অংশ থেকে এসেছিল আমি জানতাম না যে সেখানে ছিল;)
এমএসডাব্লু

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 য় বা চতুর্থ অবস্থানে রয়েছে, তাই না?
slm

2
@slm। না, সেই অর্ধেকটি লাইন ইংরেজি।
স্টাফেন চেজেলাস

আরও কিছুটা দেখার জন্য এটি লাইনগুলিকে রেকর্ডে বিভক্ত করে। তারপরে আপনি ক্ষেত্রের সংখ্যার জন্য প্রতিটি রেকর্ডের মধ্যে নজর রাখবেন (এনএফ)। একটি এনএফ এই ক্ষেত্রে একটি লাইন, তাই না? আপনি NF-=NF/2-1বিট দিয়ে যা করছেন তা আমি এখনও পাই না । আপনি কি NF=4প্রথম রেকর্ডের জন্য বলছেন গণনা করছেন , 714. সুতরাং আপনি মানগুলি পাবেন NF=4এবং NF/2-1=1, এবং তারপরে আপনাকে ছেড়ে যাওয়া 1থেকে বিয়োগ করে ফেলছেন ? তারপরে রেকর্ডের প্রথম "ক্ষেত্রগুলি" মুদ্রণ করে , তাই 4 র্থ লাইনটি ফেলে দেওয়া হচ্ছে? NF33
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 কে)

"অভিধান" থেকে 1 ম 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,

দ্রষ্টব্য: আমার আই 5 ল্যাপটপে এই পদ্ধতিটি ~ 1.5 সেকেন্ডের মধ্যে চলেছে।

এটি একটি কার্যকর উপায় বলে মনে হচ্ছে। আমি যখন এটি 100k লাইন পর্যন্ত ধাক্কা দিয়েছিলাম যদিও এটি দীর্ঘ সময় নিতে শুরু করেছিল, এটি শেষ হওয়ার আগেই আমি এটি বাতিল করে দিয়েছিলাম, যাতে আপনি অভিধানটি wordsবেশ কয়েকটি ফাইলে বিভক্ত করতে পারেন।

দ্রষ্টব্য: আমি যখন এটি 50k লাইনে ব্যাক করেছি তখন এটি 32 সেকেন্ড সময় নিয়েছিল।

ডাইভিং গভীর (50 কে লাইন)

আমি যখন 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

"আউফ" শব্দটি ইংরেজি ভাষায় বিদ্যমান? শব্দ ফাইলটিতে এটি একটি বাগ হতে হবে। এটা স্পষ্টভাবে, করে না অন্তত স্বতন্ত্র যাহাই হউক না কেন (যা একমাত্র উপায় এখানে পার্স হওয়া উচিত)
বাক্যগঠনের ত্রুটি

@ সাইন্ট্যাক্সারর - যেমনটি আমি বলেছিলাম যে এটি যে শব্দ তালিকা ফাইলটি আমি ব্যবহার করছিলাম সেটিতে রয়েছে। আমি স্বতন্ত্র পার্সিং করছি। এটা কি grep -wf ...করে। শব্দের আরও ভাল সরবরাহের সাথে এই পদ্ধতির আরও সরাসরি হবে। অন্য সমাধান (স্টিফেনের) ডেটা কাঠামোবদ্ধ হওয়ার উপর নির্ভর করে এবং এটি কোনও প্রাসঙ্গিক উপায়ে দেখে না, এমএসডব্লিউর পদ্ধতির কাছে আমার কাছে আরও ভাল পা আছে বলে মনে হয়।
এসএমএল

আমি তোমাদের অধিকৃত ছিল স্বতন্ত্র পার্স। যাই হোক না কেন, আমি নিশ্চিত করছি যে "আউফ" শব্দটি যদি সত্যই কোনও ইংরেজি-ভাষার শব্দ তালিকার অংশ হয় তবে আমি অভিধানের রেফারেন্সটি দেখতে চাই যেখানে এর অস্তিত্ব নথিভুক্ত রয়েছে। সম্ভবত, আপনি একটি খুঁজে পাবেন না ... কখনও। তবে আপনি দেখতে পাচ্ছেন, একটি নিখুঁত শব্দ সমস্ত ধরণের পার্সারগুলিতে সম্পূর্ণ বিভ্রান্তি তৈরি করতে পারে।
সিনট্যাক্সেরর

@ সাইন্ট্যাক্সরর - এই বিভ্রান্তির জন্য দুঃখিত, আমি "আউফ" একটি সত্য শব্দ হওয়ার বিষয়ে আপনার সাথে একমত নই, কেবল যে অভিধান ফাইলটি আমি ব্যবহার করছিলাম তা হতে পারে। ঘটনাচক্রে আমি সেই ফাইলটির বংশের ডাবলটি পরীক্ষা করেছিলাম এবং এটি আমার ফেডোরা 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.