使用递归N-Grams压缩文本

时间:2012-01-04 00:02:19

标签: text compression storage n-gram

我只是想通过使用递归的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字的文件)。

2 个答案:

答案 0 :(得分:2)

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

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

  2. 构建digram或trigram字符组合的直方图(包括空格,标点符号等)。然后使用未使用的字节值来编码经常出现的digram或trigrams。您甚至可以使用递归方法一遍又一遍地扫描以减少源文件。

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

    这里有一些字典预处理器,我只想给你一个参考:

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

答案 1 :(得分:1)

简而言之,是的,可能的序列数量可能太大而无法有效地完成此操作。更大的问题是那些字映射和每个映射后的n-gram需要存储在某个地方,这将大大超过实际“压缩”的任何节省。