2012-01-04 86 views
2

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

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

例如,在下面的代码中,我有一个11个字的句子(十二个句号)。我可以将每个单词对存储在数据库中(“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. 

尽管这将花费大量的工作来压缩/解压缩每个字符串 - 它似乎可能用于某种需要存储内容的存档工作 - 但除非在极少数情况下解压缩过程不是Pro blem。

我在想这个吗?单词序列的可能数量是否太大而不能存储? (想象一下500字的文档)。

回答

2

为什么你需要“digram words”来达到压缩?如果这不是一个严格的要求,有不同的方法来压缩具有不同scenerio的文本数据。这些通常称为字典预处理。这里是一个列表,可以在你的情况下应用:

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

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

就您而言,如果您考虑上述方法,效率会很低。因为,似乎你没有考虑到你需要一个非常大的数据来解码你的编码数据。要理解大部分压缩思想,最好编写一个非常简单的测试程序来分析它的输出。最终你会得到更强大和稳定的算法。

这里是一个进入我脑海的只是给大家一个参考一些字典预处理器:

  1. XWRT:一个艺术词典预处理器的状态。
  2. DICT:高性能预处理器FreeArc archiver(它是开源的)。有关于它的article。不幸的是,这是俄语。
  3. KWC:一个简单的测试字典预处理器,用字典代码替换6克代码。讨论请看here
  4. bpe2 V3:它基于n-gram替换。其他版本:V1,V2。另外,有关于它的discussion
1

简而言之,是的,可能的序列数量可能太高,不能有效地做到这一点。更大的问题是那些字映射和每个这些映射之后的n-gram将需要存储在某个地方,这将远远超过实际“压缩”的任何节省。