我正在尝试压缩短字符串(最多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))
哪个返回:
13
21
您现在是我做错了吗,还是我可以更有效地做到这一点?
答案 0 :(得分:1)
根据您的参考,Zlib添加的额外开销可能并不重要。 该文章将NCD定义为(C(x * y)-min(C(x),C(y)))/ max(C(x),C(y)),其中将zlib压缩用于C:< / p>
C(x) = length(zlib.compress(x, 9))
NCD(x,y) = (C(x*y) − min(C(x),C(y))) / max(C(x),C(y))
只要Zlib仅增加恒定开销的NCD分子 不应更改,并且指示符仅应进行少量更改。 您可以添加如下校正因子:
C(x)=长度(zlib.compress(x,9))-长度(zlib.compress(“ a”,9))+1
这可以消除与NCD分母有关的其余问题。
答案 1 :(得分:1)
检查这些库以压缩短字符串:
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是我开发的,其工作原理在this article中进行了解释:
答案 2 :(得分:0)
DEFLATE算法使用32kb压缩字典对数据进行重复数据删除。默认情况下,它将根据您提供的数据构建此字典。 如果使用短字符串,它将无法建立像样的压缩字典,因此将无法有效压缩,而元数据开销会增加压缩结果的大小。
一种解决方案是使用带有重复模式样本的预设字典。 这个问题处理相同的问题:Reusing compression dictionary
您可以使用我的dicflate实用程序对带有和不带有预设字典的短字符串和长字符串进行DEFLATE压缩实验:dicflate