以下に添付図面を参照して、本発明の実施の形態を詳細に説明する。なお、本明細書において、「文字情報」とは、テキストデータを構成する、単一文字、基礎単語、分割文字コードなどである。対象ファイル群は、たとえば、文書ファイル、Webページ、電子メールなどの電子データであり、たとえば、テキスト形式、HTML(HyperText Markup Language)形式、XML(Extensible Markup Language)形式の電子データである。
また、「単一文字」とは、1つの文字コードで表現される文字である。単一文字の文字コード長は、文字コード種により異なる。
たとえば、UTF(Unicode Transformation Format)16の場合は16ビットコード、ASCII(American Standard Code for Information Interchange)コードの場合は8ビットコード、シフトJIS(Japanese Industrial Standard)コードの場合は8ビットコードである。シフトJISコードで日本語の文字を表現する場合は、2個の8ビットコードを組み合わせることとなる。
また、「基礎単語」とは、小・中学校で学習する基本的な単語や、特定の文字列で表現される予約語をいう。「This is a・・・.」の英文を例にすると「This」、「is」、「a」などの単語であり、千語レベル、2千語レベル、数千語レベルに分類され、英和辞典には、「***」、「**」、「*」マークが付与されている。また、予約語とは、予め決められた文字列であり、たとえば、HTMLのタグ(たとえば、<br>)が挙げられる。
また、「分割文字コード」とは、単一文字を、上位のコードと下位のコードに分割した各々のコードである。本実施の形態では、後述するように、単一文字を、上位のコードと下位のコードに分割する場合がある。たとえば、「芝」という単一文字の文字コードは、UTF16の場合、「9D82」で表現されるが、上位分割文字コード「0x9D」と下位分割文字コード「0x82」に分割される。
また、「グラム」とは、文字単位である。たとえば、単一文字については、その1文字分が1グラムとなる。分割文字コードについては、分割文字コード単独で1グラムとなる。したがって、単一文字「芝」は2グラムとなる。なお、本実施の形態では、文字コードとしてUTF16を例に挙げて説明する。
また、本明細書では、「ビットをON」とした場合は、そのビットの値を"1"にし、「ビットをOFF」とした場合は、そのビットの値を"0"として説明する。なお、「ビットをON」とした場合は、そのビットの値を"0"にし、「ビットをOFF」とした場合は、そのビットの値を"1"にしてもよい。
「出現マップ」とは、文字情報を指定するポインタと文字情報の各対象ファイルでの存否を示すビット列を連結したビット列である。検索処理時には、このビット列を、ビットのON・OFFに応じて検索対象の文字情報を含むか否かを示すインデックスとして用いることができる。文字情報を指定するポインタとしては、たとえば、文字情報の圧縮符号が採用される。文字情報を指定するポインタは、例えば、文字情報そのものを用いても良い。「圧縮符号マップ」とは、圧縮符号のポインタで示される文字情報ごとの出現マップをまとめたビットマップである。2グラム文字列の圧縮符号マップについては、第1グラムの圧縮符号と第2グラムの圧縮符号を組み合わせた圧縮符号列となる。
「2グラム文字列」とは、1グラムの文字コードが連接する文字列である。たとえば、「人形芝居」という文字列には、2連接文字「人形」、「形芝」、「芝居」が含まれている。2連接文字「人形」の「人」、「形」はそれぞれ分割されない単一文字であるため、2連接文字「人形」はそのまま2グラム文字列となる。
「芝」は上述したように分割されるため、単一文字「形」と「芝」の上位分割文字コード「0x9D」の組み合わせが2グラム文字列となる。また、上位分割文字コード「0x9D」と下位分割文字コード「0x82」の組み合わせも2グラム文字列となる。さらに、下位分割文字コード「0x82」と分割されない単一文字「居」の組み合わせも2グラム文字列となる。
基礎単語により、対象ファイル群が圧縮されている場合、圧縮符号マップの生成時や検索時に1パスでアクセスすることが可能である。なお、対象ファイル群を圧縮しない場合は、文字情報を指定するポインタとしては、文字情報の文字コードをそのまま採用してもよい。
<対象ファイル更新例>
図1は、対象ファイル更新例を示す説明図である。ここで、ファイル番号#=iの対象ファイルを対象ファイルFiとする。図1では、n個の対象ファイルのうちファイル番号#=3の対象ファイルF3を更新する場合を例に挙げている。なお、図1の圧縮符号マップMでは、文字情報を指定するポインタとなる文字情報の圧縮符号について、便宜上、文字情報を表記している。
(A)において、圧縮符号マップMには削除マップDが設定されている。削除マップDとは、対象ファイルFiの存在または削除をビット列で示したインデックスである。なお、削除マップDにおいてON(=1)に該当するビットに対応するファイル番号のファイルFiは、存在していることを意味する。一方、OFF(=0)になると、当該ファイルFiは削除されたことを意味する。これにより、圧縮符号マップMを用いて検索を行う場合に、対象ファイルFiそのものを削除しなくても、対象ファイルFiに対応する削除マップをOFFにすることで、対象ファイルFiを検索対象から除くことができる。圧縮符号マップM内の出現マップは、圧縮されて保持される。圧縮符号マップMの圧縮は、例えばハフマン木による圧縮などで、各文字情報に対応するビット列単位で行われても良い。また、圧縮符号マップMの圧縮は、削除マップDを除いた圧縮マップMについて行われても良い。圧縮された圧縮符号マップMのビット列の桁数は、対象ファイルの数以下となる。図1(A)、(C)においては、圧縮されたビット列が圧縮前よりも短くなっている様を、各ビット列の表示域を小さく表示することにより便宜的に示している。
(B)圧縮符号マップMは、対象ファイル群を絞り込む場合に、圧縮に用いたハフマン木により伸長される。たとえば、検索文字列が「人形」である場合、対象ファイルF3には、文字情報「人」、「形」、「人形」のビットがONになっており、削除マップDのビットもONである。したがって、これら3個のビットのAND結果が「1」となる。したがって、対象ファイルF3が検索される。
一方、対象ファイルF2の場合、文字情報「人」、「形」、「人形」のビットがONであるが、削除マップDのビットはOFFであるため、これら3個のビットのAND結果が「0」となる。したがって、対象ファイルF2は検索されない。なお、対象ファイルF3を削除する場合は、削除マップDの対象ファイルF3のビットがONからOFFになる。これにより、対象ファイルF3は、対象ファイルF2のように、検索対象外となる。
(C)つぎに、対象ファイルF3を更新する。たとえば、対象ファイルF3に「人形芝居を見た。」という文字列が記述されており、当該文字列以外の文字列には、「人」、「形」および「紙」は存在しないものとする。このうち、「人形」を「紙」に書き換えたとする。この場合、対象ファイルF3には、あたらしいファイル番号#=n+1が割り当てられ、更新により対象ファイルF(n+1)として保存される。
また、圧縮符号マップMには、ファイル番号n+1のビットが各出現マップに設定される。また、ファイル番号n+1の削除マップDのビットはONに設定される。対象ファイルF(n+1)の場合、「人形」の削除により、文字情報「人」、「形」、「人形」のビットがOFFになり、文字情報「紙」のビットがONになる。これにより、対象ファイルF(n+1)は検索対象とすることができる。
一方、ファイル番号3の削除マップDのビットがONからOFFになる。これにより、対象ファイルF3は検索対象外とすることができる。なお、更新元の対象ファイルF3は、削除することとしてもよい。この場合、省メモリ化を図ることができる。一方、対象ファイルF3は、そのまま残しておくこととしてもよい。この場合、更新前の状態に戻したい場合に、復元することが可能となる。もしくは、対象ファイルF3の格納場所を示すポインタを、更新後のファイルF(n+i)の格納場所を示すポインタに用いても良い。すなわち、対象ファイルF3そのものを書き換え、書き換えたファイルを、対象ファイルF(n+i)として利用しても良い。
また、更新後のファイルについて新しいファイル番号を採番するため、既存のファイル番号のビットを削除する必要はない。したがって、圧縮済みであるファイル番号1〜nの出現マップについては、圧縮状態のまま内容も更新することなく保持することができる。
また、図1(C)に示したように、あらかじめ、圧縮符号マップMの圧縮領域のビット列を、先頭位置から末尾位置にかけて対象ファイル群Fsのファイル番号pの降順に配列しておく。これにより、これにより、ファイル番号;1〜nのビット列が圧縮されても、追加ファイルのファイル番号とそのビットとのずれがなく、対象ファイルFiの絞込みを正確に実行することができる。
図1を用いて説明した圧縮符号マップMによる検索処理及び圧縮符号マップMの更新処理は、日本語のみに限らず、他の言語についても有効である。例えば、英語の対象ファイルを用いた場合には、「I watched marionette performance.」という文を含む対象ファイルFiは、圧縮符号マップMにおいて、「watch」、「marionette」、「performance」のそれぞれに対応するビットがONとなる。例えば、「marionette performance」という検索文字列を受け付けた場合には、「marionette」、「performance」のそれぞれに対応するビットと、削除マップDと、のAND結果が「1」である対象ファイルに検索範囲が絞り込まれる。
また、対象ファイルFiを「I watched acrobatic performance.」に更新する場合には、F(n+i)に対応する圧縮符号マップのビットを、「watch」、「acrobatic」、「performance」のそれぞれについてONにする。対象ファイルFiが、更新後には「marionette」という単語を含まない場合には、「marionette」に対応するF(n+i)のビットはOFFとする。さらに、対象ファイルF(n+i)に対応する削除マップDをONにして、Fiに対応する削除マップDをOFFにする。これにより、英語についても対象ファイルFiの更新に合わせて、圧縮符号マップMの更新処理が行われる。
<情報処理装置のハードウェア構成例>
図2は、実施の形態にかかる情報処理装置(抽出装置含む)のハードウェア構成例を示すブロック図である。図2において、情報処理装置は、CPU(Central Processing Unit)201と、ROM(Read Only Memory)202と、RAM(Random Access Memory)203と、磁気ディスクドライブ204と、磁気ディスク205と、光ディスクドライブ206と、光ディスク207と、ディスプレイ208と、I/F(Interface)209と、キーボード210と、マウス211と、スキャナ212と、プリンタ213と、を備えている。また、各構成部はバス200によってそれぞれ接続されている。
ここで、CPU201は、情報処理装置の全体の制御を司る。ROM202は、ブートプログラムなどのプログラムを記憶している。また、ROM202は、圧縮符号マップMを生成・管理するプログラム、圧縮符号マップMまたは符号マップを用いて検索を行うプログラムを記憶している。RAM203は、CPU201のワークエリアとして使用され、CPU201は、ROM202に記憶されたプログラムをRAM203に読み出して実行することができる。磁気ディスクドライブ204は、CPU201の制御にしたがって磁気ディスク205に対するデータのリード/ライトを制御する。磁気ディスク205は、磁気ディスクドライブ204の制御で書き込まれたデータを記憶する。
光ディスクドライブ206は、CPU201の制御にしたがって光ディスク207に対するデータのリード/ライトを制御する。光ディスク207は、光ディスクドライブ206の制御で書き込まれたデータを記憶したり、光ディスク207に記憶されたデータを情報処理装置に読み取らせたりする。
ディスプレイ208は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ208は、たとえば、CRT、TFT液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
インターフェース(以下、「I/F」と略する。)209は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク214に接続され、このネットワーク214を介して他の装置に接続される。そして、I/F209は、ネットワーク214と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F209には、たとえばモデムやLANアダプタなどを採用することができる。
キーボード210は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス211は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
スキャナ212は、画像を光学的に読み取り、情報処理装置内に画像データを取り込む。なお、スキャナ212は、OCR(Optical Character Reader)機能を持たせてもよい。また、プリンタ213は、画像データや文書データを印刷する。プリンタ213には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
また、情報処理装置は、サーバや据置き型のパーソナル・コンピュータのほか、携帯電話機、スマートフォン、電子書籍端末、ノート型パソコンなどの携帯型端末であってもよい。また、本実施の形態は、複数のコンピュータに応じて実施されてもよい。
図3は、本実施の形態にかかるシステム構成例を示す説明図である。図3において、システムは、図2に示す各ハードウェアを含みうる情報処理装置301〜303、ネットワーク304、スイッチ305、無線基地局307を含む。情報処理装置303に含まれるI/Fは、無線通信機能を備える。
例えば、複数のファイルを含むコンテンツについての圧縮符号マップMを生成する処理を情報処理装置301で実行し、情報処理装置302及び情報処理装置303に配信し、情報処理装置302および情報処理装置303のそれぞれで配信されたコンテンツについての検索処理を実行してもよい。
また、複数のファイルを含むコンテンツについての圧縮符号マップMを生成する処理を情報処理装置301で実行し、情報処理装置302または情報処理装置303からコンテンツについての検索依頼を情報処理装置301が受け付けて、検索処理を実行し、実行した検索処理の結果を情報処理装置302、情報処理装置303のそれぞれに返すように構成してもよい。図2と同様に、情報処理装置301〜303のそれぞれは、サーバや据置き型のパーソナル・コンピュータのほか、携帯電話機、スマートフォン、電子書籍端末、ノート型パソコンなどの携帯型端末であってもよい。
<機能的構成例1>
図4は、本実施の形態にかかる情報処理装置の機能的構成例1を示すブロック図であり、図5は、図4に示した情報処理装置の集計部〜第2圧縮部までの処理の流れを示す説明図である。図4において、情報処理装置400は、集計部401と、第1生成部402と、第1圧縮部403と、作成部404と、第2生成部405と、第2圧縮部406と、を備える。
集計部401〜第2圧縮部406は、具体的には、たとえば、図2に示したROM202、RAM203、磁気ディスク205などの記憶装置に記憶されたプログラムをCPU201に実行させることによりその機能を実現する。なお、集計部401〜第2圧縮部406は、それぞれ実行結果を記憶装置に書き込んだり、他の部の実行結果を読み出したりして、それぞれ演算を実行する。以下、集計部401〜第2圧縮部406について簡単に説明する。
集計部401は、対象ファイル群内の文字情報の出現回数を集計する。具体的には、たとえば、集計部401は、図5の(A)に示したように、対象ファイル群Fs内の文字情報の出現回数を集計する。集計部401では、特定単一文字、上位分割文字コード、下位分割文字コード、2グラム文字、基礎単語別に出現回数を計数する。集計部401の詳細な処理内容については後述する。
第1生成部402は、集計部401の集計結果に基づいて2N分枝無節点ハフマン木Hを生成する(図5(B))。2N分枝無節点ハフマン木Hとは、根から分岐する枝が2N本あり、1または複数本の枝で葉を直接ポイントするハフマン木である。節点(内部節点)はない。節点がなく直接葉にヒットするため、節点を有する通常のハフマン木に比べて、伸長速度の高速化を図ることができる。葉は、該当する文字情報とその圧縮符号を含む構造体である。葉の構造体とも呼ぶ。葉に割り当てられる枝数は、割当先の葉に存在する圧縮符号の圧縮符号長に依存する。第1生成部402の詳細な処理内容については後述する。
第1圧縮部403は、2N分枝無節点ハフマン木Hを用いて対象ファイル群Fsの各対象ファイルを圧縮して圧縮ファイル群fsにする(図5(C))。第1圧縮部403の詳細な処理内容については後述する。
作成部404は、集計部401の集計結果と2N分枝無節点ハフマン木Hにおいて文字情報ごとに割り当てられた圧縮符号に基づいて、圧縮符号マップMを作成する。作成部404は、圧縮符号マップMについても、特定単一文字、上位分割文字コード、下位分割文字コード、2グラム文字、基礎単語別に作成する。作成部404は、圧縮符号マップMにおいて該当する文字情報が1個の対象ファイルに1回でも出現したらそのファイル番号のビットをONにする(図5(D))。また、初期状態では、削除マップDは各対象ファイルですべてONにする。作成部404の詳細な処理内容については後述する。
第2生成部405は、文字情報の出現確率に基づいて出現マップを圧縮するハフマン木hを生成する(図5(E))。第2生成部405の詳細な処理内容については後述する。第2圧縮部406は、第2生成部405で生成されたハフマン木を用いて各出現マップを圧縮する(図5(F))。第2圧縮部406の詳細な処理内容については後述する。
<集計および圧縮符号マップMの作成の詳細>
つぎに、集計部401による集計および作成部404による圧縮符号マップMの作成の詳細について説明する。圧縮符号マップMを作成する場合、作成に先立って、集計部401により、対象ファイル群Fsから文字情報の出現回数を集計し、第1生成部402により、2N分枝無節点ハフマン木Hを生成しておく必要がある。
図6は、集計部401による集計および作成部404による圧縮符号マップMの作成例を示す説明図である。
(1)出現回数の集計
まず、情報処理装置400は、対象ファイル群Fsに存在する文字情報の出現回数を計数する。集計結果は、出現回数の降順にソートされ、出現回数の大きい方から昇順の順位がつけられる。なお、ここでは、文字情報の総種類数は、例として1305個(<2048(=211))とする。(1)出現回数の集計の詳細は図7で説明する。
(2)圧縮符号長算出
つぎに、(1)で得られた集計結果を基にして、情報処理装置400は、文字情報ごとの圧縮符号長を算出する。具体的には、情報処理装置400は、文字情報ごとに、出現率を算出する。出現率は、文字情報の出現回数を全文字情報の総出現回数で割ることで得られる。そして、情報処理装置400は、出現率に対応する生起確率を求め、生起確率から圧縮符号長を導き出す。
生起確率は、1/2xで表現される。xはべき数である。圧縮符号長は、生起確率のべき数xとなる。具体的には、出現率が生起確率の以下のどの範囲であるかで圧縮符号長が決定される。ARは出現率である。
1/20>AR≧1/21・・・圧縮符号長は1ビット。
1/21>AR≧1/22・・・圧縮符号長は2ビット。
1/22>AR≧1/23・・・圧縮符号長は3ビット。
1/23>AR≧1/24・・・圧縮符号長は4ビット。
・
・
・
1/2N-1>AR≧1/2N・・・圧縮符号長はNビット。
(2)圧縮符号長算出の詳細は図8で説明する。
(3)葉数特定
つぎに、情報処理装置400は、圧縮符号長ごとに葉数を集計することで圧縮符号長ごとの葉数を特定する。ここでは、最大圧縮符号長は17ビットとする。また、葉数とは、文字情報の種類数である。したがって、圧縮符号長5ビットの葉数が2である場合、5ビットの圧縮符号が割り当てられる文字情報が2つ存在することを示している。
(4)葉数補正
つぎに、情報処理装置400は、葉数を補正する。具体的には、情報処理装置400は、枝数の上限2Nのべき数Nが最大圧縮符号長となるように補正する。たとえば、べき数N=11の場合、圧縮符号長11ビット〜17ビットまでの葉数の総和を、補正後の圧縮符号長11ビットの葉数にする。そして、情報処理装置400は、圧縮符号長ごとに葉当たりの枝数を割り当てる。具体的には、補正後の圧縮符号長に対し、その降順に、20、21、22、23、24、25、26、16として葉当たりの枝数を決定する。
たとえば、図6では、圧縮符号長11ビットの圧縮符号が割り当てられる文字情報の総数(葉数)は1215個であるが、その葉当たりの枝数は1である。圧縮符号長11ビットの圧縮符号が割り当てられる文字情報については、それぞれ1本の枝しか割り当てられないこととなる。一方、圧縮符号長6ビットの圧縮符号が割り当てられる文字情報の総数(葉数)は6個であるが、その葉当たりの枝数は32である。圧縮符号長6ビットの圧縮符号が割り当てられる文字情報については、それぞれ32本の枝が割り当てられることとなる。(4)葉数補正は、必要な場合に実行すればよく、実行しなくてもよい。
(5)葉の構造体生成
つぎに、情報処理装置400は、葉の構造体を生成する。葉の構造体とは、文字情報とその圧縮符号長とその圧縮符号長での圧縮符号が対応付けられたデータ構造体である。たとえば、出現順位が1位である文字「0」の圧縮符号長は6ビットであり、圧縮符号は「000000」となる。図6の例では、文字情報の種類数(葉数)は1305個であるため、葉L1の構造体〜葉L1305の構造体が生成されることとなる。(3)葉数特定〜(5)葉の構造体生成の詳細(N=11)は、図9で説明する。
(6)葉へのポインタ生成
つぎに、情報処理装置400は、葉の構造体ごとに葉へのポインタを生成する。葉へのポインタは、そのポイント先となる葉の構造体内の圧縮符号に、その葉当たりの枝数分の番号に相当するビット列を連結したビット列である。たとえば、葉L1である文字「0」に割り当てられた圧縮符号「000000」の圧縮符号長は6ビットであるため、葉L1当たりの枝数は32本である。
したがって、葉L1へのポインタの先頭6ビットは、圧縮符号「000000」となる。後続ビット列は、葉L1当たりの枝数で表現される32(=25)種のビット列となる。すなわち、32種の5ビットのビット列が圧縮符号「000000」の後続ビット列となる。したがって、葉L1へのポインタは、先頭6ビットが「000000」で固定された32種の11ビットのビット列となる。なお、葉当たりの枝数が1本の場合は、葉へのポインタは1個であり、圧縮符号とその葉へのポインタは同一ビット列となる。(6)葉へのポインタ生成の詳細は、図11で説明する。
(7)2N分枝無節点ハフマン木Hの構築
最後に、情報処理装置400は、2N分枝無節点ハフマン木Hを構築する。具体的には、葉のポインタを根とすることで、葉の構造体を直接指定する2N分枝無節点ハフマン木Hが構築される。圧縮符号列が、先頭6ビットが「000000」の11ビットのビット列である場合、後続の5ビットが32種のいずれのビット列であっても、2N分枝無節点ハフマン木Hにより文字「0」の葉L1の構造体をポイントすることができる。(7)2N分枝無節点ハフマン木Hの構築の詳細は、図12で説明する。
図7は、(1)出現回数の集計の詳細を示す説明図である。図7において、情報処理装置400は、(A)対象ファイル群Fsからの集計、(B)出現頻度の降順でのソート、(C)目標出現率の順位までの抽出という3つのフェーズを実行する。以下、基礎単語と単一文字に分けて説明する。
(A1)まず、情報処理装置400は、対象ファイル群Fsを読み込んで、基礎単語の出現頻度(出現回数)を計数する。情報処理装置400は、基礎単語の構造体を参照して、基礎単語の構造体内の基礎単語に一致する文字列が対象ファイルに存在する場合に、当該基礎単語の出現頻度(初期値は0)を1加算する。基礎単語の構造体とは、基礎単語が記述されたデータ構造体である。
(B1)対象ファイル群Fsにおいて基礎単語の集計が終了すると、情報処理装置400は、基礎単語出現頻度集計テーブルを、出現頻度の降順にソートする。すなわち、出現頻度の高い順に並べ替え、出現頻度が最も高い基礎単語から順位付けをおこなう。
(A2)、また、情報処理装置400は、対象ファイル群Fsを読み込んで、単一文字の出現頻度を計数する。具体的には、情報処理装置400は、単一文字の出現頻度(初期値は0)を1加算する。
(B2)対象ファイル群Fsにおいて単一文字の集計が終了すると、情報処理装置400は、単一文字出現頻度集計テーブルを、出現頻度の降順にソートする。すなわち、出現頻度の高い順に並べ替え、出現頻度が最も高い単一文字から順位付けをおこなう。
(C1)つぎに、情報処理装置400は、(B1)ソート後の基礎単語出現頻度集計テーブルを参照して、目標出現率Pwまでの順位の基礎単語を抽出する。具体的には、情報処理装置400は、全基礎単語の出現頻度の総和(総出現頻度)を分母とし、順位が1位の基礎単語から降順に出現頻度を累計して分子とし、各順位までの出現率Pwを算出する。
たとえば、総出現頻度が40000、1位からy位までの基礎単語群の累計出現頻度が30000とすると、y位までの出現頻度は、(40000/30000)×100=75[%]となる。ここで、目標出現率Pwが75[%]である場合は、上位y位までの基礎単語を抽出することとなる。
(C21)つぎに、情報処理装置400は、(B2)ソート後の単一文字出現頻度集計テーブルを参照して、目標出現率Pcまでの順位の単一文字を抽出する。具体的には、情報処理装置400は、全単一文字の出現頻度の総和(総出現頻度)を分母とし、順位が1位の単一文字から降順に出現頻度を累計して分子とし、各順位までの出現率を算出する。
たとえば、総出現頻度が50000、1位からy位までの単一文字群の累計出現頻度が40000とすると、y位までの出現頻度は、(50000/40000)×100=80[%]となる。ここで、目標出現率Pcが80[%]である場合は、上位y位までの単一文字を抽出することとなる。なお、(C21)で抽出された単一文字を、元の単一文字群と区別するために、「特定単一文字(群)」と称す。
(C22)また、単一文字群のうち特定単一文字群から外された単一文字(以下、「非特定単一文字(群)」)は、出現頻度が各特定単一文字よりも低いため、その文字コードを分割する。具体的には、非特定単一文字の文字コードを、上位ビットの文字コードと、下位ビットの文字コードに分割する。
たとえば、単一文字がUTF16ビット文字コードで表現されている場合は、上位8ビットの文字コードと下位8ビットの文字コードに分割する。この場合、分割されたいずれの文字コードも、0x00〜0xFFのコードで表現される。このように、上位ビットの文字コードが上位分割文字コードであり、下位ビットの文字コードが下位分割文字コードである。
図8は、図6の(2)圧縮符号長算出の詳細(N=11)を示す説明図である。図8の文字情報テーブルは、図6の(1)での集計結果を反映したテーブルであり、文字情報ごとに順位項目、伸長種別項目、コード項目、文字項目、出現回数項目、総回数項目、出現率項目、補正前での生起確率項目および圧縮符号長項目が設定されている。このうち、順位項目〜総回数項目までが再ソート結果で得られた情報である。
ここで、順位項目には、文字情報の出現回数の降順に順位(昇順)が書き込まれている。文字情報項目のうち伸長種別項目には、文字情報の種別が書き込まれる。「16」は16ビットコード(の単一文字)を示している。「8」は8ビットの分割文字コードを示している。「基」は基礎単語を示している。
文字情報項目のうちコード項目には、特定単一文字または分割文字コードが書き込まれている。基礎単語の場合は空欄とする。文字情報項目のうち文字項目には、文字や基礎単語が書き込まれている。分割文字コードの場合は空欄とする。出現回数項目には、対象ファイル群Fsでの文字情報の出現回数が書き込まれている。総回数項目には、全文字情報の総出現回数が書き込まれている。
出現率項目には、出現回数を総回数で割り算した値が出現率として書き込まれている。補正前項目の生起確率項目には、出現率に対応する生起確率が書き込まれている。圧縮符号長項目には、生起確率に応じた圧縮符号長、すなわち、生起確率1/2yのべき数yが圧縮符号長として書き込まれている。
図9は、図6の(3)葉数特定〜(5)葉の構造体生成の詳細(N=11)を示す説明図である。図8の文字情報テーブルを圧縮符号長単位で葉数(文字情報の総種類数)を集計した結果が、図8における補正前の葉数となる。ここで、補正Aとは、圧縮符号長の上限長N(すなわち、2N分枝無節点ハフマン木Hの最大枝数2Nのべき数N)以上の圧縮符号長に割り当てられた葉数を、圧縮符号長の上限長Nに集約する補正である。この場合、補正前での最大圧縮符号長は17ビットであるが、文字情報の総種類数が1305種であるため、圧縮符号長の上限長Nは、N=11となる。したがって、補正Aでは、圧縮符号長11ビットの葉数が、圧縮符号長が11ビット〜17ビットの葉数の総和(1190個)となる。
そして、情報処理装置400は、生起確率総和を求める。圧縮符号長ごとの生起確率は決められているため(5ビットなら1/25)、圧縮符号長ごとに生起確率を葉数で乗じることで、圧縮符号長ごとの乗算結果が得られる。たとえば、補正Aにおける圧縮符号長5ビットの葉数は2である。圧縮符号長5ビットの生起確率は、1/25である。したがって、補正Aにおける圧縮符号長5ビットの生起確率は、2×(1/25)=1/24となる。圧縮符号長6ビット以降も同様に補正Aにおける圧縮符号長生起確率を求める。そして、補正A後における各圧縮符号長の生起確率を合計することで、補正Aでの生起確率総和が得られる。
そして、情報処理装置400は、生起確率総和が1以下であるか否かを判断する。しきい値tは0<t≦1である。しきい値tを設けたくない場合は、t=1とすればよい。しきい値t未満であれば、補正Bに移行する。しきい値t以上1以下である場合は、補正Bに移行せず、この時点での圧縮符号長ごとの葉数で確定する。
補正Bは、補正Aでの圧縮符号長群(5ビット〜12ビット)は変えずに、葉数を更新する補正である。具体的には、補正Aでの生起確率総和が、しきい値t以上1以下でない場合におこなわれる補正である。より具体的には、補正Bは2種類ある。
1つ目は、生起確率総和がしきい値t未満である場合、生起確率総和が1以下の最大値が得られるまで、たとえば、最大漸近値に収束するまで、生起確率総和を増加させる補正(以下、補正B+)である。もう1つは、生起確率総和が1より大きい場合、生起確率総和が1以下に割り込んでから1以下の最大値が得られるまで、たとえば、最大漸近値に収束するまで、生起確率総和を減少させる補正(以下、補正B-)である。
図9に示した例では、補正Aでの生起確率総和が「1.146」であるため、補正B-をおこなうこととなる。なお、補正B+および補正B-のいずれの補正Bであっても、葉数を生起確率総和で割るという同じ補正をおこなう。
まず、補正B-の1回目(補正B-1)では、圧縮符号長ごとの補正Aでの葉数を、前回の補正(この場合は補正A)の生起確率の総和(1.146)で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Aでの圧縮符号長の上限長N(N=11ビット)については、前回の補正(この場合は補正A)の生起確率総和(1.146)で割ることはせず、葉の総数(1305個)から、補正B-1での圧縮符号長ごとの葉の総数(圧縮符号長の上限長Nの葉数除く)を引くことで、圧縮符号長の上限長Nの葉数を求める。この場合は、1208個である。
このあと、情報処理装置400は、補正Aの場合と同様の計算処理により、補正B-1での生起確率総和を求める。そして、情報処理装置400は、補正B-1での生起確率総和が1以下の最大漸近値に収束したか否かを判断する。補正B-1での生起確率総和が1以下の最大漸近値に収束していなければ、補正B-の2回目(補正B-2)に移行する。最大漸近値に収束した場合は、補正B-2に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正B-1で更新された生起確率総和「1.042」は1より大きいため、最大漸近値に収束しておらず、補正B-2に移行する。
補正B-2では、圧縮符号長ごとの補正B-1での葉数を、前回の補正(この場合は補正B-1)の生起確率総和(1.042)で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正B-1での圧縮符号長の上限長N(N=11ビット)については、前回の補正(この場合は補正B-1)の生起確率総和(1.042)で割ることはせず、葉の総数(1305個)から、補正B-2での圧縮符号長ごとの葉の総数(圧縮符号長の上限長Nの葉数除く)を引くことで、圧縮符号長の上限長Nの葉数を求める。この場合は、1215個である。
このあと、情報処理装置400は、補正B-1の場合と同様の計算処理により、補正B-2での生起確率総和を求める。そして、情報処理装置400は、補正B-2での生起確率総和が1以下の最大漸近値に収束したか否かを判断する。補正B-2での生起確率総和が1以下の最大漸近値に収束していなければ、補正B-の3回目(補正B-3)に移行する。最大漸近値に収束した場合は、補正B-3に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正B-2で更新された生起確率総和「0.982」は1以下であるが、最大漸近値に収束しているかが不明であるため、補正B-3に移行する。
補正B-3では、圧縮符号長ごとの補正B-2での葉数を、前回の補正(この場合は補正B-2)の生起確率総和(0.982)で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正B-2での圧縮符号長の上限長N(N=11ビット)については、前回の補正(この場合は補正B-2)の生起確率総和(0.982)で割ることはせず、葉の総数(1305個)から、補正B-3での圧縮符号長ごとの葉の総数(圧縮符号長の上限長Nの葉数除く)を引くことで、圧縮符号長の上限長Nの葉数を求める。この場合は、1215個である。
このあと、情報処理装置400は、補正B-2の場合と同様の計算処理により、補正B-3での生起確率総和を求める。そして、情報処理装置400は、補正B-3での生起確率総和が1以下の最大漸近値に収束したか否かを判断する。補正B-3での生起確率総和が1以下の最大漸近値に収束していなければ、補正B-の4回目(補正B-4)に移行する。最大漸近値に収束した場合は、補正B-4に移行せず、この時点での圧縮符号長ごとの葉数で確定する。
補正B-3で更新された生起確率総和「0.982」は、補正B-2で更新された生起確率総和「0.982」と同じ値である。すなわち、補正B-3での各圧縮符号長の葉数と補正B-2での各圧縮符号長の葉数とは同じである。この場合、情報処理装置400は、生起確率総和が最大漸近値に収束したと判断し、葉数が確定する。
このようにして、葉数が確定するまで補正B-を継続することとなる。図9の例では、補正B-3で圧縮符号長ごとの葉数が確定したこととなる。このあと、情報処理装置400は、圧縮符号長ごとに、葉当たりの枝数を算出することとなる。葉当たりの枝数の算出は、上述したように、圧縮符号長の上限長N(この場合はN=11ビット)から降順に、20、21、22、23、24、25、26として葉当たりの枝数を割り当てることとなる。なお、枝数の小計は、圧縮符号長ごとに、葉当たりの枝数に確定した葉数を乗じた乗算結果である。
図10は、文字情報ごとの補正結果を示す説明図である。図10において、文字情報テーブルには、補正A、補正B-1〜補正B-2までの補正結果が追加されている。図10に示したように、補正により圧縮符号長別の葉数が更新されるため、順位項目の1位の文字情報から短い圧縮符号長が割り当てられることとなる。
たとえば、補正B-2で確定した場合、圧縮符号長6ビットでは葉数が6、圧縮符号長7ビットでは葉数が18、…、圧縮符号長11ビットでは葉数が1215となっている。したがって、順位が1位から6位までの文字情報(葉数6個分)については6ビットの圧縮符号長、順位が7位から24位までの文字情報(葉数18個分)については7ビットの圧縮符号長、…、順位が91位から1305位までの文字情報(葉数1215個分)については11ビットの圧縮符号長が割り当てられる。
そして、情報処理装置400は、文字情報と文字情報に割り当てられた圧縮符号長と圧縮符号長ごとの葉数とに基づいて、文字情報ごとに圧縮符号を割り当て、葉の構造体を生成することとなる。たとえば、出現率1位の単一文字「0」は5ビットの圧縮符号長が割り当てられているため、圧縮符号が「000000」となる。したがって、圧縮符号「000000」、圧縮符号長「6」、文字情報「0」を含む葉L1の構造体が生成されることとなる。
なお、上述した補正処理では、圧縮符号長が5ビット〜11ビットとしたが、2グラム文字列の圧縮符号マップMを分割する場合もあるため、圧縮符号長は偶数ビットとなるように、補正してもよい。具体的には、たとえば、圧縮符号長5ビットおよび7ビットの文字情報については6ビット、9ビットの文字情報については8ビット、11ビットの文字情報については10ビットとする。
図11は、図6の(6)葉へのポインタ生成の詳細(N=11)を示す説明図である。図11は、圧縮符号長の上限Nが11ビットの場合の葉へのポインタを示している。図11において、圧縮符号長が6ビットの葉数は6個であるため、圧縮符号は「000000」〜「000101」が割り当てられる。また、圧縮符号長が6ビットの葉当たりの枝数は、32本である。したがって、圧縮符号長が6ビットの圧縮符号についての葉へのポインタは、32(=25)個生成される。具体的には、葉へのポインタの先頭6ビットが圧縮符号で後続5ビットが32種のビット列となる。したがって、圧縮符号長が6ビットの圧縮符号の各々について、32種の葉へのポインタが生成されることとなる。
なお、図示はしないが、圧縮符号長が7ビットの葉数は18個であるため、圧縮符号「0001100」〜「0011111」が割り当てられる。また、圧縮符号長が7ビットの葉当たりの枝数は、16本である。したがって、圧縮符号長が7ビットの圧縮符号についての葉へのポインタは、16(=24)個生成される。具体的には、葉へのポインタの先頭7ビットが圧縮符号で後続4ビットが16種のビット列となる。したがって、圧縮符号長が7ビットの圧縮符号の各々について、16種の葉へのポインタが生成されることとなる。
同様に、圧縮符号長が8ビットの葉数は23個であるため、圧縮符号「01000000」〜「01010110」が割り当てられる。また、圧縮符号長が8ビットの葉当たりの枝数は、8本である。したがって、圧縮符号長が8ビットの圧縮符号についての葉へのポインタは、8(=23)個生成される。具体的には、葉へのポインタの先頭8ビットが圧縮符号で後続3ビットが8種のビット列となる。したがって、圧縮符号長が8ビットの圧縮符号の各々について、8種の葉へのポインタが生成されることとなる。
同様に、圧縮符号長が9ビットの葉数は23個であるため、圧縮符号「010101110」〜「011000100」が割り当てられる。また、圧縮符号長が9ビットの葉当たりの枝数は、4本である。したがって、圧縮符号長が9ビットの圧縮符号についての葉へのポインタは、4(=22)個生成される。具体的には、葉へのポインタの先頭9ビットが圧縮符号で後続2ビットが4種のビット列となる。したがって、圧縮符号長が9ビットの圧縮符号の各々について、4種の葉へのポインタが生成されることとなる。
同様に、圧縮符号長が10ビットの葉数は20個であるため、圧縮符号「0110000110」〜「0110011101」が割り当てられる。また、圧縮符号長が10ビットの葉当たりの枝数は、2本である。したがって、圧縮符号長が10ビットの圧縮符号についての葉へのポインタは、2(=21)個生成される。具体的には、葉へのポインタの先頭10ビットが圧縮符号で後続1ビットが2種のビット列となる。したがって、圧縮符号長が10ビットの圧縮符号の各々について、2種の葉へのポインタが生成されることとなる。
同様に、圧縮符号長が11ビットの葉数は1215個であるため、圧縮符号「01100111100」〜「11111111010」が割り当てられる。また、圧縮符号長が11ビットの葉当たりの枝数は、1本である。したがって、圧縮符号長が11ビットの圧縮符号についての葉へのポインタは、1(=20)個生成される。具体的には、圧縮符号がそのまま葉へのポインタとなる。したがって、圧縮符号長が11ビットの圧縮符号の各々について、1種の葉へのポインタが生成されることとなる。
図12は、図6の(7)2N分枝無節点ハフマン木Hの構築の詳細(N=11)を示す説明図である。図12では、N=11とした場合の2048(=211)分枝無節点ハフマン木Hを示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
具体的には、圧縮符号長が6ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図11に示したように32個生成される。したがって、葉L1の構造体については、根の構造体に32個の葉L1へのポインタL1P(1)〜L1P(32)が格納される。葉L2の構造体〜葉L6の構造体についても同様である。葉L7以降の構造体については、図12のとおりである。
図13は、葉の構造体を示す説明図である。葉の構造体は、第1領域〜第4領域を有するデータ構造体である。葉の構造体は、第1領域には、圧縮符号およびその圧縮符号長が格納される。第2領域には、葉の標識と伸長種別(図8参照)、出現率(図10参照)が格納される。第3領域には、伸長種別に応じて特定単一文字である16ビットの文字コード、非特定単一文字の文字コードが分割された8ビットの分割文字コード、または基礎単語へのポインタが格納される。基礎単語へのポインタにより基礎単語の構造体内の基礎単語が指定される。また、照合フラグも格納されている。照合フラグはデフォルトでは「0」である。「0」の場合は、伸長する文字をそのまま伸長バッファに書き出し、「1」の場合は、<color>タグと</color>タグで挟み込んで伸長バッファに書き出す。
第4領域には、格納されている文字情報の出現率と出現率領域が格納される。出現率とは、図8に示した文字情報の出現率である。出現率領域については図48および図49で説明する。なお、第4領域には、そのほか、符号種別と符号区分が格納される。符号種別とは、文字コードが数字、英字、特殊記号、カタカナ、ひらがな、漢字のいずれに該当するか、または基礎単語へのポインタであるかを識別する情報である。符号区分とは、文字コードが16ビットであるか8ビットであるかを識別する情報である。16ビットの文字コードである場合または予約語である場合、符号区分として"1"を割り当て、8ビットの分割文字コードの場合、符号区分として"0"を割り当てる。
なお、第1領域〜第4領域内の情報は、後述する構築処理(ステップS3205)において格納されることとなる。
図14は、特定単一文字の構造体を示す説明図である。特定単一文字の構造体1400は、特定単一文字コードe♯とその葉L♯へのポインタを格納するデータ構造体である。具体的には、たとえば、情報処理装置400は、対象ファイル群Fsからの集計結果が得られたときに、情報処理装置400が、特定単一文字の構造体1400に特定単一文字コードe♯を格納する。そして、情報処理装置400は、2N分枝無節点ハフマン木Hが構築されると、2N分枝無節点ハフマン木Hにおける各葉の構造体に格納された圧縮符号に対応する、特定単一文字の構造体1400における特定文字コードe♯へのポインタを格納する。
また、特定単一文字コードe♯へのポインタが対応する葉の構造体に格納されると、情報処理装置400は、2N分枝無節点ハフマン木Hにおける各特定単一文字コードe♯に対応する葉へのポインタを、特定単一文字の構造体1400内の対応する特定単一文字コードe♯に関連付けて格納する。これにより、特定単一文字の構造体1400が生成される。
図15は、分割文字コードの構造体を示す説明図である。分割文字コードの構造体1500は、分割文字コードとその葉L♯へのポインタを格納する。具体的には、たとえば、情報処理装置400は、対象ファイル群Fsからの集計結果が得られたときに、情報処理装置400が、分割文字コードの構造体1500に分割文字コードを格納する。そして、情報処理装置400は、2N分枝無節点ハフマン木Hが構築されると、2N分枝無節点ハフマン木Hにおける各葉の構造体に格納された圧縮符号に対応する、分割文字コードの構造体1500における分割文字コードへのポインタを格納する。
また、分割文字コードへのポインタが対応する葉の構造体に格納されると、情報処理装置400は、2N分枝無節点ハフマン木Hにおける各分割文字コードに対応する葉へのポインタを、分割文字コードの構造体1500内の対応する分割文字コードに関連付けて格納する。これにより、分割文字コードの構造体1500が生成される。
図16は、基礎単語の構造体を示す説明図である。基礎単語の構造体1600は、基礎単語とその葉L♯へのポインタを格納するデータ構造体である。基礎単語の構造体1600には、あらかじめ基礎単語が格納されている。情報処理装置400は、2N分枝無節点ハフマン木Hが構築されると、2N分枝無節点ハフマン木Hにおける各葉の構造体に格納された圧縮符号に対応する、基礎単語の構造体1600における基礎単語へのポインタを格納する。
また、基礎単語へのポインタが対応する葉の構造体に格納されると、情報処理装置400は、2N分枝無節点ハフマン木Hにおける各基礎単語に対応する葉へのポインタを、基礎単語の構造体1600内の対応する基礎に関連付けて格納することとなる。
<圧縮符号マップMの作成例>
第1生成部402により2N分枝無節点ハフマン木Hが生成されると、作成部404は、単一文字の圧縮符号マップM、上位分割文字コードの圧縮符号マップM、下位分割文字コードの圧縮符号マップM、単語の圧縮符号マップM、2グラム文字列の圧縮符号マップMを作成する。以下、単一文字の圧縮符号マップM、上位分割文字コードの圧縮符号マップM、下位分割文字コードの圧縮符号マップM、2グラム文字列の圧縮符号マップMの詳細な作成例について説明する。なお、基礎単語の圧縮符号マップMは、単一文字の圧縮符号マップMと同様に行われるため省略する。
図17は、圧縮符号マップMの生成例を示す説明図である。図17では、対象ファイルFi内に『竜馬は脱藩した』という文字列が記述されているものとする。
(A)まず、先頭文字「竜」が対象文字である。対象文字「竜」は特定単一文字であるため、2N分枝無節点ハフマン木Hにアクセスして特定単一文字「竜」の圧縮符号を取得し、特定単一文字「竜」の出現マップを特定する。未生成の場合は、特定単一文字「竜」の圧縮符号をポインタとし、かつ、対象ファイルの存否を示すビット列をオール0にした特定単一文字「竜」の出現マップを生成する。そして、特定単一文字「竜」の出現マップについて対象ファイルFiのビットをON("0"→"1")にする。
(B)つぎに、対象文字を1グラムシフトして、対象文字を「馬」にする。対象文字「馬」は特定単一文字であるため、2N分枝無節点ハフマン木Hにアクセスして特定単一文字「馬」の圧縮符号を取得し、特定単一文字「馬」の出現マップを特定する。未生成の場合は、特定単一文字「馬」の圧縮符号をポインタとし、かつ、対象ファイルの存否を示すビット列をオール0にした特定単一文字「馬」の出現マップを生成する。そして、特定単一文字「馬」の出現マップについて対象ファイルFiのビットをON("0"→"1")にする。
また、対象文字が「馬」にシフトされた場合、「竜馬」という2グラム文字列が得られるため、「竜」の圧縮符号と「馬」の圧縮符号を結合した「竜馬」の圧縮符号列により、2グラム文字列「竜馬」の出現マップを特定する。未生成の場合は、「竜馬」の圧縮符号列をポインタとし、かつ、対象ファイルの存否を示すビット列をオール0にした2グラム文字列「竜馬」の出現マップを生成する。そして、2グラム文字列「竜馬」の出現マップにおいて対象ファイルFiのビットをON("0"→"1")にする。
(C)つぎに、対象文字を1グラムシフトして、対象文字を「は」にする。対象文字「は」についても(B)と同様に処理することで、特定単一文字「は」の出現マップについて対象ファイルFiのビットをON("0"→"1")にする。同様に、2グラム文字列「馬は」の出現マップにおいて対象ファイルFiのビットをON("0"→"1")にする。
(D)つぎに、対象文字を1グラムシフトして、対象文字を「脱」にする。対象文字「脱」は特定単一文字ではないため、対象文字「脱」の文字コード「0x8131」を、上位分割文字コード「0x81」と下位分割文字コード「0x31」に分割する。そして、対象文字を上位分割文字コード「0x81」にする。上位分割文字コード「0x81」についても、特定単一文字と同様に処理することで、上位分割文字コード「0x81」の出現マップについて対象ファイルFiのビットをON("0"→"1")にする。同様に、2グラム文字列「は 0x81」の出現マップにおいて対象ファイルFiのビットをON("0"→"1")にする。
(E)つぎに、対象文字を1グラムシフトして、文字「脱」の下位分割文字コード「0x31」を、対象文字にする。下位分割文字コード「0x31」についても、同様に処理することで、下位分割文字コード「0x31」の出現マップについて対象ファイルFiのビットをON("0"→"1")にする。同様に、2グラム文字列「0x81 0x31」の出現マップにおいて対象ファイルFiのビットをON("0"→"1")にする。
(F)〜(I)についても同様の処理をおこない、最後の対象ファイルFnについても処理を完了することで、単一文字、上位分割文字コード、下位分割文字コード、2グラム文字列のそれぞれについて、圧縮符号マップMが生成される。
<圧縮符号マップM生成処理手順>
つぎに、作成部404による圧縮符号マップ作成処理手順例について説明する。
図18は、作成部404による圧縮符号マップ作成処理手順例を示すフローチャートである。情報処理装置400は、集計処理(ステップS1801)、マップ割当数決定処理(ステップS1802)、再集計処理(ステップS1803)、ハフマン木生成処理(ステップS1804)、マップ作成処理(ステップS1805)を実行する。情報処理装置400は、集計部401により集計処理(ステップS1801)〜再集計処理(ステップS1803)を実行する。また、第1生成部402によりハフマン木生成処理(ステップS1804)を実行し、作成部404によりマップ作成処理(ステップS1805)を実行する。
集計処理(ステップS1801)とは、対象ファイル群Fs内の単一文字や基礎単語の出現回数(出現頻度ともいう)を計数する処理である。マップ割当数決定処理(ステップS1802)とは、集計処理(ステップS1801)で集計された単一文字および基礎単語についてのマップ割当数を決定する処理である。マップ割当数に対応する出現順位の単一文字および基礎単語が、それぞれ特定単一文字および基礎単語となる。
再集計処理(ステップS1803)とは、単一文字のうち特定単一文字以外の非特定単一文字を分割して、上位分割文字コードおよび下位分割文字コードとし、それぞれの出現回数を集計する処理である。また、再集計処理(ステップS1803)では、2グラム文字列の出現回数も集計する。
ハフマン木生成処理(ステップS1804)とは、図8〜図13に示したように、2N分枝無節点ハフマン木Hを生成する処理である。マップ作成処理(ステップS1805)とは、特定単一文字、基礎単語、上位分割文字コード、下位分割文字コード、2グラム文字列についての圧縮符号マップMを生成する処理である。
(集計処理(ステップS1801))
図19は、図18に示した集計処理(ステップS1801)の詳細な処理手順例を示すフローチャートである。まず、情報処理装置400は、ファイル番号iをi=1に設定し(ステップS1901)、対象ファイルFiを読み込む(ステップS1902)。そして、情報処理装置400は、対象ファイルFiの集計処理を実行する(ステップS1903)。対象ファイルFiの集計処理(ステップS1903)の詳細については、図20で説明する。このあと、情報処理装置400は、ファイル番号iがi>n(nは対象ファイルF1〜Fnの総数)であるか否かを判断する(ステップS1904)。
i>nでない場合(ステップS1904:No)、情報処理装置400は、iをインクリメントし(ステップS1905)、ステップS1902に戻る。一方、i>nである場合(ステップS1904:Yes)、情報処理装置400は、図18に示したマップ割当数決定処理(ステップS1802)に移行して、集計処理(ステップS1801)を終了する。この集計処理(ステップS1801)によれば、対象ファイルFiごとに対象ファイルFiの集計処理(ステップS1903)を実行することができる。
(対象ファイルFiの集計処理(ステップS1903))
図20は、図19に示した対象ファイルFiの集計処理(ステップS1903)の詳細な処理手順例を示すフローチャートである。まず、情報処理装置400は、対象文字を対象ファイルFiの先頭文字とし(ステップS2001)、基礎単語集計処理を実行する(ステップS2002)。基礎単語集計処理(ステップS2002)の詳細については図22で説明する。このあと、情報処理装置400は、文字出現頻度集計テーブルにおいて対象文字の出現回数を1増加する(ステップS2003)。
図21は、文字出現頻度集計テーブルを示す説明図である。文字出現頻度集計テーブル2100は、RAM203や磁気ディスク205などの記憶装置に記憶されており、該当する文字が出現する都度出現回数を1ずつ増加させる。
図20に戻り、情報処理装置400は、対象文字が対象ファイルFiの末尾文字であるか否かを判断する(ステップS2004)。対象文字が対象ファイルFiの末尾文字でない場合(ステップS2004:No)、情報処理装置400は、対象文字を末尾方向へ1文字シフトし(ステップS2005)、ステップS2002に戻る。
一方、対象文字が対象ファイルFiの末尾文字である場合(ステップS2004:Yes)、情報処理装置400は、ステップS1904に移行して、対象ファイルFiの集計処理(ステップS1903)を終了する。この対象ファイルFiの集計処理(ステップS1903)によれば、対象ファイル群Fsに存在する基礎単語および単一文字の出現頻度を集計することができる。
(基礎単語集計処理(ステップS2002))
図22は、図20に示した基礎単語集計処理(ステップS2002)の詳細な処理手順例を示すフローチャートである。まず、情報処理装置400は、最長一致検索処理を実行し(ステップS2201)、最長一致した基礎単語があったか否かを判断する(ステップS2202)。最長一致検索処理(ステップS2202)の詳細については図24で説明する。最長一致した基礎単語があった場合(ステップS2202:Yes)、情報処理装置400は、基礎単語出現頻度集計テーブルにおいて最長一致した基礎単語の出現回数を1増加し(ステップS2203)、ステップS2003に移行する。
図23は、基礎単語出現頻度集計テーブルを示す説明図である。基礎単語出現頻度集計テーブル2300は、RAM203や磁気ディスク205などの記憶装置に記憶されており、該当する基礎単語が出現する都度出現回数を1ずつ増加させる。
図22に戻り、最長一致した基礎単語がなかった場合(ステップS2202:No)、ステップS2003に移行する。これにより、基礎単語集計処理(ステップS2002)を終了する。この基礎単語集計処理(ステップS2002)によれば、最長一致検索処理(ステップS2201)により基礎単語を計数することができるため、文字列が長い基礎単語を優先的に計数することができる。
(最長一致検索処理(ステップS2201))
図24は、図22に示した最長一致検索処理(ステップS2201)の詳細な処理手順を示すフローチャートである。まず、情報処理装置400は、c=1とする(ステップS2401)。cは対象文字からの文字数(対象文字含む)である。c=1の場合は、対象文字だけである。つぎに、情報処理装置400は、対象文字からc文字目までの対象文字列と前方一致する基礎単語を2分探索する(ステップS2402)。そして、情報処理装置400は、検索により基礎単語があるか否かを判断する(ステップS2403)。2分探索により基礎単語がヒットしなかった場合(ステップS2403:No)、ステップS2406に移行する。
一方、2分探索により基礎単語がヒットした場合(ステップS2403:Yes)、情報処理装置400は、ヒットした基礎単語と対象文字列とが完全一致するか否かを判断する(ステップS2404)。そして、完全一致しない場合(ステップS2404:No)、ステップS2406に移行する。一方、完全一致する場合(ステップS2404:Yes)、情報処理装置400は、最長一致候補として記憶装置に保持し(ステップS2405)、ステップS2406に移行する。
ステップS2406では、情報処理装置400は、対象文字列について2分探索が終了したか否かを判断する(ステップS2406)。具体的には、情報処理装置400は、末尾の基礎単語まで2分探索したか否かを判断する。2分探索が終了していない場合(ステップS2406:No)、情報処理装置400は、ステップS2402に移行して、2分探索が終了するまで継続する。
一方、対象文字列について2分探索が終了した場合(ステップS2406:Yes)、情報処理装置400は、c文字目の文字が対象ファイルFiの末尾文字であるか否かを判断する(ステップS2407)。c文字目の文字が対象ファイルFiの末尾文字である場合(ステップS2407:Yes)、ステップS2410に移行する。一方、c文字目の文字が対象ファイルFiの末尾文字でない場合(ステップS2407:No)、情報処理装置400は、c>cmaxであるか否かを判断する(ステップS2408)。cmaxは予め設定された値であり、これにより対象文字列の上限文字数が設定される。
c>cmaxでない場合(ステップS2408:No)、情報処理装置400は、cをインクリメントして(ステップS2409)、ステップS2402に戻る。一方、c>cmaxである場合(ステップS2408:Yes)、情報処理装置400は、最長一致候補があるか否かを判断する(ステップS2410)。具体的には、情報処理装置400は、ステップS2405において1つでも最長一致候補がメモリに保持されているか否かを判断する。
最長一致候補がある場合(ステップS2410:Yes)、情報処理装置400は、最長一致候補のうち最長文字列を、最長一致した基礎単語に決定する(ステップS2411)。そして、ステップS2202に移行する。一方、ステップS2410において、最長一致候補が1つもない場合(ステップS2410:No)、ステップS2202に移行する。これにより、最長一致検索処理(ステップS2201)を終了する。この最長一致検索処理(ステップS2201)によれば、基礎単語の構造体にある基礎単語の中から、完全一致した文字列の中でかつ最長の文字列を基礎単語として検索することができる。
(マップ割当数決定処理(ステップS1802))
図25は、図18に示したマップ割当数決定処理(ステップS1802)の詳細な処理手順例を示すフローチャートである。まず、情報処理装置400は、集計処理(ステップS1801)による基礎単語ごとの出現頻度を示す基礎単語出現頻度集計テーブル2300と単一文字ごとの出現頻度を示す文字出現頻度集計テーブル2100を出現頻度の高い順にソートする(ステップS2501)。そして、情報処理装置400は、ソート後の基礎単語出現頻度集計テーブル2300を参照して、基礎単語の出現順位RwをRw=1とし(ステップS2502)、出現順位Rwまでの累積出現回数Arwを計数する(ステップS2503)。そして、情報処理装置400は、下記式(1)を満たすか否かを判断する(ステップS2504)。
Arw>Pw×Aw・・・(1)
Awは集計された基礎単語の総出現回数である。
上記(1)式を満たさない場合(ステップS2504:No)、情報処理装置400は、出現順位Rwをインクリメントして(ステップS2505)、ステップS2503に戻る。すなわち、上記式(1)を満たすまで出現順位Rwを下げ続ける。
そして、上記式(1)を満たした場合(ステップS2504:Yes)、情報処理装置400は、基礎単語のマップ割当数NwをNw=Rw−1とする(ステップS2506)。ここで、マップ割当数Nwとは、マップ作成処理(ステップS1805)で生成される基礎単語出現マップに割り当てられる基礎単語数であり、基礎単語出現マップのレコード数(行数)を意味する。
また、情報処理装置400は、単一文字の出現順位RcをRc=1とし(ステップS2507)、出現順位Rcまでの累積出現回数Arcを計数する(ステップS2508)。そして、情報処理装置400は、下記式(2)を満たすか否かを判断する(ステップS2509)。
Arc>Pc×Ac・・・(2)
Acは集計された単一文字の総出現回数である。
上記(2)式を満たさない場合(ステップS2509:No)、情報処理装置400は、出現順位Rcをインクリメントして(ステップS2510)、ステップS2508に戻る。すなわち、上記式(2)を満たすまで出現順位Rcを下げ続ける。
そして、上記式(2)を満たした場合(ステップS2509:Yes)、情報処理装置400は、単一文字のマップ割当数NcをNc=Rc−1とする(ステップS2511)。ここで、マップ割当数Ncとは、マップ作成処理(ステップS1805)で生成される特定単一文字出現マップに割り当てられる特定単一文字数であり、特定単一文字出現マップのレコード数(行数)を意味する。この後、再集計処理(ステップS1803)に移行して、マップ割当数決定処理(ステップS1802)を終了する。
このマップ割当数決定処理(ステップS1802)によれば、マップ作成処理(ステップS1805)において目標出現率Pwに応じた数の基礎単語分について基礎単語出現マップを生成することができる。したがって、すべての基礎単語についてマップ割当をおこなう必要はなく、目標出現率Pwにしたがって決められるため、マップサイズの最適化を図ることができる。
また、単一文字についても、マップ作成処理(ステップS1805)において目標出現率Pcに応じた数の単一文字分について特定単一文字の圧縮符号マップMを生成することができる。したがって、すべての単一文字についてマップ割当をおこなう必要はなく、目標出現率Pcにしたがって決められるため、マップサイズの最適化を図ることができる。
(再集計処理(ステップS1803))
図26は、図18に示した再集計処理(ステップS1803)の詳細な処理手順例を示すフローチャートである。まず、情報処理装置400は、ファイル番号iをi=1に設定し(ステップS2601)、対象ファイルFiを読み込む(ステップS2602)。そして、情報処理装置400は、対象ファイルFiの再集計処理を実行する(ステップS2603)。対象ファイルFiの再集計処理(ステップS2603)の詳細については、図27で説明する。このあと、情報処理装置400は、ファイル番号iがi>n(nは対象ファイルF1〜Fnの総数)であるか否かを判断する(ステップS2604)。
i>nでない場合(ステップS2604:No)、情報処理装置400は、iをインクリメントし(ステップS2605)、ステップS2602に戻る。一方、i>nである場合(ステップS2604:Yes)、情報処理装置400は、図18に示したハフマン木生成処理(ステップS1804)に移行して、再集計処理(ステップS1803)を終了する。この再集計処理(ステップS1803)によれば、対象ファイルFiごとに対象ファイルFiの再集計処理(ステップS2603)を実行することができる。
(対象ファイルFiの再集計処理(ステップS2603))
図27は、対象ファイルFiの再集計処理(ステップS2603)の詳細な処理手順例を示すフローチャートである。まず、情報処理装置400は、対象文字を対象ファイルFiの先頭文字とし(ステップS2701)、対象文字が特定単一文字であるか否かを判断する(ステップS2702)。特定単一文字である場合(ステップS2702:Yes)、分割せずにステップS2704に移行する。
一方、特定単一文字でない場合(ステップS2702:No)、情報処理装置400は、対象文字の文字コードを上位分割文字コードと下位分割文字コードとに分割する(ステップS2703)。そして、ステップS2704に移行する。
ステップS2704では、情報処理装置400は、上位分割文字コード出現頻度集計テーブルに対し、ステップS2703で得られた上位分割文字コードと同一分割文字コードの出現回数を1加算する(ステップS2704)。
図28は、上位分割文字コード出現頻度集計テーブルを示す説明図である。上位分割文字コード出現頻度集計テーブル2800は、RAM203や磁気ディスク205などの記憶装置に記憶されており、該当する上位分割文字コードが出現する都度出現回数を1ずつ増加させる。
また、図27において、情報処理装置400は、下位分割文字コード出現頻度集計テーブルに対し、ステップS2703で得られた下位分割文字コードと同一分割文字コードの出現回数を1加算する(ステップS2705)。
図29は、下位分割文字コード出現頻度集計テーブルを示す説明図である。下位分割文字コード出現頻度集計テーブル2900は、RAM203や磁気ディスク205などの記憶装置に記憶されており、該当する下位分割文字コードが出現する都度出現回数を1ずつ増加させる。
また、図27において、情報処理装置400は、2グラム文字列特定処理を実行する(ステップS2706)。2グラム文字列特定処理(ステップS2706)では、対象文字を基点とする2グラム文字列を特定する。2グラム文字列特定処理(ステップS2706)の詳細は図30で説明する。
情報処理装置400は、2グラム文字列出現頻度集計テーブルに対し、2グラム文字列特定処理(ステップS2706)で特定された2グラム文字列の出現回数を1加算する(ステップS2707)。
図30は、図27で示した2グラム文字列特定処理(ステップS2706)の詳細な処理手順を示すフローチャートである。まず、情報処理装置400は、対象文字に対し、対象文字は分割されたか否かを判断する(ステップS3001)。すなわち、情報処理装置400は、対象文字が分割文字コードか否かを判断する。分割されていない場合(ステップS3001:No)、すなわち、単一文字の場合、情報処理装置400は、1つ前の文字があるか否かを判断する(ステップS3002)。
1つ前の文字がある場合(ステップS3002:Yes)、情報処理装置400は、1つ前の文字は分割されたか否かを判断する(ステップS3003)。すなわち、情報処理装置400は、1つ前の文字が分割文字コードか否かを判断する。分割されていない場合(ステップS3003:No)、すなわち、単一文字の場合、情報処理装置400は、対象文字の1つ前の単一文字と対象文字(単一文字)からなる文字列を、2グラム文字列に決定する(ステップS3004)。そして、ステップS2707に移行する。
一方、ステップS3003において、1つ前の文字が分割された場合(ステップS3003:Yes)、すなわち、分割文字コードである場合、その1つ前の文字である分割文字コードは、下位分割文字コードとなる。したがって、情報処理装置400は、1つ前の文字である下位分割文字コードと対象文字からなる文字列を、2グラム文字列に決定する(ステップS3005)。そして、ステップS2707に移行する。
また、ステップS3002において、1つ前の文字がない場合(ステップS3002:No)、対象文字だけとなるため、2グラム文字列を決定せずに、ステップS2707に移行する。
また、ステップS3001において、対象文字が分割された場合(ステップS3001:Yes)、すなわち、分割文字コードである場合、情報処理装置400は、その分割文字コードが上位分割文字コードか下位分割文字コードであるかを判断する(ステップS3006)。
上位分割文字コードである場合(ステップS3006:上位)、情報処理装置400は、1つ前の文字は分割されたか否かを判断する(ステップS3007)。すなわち、1つ前の文字が分割文字コードか否かを判断する。分割されていない場合(ステップS3007:No)、すなわち、単一文字の場合、情報処理装置400は、対象文字の1つ前の単一文字と対象文字から分割された上位分割文字コードからなる文字列を、2グラム文字列に決定する(ステップS3008)。そして、ステップS2707に移行する。
一方、ステップS3007において、1つ前の文字が分割された場合(ステップS3007:Yes)、すなわち、分割文字コードである場合、その1つ前の文字である分割文字コードは、下位分割文字コードとなる。したがって、情報処理装置400は、1つ前の文字である下位分割文字コードと対象文字から分割された上位分割文字コードからなる文字列を、2グラム文字列に決定する(ステップS3009)。そして、ステップS2707に移行する。
また、ステップS3006において、下位分割文字コードである場合(ステップS3006:下位)、情報処理装置400は、対象文字から分割された上位分割文字コードおよび下位分割文字コードからなる文字列を、2グラム文字列に決定する(ステップS3010)。そして、ステップS2707に移行する。
この2グラム文字列特定処理(ステップS2706)によれば、対象文字が分割された場合であっても2グラム文字列を特定することができる。また、1文字シフトにしたがって2グラム文字列を特定するため、基礎単語の圧縮符号マップMおよび特定単一文字の圧縮符号マップMと同時並行で生成することができる。
このように、上述した情報生成によれば、目標出現率Pw,Pcにより、マップ作成される基礎単語数および単一文字数が制限されるため、無駄なマップ作成がなくなり、マップ作成の高速化およびマップサイズの最適化を同時に実現することができる。また、1文字シフトにより複数種類のマップ作成を同時並行で実行することができ、高精度な検索に用いる複数種類のマップ作成の効率化を図ることができる。
図31は、2グラム文字列出現頻度集計テーブルを示す説明図である。2グラム文字列出現頻度集計テーブル3100は、RAM203や磁気ディスク205などの記憶装置に記憶されており、該当する2グラム文字列が出現する都度出現回数を1ずつ増加させる。
このあと、情報処理装置400は、対象文字の後続文字が対象ファイルFi内にあるか否かを判断し(ステップS2708)、後続文字がある場合(ステップS2708:Yes)、後続文字を対象文字に設定し(ステップS2709)、ステップS2702に戻る。一方、後続文字がない場合(ステップS2708:No)、対象ファイルFiの再集計処理(ステップS2603)を終了して、ステップS2604に移行する。
これにより、対象ファイルFiごとに、対象ファイルFi内に存在する上位分割文字コード、下位分割文字コード、および2グラム文字列の出現回数を集計することができる。
(ハフマン木生成処理(ステップS1804))
図32は、図18に示したハフマン木生成処理(ステップS1804)の詳細な処理手順例を示すフローチャートである。図32において、情報処理装置400は、圧縮符号長の上限長Nを決定する(ステップS3201)。つぎに、情報処理装置400は、補正処理を実行する(ステップS3202)。ここで、補正処理とは、図8〜図10で説明したように、文字情報ごとの生起確率および圧縮符号長を、圧縮符号長の上限長Nを用いて補正する処理である。
つぎに、情報処理装置400は、文字情報ごとに葉の構造体を生成する(ステップS3203)。そして、情報処理装置400は、枝数特定処理を実行する(ステップS3206)。枝数特定処理(ステップS3204)では、圧縮符号長ごとの葉当たりの枝数を特定する。枝数特定処理(ステップS3204)の詳細は図33で説明する。
そして、情報処理装置400は、構築処理を実行する(ステップS3205)。枝数特定処理(ステップS3204)により葉の構造体ごとの枝数が特定されるため、まず、情報処理装置400は、葉の構造体ごとに、枝数分の葉へのポインタ群を生成する。そして、生成された各葉の構造体についての葉へのポインタ群を集約して根の構造体とする。これにより、2N分枝無節点ハフマン木Hが生成されることとなる。なお、生成された2N分枝無節点ハフマン木Hは、情報処理装置400内の記憶装置(RAM203や磁気ディスク205など)に格納される。このあと、図18のマップ作成処理(ステップS1805)に移行する。
図33は、図32に示した枝数特定処理(ステップS3204)の詳細な処理手順例を示すフローチャートである。まず、情報処理装置400は、最大圧縮符号長CLmax(=N)と最小圧縮符号長CLmin(=M)との差分D(=N−M)を算出する(ステップS3301)。たとえば、N=11の場合、図19を参照すると、M=6である。したがって、D=5である。
つぎに、情報処理装置400は、2のべき数の変数jをj=0とし、圧縮符号長の変数CLをCL=Nとする(ステップS3302)。そして、情報処理装置400は、j>Dであるか否かを判断する(ステップS3303)。j>Dでない場合(ステップS3303:No)、情報処理装置400は、圧縮符号長CLの葉当たりの枝数b(CL)を算出する(ステップS3304)。圧縮符号長CLの葉当たりの枝数b(CL)は、b(CL)=2jで算出される。たとえば、j=0のとき、圧縮符号長CL=N=11であるため、圧縮符号長11ビットでの葉当たりの枝数b(11)は、b(11)=2j=20=1となる。
つぎに、情報処理装置400は、圧縮符号長CLの総枝数B(L)を算出する(ステップS3305)。圧縮符号長CLの総枝数B(L)は、B(L)=L(CL)×b(CL)で算出される。L(CL)は、圧縮符号長CLでの葉数(文字情報の種類数)である。たとえば、j=0のとき、圧縮符号長CL=N=11であるため、圧縮符号長11ビットでの総枝数B(L)は、1216×20=1216となる。
このあと、情報処理装置400は、jをインクリメントし、圧縮符号長CLをデクリメントして(ステップS3306)、ステップS3303に戻り、インクリメント後のjがj>Dであるか否かが判断される。なお、N=11の場合は、j=Dになるとj=D=5となり、CL=M=6となる。したがって、ステップS3304では、圧縮符号長CL(5ビット)の葉当たりの枝数b(6)は、b(6)=26=64となる。同様に、総枝数B(L)は、B(6)=0×26=0となる。そして、j>Dである場合(ステップS3303:Yes)、構築処理(ステップS3205)に移行する。
図34は、図32に示した構築処理(ステップS3205)の詳細な処理手順を示すフローチャートである。まず、情報処理装置400は、圧縮符号長CLをCL=CLmin=Mとする(ステップS3401)。つぎに、情報処理装置400は、圧縮符号長CLでの未選択の葉があるか否かを判断する(ステップS3402)。未選択の葉がある場合(ステップS3402:Yes)、情報処理装置400は、葉へのポインタ生成処理(ステップS3403)を実行して、ステップS3402に戻る。葉へのポインタ生成処理(ステップS3403)では、葉の構造体ごとに、圧縮符号長CLに応じた枝数分の葉へのポインタ群を生成する。なお、葉へのポインタ生成処理(ステップS3403)の詳細は図35で説明する。
一方、ステップS3402において、未選択の葉がない場合(ステップS3402:No)、情報処理装置400は、CL>Nであるか否かを判断する(ステップS3404)。CL>Nでない場合(ステップS3404:No)、情報処理装置400は、CLをインクリメントして(ステップS3405)、ステップS3402に戻る。一方、CL>Nである場合(ステップS3404:Yes)、2N分枝無節点ハフマン木Hが構築されたこととなり、ステップS1805に移行することとなる。なお、第1領域〜第5領域内の情報は、この構築処理(ステップS3205)において格納されることとなる。
図35は、図34に示した葉へのポインタ生成処理(ステップS3403)の詳細な処理手順を示すフローチャートである。まず、情報処理装置400は、未選択の葉Lを選択し(ステップS3501)、選択葉へのポインタ数kをk=1に設定する(ステップS3502)。そして、情報処理装置400は、選択葉へのポインタPL(k)の先行ビット列を、選択葉の圧縮符号に設定する(ステップS3503)。たとえば、上限長N=11については、選択葉が、文字情報「0」の葉の構造体である場合、圧縮符号は「000000」である。したがって、選択葉へのポインタPL(k)の先行ビット列も、「000000」となる。
つぎに、情報処理装置400は、選択葉へのポインタPL(k)の後続ビット列のビット長を、最大圧縮符号長Nから選択葉の圧縮符号長CLを引いた差分とし、後続ビット列の初期値をオール0に設定する(ステップS3504)。たとえば、選択葉が、文字情報「0」の葉の構造体である場合、圧縮符号長CLは6ビットであるため、後続ビット列のビット長は5ビット(=11−6)となる。k=1の場合は、後続ビット列はオール0となるため、後続ビット列は、5ビットの「00000」となる。
そして、情報処理装置400は、選択葉へのポインタPL(k)を根の構造体に格納する(ステップS3505)。このあと、情報処理装置400は、k>b(CL)であるか否かを判断する(ステップS3506)。b(CL)は、選択葉の圧縮符号長CLの葉当たりの枝数である。k>b(CL)でない場合(ステップS3506:No)、選択葉に割り当てられたすべての枝について葉へのポインタが生成されていないため、情報処理装置400は、kをインクリメントする(ステップS3507)。
そして、情報処理装置400は、現在の後続ビット列をインクリメントして、インクリメント後の後続ビット列を先行ビット列の末端に連結することで、あらたに、選択葉へのポインタPL(k)を生成する(ステップS3508)。そして、情報処理装置400は、選択葉へのポインタPL(k)を根の構造体に格納し(ステップS3509)、ステップS3506に戻る。ステップS3506〜ステップS3509を繰り返すことで、葉当たりの枝数分の葉へのポインタ群が生成されることとなる。そして、ステップS3506において、k>b(CL)である場合(ステップS3506:Yes)、ステップS3402に移行する。
このように、対象ファイル群Fsに出現する文字情報の種類数に応じて、2N分枝無節点ハフマン木Hの最大枝数2Nを最適な本数に設定することができるため、2N分枝無節点ハフマン木Hのサイズの適正化を図ることができる。また、本実施の形態によれば、上限長Nが2〜4の整数倍でない場合(たとえば、上限長N=11,13)であっても、圧縮効率のよい2N分枝無節点ハフマン木Hを生成することができる。
このあと、情報処理装置400は、2N分枝無節点ハフマン木Hの各葉の構造体と、基礎単語の構造体,特定文字コードの構造体,分割文字コードの構造体とを、図10の文字情報テーブルを参照して、相互に関連付ける。具体的には、上述したように、葉の構造体には、当該葉に格納されている圧縮符号に対応する特定文字、分割文字コードおよび葉へのポインタや基礎単語へのポインタを格納する。
また、情報処理装置400は、基礎単語の構造体の基礎単語ごとに、対応する圧縮符号を格納する葉へのポインタを格納する。また、情報処理装置400は、特定文字コードの構造体の特定文字ごとに、対応する圧縮符号を格納する葉へのポインタを格納する。また、情報処理装置400は、分割文字コードの構造体の分割文字コードごとに、対応する圧縮符号を格納する葉へのポインタを格納する。
(マップ作成処理(ステップS1805))
図36は、図30に示したマップ作成処理(ステップS1805)の詳細な処理手順例を示すフローチャートである。まず、情報処理装置400は、ファイル番号iをi=1に設定し(ステップS3601)、対象ファイルFiを読み込む(ステップS3602)。そして、情報処理装置400は、対象ファイルFiのマップ作成処理を実行する(ステップS3603)。対象ファイルFiのマップ作成処理(ステップS3603)の詳細は、図38で説明する。このあと、情報処理装置400は、ファイル番号iがi>n(nは対象ファイルF1〜Fnの総数)であるか否かを判断する(ステップS3604)。
i>nでない場合(ステップS3604:No)、情報処理装置400は、iをインクリメントし(ステップS3605)、ステップS3602に戻る。一方、i>nである場合(ステップS3604:Yes)、マップ作成処理(ステップS1805)が終了する。このマップ作成処理(ステップS1805)によれば、対象ファイルFiごとに対象ファイルFiのマップ作成処理(ステップS3603)を実行することができる。
図37は、図36に示した対象ファイルFiのマップ作成処理(ステップS3603)の詳細な処理手順を示すフローチャートである。まず、情報処理装置400は、対象文字を対象ファイルFiの先頭文字とし(ステップS3701)、基礎単語出現マップ作成処理(ステップS3702)、特定単一文字出現マップ作成処理(ステップS3703)、2グラム文字列出現マップ作成処理(ステップS3704)を実行する。
基礎単語出現マップ作成処理(ステップS3702)の詳細は図38で説明する。また、特定単一文字出現マップ作成処理(ステップS3703)の詳細は図39で説明する。さらに、2グラム文字列出現マップ作成処理(ステップS3704)の詳細は図41で説明する。
このあと、情報処理装置400は、対象文字が対象ファイルFiの末尾文字であるか否かを判断する(ステップS3705)。対象文字が対象ファイルFiの末尾文字でない場合(ステップS3705:No)、情報処理装置400は、対象文字を末尾方向へ1文字シフトし(ステップS3706)、ステップS3702に戻る。一方、対象文字が対象ファイルFiの末尾文字である場合(ステップS3705:Yes)、ステップS3604に移行して、対象ファイルFiのマップ作成処理(ステップS3603)を終了する。
この対象ファイルFiのマップ作成処理(ステップS3603)によれば、基礎単語出現マップ、特定単一文字出現マップおよび2グラム文字列出現マップを、対象文字を1文字ずつシフトしながら、同時並行で生成することができる。
図38は、図37で示した基礎単語出現マップ作成処理(ステップS3702)の詳細な処理手順例を示すフローチャートである。まず、情報処理装置400は、対象文字について最長一致検索処理を実行する(ステップS3801)。最長一致検索処理(ステップS3801)の詳細な処理手順は、図22に示した最長一致検索処理(ステップS2201)と同一処理内容であるため説明を省略する。
そして、情報処理装置400は、最長一致した基礎単語、すなわち、基礎単語があるか否かを判断する(ステップS3802)。最長一致した基礎単語がない場合(ステップS3802:No)、特定単一文字出現マップ作成処理(ステップS3703)に移行する。一方、最長一致した基礎単語がある場合(ステップS3802:Yes)、情報処理装置400は、その最長一致した基礎単語について、基礎単語出現マップが設定済みであるか否かを判断する(ステップS3803)。
設定済みである場合(ステップS3803:Yes)、ステップS3806に移行する。一方、設定済みでない場合(ステップS3803:No)、情報処理装置400は、2N分枝無節点ハフマン木Hにおける最長一致した基礎単語の葉にアクセスして、その圧縮符号を取得する(ステップS3804)。そして、情報処理装置400は、取得した圧縮符号を、最長一致した基礎単語についての基礎単語出現マップへのポインタに設定して(ステップS3805)、ステップS3806に移行する。このあと、ステップS3806では、情報処理装置400は、最長一致した基礎単語についての基礎単語出現マップの対象ファイルFiのビットをONにする(ステップS3806)。
これにより、基礎単語出現マップ作成処理(ステップS3702)を終了し、特定単一文字出現マップ作成処理(ステップS3703)に移行する。この基礎単語出現マップ作成処理(ステップS3702)によれば、対象文字ごとに最長一致した基礎単語を基礎単語としてマップ作成することができる。
図39は、図37で示した特定単一文字出現マップ作成処理(ステップS3703)の詳細な処理手順例を示すフローチャートである。まず、情報処理装置400は、特定単一文字の構造体に対して対象文字の2分探索をおこない(ステップS3901)、一致したか否かを判断する(ステップS3902)。一致する単一文字がなかった場合(ステップS3902:No)、情報処理装置400は、分割文字コード出現マップ作成処理を実行して(ステップS3903)、2グラム文字列出現マップ作成処理(ステップS3704)に移行する。分割文字コード出現マップ作成処理(ステップS3903)の詳細は図40で説明する。
一方、ステップS3902において、2分探索により対象文字と一致する単一文字があった場合(ステップS3902:Yes)、情報処理装置400は、2N分枝無節点ハフマン木Hにおける2分探索された単一文字の葉にアクセスして、その圧縮符号を取得する(ステップS3904)。そして、情報処理装置400は、その取得された圧縮符号について、特定単一文字出現マップが設定済みであるか否かを判断する(ステップS3905)。設定済みである場合(ステップS3905:Yes)、ステップS3907に移行する。
一方、設定済みでない場合(ステップS3905:No)、情報処理装置400は、取得した圧縮符号を、2分探索された単一文字についての特定単一文字出現マップへのポインタに設定して(ステップS3906)、ステップS3907に移行する。このあと、ステップS3907では、2分探索された単一文字についての特定単一文字出現マップの対象ファイルFiのビットをONにする(ステップS3907)。
これにより、特定単一文字出現マップ作成処理(ステップS3703)を終了し、2グラム文字列出現マップ作成処理(ステップS3704)に移行する。この特定単一文字出現マップ作成処理(ステップS3703)によれば、2分探索された対象文字を特定単一文字としてマップ作成することができる。
図40は、図39で示した分割文字コード出現マップ作成処理(ステップS4003)の詳細な処理手順例を示すフローチャートである。まず、情報処理装置400は、対象文字を分割し(ステップS4001)、2N分枝無節点ハフマン木Hにおける上位分割文字コードの葉にアクセスして、圧縮符号を取得する(ステップS4002)。そして、情報処理装置400は、その取得された圧縮符号について、上位分割文字コード出現マップが設定済みであるか否かを判断する(ステップS4003)。
設定済みである場合(ステップS4003:Yes)、ステップS4005に移行する。一方、設定済みでない場合(ステップS4003:No)、情報処理装置400は、取得した圧縮符号を、上位分割文字コードの出現マップへのポインタに設定して(ステップS4004)、ステップS4005に移行する。このあと、ステップS4005では、情報処理装置400は、対象文字から分割された上位分割文字コードの出現マップの対象ファイルFiのビットをONにする(ステップS4005)。
また、情報処理装置400は、2N分枝無節点ハフマン木Hにおける下位分割文字コードの葉にアクセスして、圧縮符号を取得する(ステップS4006)。そして、情報処理装置400は、その取得された圧縮符号について、下位分割文字コードの出現マップが設定済みであるか否かを判断する(ステップS4007)。設定済みである場合(ステップS4007:Yes)、ステップS4009に移行する。
一方、設定済みでない場合(ステップS4007:No)、情報処理装置400は、取得した圧縮符号を、下位分割文字コードの出現マップへのポインタに設定して(ステップS4008)、ステップS4009に移行する。このあと、ステップS4009では、情報処理装置400は、対象文字から分割された下位分割文字コードの出現マップの対象ファイルFiのビットをONにする(ステップS4009)。
これにより、分割文字コード出現マップ作成処理(ステップS4003)を終了し、2グラム文字列出現マップ作成処理(ステップS3704)に移行する。この分割文字コード出現マップ作成処理(ステップS4003)によれば、目標出現率Pcに応じた順位よりも下位の単一文字については、出現頻度が低いため、OFFのビットが多数出現することとなる。
しかしながら、目標出現率Pcに応じた順位よりも下位の単一文字については特定単一文字の出現マップの生成対象外とすることで、特定単一文字の圧縮符号マップMのマップサイズの最適化を図ることができる。また、分割することで、目標出現率Pcに応じた順位よりも下位の単一文字については、上位分割文字コードの圧縮符号マップMおよび下位分割文字コードの圧縮符号マップMといったマップサイズが固定化されたマップに設定される。したがって、目標出現率Pcをどのような出現率に設定しても、マップサイズの増大化を防止でき、省メモリ化を図ることができる。
図41は、図37に示した2グラム文字列マップ作成処理(ステップS3704)の詳細な処理手順例を示すフローチャートである。図41において、まず、情報処理装置400は、2グラム文字列特定処理を実行する(ステップS4101)。2グラム文字列特定処理(ステップS4101)の詳細な処理手順は、図30に示した2グラム文字列特定処理(ステップS2706)と同一処理内容であるため説明を省略する。
つぎに、情報処理装置400は、2グラム文字列特定処理(ステップS4101)により2グラム文字列が特定されたか否かを判断する(ステップS4102)。特定されなかった場合(ステップS4102:No)、図37のステップS3705に移行する。
一方、特定された場合(ステップS4102:Yes)、情報処理装置400は、2グラム文字列出現マップ生成処理を実行して(ステップS4103)、ステップS3705に移行する。
図42は、2グラム文字列出現マップ生成処理(ステップS4103)の詳細な処理手順例を示すフローチャートである。図42において、まず、情報処理装置400は、図41の2グラム文字列特定処理(ステップS4101)で特定された2グラム文字列の第1グラム(特定単一文字または分割文字コード)について、2N分枝無節点ハフマン木Hの葉にアクセスして、圧縮符号を取得する(ステップS4201)。同様に、情報処理装置400は、第2グラム(特定単一文字または分割文字コード)について、2N分枝無節点ハフマン木Hの葉にアクセスして、圧縮符号を取得する(ステップS4202)。
そして、情報処理装置400は、第1グラムの圧縮符号と第2グラムの圧縮符号を連結する(ステップS4203)。そして、情報処理装置400は、連結圧縮符号をポインタとする出現マップが設定済みであるか否かを判断する(ステップS4204)。設定済みである場合(ステップS4204:Yes)、ステップS4206に移行する。
一方、設定済みでない場合(ステップS4204:No)、情報処理装置400は、連結圧縮符号を、特定された2グラム文字列の出現マップへのポインタに設定する(ステップS4205)。このあと、ステップS4206では、情報処理装置400は、特定された2グラム文字列の出現マップの対象ファイルFiのビットをONにする(ステップS4206)。
これにより、2グラム文字列出現マップ生成処理(ステップS4103)を終了し、ステップS3705に移行する。この2グラム文字列出現マップ生成処理(ステップS4203)によれば、2グラム文字列の連結圧縮符号により、2グラム文字列の出現マップを直接指定することができる。
<圧縮処理の具体例>
つぎに、対象ファイルFiの圧縮処理の具体例について説明する。上述のように、圧縮符号マップMを生成した場合は、検索文字列を圧縮した圧縮符号列により圧縮符号マップM内の出現マップをポイントすることが可能となる。以下、圧縮処理の具体例について説明する。
図43は、2N分枝無節点ハフマン木Hを用いた圧縮処理の具体例を示す説明図である。まず、情報処理装置400は、対象ファイル群Fsから1文字目の圧縮対象文字コードを取得し、対象ファイルFi上の位置を保持しておく。そして、情報処理装置400は、基礎単語の構造体1600に対して2分木探索をおこなう。基礎単語は2文字以上の文字コード列であるため、1文字目の圧縮対象文字コードがヒットした場合、2文字目の文字コードを圧縮対象文字コードとして取得する。
そして、2文字目の文字コードは、1文字目の圧縮対象文字コードがヒットした位置から探索する。3文字目以降も、不一致の圧縮対象文字コードが出現するまで繰り返し2分木探索をおこなう。一致する基礎単語ra(aは葉の番号)が探索された場合、基礎単語の構造体1600において対応付けされている葉Laへのポインタにより葉Laの構造体にアクセスする。そして、情報処理装置400は、アクセス先の葉Laの構造体に格納されている基礎単語raの圧縮符号を探索して、圧縮バッファ4300に格納する。
一方、不一致の圧縮文字コードが出現した場合、基礎単語の構造体1600に対する2分木探索を終了する(EOT(End Of Transmission)まで進む)。そして、情報処理装置400は、1文字目の圧縮対象文字コードを再度レジスタにセットして、特定単一文字の構造体1400に対する2分木探索をおこなう。
一致する文字コードeb(bは葉の番号)が探索された場合、情報処理装置400は、その葉Lbへのポインタにより葉Lbの構造体にアクセスする。そして、情報処理装置400は、アクセス先の葉Lbの構造体に格納されている文字コードebの圧縮符号を探索して、圧縮バッファ4300に格納する。
一方、一致する文字コードが出現せず2分木探索を終了した場合、圧縮対象文字コードは特定単一文字コードではないため、情報処理装置400は、上位8ビットと下位8ビットに分割する。そして、情報処理装置400は、上位8ビットの分割文字コードについて、分割文字コードの構造体1500に対する2分木探索をおこなう。一致する分割文字コードDc1(c1は葉の番号)が探索された場合、情報処理装置400は、その葉Lc1へのポインタにより葉Lc1の構造体にアクセスする。そして、情報処理装置400は、アクセス先の葉Lc1の構造体に格納されている分割文字コードDc1の圧縮符号を探索して、圧縮バッファ4300に格納する。
引き続き、情報処理装置400は、下位8ビットの分割文字コードについて、分割文字コードの構造体に対する2分木探索をおこなう。一致する分割文字コードDc2(c2は葉の番号)が探索された場合、情報処理装置400は、その葉Lc2へのポインタにより葉Lc2の構造体にアクセスする。そして、情報処理装置400は、アクセス先の葉Lc2の構造体に格納されている分割文字コードDc2の圧縮符号を探索して、圧縮バッファ4300に格納する。これにより、対象ファイルFiが圧縮されることとなる。
<対象ファイル群Fsの圧縮処理>
つぎに、第1圧縮部403による対象ファイル群Fsの圧縮処理の処理手順について説明する。
図44は、第1圧縮部403による2N分枝無節点ハフマン木Hを用いた対象ファイル群Fsの圧縮処理手順例を示すフローチャートである。まず、情報処理装置400は、ファイル番号:pをp=1とし(ステップS4401)、対象ファイルFpを読み込む(ステップS4402)。つぎに、情報処理装置400は、圧縮処理を実行して(ステップS4403)、ファイル番号:pをインクリメントする(ステップS4404)。圧縮処理(ステップS4403)の詳細は図45で説明する。
そして、情報処理装置400は、p>nであるか否かを判断する(ステップS4405)。nは対象ファイル群Fsの総数である。p>nでない場合(ステップS4405:No)、ステップS4402に戻る。一方、p>nである場合(ステップS4405:Yes)、対象ファイル群Fsの圧縮処理を終了する。
図45は、図44に示した圧縮処理(ステップS4403)の詳細な処理手順を示すフローチャート(その1)である。図45において、まず、情報処理装置400は、対象ファイル群Fsに圧縮対象文字コードがあるか否かを判断する(ステップS4501)。ある場合(ステップS4501:Yes)、情報処理装置400は、圧縮対象文字コードを取得してレジスタにセットする(ステップS4502)。そして、情報処理装置400は、先頭の圧縮対象文字コードか否かを判断する(ステップS4503)。
ここで、先頭の圧縮対象文字コードとは、未圧縮の1文字目の文字コードをいう。先頭である場合(ステップS4503:Yes)、情報処理装置400は、その圧縮対象文字コードの対象ファイル群Fs上の位置(先頭位置)となるポインタを取得し(ステップS4504)、ステップS4505に移行する。一方、先頭でない場合(ステップS4503:No)、先頭位置を取得せずにステップS4505に移行する。
そして、情報処理装置400は、基礎単語の構造体1600に対して2分木探索をおこなう(ステップS4505)。圧縮対象文字コードが一致した場合(ステップS4506:Yes)、情報処理装置400は、連続して一致した文字コード列が基礎単語(の文字コード列)に該当するか否かを判断する(ステップS4507)。該当しない場合(ステップS4507:No)、情報処理装置400は、ステップS4502に戻って後続の文字コードを圧縮対象文字コードとして取得する。この場合、後続の文字コードは先頭ではないため、先頭位置は取得しないこととなる。
一方、ステップS4507において、基礎単語に該当する場合(ステップS4507:Yes)、情報処理装置400は、該当する基礎単語の葉L♯へのポインタにより葉L♯の構造体にアクセスする(ステップS4508)。そして、情報処理装置400は、ポイントされた葉L♯の構造体に格納されている基礎単語の圧縮符号を抽出する(ステップS4509)。
この後、情報処理装置400は、抽出された圧縮符号を圧縮バッファ4300に格納して(ステップS4510)、ステップS4501に戻る。このループが基礎単語の圧縮処理の流れとなる。ステップS4501において、圧縮対象文字コードがない場合(ステップS4501:No)、情報処理装置400は、対象ファイルFpから圧縮された圧縮ファイルfpを圧縮バッファ4300からファイル出力して保存する(ステップS4511)。そして、ステップS4404に移行する。一方、ステップS4506において不一致となった場合(ステップS4506:No)、16ビットの文字コードの圧縮処理のループに入る。
図46は、図44に示した圧縮処理(ステップS4403)の詳細な処理手順を示すフローチャート(その2)である。図46において、情報処理装置400は、ステップS4604で取得された先頭位置のポインタを参照して、対象ファイル群Fsから圧縮対象文字コードを取得してレジスタにセットする(ステップS4601)。
つぎに、情報処理装置400は、圧縮対象文字コードについて、特定単一文字の構造体1400に対して2分木探索をおこなう(ステップS4602)。一致した場合(ステップS4603:Yes)、情報処理装置400は、該当する文字の葉L♯へのポインタにより葉L♯の構造体にアクセスする(ステップS4604)。そして、情報処理装置400は、ポイントされた葉L♯の構造体に格納されている圧縮対象文字コードの圧縮符号を抽出する(ステップS4605)。
この後、情報処理装置400は、探索された圧縮符号を圧縮バッファ4300に格納して(ステップS4606)、ステップS4501に戻る。このループが16ビットの文字コードの圧縮処理の流れとなる。一方、ステップS4603において一致する文字コードが存在しなかった場合(ステップS4603:No)、分割文字コードの圧縮処理のループに入る。
図47は、図44に示した圧縮処理(ステップS4403)の詳細な処理手順を示すフローチャート(その3)である。図47において、まず、情報処理装置400は、圧縮対象文字コードを上位8ビットと下位8ビットとに分割し(ステップS4701)、上位8ビットの分割文字コードを抽出する(ステップS4702)。そして、情報処理装置400は、分割文字コードの構造体1500に対して2分木探索をおこなう(ステップS4703)。
そして、情報処理装置400は、探索された分割文字コードの葉L♯へのポインタにより葉L♯の構造体にアクセスする(ステップS4704)。そして、情報処理装置400は、ポイントされた葉L♯の構造体に格納されている分割文字コードの圧縮符号を抽出する(ステップS4705)。この後、情報処理装置400は、探索された圧縮符号を圧縮バッファ4300に格納する(ステップS4706)。
つぎに、情報処理装置400は、下位8ビットが探索済みか否かを判断し(ステップS4707)、探索済みでない場合(ステップS4707:No)、情報処理装置400は、下位8ビットの分割文字コードを抽出して(ステップS4708)、ステップS4703〜S4706を実行する。一方、下位8ビットが探索済みである場合(ステップS4707:Yes)、ステップS4601に戻り、基礎単語の圧縮処理のループに入る。
このように、2N分枝無節点ハフマン木Hを用いた圧縮処理では、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉L♯の構造体に格納されている文字情報を抽出して、圧縮バッファ4300に書き込むだけでよい。したがって、圧縮処理の高速化を図ることができる。
また、圧縮対象文字コードが格納されている葉L♯の構造体を、基礎単語の構造体、特定単一文字コードの構造体および分割文字コードの構造体により即座に特定することができる。したがって、2N分枝無節点ハフマン木Hの葉を探索する必要がなく、圧縮処理の高速化を図ることができる。また、低位文字コードを上位ビットコードと下位ビットコードに分割することで、非特定単一文字を256種の分割文字コードの圧縮符号に圧縮することができる。したがって、圧縮率の向上を図ることができる。
<マップ圧縮の具体例>
つぎに、第2圧縮部406による圧縮符号マップM内の各出現マップのマップ圧縮の具体例について説明する。第2圧縮部406は、圧縮領域内の出現マップを圧縮し、非圧縮領域の出現マップは圧縮しない。圧縮領域とは、ファイル番号1〜nまで採番されている場合に、α×(n/αの商)となるファイル番号までの出現マップのビット列である。nは現在の対象ファイルの総数である。たとえば、α=256ビットであり、現在の対象ファイル数n=600である場合、n/αの商は2となるため、ファイル番号1〜2αまでの出現マップのビット列が圧縮領域となる。そして、ファイル番号(2α+1)〜nまでのビット列は非圧縮領域となり圧縮されない。
また、出現マップのビット列は、ファイル総数αが増大することで、ビット列内の"0"が連続する箇所も多くなる。また、出現頻度が高い文字情報については、これとは逆に"1"が連続する箇所が多くなる。したがって、文字の出現率に応じた出現率領域を設定する。出現率領域とは、出現率の範囲である。出現率領域に応じて、出現マップ圧縮用のハフマン木hを割り当てることとする。
図48は、出現率と出現率領域との関係を示す説明図である。出現率が0〜100%の範囲とすると、図48に示したように、A〜E領域およびA´〜E´領域に領域分割することができる。したがって、A〜E領域およびA´〜E´領域で特定された出現率領域に応じて、出現マップ圧縮用のハフマン木hを圧縮パターンとして割り当てる。
図49は、出現率領域別の圧縮パターンを有する圧縮パターンテーブルを示す説明図である。出現率は、図13に示したように、葉L#の構造体の第5領域に格納されているため、葉L#の構造体が指定されることで、圧縮パターンテーブル4900を参照して、圧縮パターンが特定されることとなる。なお、A領域およびA´領域は、非圧縮のため、圧縮パターンとなるハフマン木は存在しない。
図50は、B領域およびB´領域の場合の圧縮パターンを示す説明図である。圧縮パターン5000は、葉が16種のハフマン木hとなる。
図51は、C領域およびC´領域の場合の圧縮パターンを示す説明図である。圧縮パターン5100は、葉が16種+1種のハフマン木hとなる。圧縮パターン5100では、B領域およびB´領域に比べて、"0"が連続する箇所または"1"が連続する箇所が確率的に多くなる。したがって、16ビット連続して値が"0"であるビット列に、符号語"00"が割り当てられている。
図52は、D領域およびD´領域の場合の圧縮パターンを示す説明図である。圧縮パターン5200は、葉が16種+1種のハフマン木となる。圧縮パターン5200では、C領域およびC´領域に比べて、"0"が連続する箇所または"1"が連続する箇所が確率的に多くなる。したがって、32ビット連続して値が"0"であるビット列に、符号語"00"が割り当てられている。
図53は、E領域およびE´領域の場合の圧縮パターンを示す説明図である。圧縮パターン5300は、葉が16種+1種のハフマン木となる。圧縮パターン5300では、D領域およびD´領域に比べて、"0"が連続する箇所または"1"が連続する箇所が確率的に多くなる。したがって、64ビット連続して値が"0"であるビット列に、符号語"00"が割り当てられている。このように、出現率領域に応じて、文字コードが存在しないことを意味する"0"の連続数が増加するため、文字コードの出現率に応じて圧縮符号マップMの圧縮効率の向上を図ることができる。
(圧縮符号マップ圧縮処理手順)
つぎに、圧縮符号マップ圧縮処理について説明する。圧縮符号マップ圧縮処理は、圧縮領域のビット列を圧縮する処理である。具体的には、図49に示した圧縮パターンテーブル4900と図50〜図53に示した圧縮パターン5000〜5300(ハフマン木h)を用いて、圧縮符号マップMの圧縮領域のビット列を圧縮する。以下、圧縮符号マップ圧縮処理手順について説明する。
図54は、圧縮符号マップM圧縮処理手順を示すフローチャートである。図54において、まず、情報処理装置400は、圧縮符号マップM群Msにおいて、未選択の出現マップへのポインタがあるか否かを判断する(ステップS5401)。未選択のアドレスがある場合(ステップS5401:Yes)、情報処理装置400は、未選択のアドレスを選択して葉L#の構造体にアクセスし(ステップS5402)、葉L#の構造体の第1領域の中から文字コードを取得する(ステップS5403)。そして、情報処理装置400は、アクセス先の葉L#の構造体の第5領域から出現率領域を取得することで、取得された文字コードの出現率領域を特定する(ステップS5404)。
このあと、情報処理装置400は、図52の圧縮パターンテーブルを参照して、特定された出現率領域が非圧縮領域(たとえば、出現率領域A、A´)であるか否かを判断する(ステップS5405)。非圧縮領域である場合(ステップS5405:Yes)、ステップS5401に戻り、つぎのアドレスを選択する。
一方、非圧縮領域でない場合(ステップS5405:No)、情報処理装置400は、特定された出現率領域により、図50〜図53に示した圧縮パターン5000〜5300(ハフマン木h)の中から該当する圧縮パターン(ハフマン木h)を選択する(ステップS5406)。また、情報処理装置400は、圧縮対象となる取得文字コードの出現マップにおける圧縮領域のビット列を抽出する(ステップS5407)。
そして、情報処理装置400は、取得文字コードの出現率が50%以上であるか否かを判断する(ステップS5408)。出現率とは、上述したように、対象ファイル群Fs内の全ファイル数を母集団(分母)とし、当該文字情報が存在するファイル数を分子とした値である。出現率領域は、出現率に応じて決められているため(図48を参照)、出現率領域がA〜Eである場合、取得文字コードの出現率が50%以上でないと判断する。一方、出現率領域がA´〜E´である場合、情報処理装置400は、取得文字コードの出現率が50%以上であると判断する。
そして、出現率が50%以上である場合(ステップS5408:Yes)、情報処理装置400は、圧縮効率を上げるために、ステップS5407で抽出されたビット列を反転する(ステップS5409)。たとえば、抽出されたビット列が"1110"である場合、"0001"にして、"0"の個数を増やす。そして、情報処理装置400は、反転後のビット列を、ステップS5406で選択したハフマン木を用いて圧縮して、記憶装置(たとえば、フラッシュメモリや磁気ディスク205)に格納する(ステップS5410)。そして、ステップS5401に戻る。このように、ビット列反転をおこなうことで、出現率領域A´〜E´のハフマン木hを用意する必要がないため、省メモリ化を図ることができる。
一方、ステップS5408において、出現率が50%以上でない場合(ステップS5408:No)、情報処理装置400は、ビット列反転(ステップS5409)をおこなうことなく、ステップS5407で抽出されたビット列を、ステップS5406で選択したハフマン木を用いて圧縮して(ステップS5410)、ステップS5401に戻る。また、ステップS5401において、未選択のアドレスがない場合(ステップS5401:No)、圧縮符号マップ圧縮処理を終了する。
このような圧縮符号マップ圧縮処理手順により、図1(A)に示したように、文字情報ごとに圧縮領域内のビット列が、出現率に応じて圧縮される。このように、出現率領域に応じて、文字情報が存在しないことを意味する"0"の連続数が増加するため、文字情報の出現率に応じて圧縮符号マップMの圧縮効率の向上を図ることができる。
また、対象ファイルが後から追加されると、追加された対象ファイルを圧縮する際、圧縮符号マップMにも文字の存否を示すビット列を追加する必要がある。圧縮前の圧縮符号マップMでは、ファイル番号:1〜nの出現マップのビット列については、圧縮パターン5000〜5300により圧縮されてレコードごとに符号長が異なる。すなわち、可変長であるため圧縮領域となる。
したがって、図1(A)に示したように、圧縮符号列の先頭(ファイル番号n側)は整列するが末尾(ファイル番号1側)が整列しない。仮に、ビット列の並びを、ファイル番号:1〜nの順に、圧縮符号マップMへのポインタ(文字情報の圧縮符号)側から割り当てると、追加ファイルのビット列は、圧縮符号列の末尾側に挿入することとなり、圧縮符号列と追加ファイルのビット列とが非連続となってしまう。したがって、あらかじめ、圧縮符号マップM群Msの圧縮領域のビット列を、先頭位置から末尾位置にかけて対象ファイル群Fsのファイル番号pの降順に配列しておく。そして、圧縮符号マップMにおいて、出現マップへのポインタ(文字情報の圧縮符号)と圧縮領域との間に非圧縮領域を設定する。
図1(C)に示すように、ファイル番号;1〜nのうち圧縮符号列が整列する側にファイル番号:n+1のビットを割り当てる。これにより、ファイル番号;1〜nのビット列を圧縮した場合でも、非圧縮のファイル番号:n+1〜2nのビット列を挿入しても、ファイル番号順にビット列を連続させることができる。これにより、ファイル番号;1〜nのビット列が圧縮されても、追加ファイルのファイル番号とそのビットとのずれがなく、対象ファイルの絞込みを正確に実行することができる。
<機能的構成例2>
図55は、本実施の形態にかかる情報処理装置400の機能的構成例2を示すブロック図である。図55において、情報処理装置400は、指定部5501と、第1伸長部5502と、第1圧縮部403と、入力部5503と、抽出部5504と、第2伸長部5505と、特定部5506と、更新部5507と、を備える。指定部5501〜更新部5507は、具体的には、たとえば、図2に示したROM202、RAM203、磁気ディスク205などの記憶装置に記憶されたプログラムをCPU201に実行させることによりその機能を実現する。なお、指定部5501〜更新部5507は、それぞれ実行結果を記憶装置に書き込んだり、他の部の実行結果を読み出したりして、それぞれ演算を実行する。以下、指定部5501〜更新部5507について簡単に説明する。
指定部5501は、対象ファイル群Fs内のいずれかの対象ファイルのオープン指定を受け付ける。具体的には、キーボード、マウス、タッチパネルをユーザが操作することで、指定部5501は、対象ファイルFiのオープン指定を受け付ける。当該オープン指定が受け付けられると、圧縮符号マップMにおいて、オープン指定された対象ファイルFiのファイル番号iに関連付けられている圧縮ファイルfiへのポインタが指定される。これにより、ポイント先となるアドレスに格納されている、オープン指定された対象ファイルFiの圧縮ファイルfiが読み出される。
また、指定部5501は、オープンされている対象ファイルFiの保存指定を受け付ける。具体的には、キーボード、マウス、タッチパネルをユーザが操作することで、指定部5501は、対象ファイルFiの保存指定を受け付ける。当該保存指定が受け付けられると、保存指定された対象ファイルFiが第1圧縮部403により2N分枝無節点ハフマン木Hで圧縮され、圧縮ファイルfiとして記憶装置内に保存される。
第1伸長部5502は、対象ファイルFiの圧縮ファイルfiを、2N分枝無節点ハフマン木Hで伸長する。具体的には、たとえば、第1伸長部5502は、指定部5501によってオープン指定された対象ファイルFiの圧縮ファイルfiを、2N分枝無節点ハフマン木Hで伸長する。また、後述する特定部5506で特定された対象ファイルFiについても2N分枝無節点ハフマン木Hで伸長する。伸長の具体例については後述する。
入力部5503は、検索文字列の入力を受け付ける。具体的には、キーボード、マウス、タッチパネルをユーザが操作することで、入力部5503は、検索文字列の入力を受け付ける。
抽出部5504は、入力部5503によって入力された検索文字列内の文字情報の圧縮符号を2N分枝無節点ハフマン木Hから抽出する。具体的には、たとえば、抽出部5504は、検索文字列から、特定単一文字、上位分割文字コード、下位分割文字コード、2グラム文字列、および基礎単語のうち該当する文字情報を抽出する。
たとえば、検索文字列が「人形」である場合、特定単一文字「人」、「形」と、2グラム文字列「人形」が抽出される。そして、抽出部5504は、抽出された文字情報の圧縮符号を2N分枝無節点ハフマン木Hで特定し、圧縮符号マップMの該当する出現マップを抽出する。たとえば、特定単一文字「人」の圧縮済みの出現マップと、「形」の圧縮済みの出現マップと、2グラム文字列「人形」の圧縮済みの出現マップとが抽出される。
第2伸長部5505は、抽出部5504によって抽出された圧縮済みの出現マップを伸長する。具体的には、文字情報の出現率から出現率領域が特定できるため、第2伸長部5505は、特定された出現率領域に応じたマップ用のハフマン木により、圧縮済みの出現マップの圧縮領域を伸長する。たとえば、上記の例では、図1(B)に示したように、特定単一文字「人」の圧縮済みの出現マップと、「形」の圧縮済みの出現マップと、2グラム文字列「人形」の圧縮済みの出現マップとが、伸長される。
特定部5506は、第2伸長部5505による伸長後の出現マップ群および削除マップDのAND演算を実行することで、検索文字列内の文字情報を含む対象ファイルの圧縮ファイルを圧縮ファイル群から特定する。上記の例では、図1(B)に示したように、特定部5506は、特定単一文字「人」の圧縮済みの出現マップと、「形」の圧縮済みの出現マップと、2グラム文字列「人形」の圧縮済みの出現マップと、削除マップDと、をAND演算する。特定部5506までの処理が、情報処理装置400内の抽出装置での処理となる。
これにより、ファイル番号3(の圧縮ファイルf3)が特定される。第1伸長部5502では、特定部5506によって特定された圧縮ファイル(上記の例では圧縮ファイルf3)を2N分枝無節点ハフマン木Hで伸長することとなる。
更新部5507は、オープン中の対象ファイルを更新して保存する場合、あらたなファイル番号を採番して、圧縮符号マップMおよび削除マップDについて、あらたなファイル番号についてのビットを設定する。圧縮符号マップMでは「0」(OFF)、削除マップDでは「1」(ON)とする。
そして、更新される対象ファイル内の文字情報を集計部401により集計して、1回でも出現した文字情報については、あらたに採番されたファイル番号のビットをONにする。また、削除マップDにおけるオープンしたときのファイル番号のビットをOFFにする。また、新たに採番されたファイル番号については、更新部5507は、更新後の圧縮ファイルのアドレスをポインタとして関連付ける。これにより、更新後において、あらたに採番されたファイル番号が指定された場合、指定部5501により、更新後の圧縮ファイルが指定されることになる。更新部5507の詳細については後述する。
<ファイル伸長例>
つぎに、ファイル伸長例について説明する。圧縮ファイルfiを伸長する場合、対象ファイルFiをオープンするにあたり、直接ファイル番号iを指定する方法(G1)と、検索文字列によりオープンさせる対象ファイルFiを絞り込む方法(G2)がある。前者(G1)については図56で説明し、後者(G2)については図57で説明する。なお、(G1)および(G2)のいずれについても、本実施の形態の更新前と更新後のいずれの場合にも実行することができる。
図56は、ファイル伸長例(G1)を示す説明図である。ファイル伸長例(G1)で示す処理は、指定部5501および第1伸長部5502により実行される。ここでは、例としてファイル番号3をオープン指定することとする。なお、図56中、符号5600は圧縮符号マップMの管理領域である。管理領域5600には、出現マップのビットに対応するファイル番号i(i=1〜n)が記憶されている。また、管理領域5600には、ファイル番号iで特定される圧縮ファイルfiの格納先と指定するポインタが、そのファイル番号iに関連付けられて保存されている。したがって、ファイル番号iが指定されると、その圧縮ファイルfiがポイントされて読み出すことができる。
(G11)まず、指定部5501により対象ファイルF3のオープン指定がされる。圧縮符号マップMのファイル番号3は、対象ファイルF3の圧縮ファイルf3へのポインタに関連付けられている。(G12)したがって、当該ポインタにより、圧縮ファイルf3が抽出される。(G13)抽出された圧縮ファイルf3は、2N分枝無節点ハフマン木Hで伸長される。詳細な伸長処理については後述する。
図57は、ファイル伸長例(G2)を示す説明図である。ファイル伸長例(G2)で示す処理は、入力部5503、抽出部5504、第2伸長部5505、特定部5506、第1伸長部5502により実行される。(G21)まず、入力部5503により検索文字列「人形」が入力された場合、検索文字列「人形」を構成する文字「人」、「形」について特定単一文字の構造体1400に対し2分探索することで、特定単一文字「人」、「形」が検索される。特定単一文字の構造体1400には、2N分枝無節点ハフマン木Hの葉(特定単一文字)へのポインタが関連付けられている。したがって、特定単一文字の構造体でヒットすると、2N分枝無節点ハフマン木Hの葉を直接指定することができる。
(G22)2N分枝無節点ハフマン木Hの葉を直接指定すると、当該葉の構造体内の照合フラグがONに設定され、圧縮符号が抽出される。圧縮符号は特定単一文字の出現マップへのポインタとなるため、直接指定することができる。本例の場合、特定単一文字「人」、「形」の圧縮符号が抽出されるため、「人」の出現マップと「形」の出現マップとが抽出される。また、「人」の圧縮符号および「形」の圧縮符号を連結した連結圧縮符号も2グラム文字列の出現マップへのポインタとなるため、直接指定することができる。したがって、2グラム文字列「人形」の出現マップも抽出される。
(G23)抽出された3個の出現マップは、マップ用ハフマン木により伸長される。そして、伸長された出現マップと削除マップDとによりAND演算が実行され、AND結果が得られる。
(G24)AND結果においてファイル番号3がONになっているため、検索文字列「人形」が対象ファイルF3に存在することが判明する。したがって、圧縮ファイル群から圧縮ファイルf3が抽出される。これにより伸長すべき圧縮ファイルが絞り込まれることになり、無駄な伸長処理を低減することができる。
(G25)最後に、抽出された圧縮ファイルf3を圧縮状態のまま、照合、伸長することで、伸長後の対象ファイルF3がオープンされる。なお、「人」、「形」の葉の構造体では照合フラグがONになっているため、「人」、「形」の伸長の際、強調表示となるように文字列置換されて伸長される。たとえば、照合フラグがONである「人」、「形」については、<B></B>タグではさんで伸長することで、太字で表示される。照合フラグがOFFの文字については<B></B>タグではさむことなくそのまま伸長する。
<伸長処理の具体例>
つぎに、図56および図57での伸長処理の具体例について説明する。ここでは、検索文字列「人形」の圧縮符号列を用いて圧縮ファイルfiについて照合しながら伸張する例について説明する。なお、例として、特定単一文字「人」の圧縮符号を「1100010011」(10ビット)とし、特定単一文字「形」の圧縮符号を「0100010010」(10ビット)とする。
また、伸長処理では、レジスタに圧縮符号列をセットし、マスクパターンにより圧縮符号を抽出する。抽出した圧縮符号を、1パス(1枝分のアクセス)で2N分枝無節点ハフマン木Hの根から探索する。そして、アクセスした葉L♯の構造体に格納されている文字コードを読み出して伸長バッファに格納する。
また、圧縮符号を抽出するため、マスクパターンのマスク位置をオフセットする。また、マスクパターンの初期値を"0xFFF00000"とする。このマスクパターンは先頭12ビットが"1"であり、後続の20ビットが"0"のビット列である。
図58および図59は、図56および図57での伸長処理の具体例を示す説明図である。図58では、特定単一文字「人」についての伸張例(A)を示している。図58において、まず、CPUは、ビットアドレスabiとバイトオフセットbyosとビットオフセットbiosとを算出する。ビットアドレスabiは、抽出された圧縮符号のビット位置を示す値であり、今回のビットアドレスabiは、前回のビットアドレスabiに前回抽出された圧縮符号の圧縮符号長legを加算した値となる。なお、初期状態では、ビットアドレスabiはabi=0とする。
バイトオフセットbyosは、メモリに保持されている圧縮符号列のバイト境界を示す値であり、ビットアドレスabi/8の商で求められる。たとえば、バイトオフセットbyos=0のときは、メモリに記憶されている先頭からの圧縮符号列をレジスタにセットし、バイトオフセットbyos=1のときは、メモリに記憶されている先頭1バイト目からの圧縮符号列をレジスタにセットする。
また、ビットオフセットbiosは、マスクパターンのマスク位置("FFF")をオフセットする値であり、ビットアドレスabi/8の余りである。たとえば、ビットオフセットbios=0のときは、マスク位置はシフトされないこととなり、マスクパターンは、"0xFFF00000"となる。一方、ビットオフセットbios=4のときは、マスク位置は末尾方向に4ビットシフトすることとなり、マスクパターンは、"0x0FFF0000"となる。
レジスタシフト数rsは、マスクパターンとのAND演算後のレジスタ内の圧縮符号列を末尾方向にシフトするビット数であり、rs=32−12−biosで求められる。このシフトにより、シフト後のレジスタの末尾mビットのビット列を対象ビット列として抽出する。対象ビット列の抽出後はレジスタをクリアする。
なお、メモリ内のブロックは1バイトのビット列を示しており、内部の数字は、バイト境界となるバイト位置を示している。図58では、ビットアドレスabi=0により、バイトオフセットbyos=0、ビットオフセットbios=0となる。バイトオフセットbyos=0により、メモリに保持されている圧縮符号列のうち先頭から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=0により、マスクパターンは、"0xFFF00000"である。したがって、レジスタにセットされた圧縮符号列とマスクパターン"0xFFF00000"を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=0により、レジスタシフト数rsは、rs=32−m―bios=32−12−0=20となる。したがって、レジスタ内のAND結果を末尾方向に20ビット分シフトする。このシフトによりレジスタには、"110001001100"が残されるため、末尾12ビットを対象ビット列として抽出する。この場合は、"110001001100"が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
2N分枝無節点ハフマン木Hの根の構造体には、抽出された対象ビット列"110001001100"があるため、この対象ビット列と一致する葉L♯へのポインタ(枝番号)を探索する。この場合、葉L97へのポインタ群の中の1つと一致するため、該当する葉L97へのポインタを読み出して、葉L97の構造体にアクセスする。
葉L97の構造体には、文字コード"0xBA4E"が格納されているため、当該文字コード"0xBA4E"を抽出して伸長バッファに格納する。ファイル伸長例(G1)の場合は、そのまま伸長バッファに格納するが、ファイル伸長例(G2)の場合は、照合フラグがONであるため、文字コード"0xBA4E"を<B></B>タグで挟み込んで格納する。
また、葉L97の構造体には、文字コード"0xBA4E"の圧縮符号長leg(=10ビット)も格納されているため、文字コード"0xBA4E"の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=0+10=10となる。
図59では、特定単一文字「形」について伸張する例(B)を示している。具体的には、図58の状態(A)からレジスタをバイトオフセットbios分シフトした場合、前回である(A)のビットアドレスabiはabi=0、圧縮符号長legは10ビットであるため、(B)のビットアドレスabiはabi=10ビットとなる。
また、このビットアドレスabi=10により、バイトオフセットbyos=1、ビットオフセットbios=2となる。バイトオフセットbyos=1により、メモリに保持されている圧縮符号列のうち先頭1バイト目から4バイト分(図中、網掛け)の圧縮符号列をレジスタにセットする。
また、ビットオフセットbios=2により、マスクパターンは、"0x3FFC0000"である。したがって、レジスタにセットされた圧縮符号列とマスクパターン"0x3FFC0000"を論理積(AND)演算することにより、AND結果が得られる。
また、ビットオフセットbios=2により、レジスタシフト数rsは、rs=32−m―bios=32−12−2=18となる。したがって、レジスタ内のAND結果を末尾方向に18ビット分シフトする。このシフトによりレジスタには、"00000100010010"が残されるため、末尾10ビットを対象ビット列として抽出する。この場合は、"0100010010"が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
2N分枝無節点ハフマン木Hの根の構造体には、抽出された対象ビット列"0100010010"があるため、このビット列と一致する葉L♯へのポインタ(枝番号)を探索する。この場合、対象ビット列"0100010010"が葉L105へのポインタ群の中の1つと一致するため、該当する葉L105へのポインタを読み出して、葉L24の構造体にアクセスする。
葉L105の構造体には、文字コード"0x625F"が格納されているため、当該文字コード"0x625F"を抽出して伸長バッファに格納する。ファイル伸長例(G1)の場合は、そのまま伸長バッファに格納するが、ファイル伸長例(G2)の場合は、照合フラグがONであるため、文字コード"0x625F"を<B></B>タグで挟み込んで格納する。また、葉L105の構造体には、文字コード"0x625F"の圧縮符号長leg(=8ビット)も格納されているため、文字コード"0x625F"の圧縮符号長legも抽出する。この抽出された圧縮符号長legによりビットアドレスabiを更新する。この場合、更新後のビットアドレスabiはabi=10+8=18となる。このようにして伸長することで、対象ファイルがオープンされることとなる。
<検索処理手順>
つぎに、本実施の形態にかかる検索処理手順について説明する。具体的には、たとえば、図57に示したファイル伸長例(G2)についての処理手順となる。
図60は、本実施の形態にかかる検索処理手順を示すフローチャートである。まず、情報処理装置400は、検索文字列の入力を待ち受け(ステップS6001:No)、検索文字列が入力された場合(ステップS6001:Yes)、ファイル絞込み処理(ステップS6002)、伸長処理(ステップS6003)を実行する。ファイル絞込み処理(ステップS6002)は、圧縮ファイル群fsの中から検索文字列を構成する文字情報が存在する対象ファイルFiの圧縮ファイルfiを絞り込む。ファイル絞込み処理(ステップS6002)の詳細は、図61および図62で説明する。
伸長処理(ステップS6003)は、ファイル絞込み処理(ステップS6002)で絞り込まれた圧縮ファイルfiを伸長する過程で、伸長対象となる圧縮符号列と検索文字列の圧縮文字列とを照合する。伸長処理(ステップS6003)の詳細は、図63および図64で説明する。
図61は、図60に示したファイル絞込み処理(ステップS6002)の詳細な処理手順を示すフローチャート(その1)である。まず、情報処理装置400は、検索文字列を対象文字列に設定し(ステップS6101)、最長一致検索処理を実行する(ステップS6102)。最長一致検索処理(ステップS6102)は、図38に示した最長一致検索処理(ステップS3801)と同一処理であるため説明を省略する。
そして、情報処理装置400は、基礎単語の構造体において、最長一致検索処理(ステップS6102)で得られた最長一致検索結果を2分探索する(ステップS6103)。最長一致検索結果が、基礎単語の構造体で探索された場合(ステップS6103:Yes)、対象文字列である基礎単語について、その基礎単語の出現マップを基礎単語の出現マップ群から取得する(ステップS6104)。
そして、情報処理装置400は、対象文字列に後続があるか否かを判断する(ステップS6105)。後続がある場合(ステップS6105:Yes)、情報処理装置400は、後続文字列を対象文字列に設定して(ステップS6106)、最長一致検索処理(ステップS6102)に戻る。一方、後続がない場合(ステップS6105:No)、これまでに取得された出現マップ群のAND演算で対象ファイルを絞り込む(ステップS6107)。これにより、ファイル絞込み処理(ステップS6002)は終了し、伸長処理(ステップS6003)に移行する。
また、ステップS6103において、最長一致検索結果が、基礎単語の構造体で探索されなかった場合(ステップS6103:No)、図62のステップS6201に移行する。具体的には、最長一致検索結果が基礎単語の構造体に登録されていない場合、または、最長一致検索で最長一致候補がなかった場合(ステップS6103:No)に、図62のステップS6201に移行する。
図62は、図60に示したファイル絞込み処理(ステップS6002)の詳細な処理手順を示すフローチャート(その2)である。図62では、対象文字列を構成する文字ごとに、出現マップを取得する処理を示している。
まず、情報処理装置400は、対象文字列の先頭文字を対象文字に設定する(ステップS6201)。つぎに、情報処理装置400は、特定単一文字の構造体において対象文字を2分探索する(ステップS6202)。対象文字が探索された場合(ステップS6203:Yes)、情報処理装置400は、特定単一文字の圧縮符号マップMから対象文字の出現マップを取得する(ステップS6204)。
一方、ステップS6203において、探索されなかった場合(ステップS6203:No)、情報処理装置400は、対象文字を上位8ビットと下位8ビットに分割する(ステップS6205)。そして、情報処理装置400は、上位分割文字コードの圧縮符号マップMの中から、ステップS6205の分割で得られた上位分割文字コードの出現マップを取得する(ステップS6206)。
また、情報処理装置400は、下位分割文字コードの圧縮符号マップMの中から、ステップS6205の分割で得られた下位分割文字コードの出現マップを取得する(ステップS6207)。また、情報処理装置400は、対象文字やステップS6205で分割された分割文字コードについて、2N分枝無節点ハフマン木Hの葉にアクセスし、照合フラグをONにする(ステップS6208)。このあと、情報処理装置400は、2グラム文字列特定処理を実行する(ステップS6209)。2グラム文字列特定処理(ステップS6209)は、図30に示した2グラム文字列特定処理(ステップS2706)と同一処理であるため説明を省略する。
そして、情報処理装置400は、2グラム文字列特定処理(ステップS6209)で2グラム文字列が特定されなかった場合(ステップS6210:No)、図61のステップS6105に戻る。一方、2グラム文字列が特定された場合(ステップS6210:Yes)、情報処理装置400は、2グラム文字列の出現マップを取得する(ステップS6211)。具体的には、たとえば、情報処理装置400は、第1グラムの圧縮符号および第2グラムの圧縮符号を2N分枝無節点ハフマン木Hにアクセスすることで取得、連結し、2グラム文字列の圧縮符号マップMから連結圧縮符号で指定された出現マップを取得する。そして、図61のステップS6105に戻る。
このように、図62に示した処理手順により、対象文字についての出現マップ群と2グラム文字列についての出現マップ群を取得することができる。したがって、図61のステップS6107でのAND演算により圧縮ファイルfiの絞込みができることとなる。
図63は、図60に示した2N分枝無節点ハフマン木Hを用いた伸長処理(ステップS6003)の詳細な処理手順例を示すフローチャート(その1)である。図63において、まず、情報処理装置400は、ビットアドレスabiをabi=0とし(ステップS6301)、バイトオフセットbyosを算出し(ステップS6302)、ビットオフセットbiosを算出する(ステップS6303)。そして、情報処理装置400は、バイトオフセットbyosの位置からの圧縮符号列をレジスタr1にセットする(ステップS6304)。
つぎに、情報処理装置400は、レジスタr2にセットされたマスクパターンをビットオフセットbios分、末尾方向にシフトして(ステップS6305)、レジスタr1にセットされた圧縮符号列とのAND演算をおこなう(ステップS6306)。このあと、情報処理装置400は、レジスタシフト数rsを算出して(ステップS6307)、AND演算後のレジスタr2をレジスタシフト数rs分、末尾にシフトする(ステップS6308)。
図64は、図60に示した2N分枝無節点ハフマン木Hを用いた伸長処理(ステップS6003)の詳細な処理手順例を示すフローチャート(その2)である。ステップS6308のあと、図64において、情報処理装置400は、シフト後のレジスタr2から末尾Nビットを対象ビット列として抽出する(ステップS6401)。つぎに、情報処理装置400は、2N分枝無節点ハフマン木Hの根の構造体から葉L♯へのポインタを特定し(ステップS6402)、ポイント先となる葉L♯の構造体に1パスでアクセスする(ステップS6403)。このあと、情報処理装置400は、アクセス先の葉L♯の構造体の照合フラグがONであるか否かを判断する(ステップS6404)。
照合フラグがONである場合(ステップS6404:Yes)、情報処理装置400は、アクセス先の葉L♯の構造体内の文字情報について置換文字を伸長バッファに書き出して(ステップS6405)、ステップS6407に移行する。一方、照合フラグがOFFの場合(ステップS6404:No)、情報処理装置400は、アクセス先の葉L♯の構造体内の文字情報(伸長文字)を伸長バッファに書き出して(ステップS6406)、ステップS6407に移行する。
ステップS6407では、情報処理装置400は、アクセス先の葉L♯の構造体から圧縮符号長legを抽出し(ステップS6407)、ビットアドレスabiを更新する(ステップS6408)。このあと、情報処理装置400は、メモリに圧縮符号列があるか否か、具体的には、マスクパターンによるマスク処理が施されていない圧縮符号列があるか否かを判断する(ステップS6409)。たとえば、バイトオフセットbyosに該当するバイト位置があるか否かにより判断する。圧縮符号列がある場合(ステップS6409:Yes)、図63のステップS6302に戻る。一方、圧縮符号列がない場合(ステップS6409:No)、伸長処理(ステップS6003)を終了する。
このような伸長処理(ステップS6003)により、圧縮状態のまま照合・伸長をおこなうことができ、伸長速度の高速化を図ることができる。
<更新処理の具体例>
つぎに、図1に示した更新処理の具体例について説明する。ここでは、図1で示したように、圧縮済みの圧縮符号マップMを伸長することなく、対象ファイルFiの更新と、圧縮符号マップMの更新とを実行する。
図65は、更新処理の具体例を示す説明図である。図65では、対象ファイルF3を更新する場合を例に挙げて説明する。まず、図56のファイル伸長例(G1)または図57のファイル伸長例(G2)により、圧縮ファイル群fsから圧縮ファイルf3が伸長され、伸長後の対象ファイルF3がメインメモリ(たとえば、RAM203)上に書き出されたとする。
(H)ここで、対象ファイルF3内の文字列「人形芝居を見た。」を「紙芝居を見た。」に変更し、保存指示を与えたとする。この場合、メインメモリ上の対象ファイルF3にはあたらしく採番されたファイル番号n+1が割り与えられ、対象ファイルF(n+1)となる。
(I)そして、対象ファイルF(n+1)を2N分枝無節点ハフマン木Hで圧縮して圧縮ファイルf(n+1)とし、記憶装置内に保存する。この場合、記憶装置内において圧縮ファイルf(n+1)を圧縮ファイルf3に上書き保存する。
(J)また、メインメモリ上の対象ファイルF(n+1)の文字情報を集計部401により集計することで、文字情報の存否を検出することができる。したがって、新たに採番されたファイル番号n+1のビットを、各文字情報の出現マップに追加(デフォルトはOFF)し、文字情報が出現したビットについてONにする。また、ファイル番号n+1のビットを削除マップDにも追加(デフォルトはON)する。さらに、削除マップDにおいて更新元となる対象ファイルF3のファイル番号3のビットをOFFにする。
(K)また、圧縮ファイルf3は圧縮ファイルf(n+1)に上書き保存されるため、ファイル番号n+1については、管理領域においてファイル番号3に関連付けられていたポインタが関連付けされる。これにより、以降において、ファイル番号(n+1)が指定されると、圧縮ファイルf(n+1)を伸長して対象ファイルF(n+1)をオープンすることができる。
なお、図65では、圧縮ファイルf(n+1)を圧縮ファイルf3に対して上書き保存することとしたが、上書き保存せず別途保存することとしてもよい。この場合、圧縮符号マップMの管理領域5600において、ファイル番号n+1には、圧縮ファイルf3へのポインタではなく、空き領域を指定するあらたなポインタが割り当てられることとなる。この場合、圧縮ファイルf3は残存するが、削除マップDではファイル番号3がOFFに変更されているため、検索に影響は与えない。
また、更新前の状態に復元させる場合は、更新前のファイル番号3と更新後のファイル番号n+1とを関連付けさせておけばよい。これにより、ファイル番号n+1を含む復元指示を与えることで、ファイル番号3を介して圧縮ファイルf3を指定することができるため、伸長することで対象ファイルF3を得ることができる。
<更新処理手順>
つぎに、図65に示した更新処理手順について説明する。
図66は、図65に示した更新処理手順を示すフローチャートである。まず、情報処理装置400は、更新要求が受け付けられるのを待ち受け(ステップS6601:No)、更新要求が受け付けられた場合(ステップS6601:Yes)、情報処理装置400は、更新要求のあった対象ファイルFiのファイル番号iを特定する(ステップS6602)。
そして、情報処理装置400は、削除マップDにおける特定先のファイル番号iのビットをOFFにする(ステップS6603)。これにより、特定先のファイル番号iの対象ファイルFiが検索されることがなくなり、検索精度の向上を図ることができる。
つぎに、情報処理装置400は、対象ファイルFiのファイル番号iを更新する(ステップS6604)。すなわち、現時点での末尾のファイル番号に1加算したファイル番号を採番して、対象ファイルに割り与える。たとえば、図65に示したように、ファイル番号n+1を採番して、メインメモリ(RAM203)上の対象ファイルF3に付与して対象ファイルF(n+1)とする。このように、あらたに採番されたファイル番号が付与された対象ファイルを追加ファイルと称す。
このあと、情報処理装置400は、追加ファイルF(n+1)を2N分枝無節点ハフマン木Hで圧縮して圧縮ファイルとして保存する(ステップS6605)。そして、情報処理装置400は、圧縮符号マップMの管理領域5600内に、追加ファイルF(n+1)のファイル番号(n+1)に関連付けて追加ファイルF(n+1)の圧縮ファイルへのポインタを関連付ける(ステップS6606)。
このあと、情報処理装置400は、総ファイル数(末尾のファイル番号)がnの倍数であるか否かを判断する(ステップS6607)。nの倍数である場合(ステップS6607:Yes)、圧縮符号マップMの全ビットが圧縮領域となるため、圧縮符号マップMの各出現マップを圧縮する(ステップS6608)。これにより、圧縮符号マップMのサイズ縮小を図ることができる。
一方、nの倍数でない場合(ステップS6607:No)、追加ファイルF(n+1)のマップ更新処理を実行して(ステップS6609)、一連の処理を終了する。追加ファイルF(n+1)のマップ更新処理(ステップS6609)の詳細については、図67および図68で説明する。
図67は、図66に示した追加ファイルのマップ更新処理(ステップS6609)の詳細な処理手順を示すフローチャート(前半)である。まず、情報処理装置400は、圧縮符号マップMおよび削除マップDにおいて、追加ファイルのファイル番号のビットを設定する(ステップS6701)。具体的には、出現マップについてはOFFのビットを追加ファイルのファイル番号に対して設定し、削除マップDについてはONのビットを追加ファイルのファイル番号に対して設定する。
つぎに、情報処理装置400は、追加ファイル内の先頭文字を対象文字に設定し(ステップS6702)、対象文字について最長一致検索処理を実行する(ステップS6703)。最長一致検索処理(ステップS6703)は、図24に示した処理と同一処理であるため説明を省略する。
このあと、情報処理装置400は、最長一致した基礎単語が基礎単語の構造体1600にあるか否かを判断する(ステップS6704)。ない場合(ステップS6704:No)、図68のステップS6801に移行する。一方、ある場合(ステップS6704:Yes)、情報処理装置400は、最長一致した基礎単語の圧縮符号を2N分枝無節点ハフマン木Hから特定して、当該圧縮符号により、最長一致した基礎単語の出現マップを指定する(ステップS6705)。そして、情報処理装置400は、指定された出現マップにおいて追加ファイルのファイル番号に対応するビットをONにする(ステップS6706)。このあと、図68のステップS6801に移行する。
図68は、図66に示した追加ファイルのマップ更新処理(ステップS6609)の詳細な処理手順を示すフローチャート(後半)である。まず、情報処理装置400は、対象文字が特定単一文字であるか否かを判断する(ステップS6801)。具体的には、たとえば、情報処理装置400は、対象文字が特定単一文字の構造体でヒットしたか否かを判断する。
対象文字が特定単一文字である場合(ステップS6801:Yes)、情報処理装置400は、ヒットした特定単一文字の圧縮符号を2N分枝無節点ハフマン木Hから特定して、当該圧縮符号により、ヒットした特定単一文字の出現マップを指定する(ステップS6802)。そして、情報処理装置400は、指定された出現マップにおいて追加ファイルのファイル番号に対応するビットをONにする(ステップS6803)。このあと、ステップS6809に移行する。
一方、対象文字が特定単一文字でない場合(ステップS6801:No)、情報処理装置400は、対象文字を上位分割文字コードと下位分割文字コードとに分割する(ステップS6804)。そして、情報処理装置400は、分割文字コードの構造体でヒットした上位分割文字コードの圧縮符号を2N分枝無節点ハフマン木Hから特定して、当該圧縮符号により、ヒットした上位分割文字コードの出現マップを指定する(ステップS6805)。そして、情報処理装置400は、指定された出現マップにおいて追加ファイルのファイル番号に対応するビットをONにする(ステップS6806)。
同様に、情報処理装置400は、分割文字コードの構造体でヒットした下位分割文字コードの圧縮符号を2N分枝無節点ハフマン木Hから特定して、当該圧縮符号により、ヒットした下位分割文字コードの出現マップを指定する(ステップS6807)。そして、情報処理装置400は、指定された出現マップにおいて追加ファイルのファイル番号に対応するビットをONにする(ステップS6808)。このあと、ステップS6809に移行する。
また、ステップS6809において、情報処理装置400は、2グラム文字列特定処理を実行する(ステップS6809)。2グラム文字列特定処理(ステップS6809)は、図30に示した処理と同一処理であるため説明を省略する。
このあと、情報処理装置400は、2グラム文字列(たとえば「人形」)のうち先頭グラム文字(たとえば、「人」)の圧縮符号と末尾グラム文字(たとえば、「形」)の圧縮符号とを連結する(ステップS6810)。つぎに、情報処理装置400は、連結圧縮符号により、2グラム文字列の出現マップを指定する(ステップS6811)。そして、情報処理装置400は、指定された出現マップにおいて追加ファイルのファイル番号に対応するビットをONにして(ステップS6812)、一連の処理を終了する。
以上説明したように、本実施の形態によれば、追加されたファイル番号に、更新後の対象ファイルの圧縮ファイルへのポインタが付与される。したがって、更新後において追加ファイルのファイル番号を指定/検索された場合に、速やかに追加ファイルの圧縮ファイルを指定して伸長することができることになる。
したがって、インデックス情報を用いた検索の対象となる複数のファイルのいずれかを更新する場合に、更新処理を開始してから、更新後の複数のファイルに対応したインデックス情報による検索を実行可能とするまでの処理時間を低減することができる。
また、上書き保存により対象ファイルFiが削除されても、ファイル番号n+1についての出現マップおよび削除マップDのビット追加と、削除マップDのビット変更により、マップ更新が可能となる。すなわち、出現マップの圧縮領域を伸長して削除となったファイル番号iのビットを削除して、圧縮しなおすといった処理を実行する必要がなく、効率的なマップ更新をおこなうことができる。
また、あらかじめ、圧縮符号マップMの圧縮領域のビット列を、先頭位置から末尾位置にかけて対象ファイル群Fsのファイル番号pの降順に配列しておく。これにより、ファイル番号;1〜nのビット列が圧縮されても、追加ファイルのファイル番号とそのビットとのずれがなく、対象ファイルFiの絞込みを正確に実行することができる。
また、圧縮符号マップMの圧縮領域を所定数の最大倍数(たとえば、所定ファイル数256の最大倍数)のビット列にすることで、対象ファイルが追加される都度、圧縮符号マップMの圧縮をおこなう必要がない。これにより、情報処理装置400の演算負荷を低減することができる。また、追加後のファイル総数が初期のファイル数の最大倍数に達した場合に、圧縮符号マップMのファイル番号に対応する全ビットが圧縮領域となるため、圧縮符号マップMがハフマン木hにより圧縮される。これにより、省メモリ化を図ることができる。このように、所定ファイル数(たとえば256個)単位で圧縮がおこなわれるため、演算負荷低減と省メモリ化を同時に実現することができる。
なお、本実施の形態で説明した情報生成方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等の情報処理装置400で実行することにより実現することができる。本情報生成プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等の情報処理装置400で読み取り可能な記録媒体に記録され、情報処理装置400によって記録媒体から読み出されることによって実行される。また本情報生成プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)コンピュータに、
複数のファイルのそれぞれについて所定の文字情報を含むか否かを示す第1の情報を圧縮した圧縮情報を記憶手段に記憶し、
前記複数のファイルに含まれるあるファイルが更新された場合に、更新された前記あるファイルが前記所定の文字情報を含むか否かを示す第2の情報を前記記憶手段に記憶するとともに、前記あるファイルを特定可能な第3の情報を前記記憶手段に記憶し、
前記所定の文字情報についての検索要求を受けた場合に、前記複数のファイル及び前記更新されたファイルのうち、前記圧縮情報を伸張して得られる前記第1の情報又は前記第2の情報によって前記所定の文字情報が含まれない旨を示されたファイル、及び、前記第3の情報によって特定される前記あるファイルを除外したファイルを抽出する、
ことを実行させることを特徴とする抽出方法。
(付記2)前記第1の情報が、
前記複数のファイルそれぞれについて前記所定の文字情報を含むか否かを示すビット列であり、
前記第3の情報が、
前記複数のファイルそれぞれについて検索対象とするか否かを示すビット列であり、
前記コンピュータに、
前記検索要求を受けた場合に、前記第1の情報と前記第3の情報とを用いたビット演算により生成されたビット列に基づいて、前記複数のファイルから前記所定の文字情報が含まれない旨を示されたファイル及び前記あるファイルを除外する、
ことを実行させることを特徴とする付記1に記載の抽出方法。
(付記3)コンピュータに、
複数のファイルのそれぞれについて所定の文字情報を含むかを示す第1の情報を圧縮して記憶手段に記憶し、
前記複数のファイルに含まれるあるファイルが更新された場合に、更新された前記あるファイルが前記所定の文字情報を含むか否かを示す第2の情報を前記記憶手段に記憶するとともに、前記あるファイルを検索対象から除く旨を示す第3の情報を前記記憶手段に記憶する、
ことを実行させることを特徴とする情報処理方法。
(付記4)前記コンピュータに、
更新された前記あるファイルを示すポインタを、前記第2の情報と対応付けて前記記憶手段に記憶する、
ことを特徴とする付記3に記載の情報処理方法。
(付記5)前記コンピュータに、
前記圧縮情報は、前記第1の情報を、前記複数のファイルにおける前記所定の文字情報の出現率に応じたハフマン木により圧縮して得られる、
ことを実行させることを特徴とする付記3又は付記4に記載の情報処理方法。
(付記6)前記コンピュータに、
前記第1の情報のうち、前記複数のファイルの先頭ファイル番号からファイル数の最大倍数となるファイル番号までの領域を圧縮し、かつ、残余の領域を圧縮せずに、前記記憶手段に記憶する、
ことを実行させることを特徴とする付記3〜5のいずれか一つに記載の情報処理方法。
(付記7)前記コンピュータに、
前記所定の文字情報の検索要求を受けた場合に、前記複数のファイルのうち、前記圧縮情報を伸張して得られる前記第1の情報に前記所定の文字情報を含む旨を示され、且つ前記第3の情報に検索対象から除く旨を示されないファイルを抽出するとともに、前記第2の情報が、前記所定の文字情報を含む旨を示す場合に更新された前記あるファイルを抽出する、
ことを実行させることを特徴とする付記3〜6のいずれか一つに記載の情報処理方法。
(付記8)コンピュータに、
複数のファイルのそれぞれについて所定の文字情報を含むか否かを示す第1の情報を圧縮した圧縮情報を記憶手段に記憶し、
前記複数のファイルに含まれるあるファイルが更新された場合に、更新された前記あるファイルが前記所定の文字情報を含むか否かを示す第2の情報を前記記憶手段に記憶するとともに、前記あるファイルを特定可能な第3の情報を前記記憶手段に記憶し、
前記所定の文字情報についての検索要求を受けた場合に、前記複数のファイル及び前記更新されたファイルのうち、前記圧縮情報を伸張して得られる前記第1の情報又は前記第2の情報によって前記所定の文字情報が含まれない旨示されたファイル、及び、前記第3の情報によって特定される前記あるファイルを除外したファイルを抽出する、
ことを実行させることを特徴とする抽出プログラム。
(付記9)コンピュータに、
複数のファイルのそれぞれについて所定の文字情報を含むかを示す第1の情報を圧縮して記憶手段に記憶し、
前記複数のファイルに含まれるあるファイルが更新された場合に、更新された前記あるファイルが前記所定の文字情報を含むか否かを示す第2の情報を前記記憶手段に記憶するとともに、前記あるファイルを検索対象から除く旨を示す第3の情報を前記記憶手段に記憶する、
処理を実行させることを特徴とする情報処理プログラム。
(付記10)複数のファイルのそれぞれについて所定の文字情報を含むか否かを示す第1の情報を圧縮した圧縮情報を記憶手段に記憶する記憶手段と、
前記複数のファイルに含まれるあるファイルが更新された場合に、更新された前記あるファイルが前記所定の文字情報を含むか否かを示す第2の情報を前記記憶手段に記憶するとともに、前記あるファイルを特定可能な第3の情報を前記記憶手段に記憶させる更新手段と、
前記所定の文字情報についての検索要求を受けた場合に、前記複数のファイル及び前記更新されたファイルのうち、前記圧縮情報を伸張して得られる前記第1の情報又は前記第2の情報によって前記所定の文字情報が含まれない旨示されたファイル、及び、前記第3の情報によって特定される前記あるファイルを除外したファイルを抽出する抽出手段と、
を含むことを特徴とする抽出装置。
(付記11)複数のファイルのいずれが所定の文字情報を含むかを示す第1の情報を圧縮して記憶する記憶手段と、
前記複数のファイルに含まれるあるファイルが更新された場合に、更新された前記あるファイルが前記所定の文字情報を含むか否かを示す第2の情報を前記記憶手段に記憶させ、前記あるファイルを検索対象から除く旨を示す第3の情報を前記記憶手段に記憶させる更新手段と、
を備えることを特徴とする情報処理装置。