域名压缩


21

我对如何紧凑压缩任意IDN主机名(由RFC5890定义)的域感到好奇,并怀疑这可能会成为一个有趣的挑战。Unicode主机或域名(U标签)由一串Unicode字符组成,通常取决于顶级域名(例如,下的希腊字母.gr),被限制为一种语言,该Unicode字符被编码为以xn--(一个标签)。

人们不仅可以根据以下正式要求来建立数据模型:

  • 每个非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的字典中​​提取的,并为预测低阶标签中使用哪种自然语言提供了上下文。

我担心,如果不考虑数据的这些特定特征,很难对这样的短字符串进行良好的压缩,此外,现有的库将产生不必要的开销,以适应其更一般的用例。

阅读Matt Mahoney的在线书《Data Compression Explained》,很显然,可以利用许多现有技术来利用上述(和/或其他)建模假设,与不那么具体的工具相比,它们应该带来更好的压缩效果。

就上下文而言,此问题是SO上一个问题的分支。


最初的想法

令我惊讶的是,这个问题是脱机培训的绝佳选择,我设想了以下几行的压缩数据格式:

  • 霍夫曼编码的“ 公共后缀 ”,其概率来自域名注册或流量的某些公开来源;

  • 其余的U标签使用霍夫曼编码(自然语言)模型,并从给定的域后缀上下文中某些已发布的域注册或业务量来源中提取概率;

  • 应用来自指定自然语言模型的一些基于字典的转换;和

  • U标签中每个字符的算术编码,其概率来自脱机训练(甚至可能是在线,但我怀疑数据可能太短而无法提供任何有意义的见解?)的上下文自适应自然语言模型。


4
也许您可以下载所有域名的列表,然后为每个域名分配一个数字。这将非常紧凑。

@Dietrich Epp:确实-实际上,我曾想过,注册服务商可能会在WHOIS中发布每个注册的序列号,从而可以可靠地建立每个注册的序列号,但可惜他们没有。实际上,我认为维护此类数据库的实际挑战使其不可行:更不用说此类数据库不处理子域。
eggyal 2011年

...好吧,如果一个数字足够,请取ipv4 / 6地址的4/6字节:/

@arnaud:扭转它是一个问题-依赖于正确的指针.in-addr.arpa;如果IP更改,也会中断。
eggyal

1
通过Dietrich Epp的方法(基于估计的196m个域),您可以将域名存储为28位(两个Unicode字符),并且您做不到更好。当然,域名的概率分布可以为您提供更好的预期位数。您至少可以对100万个最流行的域使用算术编码,而对其余域使用一些即席方案。
彼得,

Answers:


0

霍夫曼编码最适合字母,当然可以适应序列。例如,如果序列“ ab”产生的位数少于“ a”和“ b”的位数,则只需将其添加到树上,依此类推。

...您可能还可以使用一些简单的库,以几乎最佳的性能为您完成所有这些工作,因此使用定制的超豪华压缩算法不会带来太大收益。


我认为霍夫曼并不是一个最佳选择(它四舍五入到最接近的位):算术编码应始终表现出色。而且,除非人们对被压缩的数据应用准确的模型,否则人们总是会获得次优的结果……因此,如果每一点都很重要,那么通用库就无法满足需求。
eggyal

4
如果您忽略字母之间的相关性(例如,如果看到q,则霍夫曼编码是渐近最优的(例如,如果看到a ,则下一个字母u比原本的字母更有可能是a ))。但这不是一个现实的假设。在实践中,这些相关性很大,并且比实际的朴素霍夫曼编码要好得多。
DW

@DW您对如何做得更好有什么建议?允许通过霍夫曼编码成对或三对连续字符是否有帮助?
瑞安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.