问题描述
我正在尝试压缩短字符串(最多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
你现在知道我做错了什么吗,或者我怎样才能更有效地做到这一点?
[1]:https://arxiv.org/pdf/cs/0312044.pdf
推荐答案
查看这些用于压缩短字符串的库:
https://github.com/siara-cc/unishox:
Unishox是一种混合编码器(熵、字典和增量编码)。它的工作方式是为95个字母的可打印字符集中的每个字母分配固定的无前缀代码(熵编码)。它分别对重复的字母集进行编码(词典编码)。对于Unicode字符(UTF-8),使用增量编码。它还具有用于重复大写和数字键盘字符的特殊处理。
Unishox是为了节省嵌入式设备中的内存并压缩数据库中存储的字符串而开发的。它在许多项目中使用,并对Sqlite数据库进行了扩展。虽然它比其他可用库慢,但它很适合给定的应用程序。https://github.com/antirez/smaz:
SMAZ是由萨尔瓦多·桑菲利波开发的,它通过使用码本替换部分字符串来压缩字符串。据我所知,这是第一个可用于压缩短字符串的方法。
https://github.com/Ed-von-Schleck/shoco:
令人震惊是克里斯蒂安·施拉姆写的。它是一个熵编码器,因为字符表示的长度由在给定输入字符串中遇到该字符的概率决定。
它有一个用于英语的默认模型,并提供了根据给定示例文本训练新模型的规定。
PS:Unishox是我自己开发的,其工作原理在this article:
中解释