V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
metalvest
V2EX  ›  问与答

有没有合适的算法把一段文本压缩成更短的文本?

  •  
  •   metalvest · 2023-03-21 13:47:08 +08:00 · 2003 次点击
    这是一个创建于 647 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一般压缩都是压缩成二进制,如果进行 base64 转换则会比原来的文本长,字典算法是可以把文本缩短,但又需要额外的长度保存字典。摘要、提取关键词或者使用同义词替换等方法会损失信息或者改变原来的意思。所以有没有其他的办法?短 url 或者网盘不算。

    9 条回复    2023-03-21 15:25:55 +08:00
    iBugOne
        1
    iBugOne  
       2023-03-21 13:52:28 +08:00
    先压缩再 base64 不就行了
    misdake
        2
    misdake  
       2023-03-21 13:54:22 +08:00
    gzip 再 base64 呗,只要压缩率能抵消掉 base64 增加的那三分之一就行。对于有一定长度的文本内容来说应该很容易。
    Rxianbei
        3
    Rxianbei  
       2023-03-21 13:55:35 +08:00
    emmmm chatgpt 就很适合做文本信息的收集和整理捏
    metalvest
        4
    metalvest  
    OP
       2023-03-21 13:57:40 +08:00
    @iBugOne
    @misdake
    会比原来长,你们试试就知道
    misdake
        5
    misdake  
       2023-03-21 14:02:55 +08:00
    @metalvest 我随便选了这昨天看到的项目的代码文件,https://raw.githubusercontent.com/daafu/sokoban/master/src/game.jai ,用这个工具压缩 https://www.zickty.com/texttogzip/
    输入:10574 字节
    输出:4140 字节
    mercury233
        6
    mercury233  
       2023-03-21 14:16:01 +08:00
    我测试了一下,哈利波特 7 的 txt 版,UTF8 格式是 1159 KB ,GB2312 格式是 778 KB ,UTF8 用 rar5 压缩后是 382 KB ,base64 编码后是 516 KB
    play78
        7
    play78  
       2023-03-21 14:18:47 +08:00
    如果一定要 ascii 码, 那 gzip ,然后 base64. 然后可以参考 base64 ,实现 base85 或 base91 ,https://en.wikipedia.org/wiki/Ascii85
    如果文本支持 utf8 , 那 gzip ,然后 base65535 都可以。[🤪]
    breeza
        8
    breeza  
       2023-03-21 14:24:37 +08:00
    插一嘴,一个好玩的东西: https://snufk.in/blog/silly-compression-text.html
    metalvest
        9
    metalvest  
    OP
       2023-03-21 15:25:55 +08:00
    感谢大家给的思路,在 colab 上分别用 Zstd 和 Brotli 结合 Base65536 试了试,确实可以压得更短。

    看能不能用这个思路省一点 token 来保留 GPT 的记忆?

    ~~~#!pip install zstandard
    #!pip install base65536
    #!pip install brotlicffi
    import brotlicffi
    import zstandard # 用于 zstd 算法
    import base65536 # 用于 Base65536 编码
    text = "一般压缩都是压缩成二进制,如果进行 base64 转换则会比原来的文本长,字典算法是可以把文本缩短,但又需要额外的长度保存字典。摘要、提取关键词或者使用同义词替换等方法会损失信息或者改变原来的意思。所以有没有其他的办法?短 url 或者网盘不算。"
    text_bytes = text.encode("utf-8") # 使用 utf-8 编码
    compressor = zstandard.ZstdCompressor(level=10) # 创建压缩器对象
    #compressed_bytes = compressor.compress(text_bytes) # 压缩文本字节
    compressed_bytes = brotlicffi.compress(text_bytes)
    encoded_text = base65536.encode(compressed_bytes) # 编码压缩字节
    print(f"原始文本长度:{len(text)}")
    print(f"编码后文本长度:{len(encoded_text)}")
    if len(text) > len(encoded_text):
    print("编码后文本比原始文本短")
    elif len(text) < len(encoded_text):
    print("编码后文本比原始文本长")
    else:
    print("编码后文本和原始文本一样长")~~~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2800 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 02:54 · PVG 10:54 · LAX 18:54 · JFK 21:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.