Nén tên miền


21

Tôi tò mò về việc làm thế nào người ta có thể nén rất gọn tên miền của tên máy chủ IDN tùy ý (như được định nghĩa bởi RFC5890 ) và nghi ngờ điều này có thể trở thành một thách thức thú vị. Máy chủ hoặc tên miền Unicode (nhãn U) bao gồm một chuỗi các ký tự Unicode, thường bị ràng buộc với một ngôn ngữ tùy thuộc vào tên miền cấp cao nhất (ví dụ: các chữ cái Hy Lạp bên dưới .gr), được mã hóa thành chuỗi ASCII bắt đầu bằng xn--(tương ứng A-nhãn).

Người ta có thể xây dựng các mô hình dữ liệu không chỉ từ các yêu cầu chính thức mà

  • mỗi nhãn không Unicode là một chuỗi khớp ^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?$;

  • mỗi nhãn A là một chuỗi khớp ^xn--[a-z\d]([a-z\d\-]{0,57}[a-z\d])?$; và

  • tổng chiều dài của toàn bộ miền (nhãn A và nhãn không IDN được nối với dấu phân cách '.') không vượt quá 255 ký tự

mà còn từ các heuristic khác nhau, bao gồm:

  • Các nhãn chữ U theo thứ tự thấp hơn thường là các cụm từ có giá trị về mặt từ vựng, cú pháp và ngữ nghĩa trong một số ngôn ngữ tự nhiên bao gồm các danh từ và chữ số thích hợp (không được đánh dấu trừ dấu gạch nối, tước khoảng trắng và gấp lại theo Nameprep ), với ưu tiên cho các cụm từ ngắn hơn; và

  • nhãn thứ tự cao hơn được rút ra từ một từ điển SLD và TLD và cung cấp ngữ cảnh để dự đoán ngôn ngữ tự nhiên nào được sử dụng trong nhãn thứ tự thấp hơn.

Tôi sợ rằng việc đạt được việc nén tốt các chuỗi ngắn như vậy sẽ khó khăn nếu không xem xét các tính năng cụ thể này của dữ liệu và hơn nữa, các thư viện hiện tại sẽ tạo ra chi phí không cần thiết để chứa các trường hợp sử dụng chung hơn của họ.

Đọc cuốn sách trực tuyến Nén dữ liệu của Matt Mahoney Giải thích , rõ ràng có thể sử dụng một số kỹ thuật hiện có để tận dụng các giả định mô hình hóa trên (và / hoặc khác) mà dẫn đến nén vượt trội so với các công cụ ít cụ thể hơn.

Theo ngữ cảnh, câu hỏi này là một câu trả lời từ câu hỏi trước trên SO .


Suy nghĩ ban đầu

Tôi nhận ra rằng vấn đề này là một ứng cử viên tuyệt vời cho đào tạo ngoại tuyến và tôi dự tính một định dạng dữ liệu nén dọc theo các dòng sau:

  • Một Huffman mã hóa " hậu tố công cộng ", với xác suất được rút ra từ một số nguồn đăng ký tên miền hoặc lưu lượng truy cập được công bố;

  • Mô hình mã hóa Huffman sử dụng mô hình (ngôn ngữ tự nhiên) được sử dụng cho các nhãn U còn lại, với xác suất được rút ra từ một số nguồn đăng ký tên miền hoặc khối lượng lưu lượng truy cập được đưa ra theo ngữ cảnh của hậu tố tên miền;

  • Áp dụng một số biến đổi dựa trên từ điển từ mô hình ngôn ngữ tự nhiên đã chỉ định; và

  • Mã hóa số học của từng ký tự trong nhãn U, với xác suất được rút ra từ các mô hình ngôn ngữ tự nhiên thích ứng theo ngữ cảnh bắt nguồn từ đào tạo ngoại tuyến (và có lẽ trực tuyến cũng vậy, mặc dù tôi nghi ngờ dữ liệu có thể quá ngắn để cung cấp bất kỳ thông tin chi tiết có ý nghĩa nào?).


4
Có lẽ bạn có thể tải xuống một danh sách tất cả các tên miền và gán cho mỗi tên một số. Điều này sẽ rất nhỏ gọn.

@Dietrich Epp: Thật vậy - và thực tế, tôi đã nghĩ rằng có lẽ các nhà đăng ký có thể xuất bản trên WHOIS một số sê-ri của mỗi đăng ký mà từ đó có thể được xây dựng một cách đáng tin cậy, nhưng thật đáng buồn là họ không làm như vậy. Trên thực tế, tôi nghĩ rằng những thách thức thực tế trong việc duy trì một cơ sở dữ liệu như vậy làm cho nó không khả thi: không đề cập đến việc các cơ sở dữ liệu đó không xử lý các tên miền phụ.
eggyal

... tốt, nếu một số là đủ, chỉ cần lấy 4/6 byte của địa chỉ ipv4 / 6: /

@arnaud: Đảo ngược nó là một vấn đề - dựa vào một con trỏ chính xác trong .in-addr.arpa; cũng bị hỏng nếu IP thay đổi.
eggyal

1
Theo phương pháp của Dietrich Epp (dựa trên ước tính 196 triệu tên miền), bạn có thể lưu trữ một tên miền trong 28 bit (hai ký tự unicode) và bạn không thể làm tốt hơn. Tất nhiên, phân phối xác suất trên các tên miền có thể cung cấp cho bạn số bit được mong đợi tốt hơn nhiều. Bạn ít nhất có thể sử dụng mã hóa số học cho 1 triệu tên miền phổ biến nhất và sử dụng một số sơ đồ đặc biệt cho phần còn lại.
Peter

Câu trả lời:


0

Mã hóa Huffman là tối ưu cho các chữ cái và chắc chắn có thể được điều chỉnh theo trình tự. Chẳng hạn, nếu chuỗi "ab" dẫn đến ít bit hơn các bit cho "a" và "b", thì chỉ cần thêm nó vào cây ... và cứ thế.

... Bạn cũng có thể sử dụng một số thư viện đơn giản, tất cả đều phù hợp với bạn với hiệu suất gần tối ưu, do đó bạn sẽ không thu được nhiều bằng thuật toán nén siêu ưa thích tùy chỉnh của mình.


Tôi nghĩ Huffman không hoàn toàn tối ưu (nó làm tròn đến bit gần nhất): mã hóa số học phải luôn vượt trội hơn. Và trừ khi người ta áp dụng một mô hình chính xác của dữ liệu được nén, người ta sẽ luôn đạt được kết quả tối ưu ... vì vậy nếu mỗi bit có vấn đề, các thư viện chung không thể đủ.
eggyal

4
Mã hóa Huffman là tối ưu không có triệu chứng nếu bạn bỏ qua mối tương quan giữa các chữ cái (ví dụ: nếu bạn thấy a q, thì chữ cái tiếp theo có nhiều khả năng là một chữ cái uhơn so với nó). Nhưng đó không phải là một giả định thực tế. Trong thực tế, những mối tương quan đó là rất lớn và cho phép người ta làm tốt hơn rất nhiều so với mã hóa Huffman ngây thơ trong thực tế.
DW

@DW bạn có đề xuất nào về cách một người có thể làm tốt hơn không? Có lẽ nó sẽ giúp cho phép các cặp hoặc ba nhân vật tiếp giáp được mã hóa thông qua Huffman?
ryan
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.