【问题标题】:Compressing text using recursive N-Grams使用递归 N-Gram 压缩文本
【发布时间】:2012-01-04 00:02:18
【问题描述】:

我只是想通过使用递归 2-Gram 存储将一大组文本分解为一个整数,直到只剩下一个值。

table pair
{
    id
    first_parent_id (points to -> this.id)
    second_parent_id (points to -> this.id)
}

例如,在下面的代码中,我有一个 11 个单词的句子(12 个带有句点)。我可以将每个单词对存储在数据库中(“this”+“is”= ID #1),然后将每组两个单词对存储在数据库中(1 + 2 = ID #7),然后重复直到我开始只剩下一个单词——ID 12。

This is my group of words which I plan to compress.
---1---|--2-----|--3-----|-----4-|----5--|-------6-
-------7--------|--------8-------|-------9---------
----------------10---------------11----------------
------------------------12-------------------------

然后使用数字“12”我们可以向后工作(如果我们有相同的数据集)

------------------------12-------------------------
----------------10---------------11----------------
-------7--------|--------8-------|-------9---------
---1---|--2-----|--3-----|-----4-|----5--|-------6-
This is my group of words which I plan to compress.

虽然压缩/解压缩每个字符串需要大量工作 - 似乎它可能在需要存储内容的某种归档工作中使用 - 但除非在极少数情况下,否则永远不会读取解压过程没有问题。

我是否正确地考虑了这一点?可能的单词序列数量是否太大而无法像这样存储? (想象一个 500 字的文档)。

【问题讨论】:

    标签: text compression storage n-gram


    【解决方案1】:

    为什么需要“digram words”来实现压缩?如果这不是严格要求,则有多种方法可以压缩具有不同场景的文本数据。这些大多被称为字典预处理。以下是可以应用于您的案例的列表:

    1. 统计单词出现次数并按频率降序排列。您可以使用自定义编码方法使用前 N 个单词,其中 N 可由用户配置。您甚至可以使用动态编程等来优化 N。在实际编码时,编码一个标志来指示下一个符号是字典词还是直接编码的词。

    2. 构建二元或三元字符组合(包括空格、标点符号等)的直方图。然后使用未使用的字节值来编码那些经常看到的二元组或三元组。您甚至可以使用递归方法一遍又一遍地扫描以减少源文件。

    在您的情况下,如果您考虑上述方法,则效率低下。因为,您似乎并不认为您需要一个非常大的数据来解码您的编码数据。要了解大多数压缩思想,最好编写一个非常简单的测试程序来分析它的输出。你最终会得到一个更强大、更稳定的算法。

    以下是我想到的一些字典预处理器,仅供参考:

    1. XWRT:最先进的字典预处理器之一。
    2. DICT:高性能 FreeArc 归档器的预处理器(它是开源的)。有一个关于它的article。很遗憾,它是俄语的。
    3. KWC:一个简单的测试字典预处理器,它用字典代码替换 6 克代码。关注here 进行讨论。
    4. bpe2 V3:它基于 n-gram 替换。其他版本:V1V2。此外,还有一个关于它的discussion

    【讨论】:

      【解决方案2】:

      简而言之,是的,可能的序列数量可能太多而无法有效地做到这一点。更大的问题是,这些单词映射以及每个映射之后的 n-gram 需要存储在某个地方,这将大大超过实际“压缩”所节省的成本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-23
        • 2011-05-30
        • 2012-01-02
        • 1970-01-01
        • 2018-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多