6

圧縮された多数のファイル (.txt) でテキストを検索できる必要があります。圧縮は別のものに変更されるか、独自のものになることさえあります。すべてのファイルを解凍することを避け、検索文字列を圧縮 (エンコード) し、圧縮されたファイルで検索したい。これは、すべてのファイルに対して同じコードブックでハフマン圧縮を使用することで可能になるはずです。私は車輪を再発明したくないので..誰かがこのようなことを行うライブラリや、実装およびテストされたハフマンアルゴリズム、あるいはより良いアイデアを知っていますか?

前もって感謝します

4

5 に答える 5

9

ほとんどのテキストファイルは、辞書コーダーとハフマンなどのエントロピーコーダーを組み合わせたLZファミリーのアルゴリズムの1つで圧縮されています。

ディクショナリコーダは継続的に更新される「ディクショナリ」に依存しているため、そのコーディング結果は履歴(現在のシンボルまでの入力データから派生したディクショナリ内のすべてのコード)に依存するため、ジャンプすることはできません。最初に前のすべてのデータをデコードせずに、特定の場所でデコードを開始します。

私の意見では、ファイル全体が解凍されるのを待たずに、解凍されたデータをそのまま返すzlibストリームデコーダーを使用できます。これは実行時間を節約しませんが、メモリを節約します。

2番目の提案は、英語の単語でハフマンコーディングを行い、辞書コーダーの部分を忘れることです。各英語の単語は、一意のプレフィックスなしのコードにマッピングされます。

最後に、@ SHODANは最も賢明な提案をしました。それは、ファイルにインデックスを付け、インデックスを圧縮し、圧縮されたテキストファイルとバンドルすることです。検索を行うには、インデックスファイルだけを解凍して単語を検索します。これは実際、単語に対してハフマン符号化を行うよりも改善されています-単語の頻度を見つけたら(プレフィックスコードを最適に割り当てるために)、すでにインデックスを作成しているので、検索用にインデックスを保持できます。

于 2011-04-06T06:51:56.680 に答える
5

圧縮ファイル内のテキストの検索は、圧縮されていないテキスト ファイル内の同じものを検索するよりも高速です。

高速検索を行うためにスペースを犠牲にする、私が見た圧縮技術の 1 つ:

  • テキスト内のすべての単語の 2^16 エントリを含む辞書を維持します。辞書にない単語に出くわした場合に備えて、最初の 256 エントリをリテラル バイト用に予約します。ただし、多くの大きなテキストの一意の単語は 32,000 未満であるため、これらのリテラル バイトを使用する必要はありません。
  • 各単語を 16 ビットの辞書インデックスに置き換えて、元のテキストを圧縮します。
  • (オプション) 2 つの単語が 1 つの空白文字で区切られている通常の場合、その空白文字を破棄します。それ以外の場合は、単語間の文字列内のすべてのバイトを、「デフォルト スペースなし」属性でタグ付けされた特別な「単語」(たとえば、「.」および「」、「」および「\n」)として辞書に入れ、次に「compress " それらの文字列を、対応する辞書のインデックスに置き換えることによって。
  • 同じ方法でフレーズを圧縮し、元のテキストで元の文字列を検索するのとまったく同じ方法で、圧縮されたテキストで圧縮されたバイトの文字列を検索して、単語またはフレーズを検索します。

特に、単一の単語の検索は、通常、圧縮されたテキストの 16 ビット インデックスを比較するだけで済みます。これは、元のテキストでその単語を検索するよりも高速です。

  • 各比較では、比較する必要があるバイト数が少なくなります -- 2 ではなく、その単語に多くのバイトがありました。
  • 圧縮ファイルの方が短いため、比較の回数が少なくなります。

一部の正規表現は、圧縮ファイル内のアイテムを直接検索する別の正規表現に変換できます (また、いくつかの誤検知も検出される可能性があります)。このような検索では、元のテキスト ファイルに対して元の正規表現を使用する場合よりも比較の回数が少なくなります。これは、圧縮ファイルの方が短いためです。ただし、通常、各正規表現の比較にはより多くの作業が必要です。元のテキスト。

(原則として、rwong が述べたように、固定長の 16 ビット コードを可変長のハフマン プレフィックス コードに置き換えることができます。結果として得られる圧縮ファイルは小さくなりますが、それらのファイルを処理するソフトウェアは少し遅くなります。複雑)。

より高度なテクニックについては、以下を参照してください。

于 2011-07-22T21:17:06.367 に答える
3

圧縮ファイル内の圧縮されていない文字列を検索できる可能性はほとんどありません。最善の選択肢の 1 つは、何らかの方法でファイルにインデックスを付けることだと思います。おそらくLuceneを使用していますか?

于 2011-04-06T06:42:36.393 に答える
2

ここでは完全に間違っているかもしれませんが、ファイルをデコードせずに特定の文字列を検索する信頼できる方法はないと思います。圧縮アルゴリズムに関する私の理解では、特定の文字列に対応するビットストリームは、圧縮されていないファイルの文字列の前にあるものに大きく依存します。特定のファイル内の特定の文字列の特定のエンコーディングを見つけることができるかもしれませんが、ファイル間で一貫性がないと確信しています。

于 2011-04-06T06:40:31.747 に答える