[実施の形態1]
(情報検索装置のハードウェア構成)
まず、実施の形態1にかかる情報検索装置のハードウェア構成について説明する。図1は、実施の形態1にかかる情報検索装置のハードウェア構成を示すブロック図である。
図1において、情報検索装置は、CPU(Central Processing Unit)101と、ROM(Read―Only Memory)102と、RAM(Random Access Memory)103と、HDD(ハードディスクドライブ)104と、HD(ハードディスク)105と、FDD(フレキシブルディスクドライブ)106と、着脱可能な記録媒体の一例としてのFD(フレキシブルディスク)107と、ディスプレイ108と、I/F(インターフェース)109と、キーボード110と、マウス111と、スキャナ112と、プリンタ113と、を備えている。また、各構成部はバス100によってそれぞれ接続されている。
ここで、CPU101は、情報検索装置の全体の制御を司る。ROM102は、ブートプログラムなどのプログラムを記憶している。RAM103は、CPU101のワークエリアとして使用される。HDD104は、CPU101の制御にしたがってHD105に対するデータのリード/ライトを制御する。HD105は、HDD104の制御で書き込まれたデータを記憶する。
FDD106は、CPU101の制御にしたがってFD107に対するデータのリード/ライトを制御する。FD107は、FDD106の制御で書き込まれたデータを記憶したり、FD107に記憶されたデータを情報検索装置に読み取らせたりする。
また、着脱可能な記録媒体として、FD107のほか、CD−ROM(CD−R、CD−RW)、MO、DVD(Digital Versatile Disk)、メモリーカードなどであってもよい。ディスプレイ108は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ108は、たとえば、CRT、TFT液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
I/F109は、通信回線を通じてインターネットなどのネットワーク114に接続され、このネットワーク114を介して他の装置に接続される。そして、I/F109は、ネットワーク114と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F109には、たとえばモデムやLANアダプタなどを採用することができる。
キーボード110は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス111は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
スキャナ112は、画像を光学的に読み取り、情報検索装置内に画像データを取り込む。なお、スキャナ112は、OCR機能を持たせてもよい。また、プリンタ113は、画像データや文書データを印刷する。プリンタ113には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
(情報検索装置の機能的構成)
つぎに、実施の形態1にかかる情報検索装置の機能的構成について説明する。図2は、実施の形態1にかかる情報検索装置200の機能的構成を示すブロック図である。図2において、情報検索装置200は、編集部201と検索処理部202とから構成されている。
まず、編集部201は、コンテンツ210と、見出しデータ生成部211と、文字出現頻度管理データ生成部212と、圧縮/暗号化部213と、から構成されている。コンテンツ210は検索対象となる電子データであり、たとえば、国語辞典、英和辞典、和英辞典、用語辞典などの辞書のコンテンツが挙げられる。
コンテンツ210は、複数の検索対象ファイルから構成される。コンテンツ210が辞書のコンテンツである場合、各検索対象ファイルは、たとえば、8ビットコード、16ビットコード、または32ビットコードなどの複数種類のビットコードの文字データが記述されている本文HTML(HyperText Markup Language)ファイルである。
また、文字データとしては、8ビット系(ASCII(American Standard Code for Information Interchange))である英数字、カタカナ、記号などの文字データ、16ビット系(JIS)の英数字、カタカナ、記号などの文字データ、16ビット系(JIS)の仮名や漢字の文字データが含まれている。これら英数字や、仮名、カタカナなどの8ビットコードが中心である表音文字および漢字の文字データを、本明細書において「標準文字データ」と称す。
また、文字データには、標準文字データのほか、外字データ、連字データが含まれる。連字データとは、2以上の文字列からなる文字データである。たとえば、16ビットの2つの仮名の連字データである場合、当該連字データは、32ビットコードの文字データからなる。また、非文字データではあるがアドレスポインタなどのバイナリデータも便宜的に上記「文字データ」に含めることとする。以下、特に断りがない限り、「文字データ」という用語には、バイナリデータも含まれる。
また、見出しデータ生成部211は、コンテンツ210内、すなわち複数の検索対象ファイルに記述されている単語や用語などの文字列に関する見出しデータ300を生成する。文字出現頻度管理データ生成部212は、コンテンツ210から、複数の検索対象ファイルに記述されている文字データの出現頻度に関する文字出現頻度管理データ230を生成する。さらに、文字出現頻度管理データ生成部212は、複数の検索対象ファイルに記述されている連字データを外字データに置換する連字/外字置換テーブル240を生成する。
また、圧縮/暗号化部213は、コンテンツ210を圧縮して圧縮コンテンツ250を生成する。また、文字出現頻度管理データ230を圧縮/暗号化して、暗号化圧縮文字出現頻度管理データ260を生成する。さらに、連字/外字置換テーブル240を暗号化して、暗号化連字/外字置換テーブル270を生成する。
また、検索処理部202は、検索初期化部221と、全文検索部222と、検索結果表示部223とから構成されている。検索初期化部221は、圧縮情報である暗号化圧縮文字出現頻度管理データ260および暗号化連字/外字置換テーブル270を復号して、全文検索部222による検索の初期化を実行する。
また、全文検索部222は、検索キーワードの入力を受け付け、文字出現頻度管理データ230、連字/外字置換テーブル240、および見出しデータ300を用いて、圧縮コンテンツ250の全文検索を実行して、検索候補一覧を生成する。検索結果表示部223は、全文検索部222による検索候補の中から、ユーザに選択された検索候補を伸長して、検索結果として表示する。
なお、上述したコンテンツ210、見出しデータ300、文字出現頻度管理データ230、連字/外字置換テーブル240、圧縮コンテンツ250、暗号化圧縮文字出現頻度管理データ260および暗号化連字/外字置換テーブル270は、具体的には、たとえば、図1に示したROM102、RAM103、HD105などの記録媒体によって、その機能を実現する。また、編集部201(内部の機能的構成含む)および検索処理部202(内部の機能的構成含む)は、具体的には、たとえば、図1に示したROM102、RAM103、HD105などの記録媒体に記録されたプログラムを、CPU101が実行することによって、その機能を実現する。
(見出しデータ生成部211の機能的構成)
つぎに、図2に示した見出しデータ生成部211の詳細な機能的構成について説明する。図3は、見出しデータ生成部211の詳細な機能的構成を示すブロック図である。図3において、見出しデータ生成部211は、ファイル抽出部301と、本文HTMLリスト生成部302と、アンカー抽出部303と、見出し語抽出部304と、見出しデータ生成処理部305と、から構成されている。
ファイル抽出部301は、コンテンツ210から各検索対象ファイルである本文HTMLファイルを抽出する。本文HTMLリスト生成部302は、ファイル抽出部301によって抽出された各本文HTMLファイルから、複数の項目データからなる本文HTMLリストを生成する。また、アンカー抽出部303は、本文HTMLリスト生成部302によって生成された本文HTMLリストの各項目データからアンカーを抽出する。
また、見出し語抽出部304は、本文HTMLリスト生成部302によって生成された本文HTMLリストの各項目データから見出し語を抽出する。また、見出しデータ生成処理部305は、アンカー抽出部303によって抽出された各項目データのアンカーと、見出し語抽出部304によって抽出された各項目データの見出し語と、を対応付けて、全文検索に用いる見出しデータ300を生成する。
つぎに、見出しデータ生成部211によって生成されるデータについて詳細に説明する。図4は、本文HTMLリストの一例を示す説明図であり、図5は、本文HTMLファイルのファイル構成データ500を示す説明図であり、図6は、見出しデータ300を示す説明図である。
まず、図4において、コンテンツフォルダ400(フォルダ名:honmon)は、先頭の本文HTMLファイルf0(ファイル名:file0.html)から最終の本文HTMLファイルfn(ファイル名:filen.html)までの本文HTMLファイルfを、コンテンツ210として格納している。
各本文HTMLファイルf0〜fnには、アンカー、見出し語およびその解説文からなる項目データが複数記述されている。アンカーはアンカー抽出部303によって抽出され、見出し語は見出し語抽出部304によって抽出される。
本文HTMLリスト生成部302では、各本文HTMLファイルf0〜fnに記述されている項目データを抽出し、各項目データK1〜Kkを結合することにより、本文HTMLリスト410が生成される。本文HTMLリスト410において、任意の項目データKiは、いずれかの本文HTMLファイルに記述されている項目データである。なお、項目データKiにおいて、アンカーKi−1は、『ai101』であり、見出し語Ki−2は、『アイ−アイ[aye aye]』である。なお、符号Ki−3は、解説文である。
また、図5において、ファイル構成データ500は、各本文HTMLファイルf0〜fnのファイル番号(符号501)と、図4に示した各本文HTMLファイルf0〜fnのファイルパス(符号502)と、が関連付けられたデータである。ここで、ファイル番号は、本文HTMLファイルfに付されている数字に該当し、たとえば、本文HTMLファイルf0の場合、『#0』がファイル番号に相当する。また、コンテンツフォルダ400のフォルダ名は『honmon』であり、本文HTMLファイルf0のファイル名は、『file0.html』であるため、ファイル番号#0である本文HTMLファイルf0のファイルパスは、『honmon¥file0.html』となる。
また、図6において、見出しデータ300は、本文HTMLファイルの総ファイル数情報(n+1個)601、本文HTMLファイルf0〜fnの総ブロックサイズ情報602、本文HTMLリスト410の総項目データ数情報(K個)603、各本文HTMLファイルf0〜fnのファイルパスリスト604、および見出しリスト605から構成されている。
ファイルパスリスト604は、本文HTMLファイルf0〜fnごとに、ファイル番号と、ブロック数と、ファイルパスが記述されているリストである。また、見出しリスト605は、本文HTMLファイルf0〜fnごとに、ファイル番号と、オフセット値と、レングスと、アンカー(名)と、見出し語が記述されているリストである。
(文字出現頻度管理データ生成部212の機能的構成)
つぎに、図2に示した文字出現頻度管理データ生成部212の詳細な機能的構成について説明する。図7は、文字出現頻度管理データ生成部212の詳細な機能的構成を示すブロック図である。図7において、文字出現頻度管理データ生成部212は、文字データ抽出部701と、文字出現頻度集計部702と、ソート部703と、生成処理部704とから構成されている。
文字データ抽出部701は、コンテンツ210の各本文HTMLファイルから文字データを順次抽出する。文字出現頻度集計部702は、文字データ抽出部701によって抽出された文字データのコンテンツ210における出現頻度を集計する。出現頻度とは、たとえば、文字データの出現回数や出現率であらわされる。また、文字出現頻度集計部702は、文字データの本文HTMLファイルf0〜fnごとの存否も検出する。
また、ソート部703は、出現頻度順に文字データをソートする。生成処理部704は、ソートされた各文字データの出現頻度と、存否検出結果である各文字データの存否情報(以下、「出現マップ」)とを用いて、文字出現頻度管理データ230を生成する。また、連字/外字置換テーブル240も生成する。文字出現頻度管理データ生成部212による文字出現頻度管理データ230および連字/外字置換テーブル240の生成処理を具体的に説明する。
図8は、文字出現頻度管理データ230の生成処理を示すデータ構成図である。図8において、(A)は、文字出現頻度集計部702によって文字データが集計されたときの文字出現頻度管理データ230のデータ構成、(B)は、連字/外字置換処理後の文字出現頻度管理データ230のデータ構成、(C)は、標準文字データおよび外字データからなる混合データのソート後における文字出現頻度管理データ230のデータ構成、(D)は、低出現頻度の混合データのカット後における文字出現頻度管理データ230のデータ構成、(E)は、最終的に生成された文字出現頻度管理データ230のデータ構成を示している。
(A)において、符号801は、文字出現頻度管理データ230の管理領域である。また符号802は、8ビット系(ASCII)である英数字、カタカナ、記号、16ビット系(JIS)の英数字、カタカナ、記号、16ビット系(JIS)のかなや漢字などの標準文字データの出現頻度、出現ファイル数、出現順位、出現マップを記憶する標準文字領域である。
また、符号803は、外字データの出現頻度、出現ファイル数、出現順位、出現マップを記憶する外字領域である。また、符号804は、連字データの出現頻度、出現ファイル数、出現順位、出現マップを記憶する連字領域である。また、符号805は、8ビットのバイナリデータの出現頻度、出現ファイル数、出現順位を記憶するバイナリ領域である。
(A)のデータ構造において、連字領域804の連字データは、その出現頻度順にソートされる。そして、所定の出現頻度以上の連字データを、外字データと重複しないように、他の外字データ(以下、「連字外字データ」)に置換する。このように、出現頻度の高い複数の文字列からなる連字データを、単一文字データである外字データに置換することにより、データ量の削減を図ることができ、圧縮効率の向上を図ることができる。なお、所定の出現頻度未満の連字データは、低出現頻度の連字データであるため、単一の文字データに分解されて、該当する文字領域に割り当てられる。この結果、(B)連字/外字置換処理後の文字出現頻度管理データ230のデータ構成となる。
(B)のデータ構造についてより具体的に説明する。図9は、図8に示した(B)のデータ構成を示す説明図である。図9において、(B)のデータ構造では、文字データ領域900、出現頻度領域901、出現ファイル数領域902、出現順位領域903、出現マップ904を有しており、それぞれ文字データ出現頻度、出現ファイル数、出現順位、および存否フラグが記憶されている。出現マップ904は、16ビットを1セグメントとしている。
具体的には、その左端がファイル番号『#0』の本文HTMLファイルf0の存否フラグであり、順にファイル番号『#1』の本文HTMLファイルf1のフラグ、『#2』の本文HTMLファイルf2の存否フラグが立てられている。そして、右端がファイル番号『#n』の本文HTMLファイルfnの存否フラグである。
また、(B)のデータ構造において、標準文字領域802の標準文字データおよび外字領域803の外字データを混合して高出現頻度順にソートした結果が、(C)のデータ構造である。(C)のデータ構造において、(B)に示した連字外字領域814の連字外字データおよびバイナリ領域805のバイナリデータは、ソートの対象外である。
(C)のデータ構造において、標準文字データと外字データとが混在する混合文字領域812において、低出現頻度、たとえば、出現回数0回の文字データはカットされる。このカットされたときのデータ構造が、(D)のデータ構造である。(D)において、管理領域801および混合文字領域812と、連字外字領域814と、バイナリ領域805とを結合することで、(E)のデータ構造で示したような、最終的な文字出現頻度管理データ230を生成することができる。この文字出現頻度管理データ230において、管理領域801には、ファイル・ブロック数と、出現文字データの種類の数(出現文字数(種類))と、連字外字データの数(連字数(256種))と、バイナリデータ数(バイナリ(256種))とが記録される。
図10は、図8に示した(E)のデータ構成を示す説明図である。図10において、文字出現頻度管理データ230は、バイナリデータを除く文字データごとに、出現頻度領域901と出現マップ904とが対応付けられている。文字データは高出現頻度順にソートされている。なお、後述するが、図10中、文字データ領域900の文字データと出現頻度領域901の出現頻度は、所定のマスタキーを用いた排他的論理和(XOR)によって暗号化される。
この文字出現頻度管理データ230の出現マップ904によれば、出現マップ904の左端であるファイル番号『#0』の本文HTMLファイルf0には、文字データ『月』の存否フラグと文字データ『日』の存否フラグがともに「1」であり、そのAND(論理積)が「1」となる。したがって、本文HTMLファイルf0には、文字データ『月』および『日』が含まれており、入力キーワードに『月』と『日』が含まれている場合、本文HTMLファイルf0は検索対象となる。
一方、ファイル番号『#1』の本文HTMLファイルf1では、文字データ『月』の存否フラグが「1」、文字データ『日』の存否フラグが「0」であり、そのAND(論理積)が「0」となる。したがって、本文HTMLファイルf1には、文字データ『月』が含まれているが『日』が含まれておらず、入力キーワードに『月』と『日』が含まれている場合、本文HTMLファイルf1はその検索対象外となる。
つぎに、連字/外字置換処理について具体的に説明する。図11は、連字/外字置換処理を示すデータ構成図である。図11において、(F)は、文字出現頻度集計部702によって連字データが集計されたときの文字出現頻度管理データ230の連字領域のデータ構成、(G)は、連字データのソート後における連字領域804のデータ構成、(H)は、置換後におけるデータ構成を示している。
(F)のデータ構造において、連字領域804は、領域1101〜1107を有している。領域1101には、8ビット系(ASCII)の数字列データ(「00」〜「99」)の情報(当該数字列データ、出現頻度、出現ファイル数、出現順位、出現マップ)が記憶されている。
領域1102には、8ビット系(ASCII)の英字列データ(「AA」〜「zz」)の情報(当該英字列データ、出現頻度、出現ファイル数、出現順位、出現マップ)が記憶されている。また、領域1103には、8ビット系(ASCII)のカタカナ列データ(「アア」〜「ンン」、濁音・半濁音)の情報(当該英字列データ、出現頻度、出現ファイル数、出現順位、出現マップ)が記憶されている。
領域1104には、16ビット系(JIS)の数字列データ(「00」〜「99」)の情報(当該数字列データ、出現頻度、出現ファイル数、出現順位、出現マップ)が記憶されている。また、領域1105には、16ビット系(JIS)の英字列データ(「AA」〜「zz」)の情報(当該数字列データ、出現頻度、出現ファイル数、出現順位、出現マップ)が記憶されている。
領域1106には、16ビット系(JIS)のカタカナ列データ(「アア」〜「ンン」、濁音・半濁音)の情報(当該カタカナ列データ、出現頻度、出現ファイル数、出現順位、出現マップ)が記憶されている。また、領域1107には、16ビット系(JIS)の仮名列データ(「ああ」〜「んん」、濁音・半濁音)の情報(当該仮名列データ、出現頻度、出現ファイル数、出現順位、出現マップ)が記憶されている。
また、(G)のデータ構造は、(F)のデータ構造を、各連字データの高出現順にソートすることにより得られるデータ構造である。(G)のデータ構造において、領域1111は、高出現頻度の連字データの情報であり、外字データへの置換対象となる。一方、領域1112は、所定の出現頻度以下の連字データ(低出現頻度連字データ)の情報である。この低出現頻度連字データは、単一の文字データに分解される。これにより文字データの出現頻度と出現マップ904とが補正される。
また、(H)のデータ構造は、(G)のデータ構造のうち高出現頻度の連字データを外字に置換することによって得られるデータ構造である。連字外字領域814には、置換された連字外字データの情報(当該連字外字データ、出現頻度、出現ファイル数、出現順位、出現マップ)が記憶されている。また、図12は、最終的に生成された連字/外字置換テーブル240を示す説明図である。連字/外字置換テーブル240は、(G)のデータ構造の領域1111の連字データと、(H)のデータ構造の領域814の連字外字データとを対応させることによって生成される。
(圧縮/暗号化部213の詳細な機能的構成)
つぎに、図2に示した圧縮/暗号化部213の詳細な機能的構成について説明する。図13は、図2に示した圧縮/暗号化部213の詳細な機能的構成を示すブロック図である。図13において、圧縮/暗号化部213は、低出現頻度文字データ分解部1301と、暗号化部1302と、生起確率演算部1303と、ハフマン木生成部1304と、圧縮部1305と、から構成されている。
まず、低出現頻度文字データ分解部1301は、文字出現頻度管理データ生成部212によって生成された文字出現頻度管理データ230内における文字領域の文字データを高出現頻度順にソートする。そして、所定の出現頻度以下の残余の低出現頻度の文字データを8ビットコードに分解して、同じ8ビットコードであるバイナリデータが記憶されているバイナリ領域に記憶する。
暗号化部1302は、圧縮部1305によって圧縮された圧縮文字出現頻度管理データ235を、所定のマスタキーを用いてXORによる暗号化をおこない、暗号化圧縮文字出現頻度管理データ260を生成する。連字/外字置換テーブル240も同様に、所定のマスタキーを用いてXORによる暗号化をおこない、暗号化連字/外字置換テーブル270を生成することとしてもよい。
また、生起確率演算部1303は、低出現頻度文字データ分解部1301による分解によって得られた文字出現頻度管理データ230における標準文字データ、連字外字データおよびバイナリデータを高出現順にソートして、これらの生起確率を演算する。また、ハフマン木生成部1304は、生起確率演算部1303によって演算された生起確率からハフマン木を生成する。
また、圧縮部1305は、ハフマン木生成部1304によって生成されたハフマン木を用いてコンテンツ210を圧縮し、圧縮コンテンツ250を生成する。具体的には、各本文HTMLファイルf0〜fnに記述されている文字データに対して、出現頻度が高い順、すなわち生起確率が高い順に短いビットを割り当てて、コンテンツ210を圧縮する。なお、圧縮コンテンツ250内の本文HTMLファイルを「圧縮ファイル」と称す。
つぎに、圧縮/暗号化部213による具体的なハフマン木生成処理について説明する。図14は、圧縮/暗号化部213による具体的なハフマン木生成処理を示す説明図である。図14の(I)に示した文字出現頻度管理データ230を、低出現頻度文字データ分解部1301により、低出現頻度の文字データを分解して、バイナリデータが記憶されているバイナリ領域815に記憶する(図14中(J))。
つぎに、(J)のデータ構造において、混合文字領域812、連字外字領域814、およびバイナリ領域815内のすべての文字データを高出現頻度順にソートする(図14中(K))。そして、(K)の領域1400において、出現頻度をハフマンの圧縮パラメータとして各文字データの生起確率を演算する(図14中(L))。最後に(L)において、各文字データの生起確率からハフマン木1401を生成する(図14中(M))。
つぎに、圧縮部1305によって圧縮された圧縮コンテンツ250のデータ構造について説明する。図15−1は、圧縮部1305によって圧縮された圧縮コンテンツ250のデータ構造を示す説明図である。図15−1では、任意の本文HTMLファイルfjに着目して説明する。この本文HTMLファイルfjは、ブロック数情報(m個)を格納する領域1501と、m個の各ブロックのアドレス情報(#1〜#m)を格納する領域1502と、各ブロックの圧縮ブロックデータC1〜Cmを格納する領域1503から構成される。
また、図15−2は、圧縮ブロックデータC1〜Cmと、圧縮前の元のブロックデータとの比較を示す図表である。図15−2を参照すると、圧縮ブロックデータC1〜Cmのレングスが、対応する元のブロックデータのレングスの約半分に圧縮されていることがわかる。
ここで、図13に示した圧縮部1305のあらたな機能について説明する。本実施の形態では、圧縮部1305は、コンテンツ210のほか、文字出現頻度管理データ230を圧縮して、圧縮文字出現頻度管理データ235を生成する。具体的には、文字出現頻度管理データ230内の出現マップ904を圧縮する。生成された圧縮文字出現頻度管理データ235は、上述したように、暗号化部1302により暗号化される。
図16−1は、1検索対象ファイル内における文字データの出現確率を示す説明図である。図16−1において、縦軸は、1検索対象ファイル内における文字データの出現確率を示しており、上が出現確率0%、下が出現確率100%である。この出現確率の範囲0〜100%を対数的に分割する。すなわち、確率が等しくなるように領域の上下2分割を繰り返すことにより、出現率の範囲を区画する分割領域が形成される。
この分割により、出現率をrとすると、0≦r<1/32がE領域、1/32≦r<1/16がD領域、1/16≦r<1/8がC領域、1/8≦r<1/4がB領域、1/4≦r<1/2がA領域、1/2≦r<3/4がA’領域、3/4≦r<7/8がB’領域、7/8≦r<15/16がC’領域、15/16≦r<31/32がD’領域、31/32≦r≦1がE’領域となる。
なお、同一アルファベットを付した領域の出現率は同一である。すなわち、出現確率50%を境界として領域幅と出現確率が上下対称となっている。たとえば、A領域およびA’領域の出現率はともに1/4である。なお、ある辞書コンテンツの1文字の平均出現率は、0.077であることがわかっているため、領域Cに属することとなる。
図16−2は、出現マップ904と図16−1に示した各領域との関係を示す説明図である。図16−2では、文字データごとに図16−1の出現率rが計算されており、図16−1に示した各領域と対応付けられている。出現率rは、全検索対象ファイルf0〜fn中、対象となる文字データが出現する検索対象ファイル数がどの程度存在するかをあらわすデータであり、分母を検索対象ファイル数(n+1)、対象となる文字データが1つでも出現した検索対象ファイル数である。ある検索対象ファイル中、対象となる文字データが複数出現しても1ファイルとしてカウントされる。このように、出現率rにより文字データに対応する領域が異なるため、この出現率rは圧縮パラメータとしての役割を果たす。
図16−3は、図16−1に示した領域と圧縮パターンとの対応関係を示す領域/圧縮パターン対応テーブルである。図16−3において、圧縮パターンとは、出現マップ904における各文字データのビット列の圧縮に用いるハフマン木の種類をあらわしている。たとえば、A領域およびA’領域は非圧縮のためハフマン木を使用しない。また、B領域およびB’領域は、通常の4ビット系ハフマン圧縮のように16種の符号語に圧縮する16種ハフマン木を圧縮パターンとして用いる。この16種ハフマン木のように、通常のハフマン圧縮に適用されるハフマン木を、「通常のハフマン木」と称す。
また、C領域およびC’領域は、16種ハフマン木に16ビットの特殊記号列を追加した16+1(16ビット)種ハフマン木を圧縮パターンとして用いる。また、D領域およびD’領域は、16種ハフマン木に32ビットの特殊記号列を追加した16+1(32ビット)種ハフマン木を圧縮パターンとして用いる。また、E領域およびE’領域は、16種ハフマン木に64ビットの特殊記号列を追加した16+1(64ビット)種ハフマン木を圧縮パターンとして用いる。これら特殊記号列は、文字データが出現しないことを意味するビット値(本例では、「0」)の連続記号列(NULL記号列)である。
これら、16種+1種(16、32、64、・・・ビット)ハフマン木のように、16、32、64、・・・ビットの特殊記号列を葉に追加したハフマン木を、「通常のハフマン木」と区別するため、「特殊なハフマン木」と称す。
なお、A’領域〜E’領域の出現確率で出現する文字データについては、出現マップ904中のビット列を反転させてからA領域〜E領域で用いられるハフマン木を用いてハフマン圧縮をおこなう。
すなわち、A’領域〜E’領域については、別途ハフマン木を保持しておく必要がなく、A領域〜E領域で用いられるハフマン木をそのまま用いることができるため、データ量の削減を図ることができる。なお、これらハフマン木は、図1に示したRAM103やHD105に保存されており、領域/圧縮パターン対応テーブルを参照することにより、抽出することができる。
図16−4〜図16−8は、各領域における4ビット系のハフマン圧縮を示す図表である。各図表において、左端の記号列[0000]〜[1111]は、出現マップ内のビット列のうち4ビット分のビット列パターンをあらわしており、ハフマン木の葉となる。
また、「符号長(小計)」の値は、「生起確率」と「符号長」と「数量」とを掛け合わせた値である。「生起確率(小計)」の値は、「生起確率(基準)」と「数量」とを掛け合わせた値である。「生起確率(小計)」は、領域ごとに、「生起確率」の高い記号列順に割り振られる。
図16−4は、A領域およびA’領域における4ビット系のハフマン圧縮を示す図表である。「生起確率(基準)」には、「生起確率」の高い記号列順に0.25(=1/4)、0.125(=1/8)、0.03125(=1/32)、0.00390625(=1/256)、0.000976563(=1/1024)が割り振られている。対象となる文字データの出現率rがA領域およびA’領域に該当する場合には圧縮しない。
図16−5は、B領域およびB’領域における4ビット系のハフマン圧縮を示す図表である。「生起確率(基準)」には、「生起確率」の高い記号列順に0.5(=1/2)、0.125(=1/8)、0.0625(=1/16)、0.015625(=1/64)、0.00390625(=1/256)、0.000976563(=1/1024)が割り振られている。
対象となる文字データの出現率rがB領域およびB’領域に該当する場合には、その文字データのビット列に含まれている記号列[0000]〜[1111]を、この「生起確率(小計)」に基づき、16種ハフマン木により対応する符号語に圧縮する。
図16−6は、C領域およびC’領域における4ビット系のハフマン圧縮を示す図表である。この図表では、4ビットの記号列[0000]〜[1111]のほかに、16ビットの記号列[0000…0000]も含まれている。「生起確率(基準)」には、「生起確率」の高い記号列順に0.25(=1/4)、0.25(=1/4)、0.125(=1/8)、0.0625(=1/16)、0.00012207(=1/8192)、0.000976563(1/1024)、0.00012207(=1/8192)が割り振られている。
対象となる文字データの出現率rがC領域およびC’領域に該当する場合には、その文字データのビット列に含まれている記号列[0000]〜[1111],[0000…0000]を、この「生起確率(小計)」に基づき、16種+1(16ビット)種ハフマン木により対応する符号語に圧縮する。
図16−7は、D領域およびD’領域における4ビット系のハフマン圧縮を示す図表である。この図表では、4ビットの記号列[0000]〜[1111]のほかに、32ビットの記号列[0000……0000]も含まれている。「生起確率(基準)」には、「生起確率」の高い記号列順に0.25(=1/4)、0.25(=1/4)、0.125(=1/8)、0.0625(=1/16)、0.00012207(=1/8192)、0.000976563(=1/1024)、0.00012207(=1/8192)が割り振られている。
対象となる文字データの出現率rがD領域およびD’領域に該当する場合には、その文字データのビット列に含まれている記号列[0000]〜[1111],[0000……0000]を、この「生起確率(小計)」に基づき、16種+1(32ビット)種ハフマン木により対応する符号語に圧縮する。
図16−8は、E領域およびE’領域における4ビット系のハフマン圧縮を示す図表である。この図表では、4ビットの記号列[0000]〜[1111]のほかに、64ビットの記号列[0000………0000]も含まれている。「生起確率(基準)」には、「生起確率」の高い記号列順に0.25(=1/4)、0.25(=1/4)、0.125(=1/8)、0.0625(=1/16)、0.00012207(=1/8192)、0.000976563(=1/1024)、0.00012207(=1/8192)が割り振られている。
対象となる文字データの出現率rがE領域およびE’領域に該当する場合には、その文字データのビット列に含まれている記号列[0000]〜[1111],[0000………0000]を、この「生起確率(小計)」に基づき、16種+1(64ビット)種ハフマン木により対応する符号語に圧縮する。
図16−9は、図16−6に示した16ビット記号列を追加した場合の記号列の符号語との対応関係の一例を示す図表である。図16−9において、あらたに葉として追加される16ビット記号列は、生起確率が最も高いため、2ビットの符号長の符号語「00」が割り当てられている。なお、符号長を短縮するため、この符号長は補正される。
図16−10は、葉となる17番目の記号列の追加前と追加後における4ビット系ハフマン圧縮の比較例を示す説明図である。図16−10において、上下の図表は、例として、文字データの出現率を10%とした場合の4ビット系のハフマン圧縮を示す図表である。上の図表は、12ビットの記号列[000000000000]の追加前をあらわしており、下の図表は、17番目の12ビット記号列[000000000000]の追加前をあらわしている。
下の図表において、この17番目の12ビット記号列を追加した場合、その記号列の生起確率は1/4超を目安とする。これにより、追加前において生起確率が最大である記号列[0000]の生起確率を補正する。
また、17番目の12ビット記号列には、符号長として2ビットが割り当てられるが、その符号語の符号長が短くなるように補正する。ここでは、17番目の12ビット記号列の符号長は2ビットから0.66667ビット(=2ビット×4ビット/12ビット)に補正される。
上下の図表の平均符号長を比較すると、上の図表における平均符号長が0.51355であり、下の図表の平均符号長が0.460384089となるため、17番目の12ビット記号列を追加することにより、圧縮率が10%改善することとなる。
図16−11は、ビット列圧縮データのデータ構造を示す説明図である。ビット列圧縮データ1600は、アドレス1601と圧縮パターン1602と領域フラグ1603と圧縮ビット列1604とパディング1605とからなる。
アドレス1601は、そのビット列圧縮データ1600の圧縮元のビット列の文字データにリンクするポインタである。圧縮パターン1602とは、ハフマン圧縮に用いるハフマン木を特定する情報である。領域フラグ1603とは、そのビット列圧縮データ1600の圧縮元のビット列の文字データの出現率がA領域〜E領域の範囲内にあるか、A’領域〜E’領域の範囲内にあるかを特定するためのフラグである。
圧縮ビット列1604とは、圧縮元のビット列を圧縮パターンで特定されるハフマン木で圧縮されたビット列である。パディング1605は必要に応じて追加することで、ビット列圧縮データ1600を可変長にする。
なお、図16−1〜図16−11では、おもに4ビット系のハフマン圧縮について説明したが、2ビットや3ビット、8ビット、16ビットなど4ビット系以外のハフマン圧縮にも適用することができる。
(検索初期化部221の詳細な機能的構成)
つぎに、図2に示した検索初期化部221の詳細な機能的構成について説明する。図17は、図2に示した検索初期化部221の詳細な機能的構成を示すブロック図である。図17において、検索初期化部221は、復号部1701と、低出現頻度文字データ分解部1702と、生起確率演算部1703と、ハフマン木生成部1704と、出現マップ設定部1705と、伸長部1706と、から構成されている。
まず、復号部1701は、暗号化圧縮文字出現頻度管理データ260を復号する。具体的には、図13で用いた暗号化のマスタキーを用いて排他的論理和(XOR)による復号処理を実行する。同様に、暗号化連字/外字置換テーブル270も、元の連字/外字置換テーブル240に戻す。また、低出現頻度文字データ分解部1702、生起確率演算部1703およびハフマン木生成部1704は、図13に示した低出現頻度文字データ分解部1301、生起確率演算部1303およびハフマン木生成部1304と同一の処理を実行し、ハフマン木1710を生成する。
ここで、図17に示したあらたな機能である伸長部1706について説明する。伸長部1706は、復号部1701により復号された圧縮文字出現頻度管理データ235を伸長する。具体的には、各文字データのビット列圧縮データ1600を読み込んで、その中のアドレス1601、圧縮パターン1602、領域フラグ1603を特定する。そして、圧縮時に用いたハフマン木により、圧縮ビット列1604を伸長する。これにより、文字出現頻度管理データ230が伸長されることとなる。
また、出現マップ設定部1705は、伸長された文字出現頻度管理データ230の出現マップ904を読み込んでメモリ展開し、区点対応テーブルとリンクする。区点は、JISによって制定された全角文字向けの文字コードであり、区点対応テーブルは、各区点のアドレスを記憶したテーブルである。
図18は、区点対応テーブルと出現マップとの対応関係を示す説明図である。この区点対応テーブル1800を用いて、文字出現頻度管理データ230の文字データと区点とを対応づけることにより、区点に対応する文字データの存否フラグ列を出現マップ904から呼び出すことができる。
(全文検索部222の詳細な機能的構成)
つぎに、図2に示した全文検索部222の詳細な機能的構成について説明する。図19は、図2に示した全文検索部222の詳細な機能的構成を示すブロック図である。図19において、全文検索部222は、検索キーワード入力処理部1901と、検索キーワード圧縮部1902と、出現マップ読取部1903と、圧縮ファイル特定部1904と、圧縮ファイル抽出部1905と、判定部1906と、ブロック伸長部1907と、文字列比較部1908と、見出しデータ特定部1909と、検索候補一覧表示部1910と、検索候補選択部1911と、から構成されている。
まず、検索キーワード入力処理部1901は、ユーザからの検索キーワードの入力を受け付ける。また、検索キーワードが複数ある場合、各検索キーワードの文字列を連結する。さらに、検索キーワードの連字が所定の連字に該当する場合、連字/外字置換テーブル240を用いて、連字を外字に置換する。このあと、検索キーワード入力処理部1901は、検索キーワードを単一文字に分解する。
また、検索キーワード圧縮部1902は、検索キーワード入力処理部1901によって入力された検索キーワードを、検索初期化部221のハフマン木生成部1704によって生成されたハフマン木1710を用いて圧縮する。また、出現マップ読取部1903は、出現マップ設定部1705によって設定された出現マップ904を用いて、検索キーワードの各文字の各HTMLファイルf0〜fnにおける存否フラグ列を読み取る。具体的には、この出現マップ904における各文字データは、区点対応テーブルにより区点とリンクしているため、区点と一致する検索キーワードの各文字データの存否フラグ列を読み取ることができる。
圧縮ファイル特定部1904は、出現マップ904から読み取られた各文字の各HTMLファイルf0〜fnにおける存否フラグ列の論理積を算出することにより、検索キーワードの各文字データがすべて存在する圧縮ファイルを特定することで、圧縮ファイルの絞込みをおこなう。ここで、絞込みの一例を、下記表1を用いて説明する。
上記表1においては、検索キーワードを『増殖細胞』とし、コンテンツ210に含まれている本文HTMLファイルfの数を4個、すなわち、ファイル番号#0〜#3までとする。表1において、たとえば、文字『増』の存否フラグ列は[1100]である。この存否フラグ列は、ファイル番号#0、#1の本文HTMLファイルf0、f1には文字『増』が含まれており、ファイル番号#2、#3の本文HTMLファイルf2、f3には文字『増』が含まれていないことを示している。
そして、表1において、絞込み結果は、ファイル番号ごとの存否フラグの論理積(AND)結果を示している。この絞込み結果によれば、ファイル番号#1の本文HTMLファイルf1のみが、存在を示すフラグ「1」となっているため、検索キーワードを構成するすべての文字『増』、『殖』、『細』および『胞』は、ファイル番号#1の本文HTMLファイルf1にのみ存在し、他のファイル番号(#0、#2、#3)の本文HTMLファイルf0、f2、f3には存在しないことがわかる。これにより、検索対象としてオープンするファイルを、ファイル番号#1の本文HTMLファイルf1のみに特定することができ、無駄なファイルのオープン/クローズ処理を防止して検索速度の向上を図ることができる。
また、圧縮ファイル抽出部1905は、圧縮コンテンツ250内において圧縮されている本文HTMLファイルの中から、圧縮ファイル特定部1904によって特定された本文HTMLファイルを抽出する。上記表の例では、ファイル番号#1の圧縮された本文HTMLファイル(以下、「圧縮本文HTMLファイル」)f1を抽出する。
また、判定部1906は、圧縮ファイル抽出部1905によって抽出された圧縮本文HTMLファイルに、検索キーワード圧縮部1902によって圧縮された検索キーワード(以下、「圧縮キーワード」)が含まれているか否かを判定する。具体的には、圧縮本文HTMLファイル内の圧縮ブロックデータごとに判定をおこなっている。
この判定結果が不一致である場合、圧縮本文HTMLファイルには、検索キーワードが含まれていないことがわかる。一方、判定結果が一致である場合、圧縮本文HTMLファイルには、検索キーワードが含まれていることがわかる。たとえば、上記表においては、ファイル番号#1の本文HTMLファイルに、検索キーワード『増殖細胞』という文字列が含まれていることがわかる。
また、ブロック伸長部1907は、判定部1906により一致すると判定された圧縮HTMLファイルの圧縮ブロックデータのみ伸長する。この判定部1906およびブロック伸長部1907により、本文HTMLファイルを圧縮した状態のまま判定をおこなうことができ、不一致であれば、圧縮本文HTMLファイルを伸長する前に検索候補から外し、一致した本文HTMLファイルのみ伸長することができる。また、ブロック伸長部1907において、伸長された本文HTMLファイルに連字外字データが含まれている場合、復号部1701によって復号された連字/外字置換テーブル240を用いて、連字外字データを元の連字データに置換する。
また、文字列比較部1908は、ブロック伸長部1907によって伸長されたブロックデータ内の文字列と、検索キーワード入力処理部1901によって入力された検索キーワードとを比較する。検索キーワードに一致する文字列の項目データがあった場合、当該項目データのファイル番号およびアンカー名を記録し、見出しデータ300を特定する。なお、特定された見出しデータ300を、「特定見出しデータ300」と称す。
検索候補一覧表示部1910は、特定見出しデータ300における項目データのファイル番号とアンカーから、見出しデータ300を編集して、見出し語が列挙された検索候補一覧を図1に示したディスプレイ108に表示する。また、検索候補選択部1911は、検索候補一覧表示部1910によって表示された検索候補一覧の中から、ユーザの操作によって選択された検索候補を受け付ける。
(検索結果表示部223の詳細な機能的構成)
つぎに、図2に示した検索結果表示部223の詳細な機能的構成について説明する。図20は、図2に示した検索結果表示部223の詳細な機能的構成を示すブロック図である。図20において、検索結果表示部223は、読出し部2001と、本文伸長部2002と、本文表示部2003と、から構成されている。
まず、読出し部2001は、検索候補選択部1911によって選択された検索候補である項目データを、圧縮コンテンツ250から読み出す。また、本文伸長部2002は、読出し部2001によって読み出された項目データを、ハフマン木1710によって伸長する。検索結果表示部223は、本文伸長部2002によって伸長された項目データを検索結果として表示する。
(情報検索処理手順)
つぎに、実施の形態1にかかる情報検索装置の情報検索処理手順について説明する。図21は、実施の形態1にかかる情報検索装置の情報検索処理手順を示すフローチャートである。図21において、まず、文字出現頻度管理データ生成部212により、文字出現頻度管理データ生成処理を実行する(ステップS2101)。
そして、圧縮/暗号化部213により、圧縮/暗号化処理を実行する(ステップS2102)。このあと、検索初期化部221により、検索初期化処理を実行する(ステップS2103)。つぎに、全文検索部222により、全文検索処理を実行する(ステップS2104)。最後に、検索結果表示部223により、検索結果表示処理を実行する(ステップS2105)。なお、検索結果表示処理では、検索候補一覧から選択された検索候補(項目データ)を圧縮コンテンツ250から読み出して、ハフマン木にて伸長することにより、項目データの全文を検索結果として表示することができる。
つぎに、図21に示した文字出現頻度管理データ生成処理(ステップS2101)の詳細な処理手順について説明する。図22は、図21に示した文字出現頻度管理データ生成処理(ステップS2101)の詳細な処理手順を示すフローチャートである。図22において、まず、初期化処理を実行する(ステップS2201)。具体的には、8,16ビットの文字データ、連字データ、バイナリデータの区点対応の集計領域を確保し、出現頻度と出現マップのセグメント等を初期化する。また、文字データのコードをセットし、各種カウンタを初期化する。
つぎに、文字出現頻度集計処理を実行する(ステップS2202)。この文字出現頻度集計処理の詳細な処理手順については後述する。この文字出現頻度修正処理のあと、文字出現頻度管理データ230の領域確保とその領域の初期化を実行し(ステップS2203)、8,16ビットの文字データ、連字データ、バイナリデータの文字コードと出現頻度をセットする(ステップS2204)。
そして、出現マップの各セグメントを連結し(ステップS2205)。連字領域の連字データを高出現頻度順にソートすることで、256種の連字データを選択する(ステップS2206)。これにより、連字データの削減を図ることができる。
つぎに、連字/外字置換をおこなうととともに、連字/外字置換テーブル240を生成する(ステップS2207)。具体的には、高出現頻度順に連字データを外字データに置換することにより、連字外字データと連字/外字置換テーブル240を生成する。
そして、低出現頻度の連字データ、すなわち外字に置換されなかった連字データを単一文字データに分解し、該当する文字領域に割り振る補正をおこなう(ステップS2208)。すなわち、低出現頻度の連字データを表音文字データに分割し、当該文字データの頻度の加算と出現マップのOR演算を実行する。
このあと、文字データを高出現頻度順にソートし(ステップS2209)、頻度0回の文字データをカットして、連字外字データとバイナリデータとを結合し(ステップS2210)、この結合によって得られた文字出現頻度管理データ230をファイルに出力する(ステップS2211)。これにより、ステップS2102に移行する。
つぎに、上述した文字出現頻度集計処理(ステップS2202)の詳細な処理手順について説明する。図23は、上述した文字出現頻度集計処理(ステップS2202)の詳細な処理手順を示すフローチャートである。図23において、まず、先頭(ファイル番号#0)の本文HTMLファイルf0をオープンする(ステップS2301)。
つぎに、オープンされた本文HTMLファイルから順次データを抽出する。抽出されたデータがバイナリデータである場合(ステップS2302:Yes)、当該バイナリデータの出現頻度を1ポイント加算し、当該バイナリデータの出現マップの存否フラグを「1」に設定し、さらに、バイトカウンタを2ポイント加算する(ステップS2303)。
一方、ステップS2302において、抽出されたデータがバイナリデータでない場合(ステップS2302:No)、連字データであるか否かを判定する(ステップS2304)。連字データである場合(ステップS2304:Yes)、当該連字データの出現頻度を1ポイント加算し、当該連字データの出現マップの存否フラグを「1」に設定し、さらに、バイトカウンタを2(または4)ポイント加算する(ステップS2305)。
一方、ステップS2304において、抽出されたデータが連字データでない場合(ステップS2304:No)、漢字データであるか否かを判定する(ステップS2306)。漢字データでない場合(ステップS2306:No)、当該データは表音文字データであるため、その表音文字データの出現頻度を1ポイント加算し、当該表音文字データの出現マップの存否フラグを「1」に設定し、バイトカウンタを1(または2)ポイント加算する(ステップS2307)。
一方、ステップS2306において、抽出されたデータが漢字データである場合(ステップS2306:Yes)、当該漢字データの出現頻度を1ポイント加算し、当該漢字データの出現マップの存否フラグを「1」に設定し、バイトカウンタを2ポイント加算する(ステップS2308)。
つぎに、出現マップのセグメントのセグメントカウンタを1ポイント加算し(ステップS2309)、セグメント終了か否か、すなわちセグメントの集計が終了したか否かを判断する(ステップS2310)。セグメントの集計が終了した場合(ステップS2310:Yes)、出現マップのセグメントをファイルに追加出力し、セグメントカウンタをクリアする(ステップS2311)。そして、ステップS2312に移行する。
一方、セグメントの集計が終了していない場合(ステップS2310:No)、またはステップS2311のあと、ブロック終了か否か、たとえば、集計した文字データ数が4000文字に到達したか否かを判断する(ステップS2312)。
そして、ブロック終了した場合(ステップS2312:Yes)、当該ブロックデータを有する本文HTMLファイルのファイル番号、当該ブロックデータのブロック番号、オフセット、文字数、およびレングスからなるブロック情報を生成してファイルに追加出力するとともに、バイトカウンタをクリアする(ステップS2313)。そして、ステップS2314に移行する。
一方、ブロック終了していない場合(ステップS2312:No)、またはステップS2313のあと、ファイル終了か否か、すなわち、現在オープンしている本文HTMLファイルの集計が終了したか否かを判断する(ステップS2314)。現在オープンしている本文HTMLファイルの集計が終了していない場合(ステップS2314:No)、ステップS2302に戻って次のデータを抽出し、抽出したデータの種類を特定して、集計する(ステップS2302〜S2308)。
一方、ステップS2314において、現在オープンしている本文HTMLファイルの集計が終了した場合(ステップS2314:Yes)、集計終了か否か、すなわち、現在オープンしている本文HTMLファイルをクローズする(ステップS2315)。このあと、すべての本文HTMLファイルからの集計が終了したか否かを判断する(ステップS2316)。
すべての本文HTMLファイルの集計が終了していない場合(ステップS2316:No)、つぎのファイル番号の本文HTMLファイルをオープンし(ステップS2317)、ステップS2302に戻って次のデータを抽出し、抽出したデータの種類を特定して、集計する(ステップS2302〜S2308)。
一方、ステップS2316においてすべての本文HTMLファイルの集計が終了した場合(ステップS2316:Yes)、出現マップのセグメントをファイルに追加出力し(ステップS2318)、ステップS2203に移行することで一連の処理を終了する。
つぎに、図21に示した圧縮/暗号化処理(ステップS2102)の詳細な処理手順について説明する。図24−1は、図21に示した圧縮/暗号化処理(ステップS2102)の詳細な処理手順を示すフローチャートである。図24において、まず、出現頻度順に混合文字領域812の文字データをソートする(ステップS2401)。
つぎに、低出現頻度の文字データを8ビットに分解し、該当するバイナリデータの出現頻度に加算する(ステップS2402)。そして、混合文字領域812の文字データ、連字外字データ、バイナリデータを連結し、出現頻度順にソートする(ステップS2403)。このあと、ソートされた文字データごとに、出現頻度に基づいて生起確率を演算し(ステップS2404)、この生起確率に基づいて、8,16ビットの文字データに共通のハフマン木を生成する(ステップS2405)。
このあと、各本文HTMLファイルを圧縮する(ステップS2406)。具体的には、コンテンツフォルダ400配下の各本文HTMLファイルを、たとえば4000文字ごとにブロック化し、ハフマン木を用いて圧縮する。
つぎに、本実施の形態のあらたな処理として、文字出現頻度管理データ圧縮処理を実行する(ステップS2407)。文字出現頻度管理データ圧縮処理の詳細な処理手順については、図24−2において後述する。
このあと、圧縮文字出現頻度管理データ235を暗号化する(ステップS2408)。具体的には、圧縮文字出現頻度管理データ235の暗号化領域(文字データおよび出現頻度の領域)を、マスタキーを用いて排他的論理和(XOR)により暗号化する。そして、連字/外字置換テーブル240を暗号化する(ステップS2409)。具体的には、連字/外字置換テーブル240の暗号化領域を、マスタキーを用いて排他的論理和(XOR)により暗号化する。そして、検索初期化処理(ステップS2103)に移行し、一連の処理を終了する。
ここで、上述した文字出現頻度管理データ圧縮処理の詳細な処理手順について説明する。図24−2は、文字出現頻度管理データ圧縮処理の詳細な処理手順を示すフローチャートである。図24−2において、まず、未処理の文字データがあるか否かを判断する(ステップS2471)。未処理の文字データがある場合(ステップS2471:Yes)、未処理の文字データの中から任意の文字データを選択する(ステップS2472)。なお、先頭の文字データから読み込んでいる場合には、必然的に処理された文字データのつぎの文字データとなる。
そして、選択文字データの出現率を取得する(ステップS2473)。出現率は、文字出現頻度管理データ230にあらかじめ保持されている場合には、その出現率を読み込み、出現ファイル数902が保持されている場合には、選択文字データの出現率を、選択文字データの出現ファイル数/全検索対象ファイル数(n+1)により算出する。
そして、この出現率を圧縮パラメータとすることにより選択文字データが出現する領域をA領域〜E領域、A’領域〜E’領域の中から特定する(ステップS2474)。領域が特定されると、図16−3に示した領域/圧縮パターン対応テーブルを参照することにより、圧縮に用いられるハフマン木を抽出する(ステップS2475)。これにより、選択文字データの圧縮パターンが特定される。
このあと、選択文字データのビット列を抽出する(ステップS2476)。具体的には、選択文字データのビット列を先頭から順次レジスタに書き込む。そして、出現率が50%以上であるか否かを判断する(ステップS2477)。すなわち、50%以上であれば(ステップS2477:Yes)、出現率はA’領域〜E’領域の範囲内にあるため、レジスタに保持されているビット列を反転させる(ステップS2478)。
一方、50%未満であれば(ステップS2477:No)、出現率はA領域〜E領域の範囲内であるため、レジスタに保持されているビット列は反転させず、ステップS2479に移行する。そして、レジスタに保持されているビット列を、ステップS2475で抽出されたハフマン木を用いてハフマン圧縮する(ステップS2479)。これにより、選択文字データについてのビット列圧縮データ1600が生成されることとなる。
選択文字データのビット列のハフマン圧縮が終了すると、ステップS2471に戻る。そして、ステップS2471において、未処理の文字データがない場合(ステップS2471:No)、図24−1に示したステップS2408に移行する。
つぎに、図21に示した検索初期化処理(ステップS2103)の詳細な処理手順について説明する。図25−1は、図21に示した検索初期化処理(ステップS2103)の詳細な処理手順を示すフローチャートである。
図25−1において、まず、検索初期化処理の起動を待ち受け(ステップS2501:No)、起動した場合(ステップS2501:Yes)、圧縮/暗号化処理において暗号化された暗号化圧縮文字出現頻度管理データ260を復号化する(ステップS2502)。具体的には、暗号化圧縮文字出現頻度管理データ260の暗号化領域(文字データおよび出現頻度の領域)を、暗号化したときのマスタキーを用いて排他的論理和(XOR)により復号する。
つぎに、暗号化連字/外字置換テーブル270を復号化する(ステップS2503)。具体的には、暗号化連字/外字置換テーブル270の暗号化領域を、暗号化したときのマスタキーを用いて排他的論理和(XOR)により復号する。
そして、本実施の形態のあらたな処理として、文字出現頻度管理データ伸長処理を実行する(ステップS2504)。文字出現頻度管理データ伸長処理の詳細な処理手順については、図25−2において後述する。
つぎに、圧縮/暗号化処理で示したステップS2401〜S2405までの処理と同様の処理を実行する。すなわち、高出現頻度順に文字データをソートし(ステップS2505)、低出現頻度の文字データを8ビットに分解し、該当するバイナリデータの出現頻度に加算する(ステップS2506)。そして、文字データ、連字データ、バイナリデータを連結し、高出現頻度順にソートする(ステップS2507)。このあと、文字データごとに、出現頻度に基づいて生起確率を演算し(ステップS2508)、この生起確率に基づいて、8,16ビットの文字データに共通のハフマン木を生成する(ステップS2509)。
このあと、出現マップの設定処理を実行する(ステップS2510)。具体的には、区点対応テーブルの領域確保、各文字データの出現順位の区点対応テーブルへのセット、復号された文字出現頻度管理データ230の出現マップのメモリ展開、当該出現マップと区点対応テーブルとのリンクを実行する。このあと、全文検索処理(ステップS2104)に移行して、一連の処理を終了する。
ここで、上述した文字出現頻度管理データ伸長処理の詳細な処理手順について説明する。図25−2は、文字出現頻度管理データ伸長処理の詳細な処理手順を示すフローチャートである。図25−2において、まず、未処理の文字データがあるか否かを判断する(ステップS2541)。未処理の文字データがある場合(ステップS2541:Yes)、未処理の文字データの中から任意の文字データを選択する(ステップS2542)。なお、先頭の文字データから読み込んでいる場合には、必然的に処理された文字データのつぎの文字データとなる。
そして、選択文字データのビット列圧縮データ1600から選択文字データの圧縮パターン1602を検出することにより、図16−3に示した領域/圧縮パターン対応テーブルを参照して、伸長に用いられる対応するハフマン木を抽出する(ステップS2543)。
つぎに、選択文字データの圧縮ビット列1604を抽出する(ステップS2544)。具体的には、選択文字データの圧縮ビット列1604を先頭から順次レジスタに書き込む。そして、レジスタに保持されている圧縮ビット列1604を、ステップS2543で抽出されたハフマン木を用いてハフマン伸長する(ステップS2545)。
そして、選択文字データの出現率が50%以上であるか否かを判断する(ステップS2546)。具体的には、領域フラグ1603を参照することにより判断する。50%以上であれば(ステップS2546:Yes)、出現率はA’領域〜E’領域の範囲内にあるため、伸長されたビット列を反転させる(ステップS2547)。
一方、50%未満であれば(ステップS2546:No)、出現率はA領域〜E領域の範囲内であるため、レジスタに保持されているビット列を反転させない。選択文字データの圧縮ビット列1604のハフマン伸長が終了すると、ステップS2541に戻る。そして、ステップS2541において、未処理の文字データがない場合(ステップS2541:No)、図25−1に示したステップS2505に移行する。
つぎに、図21に示した全文検索処理(ステップS2104)の詳細な処理手順について説明する。図26は、図21に示した全文検索処理(ステップS2104)の詳細な処理手順を示すフローチャートである。検索初期化処理(ステップS2103)のあと、図26において、まず、検索キーワードの入力を受け付ける(ステップS2601)。
検索キーワードが複数でない場合(ステップS2602:No)、ステップS2604に移行する。一方、検索キーワードが複数である場合(ステップS2602:Yes)、各キーワードの文字列を連結して(ステップS2603)、ステップS2604に移行する。
このあと、ステップS2604において、検索キーワード内に連字データがない場合(ステップS2604:No)、ステップS2606に移行する。一方、連字データがある場合(ステップS2604:Yes)、連字/外字置換テーブル240を用いて、その連字データを2文字の外字データに置換して(ステップS2605)、ステップS2606に移行する。
このあと、ステップS2606において、検索キーワードを単一文字データに分解して、出現マップから各文字データの各本文HTMLファイルにおける存否フラグ列を読み取る(ステップS2606)。そして、各文字データの存否フラグ列の論理積により、圧縮ファイルを特定(絞込み)する(ステップS2607)。また、検索キーワードを検索初期化処理(ステップS2103)において生成されたハフマン木で圧縮し(ステップS2608)、ファイルカウンタを初期化する(ステップS2609)。
このあと、ステップS2607で特定された圧縮ファイル(特定圧縮ファイル)をオープンし(ステップS2610)、オープンされた特定圧縮ファイルの圧縮ブロックデータに、圧縮検索キーワードとの一致判定をおこなう(ステップS2611)。不一致である場合(ステップS2612:No)、ステップS2615に移行する。
一方、一致する場合(ステップS2612:Yes)、当該圧縮ブロックデータを、ハフマン木を用いて伸長する(ステップS2613)。そして、伸長されたブロックデータと検索キーワードとを比較し、検索キーワードに一致した項目データのファイル番号およびアンカーを記録して(ステップS2614)、ステップS2615に移行する。
このあと、ステップS2615において、オープンしている特定圧縮ファイルをクローズし(ステップS2615)、ファイルカウンタを更新する(ステップS2616)。ファイルカウンタの更新により、未処理の特定圧縮ファイルがあると判断された場合(ステップS2617:Yes)、ステップS2610に移行して、つぎの特定圧縮ファイルをオープンする。
一方、未処理の特定圧縮ファイルがないと判断された場合(ステップS2617:No)、検索候補一覧を表示し(ステップS2618)、ユーザからの選択入力を待ち受ける(ステップS2619)ことにより、検索結果表示処理(ステップS2105)に移行して、一連の処理を終了する。
このように、上述した実施の形態1によれば、コンテンツ210が複数の検索対象ファイルから構成されていても、単一の圧縮情報(文字出現頻度管理データ230)により共通化することができる。
また、サイズが大きい検索対象ファイルでは文字データ数に応じてブロック化をおこない、8ビットコード、16ビットコードまたは32ビットコードの文字データが混在する検索対象ファイルについてのハフマン圧縮技術を確立することができる。
また、サイズ(容量)ではなく、文字データ数に応じたブロック化をおこない、検索対象ファイル内の各文字データの出現頻度の集計時に、文字データの種類(8ビットコード、16ビットコードまたは32ビットコード)を判定し、出現頻度を集計することができる。
また、英和辞典での英字データなど出現頻度の高い8ビットコードの文字データに対しては、0x’FF**’など16ビットコードの文字データに置換し、ハフマン圧縮をおこなう。これにより、低出現率の8ビットコードの文字データと区別して、効率的な圧縮をおこなうことができる。
また、ポインタなどの非文字データはランダムな値であるため、8ビットコードに置換する。また、ハフマン木のサイズ縮小のため、出現頻度の低い16ビットコードの文字データを分割し、8ビットコードの文字データに置換する。これにより、効率的な圧縮をおこなうことができる。
また、上述した実施の形態では、圧縮のためのハフマン木の生成元である文字出現頻度管理データ230またはその一部を暗号化する。すなわち、コンテンツや、コンテンツ圧縮のためのハフマン木を直接暗号化せず、ハフマン木の生成元を暗号化しているため、セキュリティの向上を図ることができる。
また、上述した実施の形態では、文字出現頻度管理データをもとに、全文検索の高速化を図ることができる。また、連続する表音文字データの出現頻度の高い2文字の連字データを外字データに置換した後、コンテンツ圧縮をおこなっているため、圧縮率の向上を図ることができる。
また、連字データにより、オープン/クローズするファイル数を削減することができ、文字列の比較領域の縮小により全文検索の高速化を図ることができる。さらに、全文検索は伸長後に外字データのままで文字列比較を行うことで、さらに検索速度の向上を図ることができる。
このように、この実施の形態1によれば、圧縮処理について、文字出現頻度管理データ(ハフマン木)の共通化により、各検索対象ファイルの圧縮率の向上を図ることができる。また、圧縮された検索対象ファイルをブロック毎に伸長することで、圧縮されたままで検索や表示をおこなうことができ、検索速度の向上を図ることができる。また、ポインタなど非文字コードであるバイナリデータとテキストデータが混在するファイルも圧縮することができる。
また、低出現頻度の文字データをカットしてハフマン木を生成することにより、ハフマン木を縮小することができる。したがって、使用メモリサイズが削減でき、PDAや携帯電話機などの可搬型携帯端末においても利用することができる。また、2パスのハフマン圧縮であるため、他の方式に比べ、最高速な圧縮と伸長が実現することができる。また、ハフマン圧縮の圧縮率は約50%であり、伸長速度は他の圧縮方式に比べ最高速となる。
また、暗号化処理においては、ハフマン木の生成元を暗号化しているため、全文検索や表示などにおいて、復号化が不要である。したがって、セキュリティの向上を図るとともに検索速度の向上も図ることができる。また、暗号化の領域も文字出現頻度管理データだけ(全体の1%未満)であり、で暗号化の処理時間を短くできるとともに、復号化もハフマン木の作成時の1回で済ませることができる。したがって、復号化処理が検索速度の妨げにならず、セキュリティの向上を図るとともに検索速度の向上も図ることができる。
また、全文検索処理においては、オープン/クローズする検索対象ファイルの数を削減し、文字列の比較領域を縮小することにより、全文検索の高速化を図ることができる。また、検索速度の高速化のために付加する全文検索のための出現マップは数%以下であるため、全文検索のための出現マップの生成は、ファイル圧縮時間相当の短時間でおこなうことができる。また、英数字や仮名・カタカナなどの表音文字データが混在していても、圧縮効率と全文検索速度を改善することができる。
また、文字出現頻度管理データにより、検索キーワードの文字を含まない検索対象ファイルのオープンを省くことができ、全文検索時のオープン・クローズ時間の削減、および文字列の比較領域の縮小による全文検索速度の高速化を図ることができる。具体的には、本文ファイル容量の数%の文字出現頻度管理データにより、検索対象ファイルのオープンと文字列比較を抑えることができ、数倍(表音文字2文字の検索)〜数百倍(漢字3文字の検索)の高速化を図ることができる。特に検索キーワードの文字数が多ければ多いほど、検索キーワードの文字を含まない検索対象ファイル数が増大して、そのオープンを省くことができるため、全文検索時のオープン・クローズ時間の削減、および文字列の比較領域の縮小による全文検索速度の高速化を図ることができる。
また、ミニSDやHDに格納される出現マップ904を、特殊なハフマン木を用いて効率的に圧縮する。この特殊なハフマン木には、4ビット系の通常のハフマン木にさらに4ビットバウンダリのNULL連続記号列が追加されているため、携帯電話機などのモバイル端末に実装される低速CPUや少メモリにおいて、高速な圧縮/伸長を実現することができる。
また、文字データごとの出現率を圧縮パラメータとすることにより、出現率に応じたハフマン木を選択することができる。すなわち、出現率が低いほど特殊記号列が長い特殊なハフマン木を選択することができる。一方、出現率が高いほど特殊なハフマン木よりも通常のハフマン木を選択することができる。したがって、出現マップ904の圧縮効率の向上を図ることができる。
さらに、圧縮効率の悪い分割領域については、ハフマン木を割り振らず非圧縮とすることにより、無駄な圧縮処理を防止することができ、圧縮速度の高速化を図ることができる。また、分割領域を出現確率50%を境界として対称とすることにより、ハフマン木の容量を半減することができる。したがって、省メモリ化を実現することができる。
[実施の形態2]
つぎに、実施の形態2について説明する。実施の形態1では、文字データごとの出現率を圧縮パラメータとすることにより、出現率に応じたハフマン木を選択することとした。実施の形態2では、図16−1に示した出現率に応じた領域分割を見直し、文字出現頻度管理データ230内の出現マップ904の圧縮率のさらなる向上を実現する。すなわち、出現マップ904においては、文字の存否をあらわすビットの値が「1」であるケースはまれで、ほとんどが「0」である。実施の形態2では、実施の形態1と同様、0が大多数を示すビット列を含む出現マップ904を効率よく圧縮する。
(領域分割の見直し)
図27は、分割領域の見直しを示す図表である。実施の形態1では、厳密には、A領域〜I領域まで存在する。H領域内の出現率となる文字が最も多いため、アクセス頻度も高くなる。したがって、H領域に存在する文字の出現ビット列の圧縮率が改善されると、高圧縮を図ることができる。したがって、実施の形態2では、実施の形態1のB,C領域を統合してあらたなB領域、D,E領域を統合してあらたなC領域、F,G領域を統合してあらたなD領域、H,I領域を統合してあらたなE領域とする。これにより、図16−2に示した出現マップ904の領域フィールドも、あらたな領域とする。
また、実施の形態2では、B領域では葉が16種類のハフマン木(通常のハフマン木)、C領域では葉が16+1種類(16個連続する0)の特殊ハフマン木、D領域では葉が16+2種類(16個連続する0と64個連続する0)の特殊ハフマン木、E領域では葉が16+3種類(16個連続する0と64個連続する0と256個連続する0)の特殊ハフマン木となる。
図28は、1検索対象ファイル内における文字データの出現確率を示す説明図である。図28において、縦軸は、1検索対象ファイル内における文字データの出現確率を示しており、上が出現確率0%、下が出現確率100%である。この出現確率の範囲0〜100%を対数的に分割する。すなわち、確率が等しくなるように領域の上下2分割を繰り返すことにより、出現率の範囲を区画する分割領域が形成される。なお、左側が、実施の形態1相当の出現確率を示す分割領域群であり、右側が実施の形態2の出現確率を示す分割領域群である。
この分割により、実施の形態2(図28中、右側)では、出現率をrとすると、0≦r<1/256がE領域、1/256≦r<1/64がD領域、1/64≦r<1/16がC領域、1/16≦r<1/4がB領域、1/4≦r<1/2がA領域、1/2≦r<3/4がA’領域、3/4≦r<15/16がB’領域、15/16≦r<63/64がC’領域、63/64≦r<255/256がD’領域、255/256≦r≦1がE’領域となる。
なお、同一アルファベットを付した領域の出現率は同一である。すなわち、出現確率50%を境界として領域幅と出現確率が上下対称となっている。たとえば、A領域およびA’領域の出現率はともに1/4である。なお、ある辞書コンテンツの1文字の平均出現率は、0.077であることがわかっているため、領域Cに属することとなる。
また、実施の形態2におけるA’領域〜E’領域も実施の形態1と同様、A領域〜E領域に対して0と1が反転する。以降、実施の形態2では、A領域〜E領域についてのみハフマン木とその圧縮伸長処理について説明するが、A’領域〜E’領域は、0と1が反転されたものとして読み替える。また、以降、特に断りがない限り、本実施の形態2において、A領域(A’領域),…,E領域(E’領域)と表記した場合は、実施の形態2における分割領域を示すものとする。
(分割領域のハフマン木の基本構成)
つぎに、各分割領域B〜Eにおけるハフマン木の基本構成について説明する。本実施の形態2では、特殊ハフマン木として、実施の形態1で示した2分枝のハフマン木ではなく、2n分枝(n=2,3,…)のハフマン木を用いる。実施の形態1は、n=1のハフマン木である。実施の形態2では一例として、n=4、すなわち、16分枝ハフマン木を用いて説明する。
16分枝ハフマン木は、根から16本の枝に分岐して直接、葉にポイントする構造である。葉となる伸長コードは「0000」〜「1111」までの16種類存在するが、単純に枝ごとに割り振るのではなく、伸長コードの出現率に応じて割り振る点が特徴的である。すなわち、根から出る16本の枝のうち、2本は節点をポイントすることとし、この2個の節点がさらに16本の枝により16個の葉をポイントする構造とする。以下、分割領域ごとに説明する。まず、B領域について説明する。
図29−1は、B領域における伸長コードとハフマン木の枝との関係を示す図表である。図29−1では、伸長コードの種別ごとに、個数、出現率、補正(補正後の出現率)、圧縮符号長、枝との関係を示している。補正後の出現率が高いほど圧縮符号長が短くなるように設定する。本例では、伸長コード「0000」は補正後の出現率50%であるため、圧縮符号長が「1」となる。また、枝との関係は、補正後の出現率に応じて決められる。伸長コード「0000」は補正後の出現率50%であるため、根からの16本の枝のうち50%に相当する8本の枝を専有する。
「1」が1個の「0001」、「0010」、「0100」、「1000」の4種の伸長コードは、根からの16本の枝のうち25%に相当する4本の枝を専有する。4種類の伸長コードで4本の枝を専有するため、個々の伸長コードでは、1個の枝を専有することとなる。
また、「1」が2個の「0011」、…、「1100」の6種の伸長コードは、根からの16本の枝のうち10%に相当する1本の枝を専有する。伸長コードが6種に対して根からの枝が1本なので、節点を介して葉にポイントする。「1」が3個の「0111」」、…、「1110」の4種の伸長コード、「1」が4個の伸長コード「1111」は、さらに出現率が低いため、節点を介して葉にポイントする。
図29−2は、B領域におけるハフマン木を示す説明図である。図29−2中、B領域ハフマン木2900において、○図形は、節点(根または内部節点)をあらわしており、□図形は、葉をあらわしている。○図形内に「根」の文字がある図形は、根をあらわしている。また、○図形および□図形内の文字0〜F(16進表記)は、葉/節点に固有の番号#である。以降、葉については、L(#)と表記し、内部節点(略して「節点」とする)については、N(#)と表記する。また、根から直接ポイントされる葉や節点は、L(#)やN(#)となり、節点を介してポイントされる葉は、L(##)とする。以降の他の図の説明においても同様である。
B領域ハフマン木2900では、根から直接ポイントされる葉L(0)〜L(7)に伸長コード「0000」が割り当てられる。また、葉L(8)、L(9)は空き領域である。また、葉L(A)には伸長コード「0001」、葉L(B)には伸長コード「0010」、葉L(C)には伸長コード「0100」、葉L(D)には伸長コード「1000」が割り当てられる。
また、B領域ハフマン木2900では、節点N(E)からポイントされる葉L(E0)〜L(E3)に伸長コード「0011」、葉L(E4)〜L(E7)に伸長コード「0101」、葉L(E8)〜L(EB)に伸長コード「0110」、葉L(EC)〜L(EF)に伸長コード「1001」が割り当てられる。
また、B領域ハフマン木2900では、節点N(F)からポイントされる葉L(F0)〜L(F3)に伸長コード「1010」、葉L(F4)〜L(F7)に伸長コード「1100」、葉L(F8)に伸長コード「0111」、葉L(F9)に伸長コード「1011」、葉L(FA)に伸長コード「1101」、葉L(FB)に伸長コード「1110」、葉L(FC)に伸長コード「1111」が割り当てられる。なお、葉L(FD)〜葉L(FF)は空き領域である。
図29−3は、B領域ハフマン木2900における伸長コードと圧縮符号と葉の番号の対応関係を示す伸長コード/圧縮符号テーブルを示す説明図である。伸長コード/圧縮符号テーブル2901において、伸長コード「0000」の圧縮符号は「0」である。伸長コード「0000」は、最も出現確率が高いため(図29−1を参照)、8個の葉の番号0〜7(16進表記。2進表記では、0000〜0111)が割り当てられている。この8個の葉の番号は、先頭の記号「0」が圧縮符号「0」であり、後続の記号列「001」〜「111」は固有の記号列となる。これにより、伸長する際に、圧縮符号列「0000」〜「0111」が抽出された場合、いずれの圧縮符号列「0000」〜「0111」も伸長コード「0000」に変換される。なお、圧縮符号列の下位3桁「001」〜「111」は、再度伸長対象となる。
また、伸長コード「0001」などのように、出現確率が低い伸長コードは、葉の番号と一対一対応である。すなわち、葉の番号は1つのみ割り当てられる。したがって、伸長する際に、当該伸長コードと一対一対応の葉の番号が圧縮符号列から抽出された場合に、当該伸長コードに変換されることとなる。
このように、伸長コード/圧縮符号テーブル2901では、単一の葉の番号に対して当該葉の番号に固有な圧縮符号が割り当てられた伸長コード(「0001」,「0010」など)と、複数の葉の番号に対して当該複数の葉の番号に共通する記号を含む固有な圧縮符号が割り当てられ伸長コード(「0000」,「0000…0」(16個の0),0011など)が存在することとなる。すなわち、出現率の高い伸長コードほどハフマン木の葉を多く、かつ、上位ビットに圧縮符号を含むように複数の葉の番号が割り当てられるように設定したため、圧縮処理や伸長処理の効率化を図ることができる。つぎに、C領域について説明する。
図30−1は、C領域における伸長コードと特殊ハフマン木の枝との関係を示す図表である。図30−1の図表は、図29−1の図表に、伸長コード「0000…0」(16個の0)に関するフィールドが追加された図表である。伸長コード「0000…0」(16個の0)については、補正後の出現率約13%であるため、根からの16本の枝のうち、12.5%に相当する2本の枝を専有する。
図30−2は、C領域におけるハフマン木を示す説明図である。C領域ハフマン木3000は、B領域ハフマン木2900において空き領域であった葉L(8)、L(9)に伸長コード「0000…0」(16個の0)が割り当てられる。
図30−3は、C領域ハフマン木3000における伸長コードと圧縮符号と葉の番号の対応関係を示す伸長コード/圧縮符号テーブルを示す説明図である。伸長コード/圧縮符号テーブル3001において、伸長コード「0000」の圧縮符号は「0」である。伸長コード「0000」は、最も出現確率が高いため(図30−1を参照)、8個の葉の番号0〜7(16進表記。2進表記では、0000〜0111)が割り当てられている。この8個の葉の番号は、先頭の記号「0」が圧縮符号「0」であり、後続の記号列「001」〜「111」は固有の記号列となる。これにより、伸長する際に、圧縮符号列「0000」〜「0111」が抽出された場合、いずれの圧縮符号列「0000」〜「0111」も伸長コード「0000」に変換される。なお、圧縮符号列の下位3桁「001」〜「111」は、再度伸長対象となる。
同様に、伸長コード「0000…0」(16個の0)の圧縮符号は「100」である。伸長コード「0000…0」(16個の0)も出現確率が高いため(図30−1を参照)、2個の葉の番号8,9(16進表記。2進表記では、1000〜1001)が割り当てられている。この2個の葉の番号は、先頭からの記号列「100」が圧縮符号「100」であり、後続の記号「0」,「1」は固有の記号列となる。これにより、伸長する際に、圧縮符号列「1000」または「1001」が抽出された場合、いずれの圧縮符号列「1000」,「1001」も伸長コード「0000…0」(16個の0)に変換される。なお、圧縮符号列の下位1桁「0」,「1」は、再度伸長対象となる。
また、伸長コード「0001」などのように、出現確率が低い伸長コードは、葉の番号と一対一対応である。すなわち、葉の番号は1つのみ割り当てられる。したがって、伸長する際に、当該伸長コードと一対一対応の葉の番号が圧縮符号列から抽出された場合に、当該伸長コードに変換されることとなる。
このように、伸長コード/圧縮符号テーブル3001では、単一の葉の番号に対して当該葉の番号に固有な圧縮符号が割り当てられた伸長コード(「0001」,「0010」など)と、複数の葉の番号に対して当該複数の葉の番号に共通する記号を含む固有な圧縮符号が割り当てられ伸長コード(「0000」,「0000…0」(16個の0),0011など)が存在することとなる。すなわち、出現率の高い伸長コードほどハフマン木の葉を多く、かつ、上位ビットに圧縮符号を含むように複数の葉の番号が割り当てられるように設定したため、圧縮処理や伸長処理の効率化を図ることができる。つぎに、D領域について説明する。
図31−1は、D領域における伸長コードと特殊ハフマン木の枝との関係を示す図表である。D領域では、さらに、伸長コード「0000…0」(64個の0)が葉として追加される。D領域では、各伸長コードの出現率がB領域やC領域と異なるため、割りあたる枝や本数も異なる。
図31−2は、D領域におけるハフマン木を示す説明図である。D領域ハフマン木3100は、図31−1の枝との関係にしたがって構成される。D領域ハフマン木3100では、根から直接ポイントされる葉L(0)〜L(7)に伸長コード「0000」が割り当てられる。また、葉L(8)〜L(B)に伸長コード「0000…0」(16個の0)が割り当てられる。また、葉L(C)およびL(D)には伸長コード「0000…0」(64個の0)が割り当てられる。
また、D領域ハフマン木3100では、節点N(E)からポイントされる葉L(E0)〜L(E3)に伸長コード「0001」、葉L(E4)〜L(E7)に伸長コード「0010」、葉L(E8)〜L(EB)に伸長コード「0100」、葉L(EC)〜L(EF)に伸長コード「1000」が割り当てられる。
また、D領域ハフマン木3100では、節点N(F)からポイントされる葉L(F0)に伸長コード「0011」、葉L(F1)に伸長コード「0101」、葉L(F2)に伸長コード「0110」、葉L(F3)に伸長コード「1001」、葉L(F4)に伸長コード「1010」、葉L(F5)に伸長コード「1100」、葉L(F6)に伸長コード「0111」、葉L(F7)に伸長コード「1011」、葉L(F8)に伸長コード「1101」、葉L(F9)に伸長コード「1110」、葉L(FA)に伸長コード「1111」が割り当てられる。なお、葉L(FB)〜葉L(FF)は空き領域である。
図31−3は、D領域ハフマン木3100における伸長コードと圧縮符号と葉の番号の対応関係を示す伸長コード/圧縮符号テーブルを示す説明図である。伸長コード/圧縮符号テーブル3101において、伸長コード「0000」の圧縮符号は「0」である。伸長コード「0000」は、最も出現確率が高いため(図31−1を参照)、8個の葉の番号0〜7(16進表記。2進表記では、0000〜0111)が割り当てられている。この8個の葉の番号は、先頭の記号「0」が圧縮符号「0」であり、後続の記号列「001」〜「111」は固有の記号列となる。これにより、伸長する際に、圧縮符号列「0000」〜「0111」が抽出された場合、いずれの圧縮符号列「0000」〜「0111」も伸長コード「0000」に変換される。なお、圧縮符号列の下位3桁「001」〜「111」は、再度伸長対象となる。
同様に、伸長コード「0000…0」(16個の0)の圧縮符号は「10」である。伸長コード「0000…0」(16個の0)も出現確率が高いため(図31−1を参照)、4個の葉の番号8〜B(16進表記。2進表記では、1000〜1011)が割り当てられている。この4個の葉の番号は、先頭からの記号列「10」が圧縮符号「10」であり、後続の記号「00」〜「11」は固有の記号列となる。これにより、伸長する際に、圧縮符号列「1000」〜「1011」が抽出された場合、いずれの圧縮符号列「1000」〜「1011」も伸長コード「0000…0」(16個の0)に変換される。なお、圧縮符号列の下位2桁「00」〜「11」は、再度伸長対象となる。
また、伸長コード「0011」などのように、出現確率が低い伸長コードは、葉の番号と一対一対応である。すなわち、葉の番号は1つのみ割り当てられる。したがって、伸長する際に、当該伸長コードと一対一対応の葉の番号が圧縮符号列から抽出された場合に、当該伸長コードに変換されることとなる。
このように、伸長コード/圧縮符号テーブル3101では、単一の葉の番号に対して当該葉の番号に固有な圧縮符号が割り当てられた伸長コード(「0011」,「0101」など)と、複数の葉の番号に対して当該複数の葉の番号に共通する記号を含む固有な圧縮符号が割り当てられ伸長コード(「0000」,「0000…0」(16個の0),「0000…0」(64個の0),0011など)が存在することとなる。すなわち、出現率の高い伸長コードほどハフマン木の葉を多く、かつ、上位ビットに圧縮符号を含むように複数の葉の番号が割り当てられるように設定したため、圧縮処理や伸長処理の効率化を図ることができる。つぎに、E領域について説明する。
図32−1は、E領域における伸長コードと特殊ハフマン木の枝との関係を示す図表である。E領域では、さらに、伸長コード「0000…0」(256個の0)が葉として追加される。E領域では、各伸長コードの出現率がB領域〜D領域と異なるため、割りあたる枝や本数も異なる。
図32−2は、E領域におけるハフマン木を示す説明図である。E領域ハフマン木3200は、図32−1の枝との関係にしたがって構成される。E領域ハフマン木3200では、根から直接ポイントされる葉L(0)〜L(7)に伸長コード「0000」が割り当てられる。また、葉L(8)〜L(B)に伸長コード「0000…0」(16個の0)が割り当てられる。また、葉L(C)およびL(D)には伸長コード「0000…0」(64個の0)が割り当てられる。また、葉L(E)には伸長コード「0000…0」(256個の0)が割り当てられる。
また、E領域ハフマン木3200では、節点N(F)からポイントされる葉L(F0)に伸長コード「0001」、葉L(F1)に伸長コード「0010」、葉L(F2)に伸長コード「0100」、葉L(F3)に伸長コード「1000」、葉L(F4)に伸長コード「0011」、葉L(F5)に伸長コード「0101」、葉L(F6)に伸長コード「0110」、葉L(F7)に伸長コード「1001」、葉L(F8)に伸長コード「1010」、葉L(F9)に伸長コード「1100」、葉L(FA)に伸長コード「0111」、葉L(FB)に伸長コード「1011」、葉L(FC)に伸長コード「1101」、葉L(FD)に伸長コード「1110」、葉L(FE)に伸長コード「1111」が割り当てられる。なお、葉L(FF)は空き領域である。
図32−3は、E領域ハフマン木3200における伸長コードと圧縮符号と葉の番号の対応関係を示す伸長コード/圧縮符号テーブル3201を示す説明図である。伸長コード/圧縮符号テーブル3201において、伸長コード「0000」の圧縮符号は「0」である。伸長コード「0000」は、最も出現確率が高いため(図31−1を参照)、8個の葉の番号0〜7(16進表記。2進表記では、0000〜0111)が割り当てられている。この8個の葉の番号は、先頭の記号「0」が圧縮符号「0」であり、後続の記号列「001」〜「111」は固有の記号列となる。これにより、伸長する際に、圧縮符号列「0000」〜「0111」が抽出された場合、いずれの圧縮符号列「0000」〜「0111」も伸長コード「0000」に変換される。なお、圧縮符号列の下位3桁「001」〜「111」は、再度伸長対象となる。
同様に、伸長コード「0000…0」(16個の0)の圧縮符号は「10」である。伸長コード「0000…0」(16個の0)も出現確率が高いため(図31−1を参照)、4個の葉の番号8〜B(16進表記。2進表記では、1000〜1011)が割り当てられている。この4個の葉の番号は、先頭からの記号列「10」が圧縮符号「10」であり、後続の記号「00」〜「11」は固有の記号列となる。これにより、伸長する際に、圧縮符号列「1000」〜「1011」が抽出された場合、いずれの圧縮符号列「1000」〜「1011」も伸長コード「0000…0」(16個の0)に変換される。なお、圧縮符号列の下位2桁「00」〜「11」は、再度伸長対象となる。
また、伸長コード「0000…0」(256個の0),「0001」などのように、出現確率が低い伸長コードは、葉の番号と一対一対応である。すなわち、葉の番号は1つのみ割り当てられる。したがって、伸長する際に、当該伸長コードと一対一対応の葉の番号が圧縮符号列から抽出された場合に、当該伸長コードに変換されることとなる。
このように、伸長コード/圧縮符号テーブル3201では、単一の葉の番号に対して当該葉の番号に固有な圧縮符号が割り当てられた伸長コード(「0000…0」(256個の0),「0001」など)と、複数の葉の番号に対して当該複数の葉の番号に共通する記号を含む固有な圧縮符号が割り当てられ伸長コード(「0000」,「0000…0」(16個の0),「0000…0」(64個の0))が存在することとなる。すなわち、出現率の高い伸長コードほどハフマン木の葉を多く、かつ、上位ビットに圧縮符号を含むように複数の葉の番号が割り当てられるように設定したため、圧縮処理や伸長処理の効率化を図ることができる。
(ハフマン木の圧縮用の構造体)
上述したB領域ハフマン木〜E領域ハフマン木2900〜3200は、それぞれ圧縮用の構造体と伸長用の構造体を持つ。まずは、分割領域ごとに圧縮用の構造体について説明する。圧縮用の構造体は圧縮時に使用される。圧縮用の構造体の基本構成は、ヘッダ領域と葉の領域である。
図33は、B領域ハフマン木2900の圧縮用の構造体を示す説明図である。B領域ハフマン木2900の圧縮用の構造体(以下、「B領域圧縮用構造体」と略す。)3300は、ヘッダ領域3301と葉の領域3302を有する。ヘッダ領域3301には、分割領域ID(=B)が格納されている。葉の領域3302には、図29−3に示した伸長コード/圧縮符号テーブル2901が格納されている。
図34は、C領域ハフマン木3000の圧縮用の構造体を示す説明図である。C領域ハフマン木3000の圧縮用の構造体(以下、「C領域圧縮用構造体」と略す。)3400は、ヘッダ領域3401と葉の第1領域3402と葉の第2領域3403を有する。ヘッダ領域3401には、分割領域ID(=C)が格納されている。
葉の第1領域3402には、図30−3に示した伸長コード/圧縮符号テーブル3001のうち、伸長コード「0000」〜「1111」とその圧縮符号長および圧縮符号からなる部分テーブル3411が格納されている。葉の第2領域3403には、図30−3に示した伸長コード/圧縮符号テーブル3001のうち、伸長コード「0000…0」(16個の0)とその圧縮符号長および圧縮符号からなる部分テーブル3412が格納されている。
図35は、D領域ハフマン木3100の圧縮用の構造体を示す説明図である。D領域ハフマン木3100の圧縮用の構造体(以下、「D領域圧縮用構造体」と略す。)3500は、ヘッダ領域3501と葉の第1領域3502と葉の第2領域3503を有する。ヘッダ領域3501には、分割領域ID(=D)が格納されている。
葉の第1領域3502には、図31−3に示した伸長コード/圧縮符号テーブル3101のうち、伸長コード「0000」〜「1111」とその圧縮符号長および圧縮符号からなる部分テーブル3511が格納されている。葉の第2領域3503には、図31−3に示した伸長コード/圧縮符号テーブル3101のうち、伸長コード「0000…0」(16個の0)とその圧縮符号長および圧縮符号と伸長コード「0000…0」(64個の0)とその圧縮符号長および圧縮符号とからなる部分テーブル3512が格納されている。
図36は、E領域ハフマン木3200の圧縮用の構造体を示す説明図である。E領域ハフマン木3200の圧縮用の構造体(以下、「E領域圧縮用構造体」と略す。)3600は、ヘッダ領域3601と葉の第1領域3602と葉の第2領域3603を有する。ヘッダ領域3601には、分割領域ID(=E)が格納されている。
葉の第1領域3602には、図32−3に示した伸長コード/圧縮符号テーブル3201のうち、伸長コード「0000」〜「1111」とその圧縮符号長および圧縮符号からなる部分テーブル3611が格納されている。葉の第2領域3603には、図32−3に示した伸長コード/圧縮符号テーブル3201のうち、伸長コード「0000…0」(16個の0)とその圧縮符号長および圧縮符号と伸長コード「0000…0」(64個の0)とその圧縮符号長および圧縮符号と伸長コード「0000…0」(256個の0)とその圧縮符号長および圧縮符号とからなる部分テーブル3612が格納されている。
(ハフマン木の伸長用の構造体)
つぎに、伸長用の構造体について説明する。伸長用の構造体は伸長時に使用される。伸長用の構造体の基本構成は、ヘッダ領域、根領域、節点領域、葉の領域である。
図37−1は、B領域ハフマン木2900の伸長用の構造体を示す説明図である。B領域ハフマン木2900の伸長用の構造体(以下、「B領域伸長用構造体」と略す。)3700は、ヘッダ領域3701と根領域3702と第1節点領域3703と第2節点領域3704と葉の領域3705を有する。ヘッダ領域3701には、分割領域ID(=B)が格納されている。
図37−2は、B領域伸長用構造体3700の根領域3702の記憶内容を示す説明図である。根領域3702には、節点/葉識別フラグと、節点サイズと、葉/節点の番号ごとのポインタとが格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。根であるため、節点/葉識別フラグは「0」である。節点サイズは、その節点(この場合は、根)からの枝の本数をあらわす。
図37−3は、B領域伸長用構造体3700の第1節点領域3703の記憶内容を示す説明図である。第1節点領域3703には、節点/葉識別フラグと、節点サイズと、葉の番号ごとのポインタとが格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。節点N(E)であるため、節点/葉識別フラグは「0」である。節点サイズは、その節点(この場合は、節点N(E))からの枝の本数をあらわす。
図37−4は、B領域伸長用構造体3700の第2節点領域3704の記憶内容を示す説明図である。第2節点領域3704には、節点/葉識別フラグと、節点サイズと、葉の番号ごとのポインタとが格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。節点N(F)であるため、節点/葉識別フラグは「0」である。節点サイズは、その節点(この場合は、節点N(F))からの枝の本数をあらわす。
図37−5は、B領域伸長用構造体3700の葉の領域3705の記憶内容を示す説明図である。葉の領域3705には、節点/葉識別フラグと、葉種別フラグと、葉の番号に応じた伸長コードと圧縮符号長が格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。葉であるため、節点/葉識別フラグは「1」である。葉種別フラグは、その葉となる伸長コードが、「0000」〜「1111」の16種の葉(=0)であるか、「0000…0」(16、64、256個の0)の3種類の葉(=1)であるかを識別するフラグである。
図38−1は、C領域ハフマン木3000の伸長用の構造体を示す説明図である。C領域ハフマン木3000の伸長用の構造体(以下、「C領域伸長用構造体」と略す。)3800は、ヘッダ領域3801と根領域3802と第1節点領域3803と第2節点領域3804と葉の第1領域3805と葉の第2領域3806を有する。ヘッダ領域3801には、分割領域ID(=C)が格納されている。
図38−2は、C領域伸長用構造体3800の根領域3802の記憶内容を示す説明図である。根領域3802には、節点/葉識別フラグと、節点サイズと、葉/節点の番号ごとのポインタとが格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。根であるため、節点/葉識別フラグは「0」である。節点サイズは、その節点(この場合は、根)からの枝の本数をあらわす。
図38−3は、C領域伸長用構造体3800の第1節点領域3803の記憶内容を示す説明図である。第1節点領域3803には、節点/葉識別フラグと、節点サイズと、葉の番号ごとのポインタとが格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。節点N(E)であるため、節点/葉識別フラグは「0」である。節点サイズは、その節点(この場合は、節点N(E))からの枝の本数をあらわす。
図38−4は、C領域伸長用構造体3800の第2節点領域3804の記憶内容を示す説明図である。第2節点領域3804には、節点/葉識別フラグと、節点サイズと、葉の番号ごとのポインタとが格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。節点N(F)であるため、節点/葉識別フラグは「0」である。節点サイズは、その節点(この場合は、節点N(F))からの枝の本数をあらわす。
図38−5は、C領域伸長用構造体3800の葉の第1領域3805の記憶内容を示す説明図である。葉の第1領域3805には、節点/葉識別フラグと、葉種別フラグと、葉の番号に応じた伸長コードと圧縮符号長が格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。葉であるため、節点/葉識別フラグは「1」である。葉種別フラグは、その葉となる伸長コードが、「0000」〜「1111」の16種の葉(=0)であるか、「0000…0」(16、64、256個の0)の3種類の葉(=1)であるかを識別するフラグである。葉の第1領域3805なので、葉種別フラグは「0」である。
図38−6は、C領域伸長用構造体3800の葉の第2領域3806の記憶内容を示す説明図である。第2領域3806には、節点/葉識別フラグと、葉種別フラグと、葉の番号に応じた伸長コードと圧縮符号長が格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。葉であるため、節点/葉識別フラグは「1」である。葉種別フラグは、その葉となる伸長コードが、「0000」〜「1111」の16種の葉(=0)であるか、「0000…0」(16、64、256個の0)の3種類の葉(=1)であるかを識別するフラグである。葉の第2領域3806なので、葉種別フラグは「1」である。
図39−1は、D領域ハフマン木3100の伸長用の構造体を示す説明図である。D領域ハフマン木3100の伸長用の構造体(以下、「D領域伸長用構造体」と略す。)3900は、ヘッダ領域3901と根領域3902と第1節点領域3903と第2節点領域3904と葉の第1領域3905と葉の第2領域3906を有する。ヘッダ領域3901には、分割領域ID(=D)が格納されている。
図39−2は、D領域伸長用構造体3900の根領域3902の記憶内容を示す説明図である。根領域3902には、節点/葉識別フラグと、節点サイズと、葉/節点の番号ごとのポインタとが格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。根であるため、節点/葉識別フラグは「0」である。節点サイズは、その節点(この場合は、根)からの枝の本数をあらわす。
図39−3は、D領域伸長用構造体3900の第1節点領域3903の記憶内容を示す説明図である。第1節点領域3903には、節点/葉識別フラグと、節点サイズと、葉の番号ごとのポインタとが格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。節点N(E)であるため、節点/葉識別フラグは「0」である。節点サイズは、その節点(この場合は、節点N(E))からの枝の本数をあらわす。
図39−4は、D領域伸長用構造体3900の第2節点領域3904の記憶内容を示す説明図である。第2節点領域3904には、節点/葉識別フラグと、節点サイズと、葉の番号ごとのポインタとが格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。節点N(F)であるため、節点/葉識別フラグは「0」である。節点サイズは、その節点(この場合は、節点N(F))からの枝の本数をあらわす。
図39−5は、D領域伸長用構造体3900の葉の第1領域3905の記憶内容を示す説明図である。葉の第1領域3905には、節点/葉識別フラグと、葉種別フラグと、葉の番号に応じた伸長コードと圧縮符号長が格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。葉であるため、節点/葉識別フラグは「1」である。葉種別フラグは、その葉となる伸長コードが、「0000」〜「1111」の16種の葉(=0)であるか、「0000…0」(16、64、256個の0)の3種類の葉(=1)であるかを識別するフラグである。葉の第1領域3905なので、葉種別フラグは「0」である。
図39−6は、D領域伸長用構造体3900の葉の第2領域3906の記憶内容を示す説明図である。第2領域3906には、節点/葉識別フラグと、葉種別フラグと、葉の番号に応じた伸長コードと圧縮符号長が格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。葉であるため、節点/葉識別フラグは「1」である。葉種別フラグは、その葉となる伸長コードが、「0000」〜「1111」の16種の葉(=0)であるか、「0000…0」(16、64、256個の0)の3種類の葉(=1)であるかを識別するフラグである。葉の第2領域3906なので、葉種別フラグは「1」である。
図40−1は、E領域ハフマン木3200の伸長用の構造体を示す説明図である。E領域ハフマン木3200の伸長用の構造体(以下、「E領域伸長用構造体」と略す。)4000は、ヘッダ領域4001と根領域4002と節点領域4003と葉の第1領域4004と葉の第2領域4005を有する。ヘッダ領域4001には、分割領域ID(=E)が格納されている。
図40−2は、E領域伸長用構造体4000の根領域4002の記憶内容を示す説明図である。根領域4002には、節点/葉識別フラグと、節点サイズと、葉/節点の番号ごとのポインタとが格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。根であるため、節点/葉識別フラグは「0」である。節点サイズは、その節点(この場合は、根)からの枝の本数をあらわす。
図40−3は、E領域伸長用構造体4000の節点領域4003の記憶内容を示す説明図である。節点領域4003には、節点/葉識別フラグと、節点サイズと、葉の番号ごとのポインタとが格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。節点N(E)であるため、節点/葉識別フラグは「0」である。節点サイズは、その節点(この場合は、節点N(E))からの枝の本数をあらわす。
図40−4は、E領域伸長用構造体4000の葉の第1領域4004の記憶内容を示す説明図である。葉の第1領域4004には、節点/葉識別フラグと、葉種別フラグと、葉の番号に応じた伸長コードと圧縮符号長が格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。葉であるため、節点/葉識別フラグは「1」である。葉種別フラグは、その葉となる伸長コードが、「0000」〜「1111」の16種の葉(=0)であるか、「0000…0」(16、64、256個の0)の3種類の葉(=1)であるかを識別するフラグである。葉の第1領域4004なので、葉種別フラグは「0」である。
図40−5は、E領域伸長用構造体4000の葉の第2領域4005の記憶内容を示す説明図である。第2領域4005には、節点/葉識別フラグと、葉種別フラグと、葉の番号に応じた伸長コードと圧縮符号長が格納されている。節点/葉識別フラグは、この領域が節点の領域(=0)であるか葉の領域(=1)であるかを識別するフラグである。葉であるため、節点/葉識別フラグは「1」である。葉種別フラグは、その葉となる伸長コードが、「0000」〜「1111」の16種の葉(=0)であるか、「0000…0」(16、64、256個の0)の3種類の葉(=1)であるかを識別するフラグである。葉の第2領域4005なので、葉種別フラグは「1」である。
(B領域の文字データに関する出現ビット列の圧縮)
つぎに、B領域の文字データに関する出現ビット列の圧縮について説明する。B領域の文字データであるため、図33に示したB領域圧縮用構造体3300にアクセスして圧縮することとなる。
図41は、B領域の文字データに関する出現ビット列の圧縮例を示す説明図である。本例では、圧縮対象の出現ビット列を「0000001000000011」とする。(A)において、出現ビット列を32ビットレジスタにセットする。ビットカウンタは、「0」にセットされている。そして、レジスタの末尾4ビットのみを取り出すため、マスクパターン「0xF0000000」をセットして、マスク処理(論理積)をおこなう。
(B)において、(A)におけるマスク処理結果(AND結果)である伸長コード「0000」に対応する圧縮符号「0」を、B領域圧縮用構造体3300の葉の領域3302から読み出す。これにより、4ビットの伸長コード「0000」を1ビットの圧縮符号「0」に圧縮することができる。マスク処理結果(AND結果)である伸長コード「0000」は4ビットであるため、ビットカウンタの値を4(=0+4)にして、4ビットシフトする。この4ビットシフト後の出現ビット列「001000000011」を、マスクパターン「0xF0000000」でマスク処理(論理積)をおこなう。
(C)において、(B)におけるマスク処理結果(AND結果)である伸長コード「0010」に対応する圧縮符号「1011」を、B領域圧縮用構造体3300の葉の領域3302から読み出す。マスク処理結果(AND結果)である伸長コード「0010」は4ビットであるため、ビットカウンタの値を8(=4+4)にして、4ビットシフトする。この4ビットシフト後の出現ビット列「00000011」を、マスクパターン「0xF0000000」でマスク処理(論理積)をおこなう。
(D)において、(C)におけるマスク処理結果(AND結果)である伸長コード「0000」に対応する圧縮符号「0」を、B領域圧縮用構造体3300の葉の領域3302から読み出す。これにより、4ビットの伸長コード「0000」を1ビットの圧縮符号「0」に圧縮することができる。マスク処理結果(AND結果)である伸長コード「0000」は4ビットであるため、ビットカウンタの値を12(=8+4)にして、4ビットシフトする。この4ビットシフト後の出現ビット列「0011」を、マスクパターン「0xF0000000」でマスク処理(論理積)をおこなう。
(E)において、(D)におけるマスク処理結果(AND結果)である伸長コード「0011」に対応する圧縮符号「1010」を、B領域圧縮用構造体3300の葉の領域3302から読み出す。マスク処理結果(AND結果)である伸長コード「0011」は4ビットであるため、ビットカウンタの値を16(=12+4)にして、4ビットシフトする。この4ビットシフト後は、レジスタは空となるため、終了する。このように、圧縮対象の出現ビット列「1001000100000011」を、(B)〜(E)から得られた圧縮符号列「0101101010」に圧縮することができる。
(C領域の文字データに関する出現ビット列の圧縮)
つぎに、C領域の文字データに関する出現ビット列の圧縮について説明する。C領域の文字データであるため、図34に示したC領域圧縮用構造体3400にアクセスして圧縮することとなる。
図42は、C領域の文字データに関する出現ビット列の圧縮例を示す説明図である。本例では、圧縮対象の出現ビット列は、(A)に示したビット列とする。(A)において、出現ビット列の先頭32ビットを32ビットレジスタにセットする。ビットカウンタは、「0」にセットされている。そして、レジスタの末尾16ビットのみを取り出すため、マスクパターン「0xFFFF0000」をセットして、マスク処理(論理積)をおこなう。
(B)において、(A)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとする。この伸長コード「0000…0」(16ビット連続0)に対応する圧縮符号「100」を、C領域圧縮用構造体3400の葉の第2領域3412から読み出す。これにより、伸長コード「0000…0」(16ビット連続0)をたかだか3ビットの圧縮符号「100」に圧縮することができる。マスク処理結果(AND結果)である伸長コード「0000…0」(16ビット連続0)は16ビットであるため、ビットカウンタの値を16(=0+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。
(C)において、(B)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)でないため、末尾4ビット分のマスク処理結果(AND結果)である「1011」をそのまま伸長コードとする。この伸長コード「1011」に対応する圧縮符号「11111001」を、C領域圧縮用構造体3400の葉の第1領域3402から読み出す。マスク処理結果(AND結果)である伸長コード「1011」は4ビットであるため、ビットカウンタの値を20(=16+4)にして、4ビットシフトする。この4ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。
(D)において、(C)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)でないため、末尾4ビット分のマスク処理結果(AND結果)である「0010」をそのまま伸長コードとする。この伸長コード「0010」に対応する圧縮符号「1011」を、C領域圧縮用構造体3400の葉の第1領域3402から読み出す。マスク処理結果(AND結果)である伸長コード「0010」は4ビットであるため、ビットカウンタの値を24(=20+4)にして、4ビットシフトする。この4ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。
(E)において、(D)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)でないため、末尾4ビット分のマスク処理結果(AND結果)である「0000」をそのまま伸長コードとする。この伸長コード「0000」に対応する圧縮符号「0」を、C領域圧縮用構造体3400の葉の第2領域3403から読み出す。マスク処理結果(AND結果)である伸長コード「0000」は4ビットであるため、ビットカウンタの値を28(=24+4)にして、4ビットシフトする。この4ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。
(F)において、(E)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)でないため、末尾4ビット分のマスク処理結果(AND結果)である「0011」をそのまま伸長コードとする。この伸長コード「0011」に対応する圧縮符号「1010」を、C領域圧縮用構造体3400の葉の第1領域3402から読み出す。マスク処理結果(AND結果)である伸長コード「0011」は4ビットであるため、ビットカウンタの値を32(=28+4)にして、4ビットシフトする。この4ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。
(G)において、(F)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとする。この伸長コード「0000…0」(16ビット連続0)に対応する圧縮符号「100」を、C領域圧縮用構造体3400の葉の第2領域3403から読み出す。これにより、伸長コード「0000…0」(16ビット連続0)をたかだか3ビットの圧縮符号「100」に圧縮することができる。マスク処理結果(AND結果)である伸長コード「0000…0」(16ビット連続0)は16ビットであるため、ビットカウンタの値を48(=32+16)にして、16ビットシフトする。この16ビットシフト後は、レジスタは空となるため、終了する。このように、圧縮対象の出現ビット列を、(B)〜(G)から得られた圧縮符号列に圧縮することができる。
(D領域の文字データに関する出現ビット列の圧縮)
つぎに、D領域の文字データに関する出現ビット列の圧縮について説明する。D領域の文字データであるため、図35に示したD領域圧縮用構造体3500にアクセスして圧縮することとなる。
図43は、D領域の文字データに関する出現ビット列の圧縮例(その1)を示す説明図である。本例では、圧縮対象の出現ビット列は、(A)に示したビット列とする。(A)において、出現ビット列の先頭32ビットを32ビットレジスタにセットする。ビットカウンタおよび連続カウンタは、「0」にセットされている。そして、レジスタの末尾16ビットのみを取り出すため、マスクパターン「0xFFFF0000」をセットして、マスク処理(論理積)をおこなう。
(B)において、(A)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を16(=0+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を1(=0+1)にする。
(C)において、(B)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を32(=16+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を2(=1+1)にする。
(D)において、(C)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を48(=32+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を3(=2+1)にする。
(E)において、(D)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を64(=48+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を4(=3+1)にする。
ここで、連続カウンタの値が「4」になったため、バッファには、「0000…0」(16ビット連続0)が4つ、すなわち、「0000…0」(64ビット連続0)が1つ保存されていることとなる。したがって、この「0000…0」(64ビット連続0)を伸長コードとして、当該伸長コードに対応する圧縮符号「110」を、D領域圧縮用構造体3500の葉の第2領域3503から読み出す。これにより、出現ビット列内の伸長コード「0000…0」(64ビット連続0)をたかだか3ビットの圧縮符号「110」に圧縮することができる。
図44は、D領域の文字データに関する出現ビット列の圧縮例(その2)を示す説明図である。図43に示した例は、伸長コード「0000…0」(64ビット連続0)を3ビットの圧縮符号「110」に圧縮できた例であるが、本例では、伸長コード「0000…0」(64ビット連続0)が得られなかった場合の圧縮例を示す。
また、本例では、圧縮対象の出現ビット列は、(A)に示したビット列とする。(A)において、出現ビット列の先頭32ビットを32ビットレジスタにセットする。ビットカウンタおよび連続カウンタは、「0」にセットされている。そして、レジスタの末尾16ビットのみを取り出すため、マスクパターン「0xFFFF0000」をセットして、マスク処理(論理積)をおこなう。
(B)において、(A)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を16(=0+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を1(=0+1)にする。
(C)において、(B)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を32(=16+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を2(=1+1)にする。
(D)において、(C)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を48(=32+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を3(=2+1)にする。
(E)において、(D)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)でないため、末尾4ビット分のマスク処理結果(AND結果)である「1011」をそのまま伸長コードとする。この伸長コード「1011」に対応する圧縮符号「11111001」を、D領域圧縮用構造体3500の葉の第1領域3502から読み出す。マスク処理結果(AND結果)である伸長コード「1011」は4ビットであるため、ビットカウンタの値を52(=48+4)にして、4ビットシフトする。この4ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られなかったため、連続カウンタの値を0にリセットする。
この連続カウンタのリセットにより、(B)〜(D)においてバッファに保持された各伸長コード「0000…0」(16ビット連続0)に対応する圧縮符号「1100」を、D領域圧縮用構造体3500の葉の第2領域3512からそれぞれ読み出す。これにより、「0000…0」(64ビット連続0)が出現しなかった場合でも、16ビット単位で圧縮することができる。
(E領域の文字データに関する出現ビット列の圧縮)
つぎに、E領域の文字データに関する出現ビット列の圧縮について説明する。E領域の文字データであるため、図36に示したE領域圧縮用構造体3600にアクセスして圧縮することとなる。
図45は、E領域の文字データに関する出現ビット列の圧縮例(その1)を示す説明図である。本例では、圧縮対象の出現ビット列は、(A)に示したビット列とする。(A)において、出現ビット列の先頭32ビットを32ビットレジスタにセットする。ビットカウンタおよび連続カウンタは、「0」にセットされている。そして、レジスタの末尾16ビットのみを取り出すため、マスクパターン「0xFFFF0000」をセットして、マスク処理(論理積)をおこなう。
(B)において、(A)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を16(=0+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を1(=0+1)にする。
(C)において、(B)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を32(=16+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を2(=1+1)にする。以降、同様の内容がビットカウンタの値224、連続カウンタの値14まで繰り返されたものとする。
(D)において、(C)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を240(=224+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を15(=14+1)にする。
(E)において、(D)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を256(=240+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を16(=15+1)にする。
ここで、連続カウンタの値が「16」になったため、バッファには、「0000…0」(16ビット連続0)が16個、すなわち、「0000…0」(256ビット連続0)が1つ保存されていることとなる。したがって、この「0000…0」(256ビット連続0)を伸長コードとして、当該伸長コードに対応する圧縮符号「1110」を、E領域圧縮用構造体3600の葉の第2領域3603から読み出す。これにより、出現ビット列内の伸長コード「0000…0」(256ビット連続0)をたかだか4ビットの圧縮符号「1110」に圧縮することができる。
図46は、E領域の文字データに関する出現ビット列の圧縮例(その2)を示す説明図である。図45に示した例は、伸長コード「0000…0」(256ビット連続0)を3ビットの圧縮符号「1110」に圧縮できた例であるが、本例では、伸長コード「0000…0」(256ビット連続0)が得られなかった場合の圧縮例を示す。
また、本例では、圧縮対象の出現ビット列は、(A)に示したビット列とする。(A)において、出現ビット列の先頭32ビットを32ビットレジスタにセットする。ビットカウンタおよび連続カウンタは、「0」にセットされている。そして、レジスタの末尾16ビットのみを取り出すため、マスクパターン「0xFFFF0000」をセットして、マスク処理(論理積)をおこなう。
(B)において、(A)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を16(=0+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を1(=0+1)にする。
(C)において、(B)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を32(=16+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を2(=1+1)にする。
(D)において、(C)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を48(=32+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を3(=2+1)にする。
(E)において、(D)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を64(=48+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を4(=3+1)にする。
(F)において、(E)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)であるため、マスク処理結果(AND結果)である「0000…0」(16ビット連続0)をそのまま伸長コードとしてバッファに一時的に保持する。そして、ビットカウンタの値を80(=64+16)にして、16ビットシフトする。この16ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られたため、連続カウンタの値を5(=4+1)にする。
(G)において、(F)におけるマスク処理結果(AND結果)が末尾から「0000…0」(16ビット連続0)でないため、末尾4ビット分のマスク処理結果(AND結果)である「1011」をそのまま伸長コードとする。この伸長コード「1011」に対応する圧縮符号「11111001」を、E領域圧縮用構造体3600の葉の第1領域3602から読み出す。マスク処理結果(AND結果)である伸長コード「1011」は4ビットであるため、ビットカウンタの値を84(=80+4)にして、4ビットシフトする。この4ビットシフト後の出現ビット列を、マスクパターン「0xFFFF0000」でマスク処理(論理積)をおこなう。また、「0000…0」(16ビット連続0)が得られなかったため、連続カウンタの値を0にリセットする。
バッファには、「0000…0」(16ビット連続0)が4つ、すなわち、「0000…0」(64ビット連続0)が1つ保存されていることとなる。したがって、この連続カウンタのリセットにより、(B)〜(E)においてバッファに保持された「0000…0」(64ビット連続0)を伸長コードとして、当該伸長コードに対応する圧縮符号「110」を、E領域圧縮用構造体3600の葉の第2領域3612から読み出す。これにより、出現ビット列内の伸長コード「0000…0」(64ビット連続0)をたかだか3ビットの圧縮符号「110」に圧縮することができる。
また、バッファには、(F)の処理により、「0000…0」(16ビット連続0)が1つ保存されていることとなる。したがって、この連続カウンタのリセットにより、(F)においてバッファに保持された「0000…0」(16ビット連続0)を伸長コードとして、当該伸長コードに対応する圧縮符号「10」を、E領域圧縮用構造体3600の葉の第2領域3612から読み出す。これにより、出現ビット列内の伸長コード「0000…0」(16ビット連続0)をたかだか2ビットの圧縮符号「10」に圧縮することができる。
(圧縮処理手順)
つぎに、実施の形態2における出現マップの圧縮処理手順について説明する。図47は、B領域のハフマン圧縮処理手順を示すフローチャートである。このフローチャートでは、図24−2におけるハフマン圧縮(ステップS2479)において、図41に示したような圧縮処理を自動実行する。
まず、レジスタに選択文字データの出現ビット列をセットして(ステップS4701)、レジスタが空か否かを判断する(ステップS4702)。レジスタが空でない場合(ステップS4702:No)、4ビット連続0記号列圧縮処理を実行し(ステップS4703)、ステップS4702に戻る。ステップS4702において、レジスタが空である場合(ステップS4702:Yes)、B領域のハフマン圧縮処理を終了し、ステップS2471に戻る。
つぎに、4ビット連続0記号列圧縮処理の詳細な処理手順について説明する。図48は、4ビット連続0記号列圧縮処理の詳細な処理手順を示すフローチャートである。まず、末尾4ビットのマスク処理により、4ビットの伸長コードを特定する(ステップS4801)。そして、特定された伸長コードに対応する圧縮符号を、B領域圧縮用構造体3300の葉の領域3302から読み出すことで当該圧縮符号に変換する。(ステップS4802)。そして、ビットカウンタを4加算して、レジスタ内のビット列を4ビットシフトする(ステップS4803)。レジスタの空いた領域には後続のビット列が順次セットされる。そして、ステップS4702に戻る。
つぎに、C領域のハフマン圧縮処理手順について説明する。図49は、C領域のハフマン圧縮処理手順を示すフローチャートである。このフローチャートでは、図24−2におけるハフマン圧縮(ステップS2479)において、図42に示したような圧縮処理を自動実行する。まず、レジスタに選択文字データの出現ビット列をセットして(ステップS4901)、レジスタが空か否かを判断する(ステップS4902)。レジスタが空でない場合(ステップS4902:No)、16ビット連続0記号列圧縮処理を実行する(ステップS4903)。
そして、4ビット連続0記号列圧縮処理を実行し(ステップS4904)、ステップS4902に戻る。ステップS4902において、レジスタが空である場合(ステップS4902:Yes)、C領域のハフマン圧縮処理を終了し、ステップS2471に戻る。なお、4ビット連続0記号列圧縮処理(ステップS4904)は、図48に示した処理手順となる。
つぎに、16ビット連続0記号列圧縮処理の詳細な処理手順について説明する。図50は、16ビット連続0記号列圧縮処理の詳細な処理手順を示すフローチャートである。まず、末尾16ビットのマスク処理をおこない(ステップS5001)、末尾の16ビットがすべて0であるか否かを判断する(ステップS5002)。すべて0である場合(ステップS5002:Yes)、「0000…0」(16個の0)の伸長コードに対応する圧縮符号を、C領域圧縮用構造体3400の葉の第2領域3403から読み出すことで当該圧縮符号に変換する。(ステップS5003)。
そして、ビットカウンタを16ビット加算して、レジスタ内のビット列を16ビットシフトする(ステップS5004)。レジスタの空いた領域には後続のビット列が順次セットされる。そして、ステップS5001に戻る。一方、ステップS5002において、16ビットすべて0でない場合(ステップS5002:No)、ステップS4904に移行して、4ビット連続0記号列圧縮処理(ステップS4904)を実行する。
つぎに、D領域のハフマン圧縮処理手順について説明する。図51は、D領域のハフマン圧縮処理手順を示すフローチャートである。このフローチャートでは、図43および図44に示したような圧縮処理を自動実行する。まず、レジスタに選択文字データの出現ビット列をセットして(ステップS5101)、レジスタが空か否かを判断する(ステップS5102)。レジスタが空でない場合(ステップS5102:No)、64ビット連続0記号列圧縮処理を実行して(ステップS5103)、ステップS5102に戻る。ステップS5102において、レジスタが空である場合(ステップS5102:Yes)、ステップS2471に戻る。
つぎに、64ビット連続0記号列圧縮処理の詳細な処理手順について説明する。図52は、64ビット連続0記号列圧縮処理の詳細な処理手順を示すフローチャートである。まず、末尾16ビットのマスク処理をおこない(ステップS5201)、末尾の16ビットがすべて0であるか否かを判断する(ステップS5202)。すべて0である場合(ステップS5202:Yes)、「0000…0」(16個の0)の伸長コードをバッファに保持する(ステップS5203)。そして、ビットカウンタを16加算して、レジスタ内のビット列を16ビットシフトする(ステップS5204)。レジスタの空いた領域には後続のビット列が順次セットされる。また、連続カウンタを1加算する。
そして、連続カウンタの値CaがCa=4であるか否かを判断する(ステップS5205)。Ca=4である場合(ステップS5205:Yes)、バッファ内には、4個の「0000…0」(16個の0)、すなわち、1個の「0000…0」(64個の0)が保持されているため、この伸長コード「0000…0」(64個の0)に対応する圧縮符号を、D領域圧縮用構造体3500の葉の第2領域3503から読み出すことで当該圧縮符号に変換する。(ステップS5206)。このあと、連続カウンタの値Caをリセット(Ca=0)して(ステップS5207)、ステップS5102に戻る。一方、ステップS5205において、Ca=4でない場合(ステップS5205:No)、ステップS5102に戻る。
一方、ステップS5202において、末尾の16ビットがすべて0でないと判断された場合(ステップS5202:No)、連続カウンタの値Caをリセット(Ca=0)して(ステップS5208)、バッファ内の各「0000…0」(16個の0)をそれぞれ伸長コードとする。そして、当該伸長コードに対応する圧縮符号を、D領域圧縮用構造体3500の葉の第2領域3503から読み出すことで当該圧縮符号に変換する(ステップS5209)。そして、4ビット連続0記号列圧縮処理を実行して(ステップS5210)、ステップS5102に戻る。4ビット連続0記号列圧縮処理(ステップS5210)は、図48に示した処理手順となる。
つぎに、E領域のハフマン圧縮処理手順について説明する。図53は、E領域のハフマン圧縮処理手順を示すフローチャートである。このフローチャートでは、図45および図46に示したような圧縮処理を自動実行する。まず、レジスタに選択文字データの出現ビット列をセットして(ステップS5301)、レジスタが空か否かを判断する(ステップS5302)。レジスタが空でない場合(ステップS5302:No)、256ビット連続0記号列圧縮処理を実行して(ステップS5303)、ステップS5302に戻る。ステップS5302において、レジスタが空である場合(ステップS5302:Yes)、ステップS2471に戻る。
つぎに、256ビット連続0記号列圧縮処理の詳細な処理手順について説明する。図54は、256ビット連続0記号列圧縮処理の詳細な処理手順を示すフローチャートである。まず、末尾16ビットのマスク処理をおこない(ステップS5401)、末尾の16ビットがすべて0であるか否かを判断する(ステップS5402)。すべて0である場合(ステップS5402:Yes)、「0000…0」(16個の0)の伸長コードをバッファに保持する(ステップS5403)。そして、ビットカウンタを16加算して、レジスタ内のビット列を16ビットシフトする(ステップS5404)。レジスタの空いた領域には後続のビット列が順次セットされる。また、連続カウンタを1加算する。
そして、連続カウンタの値CaがCa=16であるか否かを判断する(ステップS5405)。Ca=16である場合(ステップS5405:Yes)、バッファ内には、16個の「0000…0」(16個の0)、すなわち、1個の「0000…0」(256個の0)が保持されているため、この伸長コード「0000…0」(256個の0)に対応する圧縮符号を、E領域圧縮用構造体3600の葉の第2領域3603から読み出すことで当該圧縮符号に変換する(ステップS5406)。このあと、連続カウンタの値Caをリセット(Ca=0)して(ステップS5407)、ステップS5302に戻る。一方、ステップS5405において、Ca=16でない場合(ステップS5405:No)、ステップS5302に戻る。
一方、ステップS5402において、末尾の16ビットがすべて0でないと判断された場合(ステップS5402:No)、16/64ビット連続0記号列圧縮処理を実行する(ステップS5408)。このあと、4ビット連続0記号列圧縮処理を実行して(ステップS5409)、ステップS5402に戻る。4ビット連続0記号列圧縮処理(ステップS5409)は、図48に示した処理手順となる。
つぎに、16/64ビット連続0記号列圧縮処理の詳細な処理手順について説明する。図55は、16/64ビット連続0記号列圧縮処理の詳細な処理手順を示すフローチャートである。まず、連続カウンタの値CaがCa≦3であるか否かを判断する(ステップS5501)。Ca≦3でない場合(ステップS5501:No)、バッファ内の「0000…0」(64個の0)を伸長コードとする。この場合、伸長コードは1〜3個得られる。
この伸長コードに対応する圧縮符号を、E領域圧縮用構造体3600の葉の第2領域3603から読み出すことで当該圧縮符号に変換する(ステップS5502)。そして、伸長コードの個数Cvを用いて、連続カウンタの値Caを更新し(ステップS5503)、ステップS5504に移行する。
一方、ステップS5501において、Ca≦3である場合(ステップS5501:Yes)、ステップS5504に移行する。ステップS5504において、Ca=0であるか否かを判断する(ステップS5504)。Ca=0でない場合(ステップS5504:No)、バッファ内の「0000…0」(16個の0)を伸長コードとする。この場合、伸長コードは1または2個得られる。
この伸長コードに対応する圧縮符号を、E領域圧縮用構造体3600の葉の第2領域3612から読み出すことで当該圧縮符号に変換する(ステップS5505)。そして、連続カウンタの値Caをリセット(Ca=0)して(ステップS5506)、ステップS5409に戻る。一方、ステップS5504において、Ca=0である場合(ステップS5504:Yes)、ステップS5409に戻る。
(文字データに関する出現ビット列の圧縮符号列の伸長)
つぎに、文字データに関する出現ビット列の圧縮符号列の伸長について説明する。伸長処理では、上述したB領域伸長用構造体3700〜E領域伸長用構造体4000を用いる。どの伸長用構造体を用いるかは、選択文字データの属する分割領域に依存する。
図56は、マスクパターンテーブル5600を示す説明図である。マスクパターンは、伸長の際、圧縮符号列を特定するために用いられる。マスクパターンはビットアドレスの値0〜7に応じて使い分けられる。
つぎに、圧縮符号列の伸長例について説明する。ここでは、例として、C領域の文字データに関する出現ビット列の圧縮符号列の伸長例について説明する。
図57は、C領域の文字データに関する出現ビット列の圧縮符号列の伸長例を示す説明図である。まず、(A)において、圧縮符号列を32ビットレジスタにセットする。初期状態なので、ビットカウンタ、バイトアドレス、ビットアドレスの値Abiはいずれも「0」である。
ビットアドレスの値AbiがAbi=0であるため、マスクパターンテーブル5600を参照して、マスクパターン(0xF0000000)をセットする。なお、バイトアドレスは、ビットカウンタの値を8で割ったときの商であり、ビットアドレスは、そのときの余りとなる。そして、レジスタにセットされた圧縮符号列について、マスクパターン(0xF0000000)によりマスク処理(論理積)をおこなう。
(B)において、(A)におけるマスク処理結果(AND結果)である4ビットコード「1001」に一致する葉/節点の番号を、C領域伸長用構造体3800の根領域3802から特定する。この場合、葉の番号9(=1001)が特定されることとなり、伸長コード「0000…0」(16個の0)へのポインタが読み出されて、葉の第2領域3806をポイントする。これにより、葉の第2領域3806から伸長コード「0000…0」(16個の0)が読み出されることとなり、当該伸長コードに変換される。また、圧縮符号長「3」も読み出されるため、ビットカウンタを+3とし、バイトアドレスおよびビットアドレスを計算する。
ビットアドレスの値AbiがAbi=3であるため、マスクパターンテーブル5600を参照して、マスクパターン(0x1E000000)をセットする。そして、レジスタにセットされた圧縮符号列について、マスクパターン(0x1E000000)によりマスク処理(論理積)をおこなう。
(C)において、(B)におけるマスク処理結果(AND結果)である4ビットコード「1111」に一致する葉/節点の番号を、C領域伸長用構造体3800の根領域3802から特定する。この場合、節点の番号F(=1111)が特定されることとなり、節点N(F)へのポインタが読み出されて、第2節点領域3804をポイントする。このように葉ではなく節点をポイントした場合は、圧縮符号長が特定できないため、ビットカウンタを+4とし、バイトアドレスおよびビットアドレスを計算する。
ビットアドレスの値AbiがAbi=7であるため、マスクパターンテーブル5600を参照して、マスクパターン(0x01E00000)をセットする。そして、レジスタにセットされた圧縮符号列をマスクパターン(0x01E00000)によりマスク処理(論理積)をおこなう。
(D)において、(C)におけるマスク処理結果(AND結果)として4ビットコード「1001」が得られる。(C)では、節点の番号F(=1111)により第2節点領域3804がポイントされているため、葉の番号としてF9(=11111001)が特定される。これにより、葉の番号F9に対応するポインタを、C領域伸長用構造体3800の第2節点領域3804から読み出して、葉の第1領域3805をポイントする。これにより、葉の第1領域3805から伸長コード「1011」が読み出されることとなり、当該伸長コードに変換される。また、圧縮符号長「8」も読み出されるが、(C)で加算した+4を相殺するため、ビットカウンタを+(8−4)とし、バイトアドレスおよびビットアドレスを計算する。
バイトアドレスが+1加算されたため、レジスタ内の圧縮符号列を8ビットシフトする。また、ビットアドレスの値AbiがAbi=3であるため、マスクパターンテーブル5600を参照して、マスクパターン(0x1E000000)をセットする。そして、8ビットシフト後のレジスタにセットされた圧縮符号列について、マスクパターン(0x1E000000)によりマスク処理(論理積)をおこなう。
(E)において、(D)におけるマスク処理結果(AND結果)である4ビットコード「1011」に一致する葉/節点の番号を、C領域伸長用構造体3800の根領域3802から特定する。この場合、葉の番号B(=1011)が特定されることとなり、伸長コード「0010」へのポインタが読み出されて、葉の第1領域3805をポイントする。これにより、葉の第1領域3805から伸長コード「0010」が読み出されることとなり、当該伸長コードに変換される。また、圧縮符号長「4」も読み出されるため、ビットカウンタを+4とし、バイトアドレスおよびビットアドレスを計算する。
ビットアドレスの値AbiがAbi=7であるため、マスクパターンテーブル5600を参照して、マスクパターン(0x01E00000)をセットする。そして、レジスタにセットされた圧縮符号列について、マスクパターン(0x01E00000)によりマスク処理(論理積)をおこなう。
(F)において、(E)におけるマスク処理結果(AND結果)である4ビットコード「0101」に一致する葉/節点の番号を、C領域伸長用構造体3800の根領域3802から特定する。この場合、葉の番号5(=0101)が特定されることとなり、伸長コード「0000」へのポインタが読み出されて、葉の第1領域3805をポイントする。これにより、葉の第1領域3805から伸長コード「0000」が読み出されることとなり、当該伸長コードに変換される。また、圧縮符号長「1」も読み出されるため、ビットカウンタを+1とし、バイトアドレスおよびビットアドレスを計算する。
ビットアドレスの値AbiがAbi=0であるため、マスクパターンテーブル5600を参照して、マスクパターン(0xF0000000)をセットする。そして、レジスタにセットされた圧縮符号列について、マスクパターン(0xF0000000)によりマスク処理(論理積)をおこなう。
(G)において、(F)におけるマスク処理結果(AND結果)である4ビットコード「1010」に一致する葉/節点の番号を、C領域伸長用構造体3800の根領域3802から特定する。この場合、葉の番号A(=1010)が特定されることとなり、伸長コード「0001」へのポインタが読み出されて、葉の第1領域3805をポイントする。これにより、葉の第1領域3805から伸長コード「0001」が読み出されることとなり、当該伸長コードに変換される。また、圧縮符号長「4」も読み出されるため、ビットカウンタを+4とし、バイトアドレスおよびビットアドレスを計算する。
ビットアドレスの値AbiがAbi=4であるため、マスクパターンテーブル5600を参照して、マスクパターン(0x0F000000)をセットする。そして、レジスタにセットされた圧縮符号列について、マスクパターン(0x0F000000)によりマスク処理(論理積)をおこなう。
(H)において、レジスタ内の圧縮符号列が1ビット不足しているため、ダミーとして「0」(「1」でもよい)を追加する(図中、アンダーバーを用いて表記)。(G)におけるマスク処理結果(AND結果)である4ビットコード「1000」に一致する葉/節点の番号を、C領域伸長用構造体3800の根領域3802から特定する。この場合、葉の番号8(=1000)が特定されることとなり、伸長コード「0000…0」(16個の0)へのポインタが読み出されて、葉の第2領域3806をポイントする。これにより、葉の第2領域3806から伸長コード「0000…0」(16個の0)が読み出されることとなり、当該伸長コードに変換される。
(伸長処理手順)
つぎに、実施の形態2における出現マップへの伸長処理手順について説明する。図58および図59は、実施の形態2における出現マップへの伸長処理手順を示すフローチャートである。このフローチャートでは、図25−2におけるハフマン伸長(ステップS2545)において、図57に示したような圧縮処理を自動実行する。
なお、初期状態では、ビットカウンタ、バイトアドレス、ビットアドレスはいずれも「0」である。まず、レジスタに選択文字データの出現ビット列の圧縮符号列をセットして(ステップS5801)、マスクパターンテーブル5600からビットアドレスに応じたマスクパターンを選択する(ステップS5802)。
そして、すべて伸長されたか否かを判断する(ステップS5803)。この判断は、ダミービットが付与されたか否か、レジスタが空になったか否か、または、マスクパターンによるマスク処理が実行できないか否か(対応する圧縮符号列がないなど)で判断することができる。
すべて伸長されていない場合(ステップS5803:No)、選択マスクパターンによる末尾4ビットのマスク処理を実行する(ステップS5804)。そして、節点領域をポイント中か否かを判断する(ステップS5805)。節点領域をポイント中でない場合(ステップS5805:No)、根領域において、マスク処理結果に一致する葉/節点の番号に対応するポインタを特定する(ステップS5806)。そして、ステップS5901に移行する。一方、節点領域をポイント中である場合(ステップS5805:Yes)、ポイント中の節点領域において、マスク処理結果に一致する葉の番号に対応するポイントを特定する(ステップS5807)。そして、ステップS5901に移行する。
図59において、ポイント先が葉の領域であるか否かを判断する(ステップS5901)。葉の領域である場合(ステップS5901:Yes)、該当する伸長コードを取得するとともに(ステップS5902)、当該伸長コードの圧縮符号長Lを取得して(ステップS5903)、ステップS5905に移行する。一方、ステップS5901において、ポイント先が葉の領域でない場合(ステップS5901:No)、節点領域をポイント中であるため、伸長コードと圧縮符号長Lを取得できない。したがって、圧縮符号長LをL=4ビットに仮設定し(ステップS5904)、ステップS5905に移行する。
ステップS5905では、ビットカウンタの値Cbに対して圧縮符号長Lを加算することで、ビットカウンタの値Cbを更新する(ステップS5905)。この更新後のビットカウンタの値Cbを用いて、バイトアドレスの値Abyを計算する(ステップS5906)。バイトアドレスが+1になったか否かを判断し(ステップS5907)、+1になった場合(ステップS5907:Yes)、圧縮符号列を8ビットシフトする(ステップS5908)。そして、ステップS5909に移行する。
一方、+1になっていない場合(ステップS5907:No)、ステップS5909に移行する。ステップS5909では、ビットアドレスの値Abiを計算する(ステップS5909)。そして、ステップS5802に戻る。また、図58のステップS5803において、すべて伸長された場合(ステップS5803:Yes)、ステップS2546に戻る。
このように、本実施の形態2においても、文字データごとの出現率を圧縮パラメータとすることにより、出現率に応じたハフマン木を選択することができる。すなわち、出現率が低いほど特殊記号列が長い特殊なハフマン木を選択することができる。一方、出現率が高いほど特殊なハフマン木よりも通常のハフマン木を選択することができる。したがって、出現マップ904の圧縮効率の向上を図ることができる。
さらに、圧縮効率の悪い分割領域については、ハフマン木を割り振らず非圧縮とすることにより、無駄な圧縮処理を防止することができ、圧縮速度の高速化を図ることができる。また、分割領域を出現確率50%を境界として対称とすることにより、ハフマン木の容量を半減することができる。したがって、省メモリ化を実現することができる。
また、ミニSDやHDに格納される出現マップ904を、特殊なハフマン木を用いて効率的に圧縮する。この特殊なハフマン木には、4ビット系の通常のハフマン木にさらに4ビットバウンダリのNULL連続記号列が追加されているため、携帯電話機などのモバイル端末に実装される低速CPUや少メモリにおいて、高速な圧縮/伸長を実現することができる。
また、本実施の形態2では、n=4の16分枝ハフマン木を用いたが、n=4に限らず、2n分枝(n=2,3,…)のハフマン木を適用することができる。この場合、nの値によって伸長コードのビット長や、圧縮符号、圧縮符号長を変えることにより、同様の圧縮伸長をおこなうことができる。
なお、上述したいずれの実施の形態においても、検索対象ファイルとしてHTMLのファイルを例に挙げて説明したが、HTMLに限定されることはなく、XMLなど他のマークアップ言語によって記述されたファイルであってもよい。また、連字を外字に置換することとしているが、連字に限らず、検索対象ファイルに含まれているHTMLやXMLのタグを外字に置換することとして、連字外字置換テーブルに含めることとしてもよい。これにより、検索対象ファイルの圧縮率をさらに向上することができる。
以上のことから、実施の形態にかかる情報検索プログラム、該プログラムを記録した記録媒体、情報検索方法、および情報検索装置によれば、コンテンツについての圧縮率、セキュリティ、および全文検索速度の向上を図ることができるという効果を奏する。
(付記1)コンテンツを構成する複数の検索対象ファイルにおける文字データの存否をあらわした前記文字データごとのビット列の集合を用いて検索キーワードを構成する文字データを含む検索対象ファイルを絞り込むことにより、当該検索対象ファイルの中から前記検索キーワードと一致または関連するキーワードを検索する検索処理をコンピュータに実行させる情報検索プログラムにおいて、
前記ビット列の集合の中から、任意の文字データのビット列を抽出させるビット列抽出工程と、
所定ビット数により表現されるパターンをすべて網羅した複数種類の記号列と前記所定ビット数よりもビット数が多い特殊記号列とを葉とする特殊なハフマン木を用いて、前記ビット列抽出工程によって抽出されたビット列を圧縮させる圧縮工程と、
をコンピュータに実行させることを特徴とする情報検索プログラム。
(付記2)前記全検索対象ファイルのうち圧縮対象となる文字データが出現するファイル数の割合をあらわす出現率を取得させる取得工程と、
前記特殊なハフマン木ごとに前記特殊記号列のビット数が異なる複数種類の特殊なハフマン木を有するハフマン木集合の中から、前記取得工程によって取得された出現率に応じた特殊なハフマン木を抽出させるハフマン木抽出工程と、を前記コンピュータに実行させ、
前記ビット列抽出工程は、
前記出現率が取得された文字データのビット列を抽出させ、
前記圧縮工程は、
前記ハフマン木抽出工程によって抽出された特殊なハフマン木を用いて、前記ビット列抽出工程によって抽出されたビット列を圧縮させることを特徴とする付記1に記載の情報検索プログラム。
(付記3)前記特殊記号列は、前記文字データが出現しないことを意味する記号が連続する記号列であることを特徴とする付記1または2に記載の情報検索プログラム。
(付記4)出現確率の範囲が前記特殊なハフマン木ごとに領域分割されており、前記ハフマン木集合内の一の特殊なハフマン木の分割領域により特定される出現確率が、前記一の特殊なハフマン木の特殊記号列よりもビット数が多い特殊記号列を葉とする他の特殊なハフマン木の分割領域により特定される出現確率よりも低く設定されている場合、
前記ハフマン木抽出工程は、
前記出現率が含まれる分割領域に属する特殊なハフマン木を前記ハフマン木集合の中から抽出させることを特徴とする付記3に記載の情報検索プログラム。
(付記5)
前記一の特殊なハフマン木の分割領域が、前記他の特殊なハフマン木の分割領域よりも広く設定されていることを特徴とする付記4に記載の情報検索プログラム。
(付記6)前記ハフマン木集合には、前記複数種類の記号列のみを葉とする通常のハフマン木が含まれており、前記特殊なハフマン木の分割領域により特定される最大の出現確率よりも、前記通常のハフマン木の分割領域により特定される出現確率が高く設定されている場合、
前記ハフマン木抽出工程は、
前記出現率が含まれる分割領域が前記通常のハフマン木の分割領域である場合、当該通常のハフマン木を前記ハフマン木集合の中から抽出させることを特徴とする付記4に記載の情報検索プログラム。
(付記7)前記通常のハフマン木の分割領域により特定される出現確率よりも、いずれのハフマン木も圧縮に用いない分割領域により特定される出現確率が高く設定されている場合、
前記圧縮工程は、
前記取得工程によって取得された出現率が含まれる分割領域が前記いずれのハフマン木も圧縮に用いない分割領域である場合、前記ビット列を圧縮させないことを特徴とする付記4に記載の情報検索プログラム。
(付記8)前記出現確率の範囲が前記出現確率50%を境界として対称となるように領域分割されている場合、
前記ハフマン木抽出工程は、
前記取得工程によって取得された出現率が50%以上である場合、当該出現率が含まれる一の分割領域に対し出現確率50%を境界として対称となる前記出現確率0%以上50%未満内の他の分割領域に対応するハフマン木を前記ハフマン木集合の中から抽出させ、
前記圧縮工程は、
前記他の分割領域に対応するハフマン木を用いて、前記ビット列抽出工程によって抽出されたビット列の反転ビット列を圧縮させることを特徴とする付記4に記載の情報検索プログラム。
(付記9)前記ハフマン木は、2n分枝(n≧2)のハフマン木であることを特徴とする付記1〜8のいずれか一つに記載の情報検索プログラム。
(付記10)
前記ハフマン木は、圧縮用の構造体を有し、
前記圧縮用の構造体は、前記ハフマン木の葉を特定する葉の番号のうち、単一の葉の番号に対して当該葉の番号に固有な圧縮符号が割り当てられた第1の記号列と、複数の葉の番号に対して当該複数の葉の番号に共通する記号を含む固有な圧縮符号が割り当てられ前記第1の記号列よりも出現確率が高い第2の記号列と、が格納されており、
前記圧縮工程は、
圧縮用の構造体を用いて、前記第1または第2の記号列に一致するビット列を、当該ビット列に一致した記号列の圧縮符号に圧縮させることを特徴とする付記9に記載の情報検索プログラム。
(付記11)前記ハフマン木は、伸長用の構造体を有し、
前記伸長用の構造体は、前記ハフマン木の根からの葉となる記号列へのポインタを当該葉の番号と対応付けて格納する根領域と、前記ポインタのポイント先となる記号列を格納する葉の領域と、を有し、
前記コンピュータに、
前記圧縮工程によって圧縮された圧縮符号列から前記葉の番号を抽出し、前記伸長用の構造体内の根領域から前記記号列のポインタを特定し、当該ポインタのポイント先となる記号列を前記伸長用の構造体内の前記葉の領域から特定することにより、前記圧縮符号列を伸長させる伸長工程を実行させることを特徴とする付記10に記載の情報検索プログラム。
(付記12)前記伸長用の構造体の前記根領域は、さらに、前記ハフマン木の根からの節点をポイントするポインタを当該節点の番号に対応付けて格納しており、
前記伸長用の構造体は、さらに、前記ハフマン木の節点からの葉となる記号列へのポインタを当該葉の番号と対応付けて格納する節点領域を有し、
前記伸長用の構造体の前記葉の領域は、前記節点領域に格納されているポインタのポイント先となる記号列を格納しており、
前記伸長工程は、
前記圧縮符号列から前記節点の番号が抽出された場合、前記伸長用の構造体内の根領域から前記節点へのポインタを特定し、当該節点へのポインタのポイント先となる前記記号列へのポインタを前記伸長用の構造体内の前記節点領域から特定し、当該記号列へのポインタのポイント先となる記号列を前記伸長用の構造体内の前記葉の領域から特定することにより、前記圧縮符号列を伸長させることを特徴とする付記11に記載の情報検索プログラム。
(付記13)付記1〜12のいずれか一つに記載の情報検索プログラムを記録したコンピュータに読み取り可能な記録媒体。
(付記14)各検索対象ファイルにおける文字データの存否を当該文字データごとにあらわしたビット列の集合の中から、任意の文字データのビット列を抽出するビット列抽出工程と、
所定ビット数により表現されるパターンをすべて網羅した複数種類の記号列と前記所定ビット数よりもビット数が多い特殊記号列とを葉とする特殊なハフマン木を用いて、前記ビット列抽出工程によって抽出されたビット列を圧縮する圧縮工程と、
を含んだことを特徴とする情報検索方法。
(付記15)各検索対象ファイルにおける文字データの存否を当該文字データごとにあらわしたビット列の集合の中から、任意の文字データのビット列を抽出するビット列抽出手段と、
所定ビット数により表現されるパターンをすべて網羅した複数種類の記号列と前記所定ビット数よりもビット数が多い特殊記号列とを葉とする特殊なハフマン木を用いて、前記ビット列抽出手段によって抽出されたビット列を圧縮する圧縮手段と、
備えることを特徴とする情報検索装置。