ฉันจะลบบรรทัดภาษาอังกฤษทั้งหมดออกจากไฟล์ข้อความได้อย่างไร


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: พิมพ์บันทึกตามด้วยเทอร์มินอลเทอร์เรเตอร์ (เพื่อคืนค่าระยะห่างระหว่างย่อหน้าในจำนวนเดียวกัน) หากต้องการดูว่าโค้ดข้างต้นทำอะไรมีประโยชน์ถ้าคุณเพิ่มคำสั่งการพิมพ์ลงในมิกซ์ บางสิ่งเช่นนี้

นั่นถือว่าเป็นจุดสิ้นสุดของ Unix ถ้าไฟล์ที่อยู่ในรูปแบบ MSDOS ราวกับเป็นเรื่องธรรมดาที่มีไฟล์คำบรรยายคุณจะต้อง preprocess ด้วยหรือd2udos2unix


นี่ถือว่าเส้นภาษาอังกฤษอยู่ในตำแหน่งที่ 3 หรือ 4 ใช่ไหม?
slm

2
@slm ไม่ครึ่งสายนั้นเป็นภาษาอังกฤษ
Stéphane Chazelas

มองอีกเล็กน้อยนี้แบ่งบรรทัดลงในบันทึก จากนั้นคุณดูในแต่ละระเบียนสำหรับจำนวนเขตข้อมูล (NF) NF เป็นเส้นตรงในกรณีนี้ใช่ไหม ฉันยังไม่ได้สิ่งที่คุณทำกับNF-=NF/2-1บิต คุณกำลังพูดคำนวณNF=4สำหรับระเบียนแรก 714 ดังนั้นคุณจะได้รับค่าNF=4และNF/2-1=1แล้วลบ1จากNFออกจากคุณกับ3? จากนั้นพิมพ์3"ฟิลด์" แรกของเร็กคอร์ดดังนั้นปล่อยบรรทัดที่ 4 หรือไม่
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

ตัวอย่างการวิ่ง (10k)

เรียกใช้ไฟล์ของคุณผ่านการใช้คำ 10k 1 จาก "พจนานุกรม"

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

หมายเหตุ:วิธีการนี้ใช้เวลาประมาณ 1.5 วินาทีบนแล็ปท็อป i5 ของฉัน

มันดูเหมือนว่าจะเป็นแนวทางปฏิบัติ เมื่อฉันชนมันมากถึง 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สีมันสีแดงที่ไม่ปรากฏในผลลัพธ์ข้างต้นเนื่องจากลักษณะที่ จำกัด ของ SE 8-)

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

คำว่า "auf" มีอยู่ในภาษาอังกฤษหรือไม่ นั่นจะต้องเป็นข้อบกพร่องในไฟล์คำศัพท์ มันไม่แน่นอนอย่างน้อยไม่ใช่แบบสแตนด์อโลน (ซึ่งควรเป็นวิธีเดียวในการแยกวิเคราะห์สำหรับที่นี่) ต่อไป
ซินแทร็

@syntaxerror - อย่างที่ฉันบอกว่ามันอยู่ในไฟล์รายการคำศัพท์ที่ฉันใช้อยู่ ฉันกำลังแยกวิเคราะห์แบบสแตนด์อโลน นั่นคือสิ่งที่grep -wf ...ทำ ด้วยการจัดหาคำที่ดีกว่าวิธีการนี้จะตรงกว่า โซลูชันอื่น ๆ (Stephane's) ขึ้นอยู่กับข้อมูลที่มีโครงสร้างและไม่ได้มองในบริบทใด ๆ แนวทางของ msw ดูเหมือนจะมีขาที่ดีกว่าสำหรับฉัน
slm

ฉันคิดว่าคุณกำลังแยกวิเคราะห์แบบสแตนด์อโลน ไม่ว่าฉันจะยืนยันว่าถ้าคำว่า "auf" เป็นส่วนหนึ่งของรายการคำศัพท์ภาษาอังกฤษฉันต้องการดูการอ้างอิงพจนานุกรมที่มีการบันทึกไว้ เป็นไปได้มากที่คุณจะไม่พบ ... เลย แต่อย่างที่คุณเห็นคำเพียงคำเดียวสามารถสร้างความสับสนอย่างสิ้นเชิงในตัวแยกวิเคราะห์ทุกประเภท
ไวยากรณ์

@syntaxerror - ขออภัยในความสับสนฉันไม่เห็นด้วยกับคุณเกี่ยวกับ "auf" ที่เป็นคำที่เกิดขึ้นจริงเพียงว่ามันเกิดขึ้นกับไฟล์พจนานุกรมที่ฉันใช้อยู่ ฉันตรวจสอบเชื้อสายของไฟล์นั้นสองครั้งและมันมาจากแพ็คเกจบนแล็ปท็อป Fedora 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.