2012-01-04 35 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將需要存儲在某個地方,這將遠遠超過實際「壓縮」的任何節省。