Стиснення доменних імен


21

Мені цікаво, як можна дуже компактно стиснути домен довільного імені хоста IDN (як визначено RFC5890 ) і підозрювати, що це може стати цікавою проблемою. Ім'я хоста або доменного імені Unicode (U-label) складається з рядка символів Unicode, як правило, обмежених однією мовою залежно від домену верхнього рівня (наприклад, грецькі літери під .gr), кодованого у рядок ASCII, починаючи з xn--(відповідний A-label).

Можна будувати моделі даних не лише з формальних вимог, які цього вимагають

  • кожна метка, яка не є Unicode, повинна відповідати рядку ^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?$;

  • кожна A-мітка має відповідати рядок ^xn--[a-z\d]([a-z\d\-]{0,57}[a-z\d])?$; і

  • загальна довжина всього домену (A-мітки та не-IDN-мітки, з'єднані з '.' роздільниками), не повинна перевищувати 255 символів

а також з різних евристик, зокрема:

  • U-мітки нижнього порядку часто є лексично, синтаксично та семантично дійсними словосполученнями на якійсь природній мові, включаючи власні іменники та числівники (без знаків, за винятком дефісів, позбавлених пробілів та складених на Nameprep ), з перевагою коротших фраз; і

  • Мітки вищого порядку витягуються зі словника SLD та TLD та забезпечують контекст для прогнозування того, яка натуральна мова використовується в мітках нижчого порядку.

Я побоююсь, що досягти хорошого стиснення таких коротких рядків буде складно без врахування цих специфічних особливостей даних і, крім того, що існуючі бібліотеки створюватимуть непотрібні накладні витрати, щоб пристосувати їх більш загальні випадки використання.

Онлайн читання книги Метта Махоні в Стиснення даних Роз'яснення , то ясно , що ряд існуючих методів може бути використаний , щоб скористатися вище (і / або інших) моделювання припущень , які повинні привести до значно перевершує стиснення по порівнянні з менш специфічними інструментами.

З точки зору контексту, це питання є відхиленням від попереднього запитання про SO .


Початкові думки

Мене вражає, що ця проблема є прекрасним кандидатом для навчання в режимі офлайн, і я передбачаю стислий формат даних у наступних рядках:

  • Хаффман, що кодує " загальнодоступний суфікс ", з ймовірностями, отриманими з якогось опублікованого джерела реєстрації домену або обсягів трафіку;

  • Хаффман, кодування якої (мова натуральної мови) використовується для решти U-міток, з ймовірністю, отриманими з якогось опублікованого джерела реєстрації домену або обсягів трафіку з урахуванням контексту суфіксу домену;

  • Застосовувати деякі перетворення на основі словника із заданої моделі природної мови; і

  • Арифметичне кодування кожного символу на U-мітках, з ймовірностями, отриманими з контекстно адаптивних моделей природної мови, отриманих з офлайн-тренувань (а можливо, і в Інтернеті, хоча я підозрюю, що дані можуть бути занадто короткими, щоб забезпечити будь-яке змістовне розуміння?).


4
Можливо, ви можете завантажити список усіх доменних імен і призначити кожному з них номер. Це було б дуже компактно.

@Dietrich Epp: Дійсно - і насправді я думав, що, можливо, реєстратори можуть опублікувати в WHOIS серійний номер кожної реєстрації, з якого це можна було б надійно побудувати, але, на жаль, вони цього не роблять. Реально, я думаю, що практичні проблеми при підтримці такої бази даних роблять її нездійсненною: не кажучи вже про те, що такі бази даних не обробляють субдомени.
eggyal

... ну, якщо кількість достатня, просто візьміть 4/6 байт адреси ipv4 / 6: /

@arnaud: Повернення це проблема - покладається на правильний вказівник .in-addr.arpa; також порушується, якщо IP колись змінюється.
eggyal

1
Методом Дітріха Еппа (на основі оцінок 196м доменів) ви можете зберігати доменне ім’я в 28 біт (два символи unicode), і ви не можете зробити кращого. Звичайно, розподіл ймовірностей щодо доменних імен може дати вам набагато кращу очікувану кількість біт. Ви можете принаймні використовувати арифметичне кодування для 1 мільйона найпопулярніших доменів, а для решти використовувати якусь спеціальну схему.
Пітер

Відповіді:


0

Кодування Хаффмана є оптимальним для букв і, безумовно, може бути адаптоване до послідовностей. Наприклад, якщо послідовність "ab" призводить до меншої кількості бітів, ніж біт для "a" і "b", просто додайте її до дерева ... і так далі.

... ви, ймовірно, також можете використовувати просту бібліотеку, яка робить це все для вас з майже оптимальними характеристиками, так що ви не отримаєте багато, використовуючи на замовлений супер фантазійний алгоритм стиснення.


Я вважаю, що Хаффман не зовсім оптимальний (він обходить найближчий біт): арифметичне кодування завжди повинно перевершувати. І якщо не застосовувати точну модель стиснення даних, завжди буде досягнуто неоптимальних результатів ... тому, якщо кожен біт має значення, загальних бібліотек не може бути достатньо.
eggyal

4
Кодування Хаффмана є асимптотично оптимальним, якщо ви ігноруєте кореляції між літерами (наприклад, якщо ви бачите qбукву a , то наступний лист є набагато більшим, uніж це було б інакше). Але це не реалістичне припущення. На практиці ці кореляції величезні і дозволяють зробити набагато краще, ніж наївне кодування Хаффмана на практиці.
DW

@DW Чи є у вас якісь рекомендації, як можна зробити краще? Чи може це допомогти дозволити кодування пар або трійки суміжних символів через Хаффмана?
ryan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.