Làm thế nào tôi có thể xóa tất cả các dòng tiếng Anh từ một tệp văn bản?


11

Tôi có tệp văn bản này:

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

và muốn phân tích nó để chỉ các dòng không phải tiếng Anh ở lại

điều này có thể không


3
Bạn có thể giả định một cách an toàn rằng sẽ luôn có cùng một số dòng trong mỗi ngôn ngữ không? Nếu có hai dòng tiếng Đức thì sẽ luôn có hai dòng tiếng Anh v.v?
terdon

Câu trả lời:


13

Có một cách khó khăn và một cách dễ dàng hơn nhiều. Cách khó nhất là sử dụng phân tích ngôn ngữ tự nhiên để đưa ra xác suất rằng một dòng nhất định bằng tiếng Anh và loại bỏ các dòng đó.

Cách dễ dàng hơn là lấy danh sách các từ dừng tiếng Anh và xóa các dòng có chứa các thành phần khỏi danh sách đó. Nếu bạn muốn giảm cơ hội phân loại sai một dòng, bạn cũng có thể tìm kiếm sự hiện diện của các từ dừng tiếng Đức trong các dòng mà bạn không từ chối để kiểm tra xem chúng có phải là tiếng Đức không.

Đây là một tập lệnh rất nhanh và bẩn để sử dụng danh sách từ dừng được liên kết để thực hiện quá trình lọc:

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

và đầu ra:

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, 

Một phiên bản hoàn chỉnh hơn một chút nên bỏ qua các dấu câu khác nhau ,.nhưng không phải là dấu nháy đơn tiếng Anh 'khi trong một từ. Thậm chí độ chính xác cao hơn có thể đạt được bằng cách tìm kiếm các loại tiền mã hóa không bao giờ xảy ra bằng tiếng Anh (ví dụ «ßü) nhưng đó là một bài tập cho người đọc.


Cách tiếp cận rất tốt đẹp. Tốt hơn nhiều so với cách tiếp cận hack và slash của tôi 8-)
slm

Danke (sử dụng các từ dừng để chẩn đoán ngôn ngữ xuất phát từ một phần của tâm trí tôi không biết là ở đó;)
msw

5

Trên mẫu của bạn, điều này sẽ làm việc:

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

Chi tiết

  • RS=. Đặt dấu phân cách bản ghi . Giá trị trống là trường hợp đặc biệt có nghĩa là bản ghi là một đoạn (chuỗi các dòng được phân tách bằng các dòng trống).
  • -F '\n': đặt dấu phân cách trường ( các trường trong mỗi bản ghi là các dòng).
  • OFS='\n': đặt dấu tách trường đầu ra.

Đối với mỗi bản ghi (đoạn):

  • NF=1+NF/2(hoặc NF=2(2 dòng đầu tiên) + (NF-2)/2(một nửa số dòng còn lại)): thay đổi số lượng trường để loại trừ các trường tiếng Anh.
  • printf "%s", $0 RT: in bản ghi theo sau là dấu kết thúc bản ghi (để khôi phục cùng một khoảng cách giữa các đoạn). Để xem những gì mã trên đang làm, thật hữu ích nếu bạn thêm một số câu lệnh in vào hỗn hợp. Một cái gì đó như thế này:

Điều đó giả định kết thúc dòng Unix. Nếu tệp có định dạng MSDOS như phổ biến với các tệp phụ đề, bạn cần xử lý trước bằng d2uhoặc dos2unix.


Điều này giả định rằng các dòng tiếng Anh luôn ở vị trí thứ 3 hoặc thứ 4, phải không?
slm

2
@slm. Không, một nửa dòng đó là tiếng Anh.
Stéphane Chazelas

Nhìn thêm một chút, điều này phá vỡ các dòng thành hồ sơ. Sau đó, bạn nhìn vào trong mỗi bản ghi để biết số lượng trường (NF). Một NF là một dòng trong trường hợp này, phải không? Tôi vẫn không hiểu những gì bạn đang làm với NF-=NF/2-1bit. Bạn đang tính toán nói NF=4cho các hồ sơ đầu tiên, 714. Vì vậy, bạn sẽ có được những giá trị NF=4NF/2-1=1, và sau đó trừ đi 1từ NFđể lại cho bạn 3? Sau đó in các 3"trường" đầu tiên của bản ghi, do đó bỏ dòng thứ 4?
slm

3

Mấu chốt của cách tiếp cận này là có quyền truy cập vào một cơ sở dữ liệu tốt về các từ tiếng Anh. Có tệp này trên hệ thống của tôi, /usr/share/dict/wordscó rất nhiều từ, nhưng các nguồn khác có thể được sử dụng thay thế.

Tiếp cận

Cách tiếp cận chung của tôi sẽ là sử dụng grepnhư vậy:

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

Trường hợp đầu ra ví dụ của bạn là trong sample.txt.

Trong thử nghiệm hạn chế của tôi, kích thước của wordstừ điển dường như grepsa lầy . Phiên bản của tôi có 400k + dòng trong đó. Vì vậy, tôi bắt đầu làm một cái gì đó như thế này để phá vỡ nó một chút:

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

Chạy mẫu (10k)

Việc chạy tệp của bạn thông qua việc sử dụng 10k từ đầu tiên từ "từ điể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,

LƯU Ý: Cách tiếp cận này chạy trong ~ 1,5 giây, trên máy tính xách tay i5 của tôi.

Nó dường như là một cách tiếp cận khả thi. Khi tôi đưa nó lên đến 100 nghìn dòng, nó bắt đầu mất một thời gian dài, tôi đã hủy bỏ nó trước khi nó kết thúc, vì vậy bạn có thể chia wordstừ điển thành nhiều tệp.

LƯU Ý: Khi tôi sao lưu nó xuống 50k dòng, mất 32 giây.

Lặn sâu hơn (50k dòng)

Khi tôi bắt đầu mở rộng từ điển lên tới 50k, tôi gặp phải vấn đề tôi sợ, chồng chéo giữa các ngôn ngữ.

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

Phân tích vấn đề

Một điều tốt với phương pháp này là bạn có thể loại bỏ -vvà xem vị trí trùng lặp là:

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

Từ aufnày rõ ràng có trong cả hai ngôn ngữ ... ít nhất là trong wordstập tin của tôi , vì vậy đây có thể là một chút cách tiếp cận thử và sai để tinh chỉnh danh sách từ khi cần.

LƯU Ý: Tôi biết đó là từ aufgreptô màu đỏ, nó không hiển thị ở đầu ra ở trên do tính chất hạn chế của SE 8-).

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

Từ "auf" tồn tại trong tiếng Anh? Đó PHẢI là một lỗi trong tập tin từ. Nó chắc chắn không, ít nhất là không độc lập (nên là cách duy nhất được phân tích cú pháp ở đây)
cú pháp

@syntaxerror - như tôi đã nói trong tập tin danh sách từ mà tôi đang sử dụng. Tôi đang phân tích độc lập. Đó là những gì grep -wf ...đang làm. Với nguồn cung cấp từ tốt hơn, cách tiếp cận này sẽ trực tiếp hơn. Giải pháp khác (Stephane) phụ thuộc vào dữ liệu được cấu trúc và không xem xét nó theo bất kỳ cách nào theo ngữ cảnh, cách tiếp cận của msw dường như có đôi chân tốt hơn đối với tôi.
slm

Tôi giả sử bạn đã phân tích độc lập. Dù thế nào đi nữa, tôi khẳng định rằng nếu từ "auf" thực sự là một phần của danh sách từ tiếng Anh , tôi muốn xem tài liệu tham khảo từ điển nơi sự tồn tại của nó được ghi lại. Rất có thể, bạn sẽ không tìm thấy một ... bao giờ. Nhưng như bạn có thể thấy, một từ đơn thuần có thể tạo ra sự nhầm lẫn hoàn toàn trong các trình phân tích cú pháp thuộc mọi loại.
cú pháp

@syntaxerror - xin lỗi vì sự nhầm lẫn này, tôi không đồng ý với bạn về "auf" là một từ thực tế, chỉ là nó có trong tập tin từ điển mà tôi đang sử dụng. Tình cờ tôi đã kiểm tra lại dòng dõi của tập tin đó và nó xuất phát từ một gói trên máy tính xách tay Fedora 14 của tôi được gọi là từ. Nó lấy URL này làm người khởi tạo danh sách từ mà nó đang sử dụng: en.wikipedia.org/wiki/Moby_Project
slm

1

Điều này trông giống như một .srttập tin. Nếu có, và nếu số dòng tiếng Anh trên mỗi phụ đề luôn bằng với số dòng tiếng Đức, thì bạn có thể sử dụng:

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

Nơi old.srtnew.srtlà tập tin đầu vào và đầu ra được lựa chọn của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.