Kompresja nazw domen


21

Jestem ciekawy, jak można bardzo kompaktowo skompresować domenę dowolnej nazwy hosta IDN (zgodnie z definicją w RFC5890 ) i podejrzewam, że może to stać się ciekawym wyzwaniem. Host lub nazwa domeny Unicode (etykieta U) składa się z ciągu znaków Unicode, zwykle ograniczonego do jednego języka w zależności od domeny najwyższego poziomu (np. Litery greckie poniżej .gr), która jest zakodowana w ciąg ASCII rozpoczynający się od xn--(odpowiadający Etykieta).

Modele danych można budować nie tylko na podstawie wymogów formalnych, które

  • każda etykieta inna niż Unicode musi być pasującym ciągiem ^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?$;

  • każda etykieta A musi pasować do ciągu ^xn--[a-z\d]([a-z\d\-]{0,57}[a-z\d])?$; i

  • całkowita długość całej domeny (etykiety A i etykiety inne niż IDN połączone z ogranicznikami „.”) nie może przekraczać 255 znaków

ale także z różnych heurystyk, w tym:

  • Znaczniki U niższego rzędu są często poprawnymi leksykalnie, składniowo i semantycznie frazami w pewnym języku naturalnym, w tym odpowiednimi rzeczownikami i cyframi (nieokreślone z wyjątkiem łącznika, pozbawionego białych znaków i pofałdowane według Nameprep ), z preferencją dla krótszych fraz; i

  • etykiety wyższego rzędu są pobierane ze słownika SLD i TLD i zapewniają kontekst do przewidywania, który język naturalny jest używany w etykietach niższego rzędu.

Obawiam się, że uzyskanie dobrej kompresji takich krótkich ciągów będzie trudne bez uwzględnienia tych specyficznych cech danych, a ponadto, że istniejące biblioteki spowodują niepotrzebne koszty ogólne, aby dostosować się do ich bardziej ogólnych przypadków użycia.

Czytając książkę online Matta Mahoneya Wyjaśnienie kompresji danych , jasne jest, że można wykorzystać szereg istniejących technik, aby wykorzystać powyższe (i / lub inne) założenia modelowania, które powinny skutkować znacznie lepszą kompresją w porównaniu z mniej specyficznymi narzędziami.

Tytułem kontekstu to pytanie jest pochodną poprzedniej wersji SO .


Wstępne przemyślenia

Uderza mnie, że ten problem jest doskonałym kandydatem do szkolenia offline i przewiduję skompresowany format danych według następujących zasad:

  • Kod Huffmana „ publicznego przyrostka ”, z prawdopodobieństwem zaczerpniętym z niektórych opublikowanych źródeł rejestracji domen lub natężenia ruchu;

  • Kod Huffmana, którego model (język naturalny) jest stosowany dla pozostałych etykiet U, z prawdopodobieństwami zaczerpniętymi z opublikowanego źródła rejestracji domeny lub natężenia ruchu w kontekście sufiksu domeny;

  • Zastosuj niektóre transformacje słownikowe z określonego modelu języka naturalnego; i

  • Arytmetyczne kodowanie każdego znaku w etykietach U, z prawdopodobieństwami zaczerpniętymi z kontekstowo adaptacyjnych modeli języka naturalnego pochodzących ze szkolenia offline (i być może także online, chociaż podejrzewam, że dane mogą być zbyt krótkie, aby zapewnić jakiś znaczący wgląd?).


4
Być może możesz pobrać listę wszystkich nazw domen i przypisać każdej z nich numer. To byłoby bardzo kompaktowe.

@Dietrich Epp: Rzeczywiście - i rzeczywiście pomyślałem, że być może rejestratorzy mogą opublikować w WHOIS numer seryjny każdej rejestracji, z którego można by niezawodnie zbudować, ale niestety nie. Realistycznie myślę, że praktyczne wyzwania związane z utrzymywaniem takiej bazy danych sprawiają, że jest to niemożliwe: nie wspominając o tym, że takie bazy danych nie obsługują poddomen.
eggyal

... cóż, jeśli liczba jest wystarczająca, po prostu weź 4/6 bajtów adresu ipv4 / 6: /

@arnaud: Odwrócenie jest problemem - zależy od poprawnego wskaźnika .in-addr.arpa; psuje się również, jeśli IP kiedykolwiek się zmieni.
eggyal

1
Metodą Dietricha Eppa (opartą na szacunkowych 196 milionach domen) możesz przechowywać nazwę domeny w 28 bitach (dwa znaki Unicode) i nie możesz tego zrobić lepiej. Oczywiście rozkład prawdopodobieństwa w nazwach domen może dać znacznie lepszą oczekiwaną liczbę bitów. Możesz przynajmniej użyć kodowania arytmetycznego dla 1 miliona najpopularniejszych domen, a resztę zastosować schemat ad hoc.
Peter

Odpowiedzi:


0

Kodowanie Huffmana jest optymalne dla liter i z pewnością może być dostosowane do sekwencji. Na przykład, jeśli sekwencja „ab” daje mniej bitów niż bitów dla „a” i „b”, to po prostu dodaj ją do drzewa ... i tak dalej.

... prawdopodobnie możesz również użyć prostej biblioteki, która robi to wszystko za sprawą prawie optymalnej wydajności, dzięki czemu nie zyskasz wiele dzięki niestandardowemu algorytmowi kompresji.


Myślę, że Huffman nie jest całkiem optymalny (zaokrągla do najbliższego bitu): kodowanie arytmetyczne zawsze powinno być lepsze. I dopóki nie zastosuje się dokładnego modelu kompresowanych danych, zawsze osiąga się nieoptymalne wyniki ... więc jeśli wszystko się liczy, ogólne biblioteki nie mogą wystarczyć.
eggyal

4
Kodowanie Huffmana jest optymalne asymptotycznie, jeśli zignorujesz korelacje między literami (np. Jeśli widzisz a q, to następna litera jest o wiele bardziej prawdopodobna uniż w innym przypadku). Ale to nie jest realistyczne założenie. W praktyce korelacje te są ogromne i umożliwiają znacznie lepsze działanie niż naiwne kodowanie Huffmana w praktyce.
DW

@DW, czy masz jakieś zalecenia, jak można zrobić lepiej? Czy może pomogłoby to w kodowaniu par lub potrój ciągłych znaków za pomocą Huffmana?
ryan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.