我只是想通过使用递归的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字的文件)。
答案 0 :(得分:2)
为什么你需要“digram words”来实现压缩?如果这不是严格要求,则有各种方法来压缩具有不同场景的文本数据。这些大多称为字典预处理。这是一个可以在您的案例中应用的列表:
计算单词出现次数,并按降序排列频率。您可以使用自定义编码方法使用前N个单词,其中N可由用户配置。您甚至可以使用动态编程等优化N.在实际编码时,编码一个标志以指示下一个符号是字典单词还是直接编码单词。
构建digram或trigram字符组合的直方图(包括空格,标点符号等)。然后使用未使用的字节值来编码经常出现的digram或trigrams。您甚至可以使用递归方法一遍又一遍地扫描以减少源文件。
在您的情况下,如果考虑上述方法,效率会很低。因为,您似乎并不认为需要非常大的数据来解码编码数据。要理解大多数压缩思想,最好编写一个非常简单的测试程序来分析它的输出。最终你会得到一个更强大,更稳定的算法。
这里有一些字典预处理器,我只想给你一个参考:
答案 1 :(得分:1)
简而言之,是的,可能的序列数量可能太大而无法有效地完成此操作。更大的问题是那些字映射和每个映射后的n-gram需要存储在某个地方,这将大大超过实际“压缩”的任何节省。