短字符串的压缩

Joh*_*owk 6 python compression zlib julia

我正在尝试压缩短字符串(最多 15 个字符)。

目标是实现“标准化压缩距离”[1],我在 python 中尝试了一些压缩算法(我还想看看是否可以在 Julia 中做到这一点,但包都拒绝安装)。我最终总是得到比我试图压缩的原始字符串更长的位字符串,这完全违背了目的。

zlib 的示例:

import zlib
data = b"this is a test"

compressed_data = zlib.compress(data, 9)
print(len(data))
print(len(compressed_data))
Run Code Online (Sandbox Code Playgroud)

返回:

13
21
Run Code Online (Sandbox Code Playgroud)

你现在知道我做错了什么,或者我怎样才能更有效地做到这一点?

[1]:https://arxiv.org/pdf/cs/0312044.pdf

aru*_*run 6

查看这些用于压缩短字符串的库:

https://github.com/siara-cc/unishox

Unishox是一种混合编码器(熵、字典和增量编码)。它的工作原理是为 95 个字母的可打印字符集的每个字母分配固定的无前缀代码(熵编码)。它单独对重复字母集进行编码(字典编码)。对于 Unicode 字符 (UTF-8),使用增量编码。它还对重复大写和数字键盘字符进行特殊处理。

Unishox 的开发目的是节省嵌入式设备的内存并压缩数据库中存储的字符串。它在许多项目中都有使用,并且具有 Sqlite 数据库的扩展。尽管它比其他可用的库慢,但它对于给定的应用程序运行良好。

https://github.com/antirez/smaz

Smaz由 Salvatore Sanfilipo 开发,它通过使用密码本替换部分字符串来压缩字符串。据我所知,这是第一个可用于压缩短字符串的方法。

https://github.com/Ed-von-Schleck/shoco

shoco是由 Christian Schramm 编写的。它是一个熵编码器,因为字符表示的长度是由在给定输入字符串中遇到该字符的概率决定的。

它有一个默认的英语模型,并可以根据给定的示例文本训练新模型。

PS:Unishox是我开发的,其工作原理在这篇文章中解释:


Bil*_*ill 1

根据您的参考,Zlib 添加的额外开销可能并不重要。\n该文章将 NCD 定义为 (C(x*y) \xe2\x88\x92 min(C(x),C(y))) / max(C(x),C(y)),其中使用您的C 的 zlib 压缩:

\n\n
C(x) = length(zlib.compress(x, 9))\n\nNCD(x,y) = (C(x*y) \xe2\x88\x92 min(C(x),C(y))) / max(C(x),C(y))\n
Run Code Online (Sandbox Code Playgroud)\n\n

只要 Zlib 仅添加恒定的开销,NCD 的分子\n就不应该改变,而妖母应该只改变少量。\n您可以添加一个校正因子,如下所示:

\n\n

C(x) = 长度(zlib.compress(x, 9)) - 长度(zlib.compress("a", 9)) + 1

\n\n

这可能会消除非传染性疾病分母的剩余问题。

\n