2010-02-09 34 views
6

Tôi đang sử dụng Python 3.1, nhưng tôi có thể hạ cấp nếu cần.Python - số đếm tần số và bản dịch

Tôi có một tệp ASCII chứa một câu chuyện ngắn được viết bằng một trong các ngôn ngữ mà bảng chữ cái trong đó có thể được đại diện bằng ASCII trên và dưới. Tôi muốn:

1) Phát hiện một mã hóa để tốt nhất khả năng của tôi, có một số loại tự tin metric (sẽ khác nhau tùy thuộc vào độ dài của tập tin, phải)

2) Tự động dịch toàn bộ? sử dụng một số dịch vụ trực tuyến miễn phí hoặc một thư viện.

Câu hỏi bổ sung: Điều gì xảy ra nếu văn bản được viết bằng ngôn ngữ cần từ 2 byte trở lên để đại diện cho một chữ cái và dấu thứ tự byte không có sẵn để trợ giúp tôi?

Cuối cùng, làm cách nào để xử lý các dấu câu và các ký tự khác như không gian? Nó sẽ xảy ra thường xuyên hơn một số chữ cái, phải không? Làm thế nào về thực tế là dấu chấm câu và các ký tự đôi khi có thể được trộn lẫn - có thể có hai biểu diễn dấu phẩy, hai biểu diễn cho những gì trông giống như "a", v.v ...?

Có, tôi đã đọc . Xin hãy giúp tôi với ít nhất một số mặt hàng này.

Cảm ơn bạn!

P.S. Đây không phải là một bài tập về nhà, nhưng nó là dành cho mục đích tự học. Tôi thích sử dụng một thư viện tần số thư là mã nguồn mở và có thể đọc được như trái ngược với một thư đã đóng, hiệu quả, nhưng hoàn thành công việc tốt.

Trả lời

2

Về cơ bản có ba nhiệm vụ chủ yếu để thực hiện các ứng dụng được mô tả:

  • 1a) Xác định mã hóa ký tự của văn bản đầu vào
  • 1b) Xác định ngôn ngữ của văn bản đầu vào
  • 2) Nhận văn bản đã dịch văn bản, bằng cách một trong các dịch vụ trực tuyến 'API

Đối với 1a, bạn có thể muốn xem decodeh.py, ngoài bản thân tập lệnh, nó cung cấp nhiều tài nguyên rất hữu ích liên quan đến bộ ký tự và mã hóa lớn. CharDet, được đề cập trong câu trả lời khác cũng có vẻ đáng xem xét.

Khi mã hóa ký tự được biết, như bạn đề xuất, bạn có thể giải quyết 1b) bằng cách tính toán cấu hình tần số ký tự của văn bản và khớp với tần số đã biết.Trong khi đơn giản, cách tiếp cận này thường cung cấp một tỷ lệ chính xác khá, mặc dù nó có thể yếu về các văn bản ngắn hơn và cũng trên các văn bản theo các mẫu cụ thể; ví dụ: văn bản bằng tiếng Pháp có nhiều tham chiếu đến đơn vị trong hệ mét sẽ có tỷ lệ cao bất thường của các chữ M, K và C.

Cách tiếp cận bổ sung và rất giống nhau, sử dụng bi-gam (chuỗi hai chữ cái) và tri-gram (ba chữ cái) và các bảng tham chiếu phân phối tần số tương ứng bằng nhiều ngôn ngữ khác nhau.

Các phương pháp phát hiện ngôn ngữ khác liên quan đến việc mã hóa văn bản, tức là xem xét các từ trong văn bản. Tài nguyên NLP bao gồm các bảng với các từ được sử dụng nhiều nhất trong các ngôn ngữ khác nhau. Những từ như vậy thường là các bài báo, tính từ sở hữu, trạng từ và các loại tương tự.

Giải pháp thay thế cho phát hiện ngôn ngữ là dựa vào dịch vụ dịch trực tuyến để tìm hiểu điều này cho chúng tôi. Điều quan trọng là cung cấp dịch vụ dịch với văn bản trong mã hóa ký tự mà nó hiểu, cung cấp cho nó ngôn ngữ có thể thừa.

Cuối cùng, với nhiều ứng dụng NLP thực tế, bạn có thể quyết định triển khai nhiều giải pháp. Bằng cách sử dụng mẫu thiết kế chiến lược, người ta có thể áp dụng một số bộ lọc/phân loại/bước theo một thứ tự cụ thể và thoát khỏi logic này tại các điểm khác nhau tùy thuộc vào tình huống. Ví dụ: nếu ký tự đơn giản/tần suất bigram khớp với văn bản sang tiếng Anh (có độ lệch nhỏ), thì có thể chỉ dừng ở đó. Nếu không, nếu ngôn ngữ đoán là tiếng Pháp hoặc tiếng Đức, thực hiện một thử nghiệm, vv vv

1

Nếu bạn có tệp ASCII thì tôi có thể cho bạn biết 100% tự tin rằng nó được mã hóa bằng ASCII. Ngoài ra hãy thử chardet. Nhưng biết mã hóa không nhất thiết là đủ để xác định ngôn ngữ của nó.

Đối với mã hóa nhiều byte, Cách đáng tin cậy duy nhất để xử lý nó là hy vọng rằng nó có ký tự trong bảng chữ cái Latinh và tìm một nửa cặp có NULL. Nếu không, hãy coi nó là UTF-8 trừ khi bạn biết rõ hơn (Shift-JIS, GB2312, v.v.).

Oh và UTF-8. UTF-8, UTF-8, UTF-8. Tôi không nghĩ rằng tôi có thể nhấn mạnh rằng đủ. Và trong trường hợp tôi không ... UTF-8.

+0

Cảm ơn. Xin vui lòng giải thích về đoạn thứ hai. Tôi đoán kiến ​​thức của tôi về mã hóa không sâu như tôi nghĩ. –

+2

Có ai nói UTF-8 ?! – jathanism

2

Character tần số là khá thẳng về phía trước

Tôi chỉ nhận thấy rằng bạn đang sử dụng Python3.1 vì vậy đây là dễ dàng hơn

>>> from collections import Counter 
>>> Counter("Μεταλλικα") 
Counter({'α': 2, 'λ': 2, 'τ': 1, 'ε': 1, 'ι': 1, 'κ': 1, 'Μ': 1}) 

Đối với phiên bản cũ của Python:

>>> from collections import defaultdict 
>>> letter_freq=defaultdict(int) 
>>> unistring = "Μεταλλικα" 
>>> for uc in unistring: letter_freq[uc]+=1 
... 
>>> letter_freq 
defaultdict(<class 'int'>, {'τ': 1, 'α': 2, 'ε': 1, 'ι': 1, 'λ': 2, 'κ': 1, 'Μ': 1}) 
+0

Metallika, lol. Vâng, vâng, tôi có thể tính toán cái mà tôi gọi là tần số "ngây thơ", nhưng làm thế nào để tôi so sánh phân phối đó với một số cái đã biết? –

1

tôi đã cung cấp một số câu trả lời có điều kiện tuy nhiên câu hỏi của bạn là một chút mơ hồ và không phù hợp. Vui lòng chỉnh sửa câu hỏi của bạn để cung cấp câu trả lời cho các câu hỏi của tôi bên dưới.

(1) Bạn nói rằng tệp là ASCII nhưng bạn muốn phát hiện mã hóa? Huh? Không phải là câu trả lời "ascii" ?? Nếu bạn thực sự cần phát hiện mã hóa, hãy sử dụng chardet

(2) Tự động dịch những gì? mã hóa? ngôn ngữ? Nếu ngôn ngữ, bạn có biết ngôn ngữ đầu vào là gì hay bạn đang cố gắng phát hiện ra ngôn ngữ đó? Để phát hiện ngôn ngữ, hãy thử guess-language ... lưu ý rằng cần chỉnh sửa để phát hiện tiếng Nhật tốt hơn. Xem this SO topic ghi chú vấn đề của Nhật Bản và cũng nêu bật cho bất kỳ người đoán ngôn ngữ nào, bạn cần loại bỏ tất cả tiếng ồn HTML/XML/Javascript/etc khỏi văn bản của bạn nếu không sẽ rất thiên vị kết quả đối với các ngôn ngữ chỉ ASCII như tiếng Anh (hoặc tiếng Catalan !).

(3) Bạn đang nói về một "thư viện tần số thư" ... bạn sẽ sử dụng thư viện này để làm gì? Nếu ngôn ngữ đoán, có vẻ như sử dụng tần số của các chữ cái đơn không giúp phân biệt giữa các ngôn ngữ sử dụng cùng một bộ ký tự (hoặc gần như giống nhau); người ta cần phải sử dụng tần số của các nhóm ba chữ cái ("trigram").

(4) Câu hỏi của bạn về dấu chấm câu và dấu cách: phụ thuộc vào mục đích của bạn (mà chúng tôi chưa chắc chắn). Nếu mục đích là phát hiện ngôn ngữ, ý tưởng là chuẩn hóa văn bản; ví dụ. thay thế tất cả các lệnh không (ký tự hoặc dấu nháy đơn) bằng một khoảng trắng, sau đó loại bỏ khoảng trắng đầu/cuối, thêm 1 khoảng trắng phía trước và 1 dấu cách - chính xác hơn được thu được bằng cách xử lý bắt đầu/kết thúc từ bigrams làm trigram.Lưu ý rằng như thường lệ trong tất cả các xử lý văn bản, bạn nên giải mã đầu vào của bạn thành unicode ngay lập tức và làm việc với unicode sau đó.

Các vấn đề liên quan