(57)【特許請求の範囲】
【請求項１】
コンピュータが、
複数のファイルの中から複数の２グラム文字列を抽出し、
個々の２グラム文字列の順位を、前記２グラム文字列が前記複数のファイルに出現する回数に応じて決定し、
所定の順位より高い順位を有する高位２グラム文字列のそれぞれにつき、前記高位２グラム文字列を含むファイルを示す非分割出現マップを生成し、
前記所定の順位と同じか低い順位を有する低位２グラム文字列のそれぞれにつき、前記低位２グラム文字列の第１グラムを表す符号をｎ（「ｎ」は自然数）分割して得られたｎ個の符号と、前記低位２グラム文字列の第２グラムを表す符号をｍ（「ｍ」は自然数）分割して得られたｍ個の符号と、のｎ×ｍ個の組み合わせにそれぞれ対応するｎ×ｍ個の分割出現マップを生成する、
処理を実行することを特徴とする出現マップ生成方法。
【請求項２】
前記ｎは２、前記ｍは１であり、
前記ｎ×ｍ個の分割出現マップの生成では、
前記低位２グラム文字列の第１グラムを表す符号を、第１グラム上位コードと第１グラム下位コードとに分割し、
前記第１グラム上位コードと前記低位２グラム文字列の第２グラムを表す符号とを連結して得られた連結符号に対応する第１の分割出現マップを生成し、
前記第１グラム下位コードと前記低位２グラム文字列の第２グラムを表す符号とを連結して得られた連結符号に対応する第２の分割出現マップを生成する、
ことを特徴とする請求項１に記載の出現マップ生成方法。
【請求項３】
前記ｎは１、前記ｍは２であり、
前記ｎ×ｍ個の分割出現マップの生成では、
前記低位２グラム文字列の第２グラムを表す符号を、第２グラム上位コードと第２グラム下位コードとに分割し、
前記低位２グラム文字列の第１グラムを表す符号と前記第２グラム上位コードとを連結して得られた連結符号に対応する第１の分割出現マップを生成し、
前記低位２グラム文字列の第１グラムを表す符号と前記第２グラム下位コードとを連結して得られた連結符号に対応する第２の分割出現マップを生成する、
ことを特徴とする請求項１に記載の出現マップ生成方法。
【請求項４】
前記ｎは２、前記ｍは２であり、
前記ｎ×ｍ個の分割出現マップの生成では、
前記低位２グラム文字列の第１グラムを表す符号を、第１グラム上位コードと第１グラム下位コードとに分割し、
前記低位２グラム文字列の第２グラムを表す符号を、第２グラム上位コードと第２グラム下位コードとに分割し、
前記第１グラム上位コードと前記第２グラム上位コードとを連結して得られた連結符号に対応する第１の分割出現マップを生成し、
前記第１グラム上位コードと前記第２グラム下位コードとを連結して得られた連結符号に対応する第２の分割出現マップを生成し、
前記第１グラム下位コードと前記第２グラム上位コードとを連結して得られた連結符号に対応する第３の分割出現マップを生成し、
前記第１グラム下位コードと前記第２グラム下位コードとを連結して得られた連結符号に対応する第４の分割出現マップを生成する、
ことを特徴とする請求項１に記載の出現マップ生成方法。
【請求項５】
コンピュータが、
複数のファイルの中から抽出され、高位２グラム文字列が前記複数のファイルに出現する回数に応じて決定される順位より高い順位を有する高位２グラム文字列のそれぞれについて生成された非分割出現マップと、
複数のファイルの中から抽出され、低位２グラム文字列が前記複数のファイルに出現する回数に応じて決定される順位と同じか低い順位を有する低位２グラム文字列のそれぞれについて生成された、前記低位２グラム文字列の第１グラムを表す符号をｎ（「ｎ」は自然数）分割して得られたｎ個の符号と、前記低位２グラム文字列の第２グラムを表す符号をｍ（「ｍ」は自然数）分割して得られたｍ個の符号と、のｎ×ｍ個の組み合わせにそれぞれ対応するｎ×ｍ個の分割出現マップと、
のＡＮＤ演算により、前記複数のファイルの中から検索文字列を含むファイルを抽出する処理を実行することを特徴とするファイル抽出方法。
【請求項６】
コンピュータに、
複数のファイルの中から複数の２グラム文字列を抽出し、
個々の２グラム文字列の順位を、前記２グラム文字列が前記複数のファイルに出現する回数に応じて決定し、
所定の順位より高い順位を有する高位２グラム文字列のそれぞれにつき、前記高位２グラム文字列を含むファイルを示す非分割出現マップを生成し、
前記所定の順位と同じか低い順位を有する低位２グラム文字列のそれぞれにつき、前記低位２グラム文字列の第１グラムを表す符号をｎ（「ｎ」は自然数）分割して得られたｎ個の符号と、前記低位２グラム文字列の第２グラムを表す符号をｍ（「ｍ」は自然数）分割して得られたｍ個の符号と、のｎ×ｍ個の組み合わせにそれぞれ対応するｎ×ｍ個の分割出現マップを生成する、
処理を実行させることを特徴とする出現マップ生成プログラム。
【請求項７】
コンピュータに、
複数のファイルの中から抽出され、高位２グラム文字列が前記複数のファイルに出現する回数に応じて決定される順位より高い順位を有する高位２グラム文字列のそれぞれについて生成された非分割出現マップと、
複数のファイルの中から抽出され、低位２グラム文字列が前記複数のファイルに出現する回数に応じて決定される順位と同じか低い順位を有する低位２グラム文字列のそれぞれについて生成された、前記低位２グラム文字列の第１グラムを表す符号をｎ（「ｎ」は自然数）分割して得られたｎ個の符号と、前記低位２グラム文字列の第２グラムを表す符号をｍ（「ｍ」は自然数）分割して得られたｍ個の符号と、のｎ×ｍ個の組み合わせにそれぞれ対応するｎ×ｍ個の分割出現マップと、
のＡＮＤ演算により、前記複数のファイルの中から検索文字列を含むファイルを抽出する処理を実行させることを特徴とするファイル抽出プログラム。
【請求項８】
複数のファイルの中から複数の２グラム文字列を抽出し、
個々の２グラム文字列の順位を、前記２グラム文字列が前記複数のファイルに出現する回数に応じて決定し、
所定の順位より高い順位を有する高位２グラム文字列のそれぞれにつき、前記高位２グラム文字列を含むファイルを示す非分割出現マップを生成し、
前記所定の順位と同じか低い順位を有する低位２グラム文字列のそれぞれにつき、前記低位２グラム文字列の第１グラムを表す符号をｎ（「ｎ」は自然数）分割して得られたｎ個の符号と、前記低位２グラム文字列の第２グラムを表す符号をｍ（「ｍ」は自然数）分割して得られたｍ個の符号と、のｎ×ｍ個の組み合わせにそれぞれ対応するｎ×ｍ個の分割出現マップを生成する、
処理を実行することを特徴とする出現マップ生成装置。
【請求項９】
複数のファイルの中から抽出され、高位２グラム文字列が前記複数のファイルに出現する回数に応じて決定される順位より高い順位を有する高位２グラム文字列のそれぞれについて生成された非分割出現マップと、
複数のファイルの中から抽出され、低位２グラム文字列が前記複数のファイルに出現する回数に応じて決定される順位と同じか低い順位を有する低位２グラム文字列のそれぞれについて生成された、前記低位２グラム文字列の第１グラムを表す符号をｎ（「ｎ」は自然数）分割して得られたｎ個の符号と、前記低位２グラム文字列の第２グラムを表す符号をｍ（「ｍ」は自然数）分割して得られたｍ個の符号と、のｎ×ｍ個の組み合わせにそれぞれ対応するｎ×ｍ個の分割出現マップと、
のＡＮＤ演算により、前記複数のファイルの中から検索文字列を含むファイルを抽出する処理を実行することを特徴とするファイル抽出装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、検索技術に関する。
【背景技術】
【０００２】
従来において、文字成分表の圧縮によるサイズ縮小と伸長による絞込みに関する技術が開示されている（たとえば、下記特許文献１を参照）。また、２グラムの文字成分表のサイズ縮小に関する技術も開示されている（たとえば、下記特許文献２を参照）。
【０００３】
また、英語などの文字種が少ない表音文字によって構成される文書を対象とした場合に、与えられた検索タームから十分な絞り込みを行うことのできる連接文字成分表サーチ手段により等価的に高速なフルテキストサーチを実現する技術が開示されている（たとえば、下記特許文献３を参照）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特許第３３３３５４９号公報
【特許文献２】特開平６−６８１５９号公報
【特許文献３】特許第３４９７２４３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
文字コードの一部を用いて作成したマップに基づいて検索を行うと、検索対象の文字を含まないファイルであって、マップの作成に用いた文字コードの一部が同一である検索対象以外の文字を含むファイルについても抽出されてしまう。
【０００６】
１つの側面では、本発明は、マップサイズの縮小することにより生じる検索ノイズを抑制することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の抽出方法では、コンピュータに、それぞれ文字情報を含む複数のファイルを記憶手段に記憶し、所定部分に共通する情報を含む複数の文字情報のうち、前記複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が所定の頻度未満である文字情報群に含まれる文字情報のうちのいずれかを少なくとも１つ含むファイルがどれであるかを示す第１のインデックス情報を前記記憶手段に記憶し、前記所定部分に共通する情報を含む複数の文字情報のうち、前記複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が少なくとも前記所定の頻度以上である第１の文字情報を前記複数のファイルのうちのどのファイルが含むかを示す第２のインデックス情報を前記記憶手段に記憶し、前記第１の文字情報と、前記文字情報群に含まれる第２の文字情報と、を含むファイルを前記複数のファイルから抽出させる要求を受け付けた場合に、前記第１のインデックス情報及び前記第２のインデックス情報を参照して、いずれにおいても文字情報を含むことが示されるファイルを前記複数のファイルから抽出する、ことを実行させる。
【０００８】
本発明の抽出プログラムでは、コンピュータに、それぞれ文字情報を含む複数のファイルを記憶手段に記憶し、所定部分に共通する情報を含む複数の文字情報のうち、前記複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が所定の頻度未満である文字情報群に含まれる文字情報のうちのいずれかを少なくとも１つ含むファイルがどれであるかを示す第１のインデックス情報を前記記憶手段に記憶し、前記所定部分に共通する情報を含む複数の文字情報のうち、前記複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が少なくとも前記所定の頻度以上である第１の文字情報を前記複数のファイルのうちのどのファイルが含むかを示す第２のインデックス情報を前記記憶手段に記憶し、前記第１の文字情報と、前記文字情報群に含まれる第２の文字情報と、を含むファイルを前記複数のファイルから抽出させる要求を受け付けた場合に、前記第１のインデックス情報及び前記第２のインデックス情報を参照して、いずれにおいても文字情報を含むことが示されるファイルを前記複数のファイルから抽出する、ことを実行させる。
【０００９】
本発明の抽出システムは、第１の文字情報と第２の文字情報とを含むファイルを複数のファイルから抽出させる要求を送信する送信手段、を含む第１の装置と、それぞれ文字情報を含む複数のファイルと、所定部分に共通する情報を含む複数の文字情報のうち、前記複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が所定の頻度未満である文字情報群に含まれる文字情報のうちのいずれかを少なくとも１つ含むファイルがどれであるかを示す第１のインデックス情報と、前記所定部分に共通する情報を含む複数の文字情報のうち、前記複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が少なくとも前記所定の頻度以上である第１の文字情報を前記複数のファイルのうちのどのファイルが含むかを示す第２のインデックス情報と、を記憶する記憶手段と、前記要求を受信した場合に、前記第１のインデックス情報及び前記第２のインデックス情報を参照して、いずれにおいても文字情報を含むことが示されるファイルを前記複数のファイルから抽出する抽出手段と、を含む第２の装置と、を含む。
【００１０】
本発明の抽出装置は、それぞれ文字情報を含む複数のファイルと、所定部分に共通する情報を含む複数の文字情報のうち、前記複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が所定の頻度未満である文字情報群に含まれる文字情報のうちのいずれかを少なくとも１つ含むファイルがどれであるかを示す第１のインデックス情報と、前記所定部分に共通する情報を含む複数の文字情報のうち、前記複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が少なくとも前記所定の頻度以上である第１の文字情報を前記複数のファイルのうちのどのファイルが含むかを示す第２のインデックス情報と、を記憶する記憶手段と、前記第１の文字情報と、前記文字情報群に含まれる第２の文字情報と、を含むファイルを前記複数のファイルから抽出させる要求を受け付けた場合に、前記第１のインデックス情報及び前記第２のインデックス情報を参照して、いずれにおいても文字情報を含むことが示されるファイルを前記複数のファイルから抽出する抽出手段と、含む。
【００１１】
本発明の情報生成方法では、コンピュータに、所定部分に共通する情報を含む複数の文字情報のうち、複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が所定の頻度未満である文字情報群に含まれる文字情報のうちのいずれかを少なくとも１つ含むファイルがどれであるかを示す第１のインデックス情報を生成し、前記所定部分に共通する情報を含む複数の文字情報のうち、前記複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が少なくとも前記所定の頻度以上である第１の文字情報を前記複数のファイルのうちのどのファイルが含むかを示す第２のインデックス情報を生成する、ことを実行させる。
【００１２】
本発明の情報生成プログラムでは、コンピュータに、所定部分に共通する情報を含む複数の文字情報のうち、複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が所定の頻度未満である文字情報群に含まれる文字情報のうちのいずれかを少なくとも１つ含むファイルがどれであるかを示す第１のインデックス情報を生成し、前記所定部分に共通する情報を含む複数の文字情報のうち、前記複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が少なくとも前記所定の頻度以上である第１の文字情報を前記複数のファイルのうちのどのファイルが含むかを示す第２のインデックス情報を生成する、ことを実行させる。
【００１３】
本発明の情報コンテンツは、複数のファイルと、所定部分に共通する情報を含む複数の文字情報のうち、複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が所定の頻度未満である文字情報群に含まれる文字情報のうちのいずれかを少なくとも１つ含むファイルがどれであるかを示す第１のインデックス情報と、前記所定部分に共通する情報を含む複数の文字情報のうち、前記複数のファイルのうちどの程度の数のファイルに含まれるかを示す使用頻度が少なくとも前記所定の頻度以上である第１の文字情報を前記複数のファイルのうちのどのファイルが含むかを示す第２のインデックス情報と、を含む。
【発明の効果】
【００１４】
本発明の一側面によれば、マップサイズの縮小することにより生じる検索ノイズを抑制することができる。
【図面の簡単な説明】
【００１５】
【図１】図１は、２グラム文字列の圧縮符号マップのサイズ縮小を示す説明図である。
【図２】図２は、２グラム文字列の圧縮符号マップの分割時のサイズを示す図表である。
【図３】図３は、２グラム文字列の圧縮符号マップの分割例を示す説明図である。
【図４】図４は、２グラム文字列の圧縮符号マップを示す説明図である。
【図５】図５は、対象ファイル群内に存在する文字列の一例を示す説明図である。
【図６】図６は、図５に示した２グラム文字列「する」の４分割例を示す説明図である。
【図７】図７は、図５に示した２グラム文字列「るめ」の４分割例を示す説明図である。
【図８】図８は、図４に示した２グラム文字列「例え」の４分割例を示す説明図である。
【図９】図９は、第１分割圧縮符号マップＭ４ａの一例を示す説明図である。
【図１０】図１０は、第２分割圧縮符号マップＭ４ｂの一例を示す説明図である。
【図１１】図１１は、第３分割圧縮符号マップＭ４ｃの一例を示す説明図である。
【図１２】図１２は、第４分割圧縮符号マップＭ４ｄの一例を示す説明図である。
【図１３】図１３は、「するめ」についてのＡＮＤ結果を示す説明図である。
【図１４】図１４は、第２分割圧縮符号マップの修正例を示す説明図である。
【図１５】図１５は、第４分割圧縮符号マップの修正例を示す説明図である。
【図１６】図１６は、「するめ」についての図１４および図１５による修正された出現マップを用いた場合のＡＮＤ結果を示す説明図である。
【図１７】図１７は、圧縮符号マップ生成の前処理例を示す説明図である。
【図１８】図１８は、（１７）出現回数の集計の詳細を示す説明図である。
【図１９】図１９は、図１７の（２）圧縮符号長算出の詳細（Ｎ＝１１）を示す説明図である。
【図２０】図２０は、図１７の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１１）を示す説明図である。
【図２１】図２１は、文字情報ごとの補正結果を示す説明図である。
【図２２】図２２は、図１７の（６）葉へのポインタ生成の詳細（Ｎ＝１１）を示す説明図である。
【図２３】図２３は、図１７の（７）２Ｎ分枝無節点ハフマン木の構築の詳細（Ｎ＝１１）を示す説明図である。
【図２４】図２４は、葉の構造体を示す説明図である。
【図２５】図２５は、特定単一文字の構造体を示す説明図である。
【図２６】図２６は、分割文字コードの構造体を示す説明図である。
【図２７】図２７は、基礎単語の構造体を示す説明図である。
【図２８】図２８は、圧縮符号マップの生成例を示す説明図である。
【図２９】図２９は、実施の形態にかかるコンピュータのハードウェア構成例を示すブロック図である。
【図３０】図３０は、コンピュータが生成プログラムにより実行する圧縮符号マップ生成処理手順例を示すフローチャートである。
【図３１】図３１は、図３０に示した集計処理（ステップＳ３００１）の詳細な処理手順例を示すフローチャートである。
【図３２】図３２は、図３１に示した対象ファイルＦｉの集計処理（ステップＳ３１０３）の詳細な処理手順例を示すフローチャートである。
【図３３】図３３は、文字出現頻度集計テーブルを示す説明図である。
【図３４】図３４は、図３２に示した基礎単語集計処理（ステップＳ３２０２）の詳細な処理手順例を示すフローチャートである。
【図３５】図３５は、基礎単語出現頻度集計テーブルを示す説明図である。
【図３６】図３６は、図３４に示した最長一致検索処理（ステップＳ３４０１）の詳細な処理手順を示すフローチャートである。
【図３７】図３７は、図３０に示したマップ割当数決定処理（ステップＳ３００３）の詳細な処理手順例を示すフローチャートである。
【図３８】図３８は、図３０に示した再集計処理（ステップＳ３００３）の詳細な処理手順例を示すフローチャートである。
【図３９】図３９は、対象ファイルＦｉの再集計処理（ステップＳ３８０３）の詳細な処理手順例を示すフローチャートである。
【図４０】図４０は、上位分割文字コード出現頻度集計テーブルを示す説明図である。
【図４１】図４１は、下位分割文字コード出現頻度集計テーブルを示す説明図である。
【図４２】図４２は、図３９で示した２グラム文字列特定処理（ステップＳ３９０６）の詳細な処理手順を示すフローチャートである。
【図４３】図４３は、２グラム文字列出現頻度集計テーブルを示す説明図である。
【図４４】図４４は、図３０に示したハフマン木生成処理（ステップＳ３００４）の詳細な処理手順例を示すフローチャートである。
【図４５】図４５は、図４４に示した枝数特定処理（ステップＳ４４０４）の詳細な処理手順例を示すフローチャートである。
【図４６】図４６は、図４４に示した構築処理（ステップＳ４４０５）の詳細な処理手順を示すフローチャートである。
【図４７】図４７は、図４６に示した葉へのポインタ生成処理（ステップＳ４６０３）の詳細な処理手順を示すフローチャートである。
【図４８】図４８は、図３０に示した分割順位決定処理（ステップＳ３００５）の詳細な処理手順例を示すフローチャートである。
【図４９】図４９は、図３０に示したマップ生成処理（ステップＳ３００６）の詳細な処理手順例を示すフローチャートである。
【図５０】図５０は、図４９に示した対象ファイルＦｉのマップ生成処理（ステップＳ４９０３）の詳細な処理手順を示すフローチャートである。
【図５１】図５１は、図５０で示した基礎単語出現マップ生成処理（ステップＳ５００２）の詳細な処理手順例を示すフローチャートである。
【図５２】図５２は、図５０で示した特定単一文字出現マップ生成処理（ステップＳ５００３）の詳細な処理手順例を示すフローチャートである。
【図５３】図５３は、図５２で示した分割文字コード出現マップ生成処理（ステップＳ５２０３）の詳細な処理手順例を示すフローチャートである。
【図５４】図５４は、図５０に示した２グラム文字列圧縮符号マップ生成処理（ステップＳ５００４）の詳細な処理手順例を示すフローチャートである。
【図５５】図５５は、２グラム文字列出現マップ（非分割）生成処理（ステップＳ５４０４）の詳細な処理手順例を示すフローチャートである。
【図５６】図５６は、図５４に示した２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）の詳細な処理手順例（その１）を示すフローチャートである。
【図５７】図５７は、図５４に示した２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）の詳細な処理手順例（その２）を示すフローチャートである。
【図５８】図５８は、図５４に示した２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）の詳細な処理手順例（その３）を示すフローチャート（その１）である。
【図５９】図５９は、図５４に示した２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）の詳細な処理手順例（その３）を示すフローチャート（その２）である。
【図６０】図６０は、２N分枝無節点ハフマン木を用いた圧縮処理の具体例を示す説明図である。
【図６１】図６１は、コンピュータが自動実行する２N分枝無節点ハフマン木を用いた対象ファイル群Ｆｓの圧縮処理手順例を示すフローチャートである。
【図６２】図６２は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その１）である。
【図６３】図６３は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その２）である。
【図６４】図６４は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その３）である。
【図６５】図６５は、圧縮符号マップを用いた検索処理の流れ（Ａ）を示す説明図である。
【図６６】図６６は、圧縮符号マップを用いた検索処理の流れ（Ｂ）を示す説明図である。
【図６７】図６７は、圧縮符号マップを用いた検索処理の流れ（Ｃ）、（Ｄ）を示す説明図である。
【図６８】図６８は、図６７の（Ｄ）による照合・伸張例を示す説明図（その１）である。
【図６９】図６９は、図６７の（Ｄ）による照合・伸張例を示す説明図（その２）である。
【図７０】図７０は、図６７の（Ｄ）による照合・伸張例を示す説明図（その３）である。
【図７１】図７１は、本実施の形態にかかる検索処理手順を示すフローチャートである。
【図７２】図７２は、図７１に示したファイル絞込み処理（ステップＳ７１０２）の詳細な処理手順を示すフローチャート（その１）である。
【図７３】図７３は、図７１に示したファイル絞込み処理（ステップＳ７１０２）の詳細な処理手順を示すフローチャート（その２）である。
【図７４】図７４は、図７１に示した２Ｎ分枝無節点ハフマン木を用いた伸長処理（ステップＳ７１０３）の詳細な処理手順例を示すフローチャート（その１）である。
【図７５】図７５は、図７１に示した２N分枝無節点ハフマン木を用いた伸長処理（ステップＳ７１０３）の詳細な処理手順例を示すフローチャート（その２）である。
【図７６】図７６は、抽出システムのシステム構成例を示す説明図である。
【発明を実施するための形態】
【００１６】
以下に添付図面を参照して、本発明の実施の形態を詳細に説明する。なお、本明細書において、「文字情報」とは、テキストデータを構成する、単一文字、基礎単語、分割文字コードなどである。対象ファイル群は、たとえば、文書ファイル、Ｗｅｂページ、電子メールなどの電子データであり、たとえば、テキスト形式、ＨＴＭＬ（ＨｙｐｅｒＴｅｘｔ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）形式、ＸＭＬ（Ｅｘｔｅｎｓｉｂｌｅ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）形式の電子データである。
【００１７】
また、「単一文字」とは、１つの文字コードで表現される文字である。単一文字の文字コード長は、文字コード種により異なる。
【００１８】
たとえば、ＵＴＦ（Ｕｎｉｃｏｄｅ  Ｔｒａｎｓｆｏｒｍａｔｉｏｎ  Ｆｏｒｍａｔ）１６の場合は１６ビットコード、ＡＳＣＩＩ（Ａｍｅｒｉｃａｎ  Ｓｔａｎｄａｒｄ  Ｃｏｄｅ  ｆｏｒ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｉｎｔｅｒｃｈａｎｇｅ）コードの場合は８ビットコード、シフトＪＩＳ（Ｊａｐａｎｅｓｅ  Ｉｎｄｕｓｔｒｉａｌ  Ｓｔａｎｄａｒｄ）コードの場合は８ビットコードである。シフトＪＩＳコードで日本語の文字を表現する場合は、２個の８ビットコードを組み合わせることとなる。
【００１９】
また、「基礎単語」とは、小・中学校で学習する基本的な単語や、特定の文字列で表現される予約語をいう。「Ｔｈｉｓ  ｉｓ  ａ・・・．」の英文を例にすると「Ｔｈｉｓ」、「ｉｓ」、「ａ」などの単語であり、千語レベル、２千語レベル、数千語レベルに分類され、英和辞典には、「＊＊＊」、「＊＊」、「＊」マークが付与されている。また、予約語とは、予め決められた文字列であり、たとえば、ＨＴＭＬのタグ（たとえば、＜ｂｒ＞）が挙げられる。
【００２０】
また、「分割文字コード」とは、単一文字を、上位のコードと下位のコードに分割した各々のコードである。本実施の形態では、後述するように、単一文字を、上位のコードと下位のコードに分割する場合がある。たとえば、「芝」という単一文字の文字コードは、ＵＴＦ１６の場合、「９Ｄ８２」で表現されるが、上位分割文字コード「０ｘ９Ｄ」と下位分割文字コード「０ｘ８２」に分割される。
【００２１】
また、「グラム」とは、文字単位である。たとえば、単一文字については、その１文字分が１グラムとなる。分割文字コードについては、分割文字コード単独で１グラムとなる。したがって、単一文字「芝」は２グラムとなる。なお、本実施の形態では、文字コードとしてＵＴＦ１６を例に挙げて説明する。
【００２２】
また、本明細書では、「ビットをＯＮ」とした場合は、そのビットの値を“１”にし、「ビットをＯＦＦ」とした場合は、そのビットの値を“０”として説明する。なお、「ビットをＯＮ」とした場合は、そのビットの値を“０”にし、「ビットをＯＦＦ」とした場合は、そのビットの値を“１”にしてもよい。
【００２３】
＜圧縮符号マップの分割＞
まず、図１〜図２３を用いて、圧縮符号マップの分割について説明する。「圧縮符号マップ」とは、文字情報ごとの出現マップをまとめたビットマップである。「出現マップ」とは、文字情報を指定するポインタと文字情報の各対象ファイルでの存否を示すビット列を連結したビット列である。検索処理時には、このビット列を、ビットのＯＮ・ＯＦＦに応じて検索対象の文字情報を含むか否かを示すインデックスとして用いることができる。文字情報を指定するポインタとしては、たとえば、文字情報の圧縮符号が採用される。２グラム文字列の圧縮符号マップについては、第１グラムの圧縮符号と第２グラムの圧縮符号を組み合わせた圧縮符号列となる。
【００２４】
「２グラム文字列」とは、１グラムの文字コードが連接する文字列である。たとえば、「人形芝居」という文字列には、２連接文字「人形」、「形芝」、「芝居」が含まれている。２連接文字「人形」の「人」、「形」はそれぞれ分割されない単一文字であるため、２連接文字「人形」はそのまま２グラム文字列となる。
【００２５】
「芝」は上述したように分割されるため、単一文字「形」と「芝」の上位分割文字コード「０ｘ９Ｄ」の組み合わせが２グラム文字列となる。また、上位分割文字コード「０ｘ９Ｄ」と下位分割文字コード「０ｘ８２」の組み合わせも２グラム文字列となる。さらに、下位分割文字コード「０ｘ８２」と分割されない単一文字「居」の組み合わせも２グラム文字列となる。
【００２６】
基礎単語により、対象ファイル群が圧縮されている場合、圧縮符号マップの生成時や検索時に１パスでアクセスすることが可能である。なお、対象ファイル群を圧縮しない場合は、文字情報を指定するポインタとしては、文字情報の文字コードをそのまま採用してもよい。
【００２７】
図１は、２グラム文字列の圧縮符号マップのサイズ縮小を示す説明図である。（Ａ）は分割前の２グラム文字列の圧縮符号マップのサイズを示している。（Ａ）では、第１グラム（先頭グラム）の圧縮符号マップへのポインタとして１０ビット使用し、第２グラム（末尾グラム）の圧縮符号マップへのポインタとして１０ビット使用している例を示している。この場合、２10×２10（＝２20）パターンの文字列それぞれに対応するビット列を格納するメモリサイズが必要となり、サイズ爆発を引き起こすこととなる。
【００２８】
（Ｂ）では、第２グラムの圧縮符号マップへのポインタを５ビットで分割している。この場合、メモリサイズは、２10×２5×２（＝２16）となり、大幅なサイズ縮小を図ることができる。（Ｂ）の場合、分割された２つの圧縮符号マップからそれぞれ特定される２つの出現マップでＡＮＤ演算することで、２グラム文字列が存在する対象ファイルの絞込みをおこなうことができる。
【００２９】
（Ｃ）では、さらに、第１グラムの圧縮符号マップへのポインタを５ビットで分割している。したがって、メモリサイズは、２5×２5×４（＝２12）となり、大幅なサイズ縮小を図ることができる。（Ｃ）の場合、分割された４つの圧縮符号マップからそれぞれ特定される４つの出現マップでＡＮＤ演算することで、２グラム文字列が存在する対象ファイルの絞込みをおこなうことができる。
【００３０】
なお、分割に際し、（Ｂ），（Ｃ）のいずれの分割をおこなうかは、あらかじめ決めておく。また、（Ｂ）の２分割の場合、第１グラムと第２グラムのうちいずれを分割するかについてもあらかじめ決めておく。
【００３１】
図２は、２グラム文字列の圧縮符号マップの分割時のサイズを示す図表である。図１の（Ａ）のように非分割の場合、２グラム文字列の組み合わせでの合計サイズは、１．６４Ｍとなる。一方、図１の（Ｂ）のような２分割の場合、２グラム文字列の組み合わせでの合計メモリサイズは、１４４Ｋとなる。さらに、図１の（Ｃ）のような４分割の場合、２グラム文字列の組み合わせでの合計メモリサイズは、１０Ｋとなる。このように、分割することで、出現マップのサイズ縮小を図り、省メモリ化を図ることができる。
【００３２】
（２グラム文字列の圧縮符号マップの分割例）
図３は、２グラム文字列の圧縮符号マップの分割例を示す説明図である。図３において、「２グラム文字列群」とは、対象ファイル群から特定された２グラム文字列の集合である。本実施の形態では、２グラム文字列の出現頻度に応じて、２グラム文字列の圧縮符号マップＭの分割をおこなう。たとえば、出現頻度の高い２グラム文字列群（以下、「高位２グラム文字列群」と称す。）については、図１に示したような２分割または４分割をおこなわない。一方、出現頻度が低い２グラム文字列群（以下、「低位２グラム文字列群」と称す。）については、２分割または４分割をおこなう。
【００３３】
たとえば、２分割の場合、低位２グラム文字列群について、第１分割圧縮符号マップＭ２ａと第２分割圧縮符号マップＭ２ｂとが生成される。第１グラムを分割する場合、第１分割圧縮符号マップＭ２ａは、第１グラムの圧縮符号の上位コード（以下、「第１グラム上位コード」という）と第２グラムの圧縮符号との連結符号で指定される第１分割出現マップの集合である。また、第２分割圧縮符号マップＭ２ｂは、第１グラムの圧縮符号の下位コード（以下、「第１グラム下位コード」という）と第２グラムの圧縮符号との連結符号で指定される第２分割出現マップの集合である。
【００３４】
また、第２グラムを分割する場合、第１分割圧縮符号マップＭ２ａは、第１グラムの圧縮符号と第２グラムの圧縮符号の上位コード（以下、「第２グラム上位コード」という）との連結符号で指定される第１分割出現マップの集合である。また、第２分割圧縮符号マップＭ２ｂは、第１グラムの圧縮符号と第２グラムの圧縮符号の下位コード（以下、「第２グラム下位コード」という）との連結符号で指定される第２分割出現マップの集合である。
【００３５】
たとえば、４分割の場合、低位２グラム文字列群について、第１分割圧縮符号マップＭ４ａ〜第４分割圧縮符号マップＭ４ｄが生成される。第１分割圧縮符号マップＭ２ａは、第１グラム上位コードと第２グラム上位コードとの連結符号で指定される第１分割出現マップの集合である。
【００３６】
第２分割圧縮符号マップＭ２ｂは、第１グラム上位コードと第２グラム下位コードとの連結符号で指定される第２分割出現マップの集合である。
【００３７】
第３分割圧縮符号マップＭ４ｃは、第１グラム下位コードと第２グラム上位コードとの連結符号で指定される第３分割出現マップの集合である。
【００３８】
第４分割圧縮符号マップＭ４ｄは、第１グラム下位コードと第２グラム下位コードとの連結符号で指定される第４分割出現マップの集合である。
【００３９】
このように、高位２グラム文字列について分割をおこなわないようにすることで、圧縮符号マップのサイズ縮小を図るとともに、低位２グラム文字列の圧縮符号マップに重畳される検索ノイズを除去することができる。以下、図４〜図１６を用いて、低位２グラム文字列の圧縮符号マップに重畳される検索ノイズとその除去方法について、圧縮符号マップを図１（Ｃ）に示した４分割をおこなう場合を例にあげて説明する。なお、図１（Ｂ）に示した２分割については４分割の一部を流用すればよいため説明を省略する。
【００４０】
図４は、２グラム文字列の圧縮符号マップを示す説明図である。図４において、２グラム文字列を指定するポインタには、２グラム文字列の圧縮符号列（たとえば、２０ビット）が採用されている。また、図４において、「する」，「例え」は高位２グラム文字列、「るめ」は低位２グラム文字列とする。図４では、出現頻度による分割は行われていないため、高位２グラム文字列と低位２グラム文字列とが混在した２グラム文字列の圧縮符号マップとなっている。
【００４１】
図５は、対象ファイル群内に存在する文字列の一例を示す説明図である。文字列「するめ」には、高位２グラム文字列「する」と低位２グラム文字列「るめ」が含まれている。
【００４２】
図６は、図５に示した２グラム文字列「する」の４分割例を示す説明図である。２グラム文字列については、第１グラムである「す」の圧縮符号および第２グラムである「る」の圧縮符号をそれぞれ上下２分割し、たすきがけにより４種類の連結符号を生成する。
【００４３】
図７は、図５に示した２グラム文字列「るめ」の４分割例を示す説明図である。図７においても、図６と同様、第１グラムである「る」の圧縮符号および第２グラムである「め」の圧縮符号をそれぞれ上下２分割し、たすきがけにより４種類の連結符号を生成する。
【００４４】
図８は、図４に示した２グラム文字列「例え」の４分割例を示す説明図である。「例え」は、「例えば」の一部を構成する２グラム文字列であり、出現頻度が高い高位２グラム文字列である。図８においても、図６および図７と同様、第１グラムである「例」の圧縮符号および第２グラムである「え」の圧縮符号をそれぞれ上下２分割し、たすきがけにより４種類の連結符号を生成する。
【００４５】
図９は、第１分割圧縮符号マップＭ４ａの一例を示す説明図である。第１分割圧縮符号マップＭ４ａとは、第１グラム上位コードおよび第２グラム上位コードを連結した連結符号（以下、「第１連結符号」と称す。）をポインタとした、圧縮符号マップである。
【００４６】
図１０は、第２分割圧縮符号マップＭ４ｂの一例を示す説明図である。第２分割圧縮符号マップＭ４ｂとは、第１グラム上位コードおよび第２グラム下位コードを連結した連結符号（以下、「第２連結符号」と称す。）をポインタとした、圧縮符号マップである。図１０において、ポインタとなる第２連結符号（「０ｘ８Ｂ」「０ｘ３０」による連結符号）は、低位２グラム文字列「るめ」の第２連結符号であるとともに、高位２グラム文字列「例え」の第２連結符号でもあるため、同一となる。
【００４７】
したがって、低位２グラム文字列「るめ」が出現しない対象ファイルであっても、高位２グラム文字列「例え」が出現する対象ファイルである場合、当該対象ファイルのビットがＯＮ（“１”）に設定される。図１０の例では、低位２グラム文字列「るめ」の「る」の上位コードと「め」の下位コードとの組み合わせは対象ファイルＦ１，Ｆ３，Ｆｎにしか存在しないが、高位２グラム文字列「例え」の「例」の上位コードと「え」の下位コードの組み合わせが対象ファイルＦ１〜Ｆｎに存在する。
【００４８】
したがって、第２分割圧縮符号マップＭ４ｂ内の第２連結符号（「０ｘ８Ｂ」「０ｘ３０」による連結符号）の出現マップについては、低位２グラム文字列「るめ」の第２連結符号の出現マップと高位２グラム文字列「例え」の第２連結符号の出現マップとをＯＲ演算したビット列となる。これにより、低位２グラム文字列「るめ」が存在しない対象ファイルを検索対象に含めてしまう場合がある。
【００４９】
図１１は、第３分割圧縮符号マップＭ４ｃの一例を示す説明図である。第３分割圧縮符号マップＭ４ｃとは、第１グラム下位コードおよび第２グラム上位コードを連結した連結符号（以下、「第３連結符号」と称す。）をポインタとした、圧縮符号マップである。
【００５０】
図１２は、第４分割圧縮符号マップＭ４ｄの一例を示す説明図である。第４分割圧縮符号マップＭ４ｄとは、第１グラム下位コードおよび第２グラム下位コードを連結した連結符号（以下、「第４連結符号」と称す。）の圧縮符号列をポインタとした、圧縮符号マップである。第４分割圧縮符号マップＭ４ｄについても、図１０に示した第２分割圧縮符号マップＭ４ｂと同様、ポインタとなる第４連結符号（「０ｘ３０」「０ｘ３０」による連結符号）は、低位２グラム文字列「るめ」の第４連結符号であるとともに、高位２グラム文字列「する」の第４連結符号でもあるため、同一となる。
【００５１】
したがって、低位２グラム文字列「るめ」が出現しない対象ファイルであっても、高位２グラム文字列「する」が出現する対象ファイルである場合、当該対象ファイルのビットがＯＮ（“１”）に設定される。図１２の例では、低位２グラム文字列「るめ」の「る」の下位コードと「め」の下位コードとの組み合わせは対象ファイルＦ２，Ｆ３にしか存在しないが、高位２グラム文字列「する」の「す」の下位コードと「る」の下位コードとの組み合わせが対象ファイルＦ１〜Ｆｎに存在する。
【００５２】
したがって、第４分割圧縮符号マップＭ４ｄ内の第４連結符号（「０ｘ３０」「０ｘ３０」による連結符号）の出現マップについては、低位２グラム文字列「るめ」の第４連結符号の出現マップと高位２グラム文字列「する」の第４連結符号の出現マップとをＯＲ演算したビット列となる。これにより、低位２グラム文字列「るめ」が存在しない対象ファイルを検索対象に含めてしまう場合がある。
【００５３】
図１３は、「するめ」についてのＡＮＤ結果を示す説明図である。（Ａ）は、「する」についての４種の出現マップのＡＮＤ結果１３０１を示しており、（Ｂ）は、「るめ」についての４種の出現マップのＡＮＤ結果１３０２を示している。（Ｃ）は、（Ａ），（Ｂ）の両ＡＮＤ結果１３０１，１３０２のＡＮＤ演算によるＡＮＤ結果１３０３を示している。（Ｃ）のＡＮＤ結果では、「するめ」は、対象ファイルＦ１〜Ｆ３、Ｆ（ｎ−１）に存在している可能性があることがわかり、それ以外の対象ファイルには存在しないことがわかる。
【００５４】
図１４は、第２分割圧縮符号マップの修正例を示す説明図である。図１４において、高位２グラム文字列「例え」の上位下位コード列の出現マップを、ＮＵＬＬｂｉｔ（オール０）変換する。これにより、低位２グラム文字列「るめ」の第２連結符号の出現マップとＯＲ演算しても、高位２グラム文字列「例え」の第２連結符号の出現マップでのビットの値を除去することができる。
【００５５】
図１５は、第４分割圧縮符号マップの修正例を示す説明図である。図１５において、高位２グラム文字列「する」の第４連結符号の出現マップを、ＮＵＬＬｂｉｔ（オール０）変換する。これにより、低位２グラム文字列「るめ」の第２連結符号の出現マップとＯＲ演算しても、高位２グラム文字列「する」の第４連結符号の出現マップでのビットの値を除去することができる。
【００５６】
図１６は、「するめ」についての図１４および図１５による修正された出現マップを用いた場合のＡＮＤ結果を示す説明図である。（Ａ）は、図１３のＡＮＤ演算と同一内容であるため、ＡＮＤ結果１３０１，１６０１は同一となる。（Ｂ）は、４種類の出現マップのうち、第２分割圧縮符号マップＭ４ｂ内の出現マップと第４分割圧縮符号マップＭ４ｄ内の出現マップについては、図１４および図１５の出現マップを採用している。
【００５７】
したがって、（Ｂ）のＡＮＤ結果１６０２は、図１３のＡＮＤ結果１３０２と異なる。（Ｃ）は、（Ａ），（Ｂ）の両ＡＮＤ結果１６０１，１６０２のＡＮＤ演算によるＡＮＤ結果１６０３を示している。（Ｃ）のＡＮＤ結果１６０３では、「するめ」は、対象ファイルＦ３に存在している可能性があることがわかり、それ以外の対象ファイルには存在しないことがわかる。図１３の（Ｃ）のＡＮＤ結果１３０３と比較すると、対象ファイルの絞込みの精度が向上していることがわかる。
【００５８】
＜圧縮符号マップ生成の前処理＞
つぎに、圧縮符号マップ生成の前処理について説明する。圧縮符号マップを生成する場合、生成に先立って、対象ファイル群から文字情報の出現回数を集計し、２N分枝無節点ハフマン木を生成しておく必要がある。２N分枝無節点ハフマン木とは、根から分岐する枝が２N本あり、１または複数本の枝で葉を直接ポイントするハフマン木である。節点（内部節点）はない。節点がなく直接葉にヒットするため、節点を有する通常のハフマン木に比べて、伸長速度の高速化を図ることができる。葉は、該当する文字情報とその圧縮符号を含む構造体である。葉の構造体とも呼ぶ。葉に割り当てられる枝数は、割当先の葉に存在する圧縮符号の圧縮符号長に依存する。以下、前処理例について説明する。
【００５９】
図１７は、圧縮符号マップ生成の前処理例を示す説明図である。
【００６０】
（１）出現回数の集計
まず、コンピュータは、対象ファイル群Ｆｓに存在する文字情報の出現回数を計数する。集計結果は、出現回数の降順にソートされ、出現回数の大きい方から昇順の順位がつけられる。なお、ここでは、文字情報の総種類数は、例として１３０５個（＜２０４８（＝２11））とする。（１）出現回数の集計の詳細は図１８で説明する。
【００６１】
（２）圧縮符号長算出
つぎに、（１）で得られた集計結果を基にして、コンピュータは、文字情報ごとの圧縮符号長を算出する。具体的には、コンピュータは、文字情報ごとに、出現率を算出する。出現率は、文字情報の出現回数を全文字情報の総出現回数で割ることで得られる。そして、コンピュータは、出現率に対応する生起確率を求め、生起確率から圧縮符号長を導き出す。
【００６２】
生起確率は、１／２ｘで表現される。ｘはべき数である。圧縮符号長は、生起確率のべ
き数ｘとなる。具体的には、出現率が生起確率の以下のどの範囲であるかで圧縮符号長が決定される。ＡＲは出現率である。
１／２0＞ＡＲ≧１／２1・・・圧縮符号長は１ビット。
１／２1＞ＡＲ≧１／２2・・・圧縮符号長は２ビット。
１／２2＞ＡＲ≧１／２3・・・圧縮符号長は３ビット。
１／２3＞ＡＲ≧１／２4・・・圧縮符号長は４ビット。
・
・
・
１／２N-1＞ＡＲ≧１／２N・・・圧縮符号長はＮビット。
【００６３】
（２）圧縮符号長算出の詳細は図１９で説明する。
【００６４】
（３）葉数特定
つぎに、コンピュータは、圧縮符号長ごとに葉数を集計することで圧縮符号長ごとの葉数を特定する。図１７では、最大圧縮符号長は１７ビットとする。また、葉数とは、文字情報の種類数である。したがって、圧縮符号長５ビットの葉数が２である場合、５ビットの圧縮符号が割り当てられる文字情報が２つ存在することを示している。
【００６５】
（４）葉数補正
つぎに、コンピュータは、葉数を補正する。具体的には、コンピュータは、枝数の上限２Nのべき数Ｎが最大圧縮符号長となるように補正する。たとえば、べき数Ｎ＝１１の場合、圧縮符号長１１ビット〜１７ビットまでの葉数の総和を、補正後の圧縮符号長１１ビットの葉数にする。そして、コンピュータは、圧縮符号長ごとに葉当たりの枝数を割り当てる。具体的には、補正後の圧縮符号長に対し、その降順に、２0、２1、２2、２3、２4、２5、２6、２7として葉当たりの枝数を決定する。
【００６６】
たとえば、図１７では、圧縮符号長１１ビットの圧縮符号が割り当てられる文字情報の総数（葉数）は１２１５個であるが、その葉当たりの枝数は１である。圧縮符号長１１ビットの圧縮符号が割り当てられる文字情報については、それぞれ１本の枝しか割り当てられないこととなる。一方、圧縮符号長６ビットの圧縮符号が割り当てられる文字情報の総数（葉数）は６個であるが、その葉当たりの枝数は３２である。圧縮符号長６ビットの圧縮符号が割り当てられる文字情報については、それぞれ３２本の枝が割り当てられることとなる。（４）葉数補正は、必要な場合に実行すればよく、実行しなくてもよい。
【００６７】
（５）葉の構造体生成
つぎに、コンピュータは、葉の構造体を生成する。葉の構造体とは、文字情報とその圧縮符号長とその圧縮符号長での圧縮符号が対応付けられたデータ構造体である。たとえば、出現順位が１位である文字「０」の圧縮符号長は６ビットであり、圧縮符号は「００００００」となる。図１７の例では、文字情報の種類数（葉数）は１３０５個であるため、葉Ｌ１の構造体〜葉Ｌ１３０５の構造体が生成されることとなる。（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１１）は、図２０で説明する。
【００６８】
（６）葉へのポインタ生成
つぎに、コンピュータは、葉の構造体ごとに葉へのポインタを生成する。葉へのポインタは、そのポイント先となる葉の構造体内の圧縮符号に、その葉当たりの枝数分の番号に相当するビット列を連結したビット列である。たとえば、葉Ｌ１である文字「０」に割り当てられた圧縮符号「００００００」の圧縮符号長は６ビットであるため、葉Ｌ１当たりの枝数は３２本である。
【００６９】
したがって、葉Ｌ１へのポインタの先頭６ビットは、圧縮符号「００００００」となる。後続ビット列は、葉Ｌ１当たりの枝数で表現される３２（＝２5）種のビット列となる。すなわち、３２種の５ビットのビット列が圧縮符号「００００００」の後続ビット列となる。したがって、葉Ｌ１へのポインタは、先頭６ビットが「００００００」で固定された３２種の１１ビットのビット列となる。なお、葉当たりの枝数が１本の場合は、葉へのポインタは１個であり、圧縮符号とその葉へのポインタは同一ビット列となる。（６）葉へのポインタ生成の詳細は、図２２で説明する。
【００７０】
（７）２N分枝無節点ハフマン木の構築
最後に、コンピュータは、２N分枝無節点ハフマン木を構築する。具体的には、葉のポインタを根とすることで、葉の構造体を直接指定する２N分枝無節点ハフマン木が構築される。圧縮符号列が、先頭６ビットが「００００００」の１１ビットのビット列である場合、後続の５ビットが３２種のいずれのビット列であっても、２N分枝無節点ハフマン木により文字「０」の葉Ｌ１の構造体をポイントすることができる。（７）２N分枝無節点ハフマン木の構築の詳細は、図２３で説明する。
【００７１】
図１８は、（１）出現回数の集計の詳細を示す説明図である。図１８において、コンピュータは、（Ａ）対象ファイル群Ｆｓからの集計、（Ｂ）出現頻度の降順でのソート、（Ｃ）目標出現率の順位までの抽出という３つのフェーズを実行する。以下、基礎単語と単一文字に分けて説明する。
【００７２】
（Ａ１）まず、コンピュータは、対象ファイル群Ｆｓを読み込んで、基礎単語の出現頻度（出現回数）を計数する。コンピュータは、基礎単語の構造体を参照して、基礎単語の構造体内の基礎単語に一致する文字列が対象ファイルに存在する場合に、当該基礎単語の出現頻度（初期値は０）を１加算する。基礎単語の構造体とは、基礎単語が記述されたデータ構造体である。
【００７３】
（Ｂ１）対象ファイル群Ｆｓにおいて基礎単語の集計が終了すると、コンピュータは、基礎単語出現頻度集計テーブルを、出現頻度の降順にソートする。すなわち、出現頻度の高い順に並べ替え、出現頻度が最も高い基礎単語から順位付けをおこなう。
【００７４】
（Ａ２）、また、コンピュータは、対象ファイル群Ｆｓを読み込んで、単一文字の出現頻度を計数する。具体的には、コンピュータは、単一文字の出現頻度（初期値は０）を１加算する。
【００７５】
（Ｂ２）対象ファイル群Ｆｓにおいて単一文字の集計が終了すると、コンピュータは、単一文字出現頻度集計テーブルを、出現頻度の降順にソートする。すなわち、出現頻度の高い順に並べ替え、出現頻度が最も高い単一文字から順位付けをおこなう。
【００７６】
つぎに、コンピュータは、（Ｂ１）ソート後の基礎単語出現頻度集計テーブルを参照して、目標出現率Ｐｗまでの順位の基礎単語を抽出する。具体的には、コンピュータは、全基礎単語の出現頻度の総和（総出現頻度）を分母とし、順位が１位の基礎単語から降順に出現頻度を累計して分子とし、各順位までの出現率Ｐｗを算出する。
【００７７】
たとえば、総出現頻度が４００００、１位からｙ位までの基礎単語群の累計出現頻度が３００００とすると、ｙ位までの出現頻度は、（４００００／３００００）×１００＝７５［％］となる。ここで、目標出現率Ｐｗが７５［％］である場合は、上位ｙ位までの基礎単語を抽出することとなる。
【００７８】
（Ｃ２１）つぎに、コンピュータは、（Ｂ２）ソート後の単一文字出現頻度集計テーブルを参照して、目標出現率Ｐｃまでの順位の単一文字を抽出する。具体的には、コンピュータは、全単一文字の出現頻度の総和（総出現頻度）を分母とし、順位が１位の単一文字から降順に出現頻度を累計して分子とし、各順位までの出現率を算出する。
【００７９】
たとえば、総出現頻度が５００００、１位からｙ位までの単一文字群の累計出現頻度が４００００とすると、ｙ位までの出現頻度は、（５００００／４００００）×１００＝８０［％］となる。ここで、目標出現率Ｐｃが８０［％］である場合は、上位ｙ位までの単一文字を抽出することとなる。なお、（Ｃ２１）で抽出された単一文字を、元の単一文字群と区別するために、「特定単一文字（群）」と称す。
【００８０】
（Ｃ２２）また、単一文字群のうち特定単一文字群から外された単一文字（以下、「非特定単一文字（群）」）は、出現頻度が各特定単一文字よりも低いため、その文字コードを分割する。具体的には、非特定単一文字の文字コードを、上位ビットの文字コードと、下位ビットの文字コードに分割する。
【００８１】
たとえば、単一文字がＵＴＦ１６ビット文字コードで表現されている場合は、上位８ビットの文字コードと下位８ビットの文字コードに分割する。この場合、分割されたいずれの文字コードも、０ｘ００〜０ｘＦＦのコードで表現される。このように、上位ビットの文字コードが上位分割文字コードであり、下位ビットの文字コードが下位分割文字コードである。
【００８２】
図１９は、図１７の（２）圧縮符号長算出の詳細（Ｎ＝１１）を示す説明図である。図１９の文字情報テーブルは、図１７の（１）での集計結果を反映したテーブルであり、文字情報ごとに順位項目、伸長種別項目、コード項目、文字項目、出現回数項目、総回数項目、出現率項目、補正前での生起確率項目および圧縮符号長項目が設定されている。このうち、順位項目〜総回数項目までが再ソート結果で得られた情報である。
【００８３】
ここで、順位項目には、文字情報の出現回数の降順に順位（昇順）が書き込まれている。文字情報項目のうち伸長種別項目には、文字情報の種別が書き込まれる。「１６」は１６ビットコード（の単一文字）を示している。「８」は８ビットの分割文字コードを示している。「特」は基礎単語を示している。
【００８４】
文字情報項目のうちコード項目には、特定単一文字または分割文字コードが書き込まれている。基礎単語の場合は空欄とする。文字情報項目のうち文字項目には、文字や基礎単語が書き込まれている。分割文字コードの場合は空欄とする。出現回数項目には、対象ファイル群Ｆｓでの文字情報の出現回数が書き込まれている。総回数項目には、全文字情報の総出現回数が書き込まれている。
【００８５】
出現率項目には、出現回数を総回数で割り算した値が出現率として書き込まれている。補正前項目の生起確率項目には、出現率に対応する生起確率が書き込まれている。圧縮符号長項目には、生起確率に応じた圧縮符号長、すなわち、生起確率１／２yのべき数ｙが圧縮符号長として書き込まれている。
【００８６】
図２０は、図１７の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１１）を示す説明図である。図１９の文字情報テーブルを圧縮符号長単位で葉数（文字情報の総種類数）を集計した結果が、図１９における補正前の葉数となる。ここで、補正Ａとは、圧縮符号長の上限長Ｎ（すなわち、２N分枝無節点ハフマン木の最大枝数２Nのべき数Ｎ）以上の圧縮符号長に割り当てられた葉数を、圧縮符号長の上限長Ｎに集約する補正である。この場合、補正前での最大圧縮符号長は１７ビットであるが、文字情報の総種類数が１３０５種であるため、圧縮符号長の上限長Ｎは、Ｎ＝１１となる。したがって、補正Ａでは、圧縮符号長１１ビットの葉数が、圧縮符号長が１１ビット〜１７ビットの葉数の総和（１１９０個）となる。
【００８７】
そして、コンピュータは、生起確率総和を求める。圧縮符号長ごとの生起確率は決められているため（５ビットなら１／２5）、圧縮符号長ごとに生起確率を葉数で乗じることで、圧縮符号長ごとの乗算結果が得られる。たとえば、補正Ａにおける圧縮符号長５ビットの葉数は２である。圧縮符号長５ビットの生起確率は、１／２5である。したがって、補正Ａにおける圧縮符号長５ビットの生起確率は、２×（１／２5）＝１／２4となる。圧縮符号長６ビット以降も同様に補正Ａにおける圧縮符号長生起確率を求める。そして、補正Ａ後における各圧縮符号長の生起確率を合計することで、補正Ａでの生起確率総和が得られる。
【００８８】
そして、コンピュータは、生起確率総和が１以下であるか否かを判断する。しきい値ｔは０＜ｔ≦１である。しきい値ｔを設けたくない場合は、ｔ＝１とすればよい。しきい値ｔ未満であれば、補正Ｂに移行する。しきい値ｔ以上１以下である場合は、補正Ｂに移行せず、この時点での圧縮符号長ごとの葉数で確定する。
【００８９】
補正Ｂは、補正Ａでの圧縮符号長群（５ビット〜１２ビット）は変えずに、葉数を更新する補正である。具体的には、補正Ａでの生起確率総和が、しきい値ｔ以上１以下でない場合におこなわれる補正である。より具体的には、補正Ｂは２種類ある。
【００９０】
１つ目は、生起確率総和がしきい値ｔ未満である場合、生起確率総和が１以下の最大値が得られるまで、たとえば、最大漸近値に収束するまで、生起確率総和を増加させる補正（以下、補正Ｂ+）である。もう１つは、生起確率総和が１より大きい場合、生起確率総和が１以下に割り込んでから１以下の最大値が得られるまで、たとえば、最大漸近値に収束するまで、生起確率総和を減少させる補正（以下、補正Ｂ-）である。
【００９１】
図２０に示した例では、補正Ａでの生起確率総和が「１．１４６」であるため、補正Ｂ-をおこなうこととなる。なお、補正Ｂ+および補正Ｂ-のいずれの補正Ｂであっても、葉数を生起確率総和で割るという同じ補正をおこなう。
【００９２】
まず、補正Ｂ-の１回目（補正Ｂ-１）では、圧縮符号長ごとの補正Ａでの葉数を、前回の補正（この場合は補正Ａ）の生起確率の総和（１．１４６）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ａでの圧縮符号長の上限長Ｎ（Ｎ＝１１ビット）については、前回の補正（この場合は補正Ａ）の生起確率総和（１．１４６）で割ることはせず、葉の総数（１３０５個）から、補正Ｂ-１での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、１２０８個である。
【００９３】
このあと、コンピュータは、補正Ａの場合と同様の計算処理により、補正Ｂ-１での生起確率総和を求める。そして、コンピュータは、補正Ｂ-１での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ-１での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ-の２回目（補正Ｂ-２）に移行する。最大漸近値に収束した場合は、補正Ｂ-２に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ-１で更新された生起確率総和「１．０４２」は１より大きいため、最大漸近値に収束しておらず、補正Ｂ-２に移行する。
【００９４】
補正Ｂ-２では、圧縮符号長ごとの補正Ｂ-１での葉数を、前回の補正（この場合は補正Ｂ-１）の生起確率総和（１．０４２）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ｂ-１での圧縮符号長の上限長Ｎ（Ｎ＝１１ビット）については、前回の補正（この場合は補正Ｂ-１）の生起確率総和（１．０４２）で割ることはせず、葉の総数（１３０５個）から、補正Ｂ-２での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、１２１５個である。
【００９５】
このあと、コンピュータは、補正Ｂ-１の場合と同様の計算処理により、補正Ｂ-２での生起確率総和を求める。そして、コンピュータは、補正Ｂ-２での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ-２での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ-の３回目（補正Ｂ-３）に移行する。最大漸近値に収束した場合は、補正Ｂ-３に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ-２で更新された生起確率総和「０．９８２」は１以下であるが、最大漸近値に収束しているかが不明であるため、補正Ｂ-３に移行する。
【００９６】
補正Ｂ-３では、圧縮符号長ごとの補正Ｂ-２での葉数を、前回の補正（この場合は補正Ｂ-２）の生起確率総和（０．９８２）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ｂ-２での圧縮符号長の上限長Ｎ（Ｎ＝１１ビット）については、前回の補正（この場合は補正Ｂ-２）の生起確率総和（０．９８２）で割ることはせず、葉の総数（１３０５個）から、補正Ｂ-３での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、１２１５個である。
【００９７】
このあと、コンピュータは、補正Ｂ-２の場合と同様の計算処理により、補正Ｂ-３での生起確率総和を求める。そして、コンピュータは、補正Ｂ-３での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ-３での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ-の４回目（補正Ｂ-４）に移行する。最大漸近値に収束した場合は、補正Ｂ-４に移行せず、この時点での圧縮符号長ごとの葉数で確定する。
【００９８】
補正Ｂ-３で更新された生起確率総和「０．９８２」は、補正Ｂ-２で更新された生起確率総和「０．９８２」と同じ値である。すなわち、補正Ｂ-３での各圧縮符号長の葉数と補正Ｂ-２での各圧縮符号長の葉数とは同じである。この場合、コンピュータは、生起確率総和が最大漸近値に収束したと判断し、葉数が確定する。
【００９９】
このようにして、葉数が確定するまで補正Ｂ-を継続することとなる。図２０の例では、補正Ｂ-３で圧縮符号長ごとの葉数が確定したこととなる。このあと、コンピュータは、圧縮符号長ごとに、葉当たりの枝数を算出することとなる。葉当たりの枝数の算出は、上述したように、圧縮符号長の上限長Ｎ（この場合はＮ＝１１ビット）から降順に、２0、２1、２2、２3、２4、２5、２6として葉当たりの枝数を割り当てることとなる。なお、枝数の小計は、圧縮符号長ごとに、葉当たりの枝数に確定した葉数を乗じた乗算結果である。
【０１００】
図２１は、文字情報ごとの補正結果を示す説明図である。図２１において、文字情報テーブルには、補正Ａ、補正Ｂ-１〜補正Ｂ-２までの補正結果が追加されている。図２１に示したように、補正により圧縮符号長別の葉数が更新されるため、順位項目の１位の文字情報から短い圧縮符号長が割り当てられることとなる。
【０１０１】
たとえば、補正Ｂ-２で確定した場合、圧縮符号長６ビットでは葉数が６、圧縮符号長７ビットでは葉数が１８、…、圧縮符号長１１ビットでは葉数が１２１５となっている。したがって、順位が１位から６位までの文字情報（葉数６個分）については６ビットの圧縮符号長、順位が７位から２４位までの文字情報（葉数１８個分）については７ビットの圧縮符号長、…、順位が９１位から１３０５位までの文字情報（葉数１２１５個分）については１１ビットの圧縮符号長が割り当てられる。
【０１０２】
そして、コンピュータは、文字情報と文字情報に割り当てられた圧縮符号長と圧縮符号長ごとの葉数とに基づいて、文字情報ごとに圧縮符号を割り当て、葉の構造体を生成することとなる。たとえば、出現率１位の単一文字「０」は５ビットの圧縮符号長が割り当てられているため、圧縮符号が「００００００」となる。したがって、圧縮符号「００００００」、圧縮符号長「６」、文字情報「０」を含む葉Ｌ１の構造体が生成されることとなる。
【０１０３】
なお、上述した補正処理では、圧縮符号長が５ビット〜１１ビットとしたが、２グラム文字列の圧縮符号マップを分割する場合もあるため、圧縮符号長は偶数ビットとなるように、補正してもよい。具体的には、たとえば、圧縮符号長５ビットおよび７ビットの文字情報については６ビット、９ビットの文字情報については８ビット、１１ビットの文字情報については１０ビットとする。
【０１０４】
図２２は、図１７の（６）葉へのポインタ生成の詳細（Ｎ＝１１）を示す説明図である。図２２は、圧縮符号長の上限Ｎが１１ビットの場合の葉へのポインタを示している。図２２において、圧縮符号長が６ビットの葉数は６個であるため、圧縮符号は「００００００」〜「０００１０１」が割り当てられる。また、圧縮符号長が６ビットの葉当たりの枝数は、３２本である。したがって、圧縮符号長が６ビットの圧縮符号についての葉へのポインタは、３２（＝２5）個生成される。具体的には、葉へのポインタの先頭６ビットが圧縮符号で後続５ビットが３２種のビット列となる。したがって、圧縮符号長が６ビットの圧縮符号の各々について、３２種の葉へのポインタが生成されることとなる。
【０１０５】
なお、図示はしないが、圧縮符号長が７ビットの葉数は１８個であるため、圧縮符号「０００１１００」〜「００１１１１１」が割り当てられる。また、圧縮符号長が７ビットの葉当たりの枝数は、１６本である。したがって、圧縮符号長が７ビットの圧縮符号についての葉へのポインタは、１６（＝２4）個生成される。具体的には、葉へのポインタの先頭７ビットが圧縮符号で後続４ビットが１６種のビット列となる。したがって、圧縮符号長が７ビットの圧縮符号の各々について、１６種の葉へのポインタが生成されることとなる。
【０１０６】
同様に、圧縮符号長が８ビットの葉数は２３個であるため、圧縮符号「０１００００００」〜「０１０１０１１０」が割り当てられる。また、圧縮符号長が８ビットの葉当たりの枝数は、８本である。したがって、圧縮符号長が８ビットの圧縮符号についての葉へのポインタは、８（＝２3）個生成される。具体的には、葉へのポインタの先頭８ビットが圧縮符号で後続３ビットが８種のビット列となる。したがって、圧縮符号長が８ビットの圧縮符号の各々について、８種の葉へのポインタが生成されることとなる。
【０１０７】
同様に、圧縮符号長が９ビットの葉数は２３個であるため、圧縮符号「０１０１０１１１０」〜「０１１０００１００」が割り当てられる。また、圧縮符号長が９ビットの葉当たりの枝数は、４本である。したがって、圧縮符号長が９ビットの圧縮符号についての葉へのポインタは、４（＝２2）個生成される。具体的には、葉へのポインタの先頭９ビットが圧縮符号で後続２ビットが４種のビット列となる。したがって、圧縮符号長が９ビットの圧縮符号の各々について、４種の葉へのポインタが生成されることとなる。
【０１０８】
同様に、圧縮符号長が１０ビットの葉数は２０個であるため、圧縮符号「０１１００００１１０」〜「０１１００１１１０１」が割り当てられる。また、圧縮符号長が１０ビットの葉当たりの枝数は、２本である。したがって、圧縮符号長が１０ビットの圧縮符号についての葉へのポインタは、２（＝２1）個生成される。具体的には、葉へのポインタの先頭１０ビットが圧縮符号で後続１ビットが２種のビット列となる。したがって、圧縮符号長が１０ビットの圧縮符号の各々について、２種の葉へのポインタが生成されることとなる。
【０１０９】
同様に、圧縮符号長が１１ビットの葉数は１２１５個であるため、圧縮符号「０１１００１１１１００」〜「１１１１１１１１０１０」が割り当てられる。また、圧縮符号長が１１ビットの葉当たりの枝数は、１本である。したがって、圧縮符号長が１１ビットの圧縮符号についての葉へのポインタは、１（＝２0）個生成される。具体的には、圧縮符号がそのまま葉へのポインタとなる。したがって、圧縮符号長が１１ビットの圧縮符号の各々について、１種の葉へのポインタが生成されることとなる。
【０１１０】
図２３は、図１７の（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１１）を示す説明図である。図２３では、Ｎ＝１１とした場合の２０４８（＝２11）分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
【０１１１】
具体的には、圧縮符号長が６ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２２に示したように３２個生成される。したがって、葉Ｌ１の構造体については、根の構造体に３２個の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（３２）が格納される。葉Ｌ２の構造体〜葉Ｌ６の構造体についても同様である。葉Ｌ７以降の構造体については、図２３のとおりである。
【０１１２】
図２４は、葉の構造体を示す説明図である。葉の構造体は、第１領域〜第４領域を有するデータ構造体である。葉の構造体は、第１領域には、圧縮符号およびその圧縮符号長が格納される。第２領域には、葉の標識と伸長種別（図１９参照）が格納される。第３領域には、伸長種別に応じて特定単一文字である１６ビットの文字コード、非特定単一文字の文字コードが分割された８ビットの分割文字コード、または基礎単語へのポインタが格納される。基礎単語へのポインタにより基礎単語の構造体内の基礎単語が指定される。また、照合フラグも格納されている。照合フラグはデフォルトでは「０」である。「０」の場合は、伸長する文字をそのまま伸長バッファに書き出し、「１」の場合は、＜ｃｏｌｏｒ＞タグと＜／ｃｏｌｏｒ＞タグで挟み込んで伸長バッファに書き出す。
【０１１３】
第４領域には、符号種別と符号区分が格納される。符号種別とは、文字コードが数字、英字、特殊記号、カタカナ、ひらがな、漢字のいずれに該当するか、または予約語へのポインタであるかを識別する情報である。符号区分とは、文字コードが１６ビットであるか８ビットであるかを識別する情報である。１６ビットの文字コードである場合または予約語である場合、符号区分として“１”を割り当て、８ビットの分割文字コードの場合、符号区分として“０”を割り当てる。
【０１１４】
図２５は、特定単一文字の構造体を示す説明図である。特定単一文字の構造体２５００は、特定単一文字コードｅ♯とその葉Ｌ♯へのポインタを格納するデータ構造体である。具体的には、たとえば、コンピュータは、対象ファイル群Ｆｓからの集計結果が得られたときに、コンピュータが、特定単一文字の構造体２５００に特定単一文字コードｅ♯を格納する。そして、コンピュータは、２N分枝無節点ハフマン木が構築されると、２N分枝無節点ハフマン木における各葉の構造体に格納された圧縮符号に対応する、特定単一文字の構造体２５００における特定文字コードｅ♯へのポインタを格納する。
【０１１５】
また、特定単一文字コードｅ♯へのポインタが対応する葉の構造体に格納されると、コンピュータは、２N分枝無節点ハフマン木における各特定単一文字コードｅ♯に対応する葉へのポインタを、特定単一文字の構造体２５００内の対応する特定単一文字コードｅ♯に関連付けて格納する。これにより、特定単一文字の構造体２５００が生成される。
【０１１６】
図２６は、分割文字コードの構造体を示す説明図である。分割文字コードの構造体２６００は、分割文字コードとその葉Ｌ♯へのポインタを格納する。具体的には、たとえば、コンピュータは、対象ファイル群Ｆｓからの集計結果が得られたときに、コンピュータが、分割文字コードの構造体２６００に分割文字コードを格納する。そして、コンピュータは、２N分枝無節点ハフマン木が構築されると、２N分枝無節点ハフマン木における各葉の構造体に格納された圧縮符号に対応する、分割文字コードの構造体２６００における分割文字コードへのポインタを格納する。
【０１１７】
また、分割文字コードへのポインタが対応する葉の構造体に格納されると、コンピュータは、２N分枝無節点ハフマン木における各分割文字コードに対応する葉へのポインタを、分割文字コードの構造体２６００内の対応する分割文字コードに関連付けて格納する。これにより、分割文字コードの構造体２６００が生成される。
【０１１８】
図２７は、基礎単語の構造体を示す説明図である。基礎単語の構造体２７００は、特基礎単語とその葉Ｌ♯へのポインタを格納するデータ構造体である。基礎単語の構造体２７００には、あらかじめ基礎単語が格納されている。コンピュータは、２N分枝無節点ハフマン木が構築されると、２N分枝無節点ハフマン木における各葉の構造体に格納された圧縮符号に対応する、基礎単語の構造体２７００における基礎単語へのポインタを格納する。
【０１１９】
また、基礎単語へのポインタが対応する葉の構造体に格納されると、コンピュータは、２N分枝無節点ハフマン木における各基礎単語に対応する葉へのポインタを、基礎単語の構造体２７００内の対応する基礎に関連付けて格納することとなる。
【０１２０】
＜圧縮符号マップの生成例＞
２N分枝無節点ハフマン木が生成されると、単一文字の圧縮符号マップ、上位分割文字コードの圧縮符号マップ、下位分割文字コードの圧縮符号マップ、単語の圧縮符号マップ、２グラム文字列の圧縮符号マップを生成することができる。以下、単一文字の圧縮符号マップ、上位分割文字コードの圧縮符号マップ、下位分割文字コードの圧縮符号マップ、２グラム文字列の圧縮符号マップの詳細な生成例について説明する。なお、基礎単語の圧縮符号マップは、単一文字の圧縮符号マップと同様に行われるため省略する。
【０１２１】
図２８は、圧縮符号マップの生成例を示す説明図である。図２８では、対象ファイルＦｉ内に『竜馬は脱藩した』という文字列が記述されているものとする。
【０１２２】
（Ａ）まず、先頭文字「竜」が対象文字である。対象文字「竜」は特定単一文字であるため、２N分枝無節点ハフマン木にアクセスして特定単一文字「竜」の圧縮符号を取得し、特定単一文字「竜」の出現マップを特定する。未生成の場合は、特定単一文字「竜」の圧縮符号をポインタとし、かつ、対象ファイルの存否を示すビット列をオール０にした特定単一文字「竜」の出現マップを生成する。そして、特定単一文字「竜」の出現マップについて対象ファイルＦｉのビットをＯＮ（“０”→“１”）にする。
【０１２３】
（Ｂ）つぎに、対象文字を１グラムシフトして、対象文字を「馬」にする。対象文字「馬」は特定単一文字であるため、２N分枝無節点ハフマン木にアクセスして特定単一文字「馬」の圧縮符号を取得し、特定単一文字「馬」の出現マップを特定する。未生成の場合は、特定単一文字「馬」の圧縮符号をポインタとし、かつ、対象ファイルの存否を示すビット列をオール０にした特定単一文字「馬」の出現マップを生成する。そして、特定単一文字「馬」の出現マップについて対象ファイルＦｉのビットをＯＮ（“０”→“１”）にする。
【０１２４】
また、対象文字が「馬」にシフトされた場合、「竜馬」という２グラム文字列が得られるため、「竜」の圧縮符号と「馬」の圧縮符号を結合した「竜馬」の圧縮符号列により、２グラム文字列「竜馬」の出現マップを特定する。未生成の場合は、「竜馬」の圧縮符号列をポインタとし、かつ、対象ファイルの存否を示すビット列をオール０にした２グラム文字列「竜馬」の出現マップを生成する。そして、２グラム文字列「竜馬」の出現マップにおいて対象ファイルＦｉのビットをＯＮ（“０”→“１”）にする。
【０１２５】
（Ｃ）つぎに、対象文字を１グラムシフトして、対象文字を「は」にする。対象文字「は」についても（Ｂ）と同様に処理することで、特定単一文字「は」の出現マップについて対象ファイルＦｉのビットをＯＮ（“０”→“１”）にする。同様に、２グラム文字列「馬は」の出現マップにおいて対象ファイルＦｉのビットをＯＮ（“０”→“１”）にする。
【０１２６】
（Ｄ）つぎに、対象文字を１グラムシフトして、対象文字を「脱」にする。対象文字「脱」は特定単一文字ではないため、対象文字「脱」の文字コード「０ｘ８１３１」を、上位分割文字コード「０ｘ８１」と下位分割文字コード「０ｘ３１」に分割する。そして、対象文字を上位分割文字コード「０ｘ８１」にする。上位分割文字コード「０ｘ８１」についても、特定単一文字と同様に処理することで、上位分割文字コード「０ｘ８１」の出現マップについて対象ファイルＦｉのビットをＯＮ（“０”→“１”）にする。同様に、２グラム文字列「は  ０ｘ８１」の出現マップにおいて対象ファイルＦｉのビットをＯＮ（“０”→“１”）にする。
【０１２７】
（Ｅ）つぎに、対象文字を１グラムシフトして、文字「脱」の下位分割文字コード「０ｘ３１」を、対象文字にする。下位分割文字コード「０ｘ３１」についても、同様に処理することで、下位分割文字コード「０ｘ３１」の出現マップについて対象ファイルＦｉのビットをＯＮ（“０”→“１”）にする。同様に、２グラム文字列「０ｘ８１  ０ｘ３１」の出現マップにおいて対象ファイルＦｉのビットをＯＮ（“０”→“１”）にする。
【０１２８】
（Ｆ）〜（Ｉ）についても同様の処理をおこない、最後の対象ファイルＦｎについても処理を完了することで、単一文字の圧縮符号マップ、上位分割文字コードの圧縮符号マップ、下位分割文字コードの圧縮符号マップ、２グラム文字列の圧縮符号マップが生成される。
【０１２９】
ただし、図３に示したように、２グラム文字列の出現頻度が低い場合（後述の分割順位Ｒ２ｇ以降）は、２グラム文字列に対し第１連結符号〜第４連結符号を生成する（４分割の場合）。そして、第１連結符号〜第４連結符号をポインタとする出現マップ群を生成し、対象ファイルＦｉのビットをＯＮ（“０”→“１”）にすることになる。これにより、マップサイズの縮小および検索ノイズの低減化を図ることができる。
【０１３０】
＜コンピュータのハードウェア構成例＞
図２９は、実施の形態にかかるコンピュータのハードウェア構成例を示すブロック図である。図２９において、コンピュータは、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）２９０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）２９０２と、ＲＡＭ２９０３（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２９０３と、磁気ディスク２９０５ドライブ２９０４と、磁気ディスク２９０５と、光ディスクドライブ２９０６と、光ディスク２９０７と、ディスプレイ２９０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）２９０９と、キーボード２９１０と、マウス２９１１と、スキャナ２９１２と、プリンタ２９１３と、を備えている。また、各構成部はバス２９００によってそれぞれ接続されている。
【０１３１】
ここで、ＣＰＵ２９０１は、コンピュータの全体の制御を司る。ＲＯＭ２９０２は、ブートプログラムなどのプログラムを記憶している。また、ＲＯＭ２９０２は、圧縮符号マップを生成するプログラム、圧縮符号マップまたは符号マップを用いて検索を行うプログラムを記憶している。ＲＡＭ２９０３は、ＣＰＵ２９０１のワークエリアとして使用され、ＣＰＵ２９０１は、ＲＯＭ２９０２に記憶されたプログラムをＲＡＭ２９０３に読み出して実行することができる。磁気ディスク２９０５ドライブ２９０４は、ＣＰＵ２９０１の制御にしたがって磁気ディスク２９０５に対するデータのリード／ライトを制御する。磁気ディスク２９０５は、磁気ディスク２９０５ドライブ２９０４の制御で書き込まれたデータを記憶する。
【０１３２】
光ディスクドライブ２９０６は、ＣＰＵ２９０１の制御にしたがって光ディスク２９０７に対するデータのリード／ライトを制御する。光ディスク２９０７は、光ディスクドライブ２９０６の制御で書き込まれたデータを記憶したり、光ディスク２９０７に記憶されたデータをコンピュータに読み取らせたりする。
【０１３３】
ディスプレイ２９０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ２９０８は、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【０１３４】
インターフェース（以下、「Ｉ／Ｆ」と略する。）２９０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２９１４に接続され、このネットワーク２９１４を介して他の装置に接続される。そして、Ｉ／Ｆ２９０９は、ネットワーク２９１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２９０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【０１３５】
キーボード２９１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス２９１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【０１３６】
スキャナ２９１２は、画像を光学的に読み取り、コンピュータ内に画像データを取り込む。なお、スキャナ２９１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ２９１３は、画像データや文書データを印刷する。プリンタ２９１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
【０１３７】
また、コンピュータは、サーバや据置き型のパーソナル・コンピュータのほか、携帯電話機、スマートフォン、電子書籍端末、ノート型パソコンなどの携帯型端末であってもよい。
【０１３８】
また、図７６に示すように、本実施の形態は、複数のコンピュータに応じて実施されても良い。図７６に示すシステムは、図２９に示す各ハードウェアを含みうるコンピュータ７６０１〜７６０３、ネットワーク７６０４、スイッチ７６０５、無線基地局７６０７を含む。コンピュータ７６０３に含まれるＩ／Ｆは、無線通信機能を備える。
【０１３９】
例えば、複数のファイルを含むコンテンツについての圧縮符号マップまたは符号マップを生成する処理をコンピュータ７６０１で実行し、コンピュータ７６０２及びコンピュータ７６０３に配信し、コンピュータ７６０２およびコンピュータ７６０３のそれぞれで配信されたコンテンツについての検索処理を実行しても良い。
【０１４０】
また、複数のファイルを含むコンテンツについての圧縮符号マップまたは符号マップを生成する処理をコンピュータ７６０１で実行し、コンピュータ７６０２またはコンピュータ７６０３からコンテンツについての検索依頼をコンピュータ７６０１が受け付けて、検索処理を実行し、実行した検索処理の結果をコンピュータ７６０２、コンピュータ７６０３のそれぞれに返すように構成しても良い。
【０１４１】
図２９のコンピュータと同様に、コンピュータ７６０１〜７６０３のそれぞれは、サーバや据置き型のパーソナル・コンピュータのほか、携帯電話機、スマートフォン、電子書籍端末、ノート型パソコンなどの携帯型端末であってもよい。
【０１４２】
＜圧縮符号マップ生成処理手順＞
つぎに、コンピュータが生成プログラムにより実行する圧縮符号マップ生成処理手順例について説明する。
【０１４３】
図３０は、コンピュータが生成プログラムにより実行する圧縮符号マップ生成処理手順例を示すフローチャートである。コンピュータは、集計処理（ステップＳ３００１）、マップ割当数決定処理（ステップＳ３００２）、再集計処理（ステップＳ３００３）、ハフマン木生成処理（ステップＳ３００４）、分割順位決定処理（ステップＳ３００５）、マップ生成処理（ステップＳ３００６）を実行する。
【０１４４】
集計処理（ステップＳ３００１）とは、対象ファイル群Ｆｓ内の単一文字や基礎単語の出現回数（出現頻度ともいう）を計数する処理である。マップ割当数決定処理（ステップＳ３００２）とは、集計処理（ステップＳ３００１）で集計された単一文字および基礎単語についてのマップ割当数を決定する処理である。マップ割当数に対応する出現順位の単一文字および基礎単語が、それぞれ特定単一文字および基礎単語となる。
【０１４５】
再集計処理（ステップＳ３００３）とは、単一文字のうち特定単一文字以外の非特定単一文字を分割して、上位分割文字コードおよび下位分割文字コードとし、それぞれの出現回数を集計する処理である。また、再集計処理（ステップＳ３００３）では、２グラム文字列の出現回数も集計する。
【０１４６】
ハフマン木生成処理（ステップＳ３００４）とは、図１９〜図２４に示したように、２N分枝無節点ハフマン木を生成する処理である。分割順位決定処理（ステップＳ３００５）とは、分割順位を決定する処理である。分割順位とは、再集計処理（ステップＳ３００３）で再集計された２グラム文字列の圧縮符号マップを分割させる２グラム文字列の出現順位である。これにより、分割順位以降の２グラム文字列について分割されることとなる。
【０１４７】
マップ生成処理（ステップＳ３００６）とは、特定単一文字、基礎単語、上位分割文字コード、下位分割文字コード、２グラム文字列についての圧縮符号マップを生成する処理である。２グラム文字列の圧縮符号マップのうち、分割順位決定処理（ステップＳ３００５）で決定された分割順位以降の２グラム文字列については分割される。これにより、検索ノイズの低減化を図ることができる。
【０１４８】
（集計処理（ステップＳ３００１））
図３１は、図３０に示した集計処理（ステップＳ３００１）の詳細な処理手順例を示すフローチャートである。まず、コンピュータは、ファイル番号ｉをｉ＝１に設定し（ステップＳ３１０１）、対象ファイルＦｉを読み込む（ステップＳ３１０２）。そして、コンピュータは、対象ファイルＦｉの集計処理を実行する（ステップＳ３１０３）。対象ファイルＦｉの集計処理（ステップＳ３１０３）の詳細については、図３２で説明する。このあと、コンピュータは、ファイル番号ｉがｉ＞ｎ（ｎは対象ファイルＦ１〜Ｆｎの総数）であるか否かを判断する（ステップＳ３１０４）。
【０１４９】
ｉ＞ｎでない場合（ステップＳ３１０４：Ｎｏ）、コンピュータは、ｉをインクリメントし（ステップＳ３１０５）、ステップＳ３１０２に戻る。一方、ｉ＞ｎである場合（ステップＳ３１０４：Ｙｅｓ）、コンピュータは、図３０に示したマップ割当数決定処理（ステップＳ３００２）に移行して、集計処理（ステップＳ３００１）を終了する。この集計処理（ステップＳ３００１）によれば、対象ファイルＦｉごとに対象ファイルＦｉの集計処理（ステップＳ３１０３）を実行することができる。
【０１５０】
（対象ファイルＦｉの集計処理（ステップＳ３１０３））
図３２は、図３１に示した対象ファイルＦｉの集計処理（ステップＳ３１０３）の詳細な処理手順例を示すフローチャートである。まず、コンピュータは、対象文字を対象ファイルＦｉの先頭文字とし（ステップＳ３２０１）、基礎単語集計処理を実行する（ステップＳ３２０２）。基礎単語集計処理（ステップＳ３２０２）の詳細については図３４で説明する。このあと、コンピュータは、文字出現頻度集計テーブルにおいて対象文字の出現回数を１増加する（ステップＳ３２０３）。
【０１５１】
図３３は、文字出現頻度集計テーブルを示す説明図である。文字出現頻度集計テーブル３３００は、ＲＡＭ２９０３や磁気ディスク２９０５などの記憶装置に記憶されており、該当する文字が出現する都度出現回数を１ずつ増加させる。
【０１５２】
図３２に戻り、コンピュータは、対象文字が対象ファイルＦｉの末尾文字であるか否かを判断する（ステップＳ３２０４）。対象文字が対象ファイルＦｉの末尾文字でない場合（ステップＳ３２０４：Ｎｏ）、コンピュータは、対象文字を末尾方向へ１文字シフトし（ステップＳ３２０５）、ステップＳ３２０２に戻る。
【０１５３】
一方、対象文字が対象ファイルＦｉの末尾文字である場合（ステップＳ３２０４：Ｙｅｓ）、コンピュータは、ステップＳ３１０４に移行して、対象ファイルＦｉの集計処理（ステップＳ３１０３）を終了する。この対象ファイルＦｉの集計処理（ステップＳ３１０３）によれば、対象ファイル群Ｆｓに存在する基礎単語および単一文字の出現頻度を集計することができる。
【０１５４】
（基礎単語集計処理（ステップＳ３２０２））
図３４は、図３２に示した基礎単語集計処理（ステップＳ３２０２）の詳細な処理手順例を示すフローチャートである。まず、コンピュータは、最長一致検索処理を実行し（ステップＳ３４０１）、最長一致した基礎単語があったか否かを判断する（ステップＳ３４０２）。最長一致検索処理（ステップＳ３４０２）の詳細については図３６で説明する。最長一致した基礎単語があった場合（ステップＳ３４０２：Ｙｅｓ）、コンピュータは、基礎単語出現頻度集計テーブルにおいて最長一致した基礎単語の出現回数を１増加し（ステップＳ３４０３）、ステップＳ３２０３に移行する。
【０１５５】
図３５は、基礎単語出現頻度集計テーブルを示す説明図である。基礎単語出現頻度集計テーブル３５００は、ＲＡＭ２９０３や磁気ディスク２９０５などの記憶装置に記憶されており、該当する基礎単語が出現する都度出現回数を１ずつ増加させる。
【０１５６】
図３４に戻り、最長一致した基礎単語がなかった場合（ステップＳ３４０２：Ｎｏ）、ステップＳ３２０３に移行する。これにより、基礎単語集計処理（ステップＳ３２０２）を終了する。この基礎単語集計処理（ステップＳ３２０２）によれば、最長一致検索処理（ステップＳ３４０１）により基礎単語を計数することができるため、文字列が長い基礎単語を優先的に計数することができる。
【０１５７】
（最長一致検索処理（ステップＳ３４０１））
図３６は、図３４に示した最長一致検索処理（ステップＳ３４０１）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、ｃ＝１とする（ステップＳ３６０１）。ｃは対象文字からの文字数（対象文字含む）である。ｃ＝１の場合は、対象文字だけである。つぎに、コンピュータは、対象文字からｃ文字目までの対象文字列と前方一致する基礎単語を２分探索する（ステップＳ３６０２）。そして、コンピュータは、検索により基礎単語があるか否かを判断する（ステップＳ３６０３）。２分探索により基礎単語がヒットしなかった場合（ステップＳ３６０３：Ｎｏ）、ステップＳ３６０６に移行する。
【０１５８】
一方、２分探索により基礎単語がヒットした場合（ステップＳ３６０３：Ｙｅｓ）、コンピュータは、ヒットした基礎単語と対象文字列とが完全一致するか否かを判断する（ステップＳ３６０４）。そして、完全一致しない場合（ステップＳ３６０４：Ｎｏ）、ステップＳ３６０６に移行する。一方、完全一致する場合（ステップＳ３６０４：Ｙｅｓ）、コンピュータは、最長一致候補として記憶装置に保持し（ステップＳ３６０５）、ステップＳ３６０６に移行する。
【０１５９】
ステップＳ３６０６では、コンピュータは、対象文字列について２分探索が終了したか否かを判断する（ステップＳ３６０６）。具体的には、コンピュータは、末尾の基礎単語まで２分探索したか否かを判断する。２分探索が終了していない場合（ステップＳ３６０６：Ｎｏ）、コンピュータは、ステップＳ３６０２に移行して、２分探索が終了するまで継続する。
【０１６０】
一方、対象文字列について２分探索が終了した場合（ステップＳ３６０６：Ｙｅｓ）、コンピュータは、ｃ文字目の文字が対象ファイルＦｉの末尾文字であるか否かを判断する（ステップＳ３６０７）。ｃ文字目の文字が対象ファイルＦｉの末尾文字である場合（ステップＳ３６０７：Ｙｅｓ）、ステップＳ３６１０に移行する。一方、ｃ文字目の文字が対象ファイルＦｉの末尾文字でない場合（ステップＳ３６０７：Ｎｏ）、コンピュータは、ｃ＞ｃｍａｘであるか否かを判断する（ステップＳ３６０８）。ｃｍａｘは予め設定された値であり、これにより対象文字列の上限文字数が設定される。
【０１６１】
ｃ＞ｃｍａｘでない場合（ステップＳ３６０８：Ｎｏ）、コンピュータは、ｃをインクリメントして（ステップＳ３６０９）、ステップＳ３６０２に戻る。一方、ｃ＞ｃｍａｘである場合（ステップＳ３６０８：Ｙｅｓ）、コンピュータは、最長一致候補があるか否かを判断する（ステップＳ３６１０）。具体的には、コンピュータは、ステップＳ３６０５において１つでも最長一致候補がメモリに保持されているか否かを判断する。
【０１６２】
最長一致候補がある場合（ステップＳ３６１０：Ｙｅｓ）、コンピュータは、最長一致候補のうち最長文字列を、最長一致した基礎単語に決定する（ステップＳ３６１１）。そして、ステップＳ３４０２に移行する。一方、ステップＳ３６１０において、最長一致候補が１つもない場合（ステップＳ３６１０：Ｎｏ）、ステップＳ３４０２に移行する。これにより、最長一致検索処理（ステップＳ３４０１）を終了する。この最長一致検索処理（ステップＳ３４０１）によれば、基礎単語の構造体にある基礎単語の中から、完全一致した文字列の中でかつ最長の文字列を基礎単語として検索することができる。
【０１６３】
（マップ割当数決定処理（ステップＳ３００２））
図３７は、図３０に示したマップ割当数決定処理（ステップＳ３００２）の詳細な処理手順例を示すフローチャートである。まず、コンピュータは、集計処理（ステップＳ３００１）による基礎単語ごとの出現頻度を示す基礎単語出現頻度集計テーブル３５００と単一文字ごとの出現頻度を示す文字出現頻度集計テーブル３３００を出現頻度の高い順にソートする（ステップＳ３７０１）。そして、コンピュータは、ソート後の基礎単語出現頻度集計テーブル３５００を参照して、基礎単語の出現順位ＲｗをＲｗ＝１とし（ステップＳ３７０２）、出現順位Ｒｗまでの累積出現回数Ａｒｗを計数する（ステップＳ３７０３）。そして、コンピュータは、下記式（１）を満たすか否かを判断する（ステップＳ３７０４）。
【０１６４】
Ａｒｗ＞Ｐｗ×Ａｗ・・・（１）
Ａｗは集計された基礎単語の総出現回数である。
【０１６５】
上記（１）式を満たさない場合（ステップＳ３７０４：Ｎｏ）、コンピュータは、出現順位Ｒｗをインクリメントして（ステップＳ３７０５）、ステップＳ３７０３に戻る。すなわち、上記式（１）を満たすまで出現順位Ｒｗを下げ続ける。
【０１６６】
そして、上記式（１）を満たした場合（ステップＳ３７０４：Ｙｅｓ）、コンピュータは、基礎単語のマップ割当数ＮｗをＮｗ＝Ｒｗ−１とする（ステップＳ３７０６）。ここで、マップ割当数Ｎｗとは、マップ生成処理（ステップＳ３００６）で生成される基礎単語出現マップに割り当てられる基礎単語数であり、基礎単語出現マップのレコード数（行数）を意味する。
【０１６７】
また、コンピュータは、単一文字の出現順位ＲｃをＲｃ＝１とし（ステップＳ３７０７）、出現順位Ｒｃまでの累積出現回数Ａｒｃを計数する（ステップＳ３７０８）。そして、コンピュータは、下記式（２）を満たすか否かを判断する（ステップＳ３７０９）。
【０１６８】
Ａｒｃ＞Ｐｃ×Ａｃ・・・（２）
Ａｃは集計された単一文字の総出現回数である。
【０１６９】
上記（２）式を満たさない場合（ステップＳ３７０９：Ｎｏ）、コンピュータは、出現順位Ｒｃをインクリメントして（ステップＳ３７１０）、ステップＳ３７０８に戻る。すなわち、上記式（２）を満たすまで出現順位Ｒｃを下げ続ける。
【０１７０】
そして、上記式（２）を満たした場合（ステップＳ３７０９：Ｙｅｓ）、コンピュータは、単一文字のマップ割当数ＮｃをＮｃ＝Ｒｃ−１とする（ステップＳ３７１１）。ここで、マップ割当数Ｎｃとは、マップ生成処理（ステップＳ３００６）で生成される特定単一文字出現マップに割り当てられる特定単一文字数であり、特定単一文字出現マップのレコード数（行数）を意味する。この後、再集計処理（ステップＳ３００３）に移行して、マップ割当数決定処理（ステップＳ３００２）を終了する。
【０１７１】
このマップ割当数決定処理（ステップＳ３００２）によれば、マップ生成処理（ステップＳ３００６）において目標出現率Ｐｗに応じた数の基礎単語分について基礎単語出現マップを生成することができる。したがって、すべての基礎単語についてマップ割当をおこなう必要はなく、目標出現率Ｐｗにしたがって決められるため、マップサイズの最適化を図ることができる。
【０１７２】
また、単一文字についても、マップ生成処理（ステップＳ３００６）において目標出現率Ｐｃに応じた数の単一文字分について特定単一文字の圧縮符号マップを生成することができる。したがって、すべての単一文字についてマップ割当をおこなう必要はなく、目標出現率Ｐｃにしたがって決められるため、マップサイズの最適化を図ることができる。
【０１７３】
（再集計処理（ステップＳ３００３））
図３８は、図３０に示した再集計処理（ステップＳ３００３）の詳細な処理手順例を示すフローチャートである。まず、コンピュータは、ファイル番号ｉをｉ＝１に設定し（ステップＳ３８０１）、対象ファイルＦｉを読み込む（ステップＳ３８０２）。そして、コンピュータは、対象ファイルＦｉの再集計処理を実行する（ステップＳ３８０３）。対象ファイルＦｉの再集計処理（ステップＳ３８０３）の詳細については、図３９で説明する。このあと、コンピュータは、ファイル番号ｉがｉ＞ｎ（ｎは対象ファイルＦ１〜Ｆｎの総数）であるか否かを判断する（ステップＳ３８０４）。
【０１７４】
ｉ＞ｎでない場合（ステップＳ３８０４：Ｎｏ）、コンピュータは、ｉをインクリメントし（ステップＳ３８０５）、ステップＳ３８０２に戻る。一方、ｉ＞ｎである場合（ステップＳ３８０４：Ｙｅｓ）、コンピュータは、図３０に示したハフマン木生成処理（ステップＳ３００４）に移行して、再集計処理（ステップＳ３００３）を終了する。この再集計処理（ステップＳ３００３）によれば、対象ファイルＦｉごとに対象ファイルＦｉの再集計処理（ステップＳ３８０３）を実行することができる。
【０１７５】
（対象ファイルＦｉの再集計処理（ステップＳ３８０３））
図３９は、対象ファイルＦｉの再集計処理（ステップＳ３８０３）の詳細な処理手順例を示すフローチャートである。まず、コンピュータは、対象文字を対象ファイルＦｉの先頭文字とし（ステップＳ３９０１）、対象文字が特定単一文字であるか否かを判断する（ステップＳ３９０２）。特定単一文字である場合（ステップＳ３９０２：Ｙｅｓ）、分割せずにステップＳ３９０４に移行する。
【０１７６】
一方、特定単一文字でない場合（ステップＳ３９０２：Ｎｏ）、コンピュータは、対象文字の文字コードを上位分割文字コードと下位分割文字コードとに分割する（ステップＳ３９０３）。そして、ステップＳ３９０４に移行する。
【０１７７】
ステップＳ３９０４では、コンピュータは、上位分割文字コード出現頻度集計テーブルに対し、ステップＳ３９０３で得られた上位分割文字コードと同一分割文字コードの出現回数を１加算する（ステップＳ３９０４）。
【０１７８】
図４０は、上位分割文字コード出現頻度集計テーブルを示す説明図である。上位分割文字コード出現頻度集計テーブル４０００は、ＲＡＭ２９０３や磁気ディスク２９０５などの記憶装置に記憶されており、該当する上位分割文字コードが出現する都度出現回数を１ずつ増加させる。
【０１７９】
また、図３９において、コンピュータは、下位分割文字コード出現頻度集計テーブルに対し、ステップＳ３９０３で得られた下位分割文字コードと同一分割文字コードの出現回数を１加算する（ステップＳ３９０５）。
【０１８０】
図４１は、下位分割文字コード出現頻度集計テーブルを示す説明図である。下位分割文字コード出現頻度集計テーブル４１００は、ＲＡＭ２９０３や磁気ディスク２９０５などの記憶装置に記憶されており、該当する下位分割文字コードが出現する都度出現回数を１ずつ増加させる。
【０１８１】
また、図３９において、コンピュータは、２グラム文字列特定処理を実行する（ステップＳ３９０６）。２グラム文字列特定処理（ステップＳ３９０６）では、対象文字を基点とする２グラム文字列を特定する。２グラム文字列特定処理（ステップＳ３９０６）の詳細は図４２で説明する。
【０１８２】
コンピュータは、２グラム文字列出現頻度集計テーブルに対し、２グラム文字列特定処理（ステップＳ３９０６）で特定された２グラム文字列の出現回数を１加算する（ステップＳ３９０７）。
【０１８３】
図４２は、図３９で示した２グラム文字列特定処理（ステップＳ３９０６）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、対象文字に対し、対象文字は分割されたか否かを判断する（ステップＳ４２０１）。すなわち、コンピュータは、対象文字が分割文字コードか否かを判断する。分割されていない場合（ステップＳ４２０１：Ｎｏ）、すなわち、単一文字の場合、コンピュータは、１つ前の文字があるか否かを判断する（ステップＳ４２０２）。
【０１８４】
１つ前の文字がある場合（ステップＳ４２０２：Ｙｅｓ）、コンピュータは、１つ前の文字は分割されたか否かを判断する（ステップＳ４２０３）。すなわち、コンピュータは、１つ前の文字が分割文字コードか否かを判断する。分割されていない場合（ステップＳ４２０３：Ｎｏ）、すなわち、単一文字の場合、コンピュータは、対象文字の１つ前の単一文字と対象文字（単一文字）からなる文字列を、２グラム文字列に決定する（ステップＳ４２０４）。そして、ステップＳ３９０７に移行する。
【０１８５】
一方、ステップＳ４２０３において、１つ前の文字が分割された場合（ステップＳ４２０３：Ｙｅｓ）、すなわち、分割文字コードである場合、その１つ前の文字である分割文字コードは、下位分割文字コードとなる。したがって、コンピュータは、１つ前の文字である下位分割文字コードと対象文字からなる文字列を、２グラム文字列に決定する（ステップＳ４２０５）。そして、ステップＳ３９０７に移行する。
【０１８６】
また、ステップＳ４２０２において、１つ前の文字がない場合（ステップＳ４２０２：Ｎｏ）、対象文字だけとなるため、２グラム文字列を決定せずに、ステップＳ３９０７に移行する。
【０１８７】
また、ステップＳ４２０１において、対象文字が分割された場合（ステップＳ４２０１：Ｙｅｓ）、すなわち、分割文字コードである場合、コンピュータは、その分割文字コードが上位分割文字コードか下位分割文字コードであるかを判断する（ステップＳ４２０６）。
【０１８８】
上位分割文字コードである場合（ステップＳ４２０６：上位）、コンピュータは、１つ前の文字は分割されたか否かを判断する（ステップＳ４２０７）。すなわち、１つ前の文字が分割文字コードか否かを判断する。分割されていない場合（ステップＳ４２０７：Ｎｏ）、すなわち、単一文字の場合、コンピュータは、対象文字の１つ前の単一文字と対象文字から分割された上位分割文字コードからなる文字列を、２グラム文字列に決定する（ステップＳ４２０８）。そして、ステップＳ３９０７に移行する。
【０１８９】
一方、ステップＳ４２０７において、１つ前の文字が分割された場合（ステップＳ４２０７：Ｙｅｓ）、すなわち、分割文字コードである場合、その１つ前の文字である分割文字コードは、下位分割文字コードとなる。したがって、コンピュータは、１つ前の文字である下位分割文字コードと対象文字から分割された上位分割文字コードからなる文字列を、２グラム文字列に決定する（ステップＳ４２０９）。そして、ステップＳ３９０７に移行する。
【０１９０】
また、ステップＳ４２０６において、下位分割文字コードである場合（ステップＳ４２０６：下位）、コンピュータは、対象文字から分割された上位分割文字コードおよび下位分割文字コードからなる文字列を、２グラム文字列に決定する（ステップＳ４２１０）。そして、ステップＳ３９０７に移行する。
【０１９１】
この２グラム文字列特定処理（ステップＳ３９０６）によれば、対象文字が分割された場合であっても２グラム文字列を特定することができる。また、１文字シフトにしたがって２グラム文字列を特定するため、基礎単語の圧縮符号マップおよび特定単一文字の圧縮符号マップと同時並行で生成することができる。
【０１９２】
このように、上述した情報生成によれば、目標出現率Ｐｗ，Ｐｃにより、マップ生成される基礎単語数および単一文字数が制限されるため、無駄なマップ生成がなくなり、マップ生成の高速化およびマップサイズの最適化を同時に実現することができる。また、１文字シフトにより複数種類のマップ生成を同時並行で実行することができ、高精度な検索に用いる複数種類のマップ生成の効率化を図ることができる。
【０１９３】
図４３は、２グラム文字列出現頻度集計テーブルを示す説明図である。２グラム文字列出現頻度集計テーブル４３００は、ＲＡＭ２９０３や磁気ディスク２９０５などの記憶装置に記憶されており、該当する２グラム文字列が出現する都度出現回数を１ずつ増加させる。
【０１９４】
このあと、コンピュータは、対象文字の後続文字が対象ファイルＦｉ内にあるか否かを判断し（ステップＳ３９０８）、後続文字がある場合（ステップＳ３９０８：Ｙｅｓ）、後続文字を対象文字に設定し（ステップＳ３９０９）、ステップＳ３９０２に戻る。一方、後続文字がない場合（ステップＳ３９０８：Ｎｏ）、対象ファイルＦｉの再集計処理（ステップＳ３８０３）を終了して、ステップＳ３８０４に移行する。
【０１９５】
これにより、対象ファイルＦｉごとに、対象ファイルＦｉ内に存在する上位分割文字コード、下位分割文字コード、および２グラム文字列の出現回数を集計することができる。
【０１９６】
（ハフマン木生成処理（ステップＳ３００４））
図４４は、図３０に示したハフマン木生成処理（ステップＳ３００４）の詳細な処理手順例を示すフローチャートである。図４４において、コンピュータは、圧縮符号長の上限長Ｎを決定する（ステップＳ４４０１）。つぎに、コンピュータは、補正処理を実行する（ステップＳ４４０２）。ここで、補正処理とは、図１９〜図２１で説明したように、文字情報ごとの生起確率および圧縮符号長を、圧縮符号長の上限長Ｎを用いて補正する処理である。
【０１９７】
つぎに、コンピュータは、文字情報ごとに葉の構造体を生成する（ステップＳ４４０３）。そして、コンピュータは、枝数特定処理を実行する（ステップＳ４００６）。枝数特定処理（ステップＳ４４０４）では、圧縮符号長ごとの葉当たりの枝数を特定する。枝数特定処理（ステップＳ４４０４）の詳細は図４５で説明する。
【０１９８】
そして、コンピュータは、構築処理を実行する（ステップＳ４４０５）。枝数特定処理（ステップＳ４４０４）により葉の構造体ごとの枝数が特定されるため、まず、コンピュータは、葉の構造体ごとに、枝数分の葉へのポインタ群を生成する。そして、生成された各葉の構造体についての葉へのポインタ群を集約して根の構造体とする。これにより、２N分枝無節点ハフマン木が生成されることとなる。なお、生成された２N分枝無節点ハフマン木は、コンピュータ内の記憶装置（ＲＡＭ２９０３や磁気ディスク２９０５など）に格納される。このあと、図３０の分割順位決定処理（ステップＳ３００５）に移行する。
【０１９９】
図４５は、図４４に示した枝数特定処理（ステップＳ４４０４）の詳細な処理手順例を示すフローチャートである。まず、コンピュータは、最大圧縮符号長ＣＬｍａｘ（＝Ｎ）と最小圧縮符号長ＣＬｍｉｎ（＝Ｍ）との差分Ｄ（＝Ｎ−Ｍ）を算出する（ステップＳ４５０１）。たとえば、Ｎ＝１１の場合、図１９を参照すると、Ｍ＝６である。したがって、Ｄ＝５である。
【０２００】
つぎに、コンピュータは、２のべき数の変数ｊをｊ＝０とし、圧縮符号長の変数ＣＬをＣＬ＝Ｎとする（ステップＳ４５０２）。そして、コンピュータは、ｊ＞Ｄであるか否かを判断する（ステップＳ４５０３）。ｊ＞Ｄでない場合（ステップＳ４５０３：Ｎｏ）、コンピュータは、圧縮符号長ＣＬの葉当たりの枝数ｂ（ＣＬ）を算出する（ステップＳ４５０４）。圧縮符号長ＣＬの葉当たりの枝数ｂ（ＣＬ）は、ｂ（ＣＬ）＝２jで算出される。たとえば、ｊ＝０のとき、圧縮符号長ＣＬ＝Ｎ＝１１であるため、圧縮符号長１１ビットでの葉当たりの枝数ｂ（１１）は、ｂ（１１）＝２j＝２0＝１となる。
【０２０１】
つぎに、コンピュータは、圧縮符号長ＣＬの総枝数Ｂ（Ｌ）を算出する（ステップＳ４５０５）。圧縮符号長ＣＬの総枝数Ｂ（Ｌ）は、Ｂ（Ｌ）＝Ｌ（ＣＬ）×ｂ（ＣＬ）で算出される。Ｌ（ＣＬ）は、圧縮符号長ＣＬでの葉数（文字情報の種類数）である。たとえば、ｊ＝０のとき、圧縮符号長ＣＬ＝Ｎ＝１１であるため、圧縮符号長１１ビットでの総枝数Ｂ（Ｌ）は、１２１６×２0＝１２１６となる。
【０２０２】
このあと、コンピュータは、ｊをインクリメントし、圧縮符号長ＣＬをデクリメントして（ステップＳ４５０６）、ステップＳ４５０３に戻り、インクリメント後のｊがｊ＞Ｄであるか否かが判断される。なお、Ｎ＝１１の場合は、ｊ＝Ｄになるとｊ＝Ｄ＝５となり、ＣＬ＝Ｍ＝６となる。したがって、ステップＳ４５０４では、圧縮符号長ＣＬ（５ビット）の葉当たりの枝数ｂ（６）は、ｂ（６）＝２6＝６４となる。同様に、総枝数Ｂ（Ｌ）は、Ｂ（６）＝０×２6＝０となる。そして、ｊ＞Ｄである場合（ステップＳ４５０３：Ｙｅｓ）、構築処理（ステップＳ４４０５）に移行する。
【０２０３】
図４６は、図４４に示した構築処理（ステップＳ４４０５）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、圧縮符号長ＣＬをＣＬ＝ＣＬｍｉｎ＝Ｍとする（ステップＳ４６０１）。つぎに、コンピュータは、圧縮符号長ＣＬでの未選択の葉があるか否かを判断する（ステップＳ４６０２）。未選択の葉がある場合（ステップＳ４６０２：Ｙｅｓ）、コンピュータは、葉へのポインタ生成処理（ステップＳ４６０３）を実行して、ステップＳ４６０２に戻る。葉へのポインタ生成処理（ステップＳ４６０３）では、葉の構造体ごとに、圧縮符号長ＣＬに応じた枝数分の葉へのポインタ群を生成する。なお、葉へのポインタ生成処理（ステップＳ４６０３）の詳細は図４７で説明する。
【０２０４】
一方、ステップＳ４６０２において、未選択の葉がない場合（ステップＳ４６０２：Ｎｏ）、コンピュータは、ＣＬ＞Ｎであるか否かを判断する（ステップＳ４６０４）。ＣＬ＞Ｎでない場合（ステップＳ４６０４：Ｎｏ）、コンピュータは、ＣＬをインクリメントして（ステップＳ４６０５）、ステップＳ４６０２に戻る。一方、ＣＬ＞Ｎである場合（ステップＳ４６０４：Ｙｅｓ）、２N分枝無節点ハフマン木が構築されたこととなり、図３０の分割順位決定処理（ステップＳ３００５）に移行することとなる。
【０２０５】
図４７は、図４６に示した葉へのポインタ生成処理（ステップＳ４６０３）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、未選択の葉Ｌを選択し（ステップＳ４７０１）、選択葉へのポインタ数ｋをｋ＝１に設定する（ステップＳ４７０２）。そして、コンピュータは、選択葉へのポインタＰＬ（ｋ）の先行ビット列を、選択葉の圧縮符号に設定する（ステップＳ４７０３）。たとえば、上限長Ｎ＝１１については、選択葉が、文字情報「０」の葉の構造体である場合、圧縮符号は「００００００」である。したがって、選択葉へのポインタＰＬ（ｋ）の先行ビット列も、「００００００」となる。
【０２０６】
つぎに、コンピュータは、選択葉へのポインタＰＬ（ｋ）の後続ビット列のビット長を、最大圧縮符号長Ｎから選択葉の圧縮符号長ＣＬを引いた差分とし、後続ビット列の初期値をオール０に設定する（ステップＳ４７０４）。たとえば、選択葉が、文字情報「０」の葉の構造体である場合、圧縮符号長ＣＬは６ビットであるため、後続ビット列のビット長は５ビット（＝１１−６）となる。ｋ＝１の場合は、後続ビット列はオール０となるため、後続ビット列は、５ビットの「０００００」となる。
【０２０７】
そして、コンピュータは、選択葉へのポインタＰＬ（ｋ）を根の構造体に格納する（ステップＳ４７０５）。このあと、コンピュータは、ｋ＞ｂ（ＣＬ）であるか否かを判断する（ステップＳ４７０６）。ｂ（ＣＬ）は、選択葉の圧縮符号長ＣＬの葉当たりの枝数である。ｋ＞ｂ（ＣＬ）でない場合（ステップＳ４７０６：Ｎｏ）、選択葉に割り当てられたすべての枝について葉へのポインタが生成されていないため、コンピュータは、ｋをインクリメントする（ステップＳ４７０７）。
【０２０８】
そして、コンピュータは、現在の後続ビット列をインクリメントして、インクリメント後の後続ビット列を先行ビット列の末端に連結することで、あらたに、選択葉へのポインタＰＬ（ｋ）を生成する（ステップＳ４７０８）。そして、コンピュータは、選択葉へのポインタＰＬ（ｋ）を根の構造体に格納し（ステップＳ４７０９）、ステップＳ４７０６に戻る。ステップＳ４７０６〜ステップＳ４７０９を繰り返すことで、葉当たりの枝数分の葉へのポインタ群が生成されることとなる。そして、ステップＳ４７０６において、ｋ＞ｂ（ＣＬ）である場合（ステップＳ４７０６：Ｙｅｓ）、ステップＳ４６０２に移行する。
【０２０９】
このように、対象ファイル群Ｆｓに出現する文字情報の種類数に応じて、２N分枝無節点ハフマン木の最大枝数２Nを最適な本数に設定することができるため、２N分枝無節点ハフマン木のサイズの適正化を図ることができる。また、本実施の形態によれば、上限長Ｎが２〜４の整数倍でない場合（たとえば、上限長Ｎ＝１１，１３）であっても、圧縮効率のよい２N分枝無節点ハフマン木を生成することができる。
【０２１０】
このあと、コンピュータは、２N分枝無節点ハフマン木の各葉の構造体と、基礎単語の構造体，特定文字コードの構造体，分割文字コードの構造体とを、図２１の文字情報テーブルを参照して、相互に関連付ける。具体的には、上述したように、葉の構造体には、当該葉に格納されている圧縮符号に対応する特定文字、分割文字コードおよびへのポインタや基礎単語へのポインタを格納する。
【０２１１】
また、コンピュータは、基礎単語の構造体の基礎単語ごとに、対応する圧縮符号を格納する葉へのポインタを格納する。また、コンピュータは、特定文字コードの構造体の特定文字ごとに、対応する圧縮符号を格納する葉へのポインタを格納する。また、コンピュータは、分割文字コードの構造体の分割文字コードごとに、対応する圧縮符号を格納する葉へのポインタを格納する。
【０２１２】
（分割順位決定処理（ステップＳ３００５））
図４８は、図３０に示した分割順位決定処理（ステップＳ３００５）の詳細な処理手順例を示すフローチャートである。まず、コンピュータは、２グラム文字列出現頻度集計テーブル４３００について出現回数の高い順にソートする（ステップＳ４８０１）。つぎに、コンピュータは、２グラム文字列の出現順位Ｒ２ｇをＲ２ｇ＝１とする（ステップＳ４８０２）。そして、コンピュータは、２グラム文字列出現頻度集計テーブル４３００を参照して、出現順位Ｒ２ｇまでの累積出現回数Ａｒ２ｇを計数する（ステップＳ４８０３）。
【０２１３】
そして、コンピュータは、下記式（３）を満たすか否かを判断する（ステップＳ４８０４）。
【０２１４】
Ａｒ２ｇ＞Ｐ２ｇ×Ａ２ｇ・・・（３）
Ｐ２ｇは２グラム文字列の目標出現率であり、Ａ２ｇは集計された２グラム文字列の総出現回数である。
【０２１５】
上記（３）式を満たさない場合（ステップＳ４８０４：Ｎｏ）、コンピュータは、出現順位Ｒ２ｇをインクリメントして（ステップＳ４８０５）、ステップＳ４８０３に戻る。すなわち、上記式（３）を満たすまで出現順位Ｒ２ｇを下げ続ける。
【０２１６】
そして、上記式（３）を満たした場合（ステップＳ４８０４：Ｙｅｓ）、コンピュータは、図３０に示したマップ生成処理（ステップＳ３００６）に移行する。上記式（３）を満たしたときの出現順位Ｒ２ｇが分割順位となる。これにより、分割順位Ｒ２ｇ以降の２グラム文字列について分割されることとなる。
【０２１７】
（マップ生成処理（ステップＳ３００６））
図４９は、図３０に示したマップ生成処理（ステップＳ３００６）の詳細な処理手順例を示すフローチャートである。まず、コンピュータは、ファイル番号ｉをｉ＝１に設定し（ステップＳ４９０１）、対象ファイルＦｉを読み込む（ステップＳ４９０２）。そして、コンピュータは、対象ファイルＦｉのマップ生成処理を実行する（ステップＳ４９０３）。対象ファイルＦｉのマップ生成処理（ステップＳ４９０３）の詳細は、図５０で説明する。このあと、コンピュータは、ファイル番号ｉがｉ＞ｎ（ｎは対象ファイルＦ１〜Ｆｎの総数）であるか否かを判断する（ステップＳ４９０４）。
【０２１８】
ｉ＞ｎでない場合（ステップＳ４９０４：Ｎｏ）、コンピュータは、ｉをインクリメントし（ステップＳ４９０５）、ステップＳ４９０２に戻る。一方、ｉ＞ｎである場合（ステップＳ４９０４：Ｙｅｓ）、マップ生成処理（ステップＳ３００６）が終了する。このマップ生成処理（ステップＳ３００６）によれば、対象ファイルＦｉごとに対象ファイルＦｉのマップ生成処理（ステップＳ４９０３）を実行することができる。
【０２１９】
図５０は、図４９に示した対象ファイルＦｉのマップ生成処理（ステップＳ４９０３）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、対象文字を対象ファイルＦｉの先頭文字とし（ステップＳ５００１）、基礎単語出現マップ生成処理（ステップＳ５００２）、特定単一文字出現マップ生成処理（ステップＳ５００３）、２グラム文字列出現マップ生成処理（ステップＳ５００４）を実行する。
【０２２０】
基礎単語出現マップ生成処理（ステップＳ５００２）の詳細は図５１で説明する。また、特定単一文字出現マップ生成処理（ステップＳ５００３）の詳細は図５２で説明する。さらに、２グラム文字列出現マップ生成処理（ステップＳ５００４）の詳細は図５４で説明する。
【０２２１】
このあと、コンピュータは、対象文字が対象ファイルＦｉの末尾文字であるか否かを判断する（ステップＳ５００５）。対象文字が対象ファイルＦｉの末尾文字でない場合（ステップＳ５００５：Ｎｏ）、コンピュータは、対象文字を末尾方向へ１文字シフトし（ステップＳ５００６）、ステップＳ５００２に戻る。一方、対象文字が対象ファイルＦｉの末尾文字である場合（ステップＳ５００５：Ｙｅｓ）、ステップＳ４９０４に移行して、対象ファイルＦｉのマップ生成処理（ステップＳ４９０３）を終了する。
【０２２２】
この対象ファイルＦｉのマップ生成処理（ステップＳ４９０３）によれば、基礎単語出現マップ、特定単一文字出現マップおよび２グラム文字列出現マップを、対象文字を１文字ずつシフトしながら、同時並行で生成することができる。
【０２２３】
図５１は、図５０で示した基礎単語出現マップ生成処理（ステップＳ５００２）の詳細な処理手順例を示すフローチャートである。まず、コンピュータは、対象文字について最長一致検索処理を実行する（ステップＳ５１０１）。最長一致検索処理（ステップＳ５１０１）の詳細な処理手順は、図３６に示した最長一致検索処理（ステップＳ３４０１）と同一処理内容であるため説明を省略する。
【０２２４】
そして、コンピュータは、最長一致した基礎単語、すなわち、基礎単語があるか否かを判断する（ステップＳ５１０２）。最長一致した基礎単語がない場合（ステップＳ５１０２：Ｎｏ）、特定単一文字出現マップ生成処理（ステップＳ５００３）に移行する。一方、最長一致した基礎単語がある場合（ステップＳ５１０２：Ｙｅｓ）、コンピュータは、その最長一致した基礎単語について、基礎単語出現マップが設定済みであるか否かを判断する（ステップＳ５１０３）。
【０２２５】
設定済みである場合（ステップＳ５１０３：Ｙｅｓ）、ステップＳ５１０６に移行する。一方、設定済みでない場合（ステップＳ５１０３：Ｎｏ）、コンピュータは、２N分枝無節点ハフマン木における最長一致した基礎単語の葉にアクセスして、その圧縮符号を取得する（ステップＳ５１０４）。そして、コンピュータは、取得した圧縮符号を、最長一致した基礎単語についての基礎単語出現マップへのポインタに設定して（ステップＳ５１０５）、ステップＳ５１０６に移行する。このあと、ステップＳ５１０６では、コンピュータは、最長一致した基礎単語についての基礎単語出現マップの対象ファイルＦｉのビットをＯＮにする（ステップＳ５１０６）。
【０２２６】
これにより、基礎単語出現マップ生成処理（ステップＳ５００２）を終了し、特定単一文字出現マップ生成処理（ステップＳ５００３）に移行する。この基礎単語出現マップ生成処理（ステップＳ５００２）によれば、対象文字ごとに最長一致した基礎単語を基礎単語としてマップ生成することができる。
【０２２７】
図５２は、図５０で示した特定単一文字出現マップ生成処理（ステップＳ５００３）の詳細な処理手順例を示すフローチャートである。まず、コンピュータは、特定単一文字の構造体に対して対象文字の２分探索をおこない（ステップＳ５２０１）、一致したか否かを判断する（ステップＳ５２０２）。一致する単一文字がなかった場合（ステップＳ５２０２：Ｎｏ）、コンピュータは、分割文字コード出現マップ生成処理を実行して（ステップＳ５２０３）、２グラム文字列出現マップ生成処理（ステップＳ５００４）に移行する。分割文字コード出現マップ生成処理（ステップＳ５２０３）の詳細は図５３で説明する。
【０２２８】
一方、ステップＳ５２０２において、２分探索により対象文字と一致する単一文字があった場合（ステップＳ５２０２：Ｙｅｓ）、コンピュータは、２N分枝無節点ハフマン木における２分探索された単一文字の葉にアクセスして、その圧縮符号を取得する（ステップＳ５２０４）。そして、コンピュータは、その取得された圧縮符号について、特定単一文字出現マップが設定済みであるか否かを判断する（ステップＳ５２０５）。設定済みである場合（ステップＳ５２０５：Ｙｅｓ）、ステップＳ５２０７に移行する。
【０２２９】
一方、設定済みでない場合（ステップＳ５２０５：Ｎｏ）、コンピュータは、取得した圧縮符号を、２分探索された単一文字についての特定単一文字出現マップへのポインタに設定して（ステップＳ５２０６）、ステップＳ５２０７に移行する。このあと、ステップＳ５２０７では、２分探索された単一文字についての特定単一文字出現マップの対象ファイルＦｉのビットをＯＮにする（ステップＳ５２０７）。
【０２３０】
これにより、特定単一文字出現マップ生成処理（ステップＳ５００３）を終了し、２グラム文字列出現マップ生成処理（ステップＳ５００４）に移行する。この特定単一文字出現マップ生成処理（ステップＳ５００３）によれば、２分探索された対象文字を特定単一文字としてマップ生成することができる。
【０２３１】
図５３は、図５２で示した分割文字コード出現マップ生成処理（ステップＳ５２０３）の詳細な処理手順例を示すフローチャートである。まず、コンピュータは、対象文字を分割し（ステップＳ５３０１）、２N分枝無節点ハフマン木における上位分割文字コードの葉にアクセスして、圧縮符号を取得する（ステップＳ５３０２）。そして、コンピュータは、その取得された圧縮符号について、上位分割文字コード出現マップが設定済みであるか否かを判断する（ステップＳ５３０３）。
【０２３２】
設定済みである場合（ステップＳ５３０３：Ｙｅｓ）、ステップＳ５３０５に移行する。一方、設定済みでない場合（ステップＳ５３０３：Ｎｏ）、コンピュータは、取得した圧縮符号を、上位分割文字コードの出現マップへのポインタに設定して（ステップＳ５３０４）、ステップＳ５３０５に移行する。このあと、ステップＳ５３０５では、コンピュータは、対象文字から分割された上位分割文字コードの出現マップの対象ファイルＦｉのビットをＯＮにする（ステップＳ５３０５）。
【０２３３】
また、コンピュータは、２N分枝無節点ハフマン木における下位分割文字コードの葉にアクセスして、圧縮符号を取得する（ステップＳ５３０６）。そして、コンピュータは、その取得された圧縮符号について、下位分割文字コードの出現マップが設定済みであるか否かを判断する（ステップＳ５３０７）。設定済みである場合（ステップＳ５３０７：Ｙｅｓ）、ステップＳ５３０９に移行する。
【０２３４】
一方、設定済みでない場合（ステップＳ５３０７：Ｎｏ）、コンピュータは、取得した圧縮符号を、下位分割文字コードの出現マップへのポインタに設定して（ステップＳ５３０８）、ステップＳ５３０９に移行する。このあと、ステップＳ５３０９では、コンピュータは、対象文字から分割された下位分割文字コードの出現マップの対象ファイルＦｉのビットをＯＮにする（ステップＳ５３０９）。
【０２３５】
これにより、分割文字コード出現マップ生成処理（ステップＳ５２０３）を終了し、２グラム文字列出現マップ生成処理（ステップＳ５００４）に移行する。この分割文字コード出現マップ生成処理（ステップＳ５２０３）によれば、目標出現率Ｐｃに応じた順位よりも下位の単一文字については、出現頻度が低いため、ＯＦＦのビットが多数出現することとなる。
【０２３６】
しかしながら、目標出現率Ｐｃに応じた順位よりも下位の単一文字については特定単一文字の出現マップの生成対象外とすることで、特定単一文字の圧縮符号マップのマップサイズの最適化を図ることができる。また、分割することで、目標出現率Ｐｃに応じた順位よりも下位の単一文字については、上位分割文字コードの圧縮符号マップおよび下位分割文字コードの圧縮符号マップといったマップサイズが固定化されたマップに設定される。したがって、目標出現率Ｐｃをどのような出現率に設定しても、マップサイズの増大化を防止でき、省メモリ化を図ることができる。
【０２３７】
図５４は、図５０に示した２グラム文字列圧縮符号マップ生成処理（ステップＳ５００４）の詳細な処理手順例を示すフローチャートである。図５４において、まず、コンピュータは、２グラム文字列特定処理を実行する（ステップＳ５４０１）。２グラム文字列特定処理（ステップＳ５４０１）の詳細な処理手順は、図４２に示した２グラム文字列特定処理（ステップＳ３９０６）と同一処理内容であるため説明を省略する。
【０２３８】
つぎに、コンピュータは、２グラム文字列特定処理（ステップＳ５４０１）により２グラム文字列が特定されたか否かを判断する（ステップＳ５４０２）。特定されなかった場合（ステップＳ５４０２：Ｎｏ）、図５０のステップＳ５００５に移行する。
【０２３９】
一方、特定された場合（ステップＳ５４０２：Ｙｅｓ）、特定された２グラム文字列の出現順位が、分割順位決定処理（ステップＳ３００５）で決定された分割順位Ｒ２ｇより上であるか否かを、ソートされた２グラム文字列出現頻度集計テーブル４３００を参照して判断する（ステップＳ５４０３）。
【０２４０】
分割順位Ｒ２ｇより上である場合（ステップＳ５４０３：Ｙｅｓ）、コンピュータは、２グラム文字列出現マップ（非分割）生成処理を実行して（ステップＳ５４０４）、ステップＳ５００５に移行する。２グラム文字列出現マップ（非分割）生成処理（ステップＳ５４０４）では、図１（Ｂ），（Ｃ）に示したような分割はされないこととなる。
【０２４１】
一方、分割順位Ｒ２ｇ以下である場合（ステップＳ５４０３：Ｎｏ）、コンピュータは、２グラム文字列出現マップ（分割）生成処理を実行して（ステップＳ５４０５）、ステップＳ５００５に移行する。２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）では、図１（Ｂ），（Ｃ）に示したような分割がされることとなる。
【０２４２】
図５５は、２グラム文字列出現マップ（非分割）生成処理（ステップＳ５４０４）の詳細な処理手順例を示すフローチャートである。図５５において、まず、コンピュータは、図５４の２グラム文字列特定処理（ステップＳ５４０１）で特定された２グラム文字列の第１グラム（特定単一文字または分割文字コード）について、２N分枝無節点ハフマン木の葉にアクセスして、圧縮符号を取得する（ステップＳ５５０１）。同様に、コンピュータは、第２グラム（特定単一文字または分割文字コード）について、２N分枝無節点ハフマン木におけるの葉にアクセスして、圧縮符号を取得する（ステップＳ５５０２）。
【０２４３】
そして、コンピュータは、第１グラムの圧縮符号と第２グラムの圧縮符号を連結する（ステップＳ５５０４）。そして、コンピュータは、連結圧縮符号をポインタとする出現マップが設定済みであるか否かを判断する（ステップＳ５５０４）。設定済みである場合（ステップＳ５５０４：Ｙｅｓ）、ステップＳ５５０６に移行する。
【０２４４】
一方、設定済みでない場合（ステップＳ５５０４：Ｎｏ）、コンピュータは、連結圧縮符号を、特定された２グラム文字列の出現マップへのポインタに設定する（ステップＳ５５０５）。このあと、ステップＳ５５０６では、コンピュータは、特定された２グラム文字列の出現マップの対象ファイルＦｉのビットをＯＮにする（ステップＳ５５０６）。
【０２４５】
これにより、２グラム文字列出現マップ（非分割）生成処理（ステップＳ５４０４）を終了し、ステップＳ５００５に移行する。この２グラム文字列出現マップ（非分割）生成処理（ステップＳ５４０４）によれば、目標出現率Ｐｃに応じた順位よりも上位の２グラム文字列については分割されずに、出現マップが生成される。したがって、分割された２グラムの出現マップに検索ノイズが重畳されないこととなる。
【０２４６】
つぎに、図５４に示した２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）の詳細な処理手順例について説明する。２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）は、分割方法によって３種類存在する。いずれを実行するかはデフォルトで決めておくことになる。
【０２４７】
図５６は、図５４に示した２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）の詳細な処理手順例（その１）を示すフローチャートである。図５６は、分割順位Ｒ２ｇ以降の２グラム文字列のうち第１グラム（特定単一文字または分割文字コード）について分割し、第２グラム（特定単一文字または分割文字コード）については分割しない例である。
【０２４８】
図５６において、まず、コンピュータは、図５４の２グラム文字列特定処理（ステップＳ５４０１）で特定された２グラム文字列の第１グラム（特定単一文字または分割文字コード）について、２N分枝無節点ハフマン木の葉にアクセスして、圧縮符号を取得する（ステップＳ５６０１）。そして、コンピュータは、取得した第１グラムの圧縮符号を上位コードと下位コードとに分割する（ステップＳ５６０２）。
【０２４９】
つぎに、コンピュータは、第２グラム（特定単一文字または分割文字コード）についても２N分枝無節点ハフマン木の葉にアクセスして、圧縮符号を取得する（ステップＳ５６０３）。このあと、コンピュータは、第１グラムの圧縮符号の上位コード（第１グラム上位コード）と第２グラムの圧縮符号とを連結する（ステップＳ５６０４）。
【０２５０】
そして、コンピュータは、ステップＳ５６０４での連結符号をポインタとする出現マップが設定済みであるか否かを判断する（ステップＳ５６０５）。設定済みである場合（ステップＳ５６０５：Ｙｅｓ）、ステップＳ５６０７に移行する。
【０２５１】
一方、設定済みでない場合（ステップＳ５６０５：Ｎｏ）、コンピュータは、連結符号をポインタに設定する（ステップＳ５６０６）。このあと、ステップＳ５６０７では、コンピュータは、連結符号の出現マップの対象ファイルＦｉのビットをＯＮにする（ステップＳ５６０７）。
【０２５２】
ステップＳ５６０２で分割された下位コードについても同様に、コンピュータは、第１グラムの圧縮符号の下位コード（第１グラム下位コード）と第２グラムの圧縮符号とを連結する（ステップＳ５６０８）。
【０２５３】
そして、コンピュータは、ステップＳ５６０８での連結符号をポインタとする出現マップが設定済みであるか否かを判断する（ステップＳ５６０９）。設定済みである場合（ステップＳ５６０９：Ｙｅｓ）、ステップＳ５６１１に移行する。
【０２５４】
一方、設定済みでない場合（ステップＳ５６０９：Ｎｏ）、コンピュータは、連結符号をポインタに設定する（ステップＳ５６１０）。このあと、ステップＳ５６１１では、コンピュータは、連結符号の出現マップの対象ファイルＦｉのビットをＯＮにする（ステップＳ５６１１）。
【０２５５】
これにより、２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）を終了し、ステップＳ５００５に移行する。この２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）によれば、目標出現率Ｐｃに応じた順位以降の２グラム文字列の圧縮符号マップが２分割されるため、検索ノイズが重畳されずにメモリサイズの縮小を図ることができる。
【０２５６】
図５７は、図５４に示した２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）の詳細な処理手順例（その２）を示すフローチャートである。図５７は、分割順位Ｒ２ｇ以降の２グラム文字列のうち第２グラム（特定単一文字または分割文字コード）について分割し、第１グラム（特定単一文字または分割文字コード）については分割しない例である。
【０２５７】
図５７において、まず、コンピュータは、図５４の２グラム文字列特定処理（ステップＳ５４０１）で特定された２グラム文字列の第１グラム（特定単一文字または分割文字コード）について、２N分枝無節点ハフマン木の葉にアクセスして、圧縮符号を取得する（ステップＳ５７０１）。
【０２５８】
同様に、コンピュータは、第２グラム（特定単一文字または分割文字コード）についても２N分枝無節点ハフマン木の葉にアクセスして、圧縮符号を取得する（ステップＳ５７０２）。そして、コンピュータは、取得した第２グラムの圧縮符号を上位コードと下位コードとに分割する（ステップＳ５７０３）。このあと、コンピュータは、第１グラムの圧縮符号と第２グラムの圧縮符号の上位コード（第２グラム上位コード）とを連結する（ステップＳ５７０４）。
【０２５９】
そして、コンピュータは、ステップＳ５７０４での連結符号をポインタとする出現マップが設定済みであるか否かを判断する（ステップＳ５７０５）。設定済みである場合（ステップＳ５７０５：Ｙｅｓ）、ステップＳ５７０７に移行する。
【０２６０】
一方、設定済みでない場合（ステップＳ５７０５：Ｎｏ）、コンピュータは、連結符号をポインタに設定する（ステップＳ５７０６）。このあと、ステップＳ５７０７では、コンピュータは、連結符号の出現マップの対象ファイルＦｉのビットをＯＮにする（ステップＳ５７０７）。
【０２６１】
ステップＳ５７０３で分割された下位コードについても同様に、コンピュータは、第１グラムの圧縮符号と第２グラムの圧縮符号の下位コード（第２グラム下位コード）とを連結する（ステップＳ５７０８）。
【０２６２】
そして、コンピュータは、ステップＳ５７０８での連結符号をポインタとする出現マップが設定済みであるか否かを判断する（ステップＳ５７０９）。設定済みである場合（ステップＳ５７０９：Ｙｅｓ）、ステップＳ５７１１に移行する。
【０２６３】
一方、設定済みでない場合（ステップＳ５７０９：Ｎｏ）、コンピュータは、連結符号をポインタに設定する（ステップＳ５７１０）。このあと、ステップＳ５７１１では、コンピュータは、連結符号の出現マップの対象ファイルＦｉのビットをＯＮにする（ステップＳ５７１１）。
【０２６４】
これにより、２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）を終了し、ステップＳ５００５に移行する。この２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）によれば、目標出現率Ｐｃに応じた順位以降の２グラム文字列の圧縮符号マップが２分割されるため、検索ノイズが重畳されずにメモリサイズの縮小を図ることができる。
【０２６５】
図５８および図５９は、図５４に示した２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）の詳細な処理手順例（その３）を示すフローチャートである。図５８および図５９は、分割順位Ｒ２ｇ以降の２グラム文字列の第１グラム（特定単一文字または分割文字コード）および第２グラム（特定単一文字または分割文字コード）について分割する例である。
【０２６６】
図５８において、まず、コンピュータは、図５４の２グラム文字列特定処理（ステップＳ５４０１）で特定された２グラム文字列の第１グラム（特定単一文字または分割文字コード）について、２N分枝無節点ハフマン木の葉にアクセスして、圧縮符号を取得する（ステップＳ５８０１）。そして、コンピュータは、取得した第１グラムの圧縮符号を上位コードと下位コードとに分割する（ステップＳ５８０２）。
【０２６７】
つぎに、コンピュータは、第２グラム（特定単一文字または分割文字コード）についても２N分枝無節点ハフマン木の葉にアクセスして、圧縮符号を取得する（ステップＳ５８０３）。そして、コンピュータは、取得した第２グラムの圧縮符号を上位コードと下位コードとに分割する（ステップＳ５８０４）。
【０２６８】
このあと、コンピュータは、第１グラムの圧縮符号の上位コード（第１グラム上位コード）と第２グラムの圧縮符号の上位コード（第２グラム上位コード）とを連結する（ステップＳ５８０５）。
【０２６９】
そして、コンピュータは、ステップＳ５８０５での連結符号をポインタとする出現マップが設定済みであるか否かを判断する（ステップＳ５８０６）。設定済みである場合（ステップＳ５８０６：Ｙｅｓ）、ステップＳ５８０８に移行する。
【０２７０】
一方、設定済みでない場合（ステップＳ５８０６：Ｎｏ）、コンピュータは、連結符号をポインタに設定する（ステップＳ５８０７）。このあと、ステップＳ５８０８では、コンピュータは、連結符号の出現マップの対象ファイルＦｉのビットをＯＮにする（ステップＳ５８０８）。そして、図５９のステップＳ５９０１に移行する。
【０２７１】
また、図５９において、同様に、コンピュータは、第１グラム上位コードと第２グラムの圧縮符号の下位コード（第２グラム下位コード）とを連結する（ステップＳ５９０１）。そして、コンピュータは、ステップＳ５９０１での連結符号をポインタとする出現マップが設定済みであるか否かを判断する（ステップＳ５９０２）。設定済みである場合（ステップＳ５９０２：Ｙｅｓ）、ステップＳ５９０４に移行する。
【０２７２】
一方、設定済みでない場合（ステップＳ５９０２：Ｎｏ）、コンピュータは、連結符号をポインタに設定する（ステップＳ５９０３）。このあと、ステップＳ５９０４では、コンピュータは、連結符号の出現マップの対象ファイルＦｉのビットをＯＮにする（ステップＳ５９０４）。
【０２７３】
また、同様に、コンピュータは、第１グラムの圧縮符号の下位コード（第１グラム下位コード）と第２グラム上位コードとを連結する（ステップＳ５９０５）。そして、コンピュータは、ステップＳ５９０５での連結符号をポインタとする出現マップが設定済みであるか否かを判断する（ステップＳ５９０６）。設定済みである場合（ステップＳ５９０６：Ｙｅｓ）、ステップＳ５９０８に移行する。
【０２７４】
一方、設定済みでない場合（ステップＳ５９０６：Ｎｏ）、コンピュータは、連結符号をポインタに設定する（ステップＳ５９０７）。このあと、ステップＳ５９０８では、コンピュータは、連結符号の出現マップの対象ファイルＦｉのビットをＯＮにする（ステップＳ５９０８）。
【０２７５】
また、同様に、コンピュータは、第１グラム下位コードと第２グラム下位コードとを連結する（ステップＳ５９０９）。そして、コンピュータは、ステップＳ５９０９での連結符号をポインタとする出現マップが設定済みであるか否かを判断する（ステップＳ５９１０）。設定済みである場合（ステップＳ５９１０：Ｙｅｓ）、ステップＳ５９１２に移行する。
【０２７６】
一方、設定済みでない場合（ステップＳ５９１０：Ｎｏ）、コンピュータは、連結符号をポインタに設定する（ステップＳ５９１１）。このあと、ステップＳ５９１２では、コンピュータは、連結符号の出現マップの対象ファイルＦｉのビットをＯＮにする（ステップＳ５９１２）。
【０２７７】
これにより、２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）を終了し、ステップＳ５００５に移行する。この２グラム文字列出現マップ（分割）生成処理（ステップＳ５４０５）によれば、目標出現率Ｐｃに応じた順位以降の２グラム文字列の圧縮符号マップが４分割されるため、検索ノイズが重畳されずにメモリサイズの縮小を図ることができる。
【０２７８】
＜圧縮処理の具体例＞
つぎに、対象ファイルＦｉの圧縮処理の具体例について説明する。上述のように、圧縮符号マップを生成した場合は、検索文字列を圧縮した圧縮符号列により圧縮符号マップ内の出現マップをポイントすることが可能となる。以下、圧縮処理の具体例について説明する。
【０２７９】
図６０は、２N分枝無節点ハフマン木を用いた圧縮処理の具体例を示す説明図である。まず、コンピュータは、対象ファイル群Ｆｓから１文字目の圧縮対象文字コードを取得し、対象ファイルＦｉ上の位置を保持しておく。そして、コンピュータは、基礎単語の構造体に対して２分木探索をおこなう。基礎単語は２文字以上の文字コード列であるため、１文字目の圧縮対象文字コードがヒットした場合、２文字目の文字コードを圧縮対象文字コードとして取得する。
【０２８０】
そして、２文字目の文字コードは、１文字目の圧縮対象文字コードがヒットした位置から探索する。３文字目以降も、不一致の圧縮対象文字コードが出現するまで繰り返し２分木探索をおこなう。一致する基礎単語ｒａ（ａは葉の番号）が探索された場合、基礎単語の構造体において対応付けされている葉Ｌａへのポインタにより葉Ｌａの構造体にアクセスする。そして、コンピュータは、アクセス先の葉Ｌａの構造体に格納されている基礎単語ｒａの圧縮符号を探索して、圧縮バッファ６０００に格納する。
【０２８１】
一方、不一致の圧縮文字コードが出現した場合、基礎単語の構造体に対する２分木探索を終了する（ＥＯＴ（Ｅｎｄ  Ｏｆ  Ｔｒａｎｓｍｉｓｓｉｏｎ）まで進む）。そして、コンピュータは、１文字目の圧縮対象文字コードを再度レジスタにセットして、特定単一文字の構造体に対する２分木探索をおこなう。
【０２８２】
一致する文字コードｅｂ（ｂは葉の番号）が探索された場合、コンピュータは、その葉Ｌｂへのポインタにより葉Ｌｂの構造体にアクセスする。そして、コンピュータは、アクセス先の葉Ｌｂの構造体に格納されている文字コードｅｂの圧縮符号を探索して、圧縮バッファ６０００に格納する。
【０２８３】
一方、一致する文字コードが出現せず２分木探索を終了した場合、圧縮対象文字コードは特定単一文字コードではないため、コンピュータは、上位８ビットと下位８ビットに分割する。そして、コンピュータは、上位８ビットの分割文字コードについて、分割文字コードの構造体に対する２分木探索をおこなう。一致する分割文字コードＤｃ１（ｃ１は葉の番号）が探索された場合、コンピュータは、その葉Ｌｃ１へのポインタにより葉Ｌｃ１の構造体にアクセスする。そして、コンピュータは、アクセス先の葉Ｌｃ１の構造体に格納されている分割文字コードＤｃ１の圧縮符号を探索して、圧縮バッファ６０００に格納する。
【０２８４】
引き続き、コンピュータは、下位８ビットの分割文字コードについて、分割文字コードの構造体に対する２分木探索をおこなう。一致する分割文字コードＤｃ２（ｃ２は葉の番号）が探索された場合、コンピュータは、その葉Ｌｃ２へのポインタにより葉Ｌｃ２の構造体にアクセスする。そして、コンピュータは、アクセス先の葉Ｌｃ２の構造体に格納されている分割文字コードＤｃ２の圧縮符号を探索して、圧縮バッファ６０００に格納する。これにより、対象ファイルＦｉが圧縮されることとなる。
【０２８５】
＜対象ファイル群Ｆｓの圧縮処理＞
つぎに、対象ファイル群Ｆｓの圧縮処理の処理手順について説明する。
【０２８６】
図６１は、コンピュータが自動実行する２N分枝無節点ハフマン木を用いた対象ファイル群Ｆｓの圧縮処理手順例を示すフローチャートである。まず、コンピュータは、ファイル番号：ｐをｐ＝１とし（ステップＳ６１０１）、対象ファイルＦｐを読み込む（ステップＳ６１０２）。つぎに、コンピュータは、圧縮処理を実行して（ステップＳ６１０３）、ファイル番号：ｐをインクリメントする（ステップＳ６１０４）。圧縮処理（ステップＳ６１０３）の詳細は図６２で説明する。
【０２８７】
そして、コンピュータは、ｐ＞ｎであるか否かを判断する（ステップＳ６１０５）。ｎは対象ファイル群Ｆｓの総数である。ｐ＞ｎでない場合（ステップＳ６１０５：Ｎｏ）、ステップＳ６１０２に戻る。一方、ｐ＞ｎである場合（ステップＳ６１０５：Ｙｅｓ）、対象ファイル群Ｆｓの圧縮処理を終了する。
【０２８８】
図６２は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その１）である。図６２において、まず、コンピュータは、対象ファイル群Ｆｓに圧縮対象文字コードがあるか否かを判断する（ステップＳ６２０１）。ある場合（ステップＳ６２０１：Ｙｅｓ）、コンピュータは、圧縮対象文字コードを取得してレジスタにセットする（ステップＳ６２０２）。そして、コンピュータは、先頭の圧縮対象文字コードか否かを判断する（ステップＳ６２０３）。
【０２８９】
ここで、先頭の圧縮対象文字コードとは、未圧縮の１文字目の文字コードをいう。先頭である場合（ステップＳ６２０３：Ｙｅｓ）、コンピュータは、その圧縮対象文字コードの対象ファイル群Ｆｓ上の位置（先頭位置）となるポインタを取得し（ステップＳ６２０４）、ステップＳ６２０５に移行する。一方、先頭でない場合（ステップＳ６２０３：Ｎｏ）、先頭位置を取得せずにステップＳ６２０５に移行する。
【０２９０】
そして、コンピュータは、基礎単語の構造体に対して２分木探索をおこなう（ステップＳ６２０５）。圧縮対象文字コードが一致した場合（ステップＳ６２０６：Ｙｅｓ）、コンピュータは、連続して一致した文字コード列が基礎単語（の文字コード列）に該当するか否かを判断する（ステップＳ６２０７）。該当しない場合（ステップＳ６２０７：Ｎｏ）、コンピュータは、ステップＳ６２０２に戻って後続の文字コードを圧縮対象文字コードとして取得する。この場合、後続の文字コードは先頭ではないため、先頭位置は取得しないこととなる。
【０２９１】
一方、ステップＳ６２０７において、基礎単語に該当する場合（ステップＳ６２０７：Ｙｅｓ）、コンピュータは、該当する基礎単語の葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ６２０８）。そして、コンピュータは、ポイントされた葉Ｌ♯の構造体に格納されている基礎単語の圧縮符号を抽出する（ステップＳ６２０９）。
【０２９２】
この後、コンピュータは、抽出された圧縮符号を圧縮バッファ６０００に格納して（ステップＳ６２１０）、ステップＳ６２０１に戻る。このループが基礎単語の圧縮処理の流れとなる。ステップＳ６２０１において、圧縮対象文字コードがない場合（ステップＳ６２０１：Ｎｏ）、コンピュータは、対象ファイルＦｐから圧縮された圧縮ファイルｆｐを圧縮バッファ６０００からファイル出力して保存する（ステップＳ６２１１）。そして、ステップＳ６１０４に移行する。一方、ステップＳ６２０６において不一致となった場合（ステップＳ６２０６：Ｎｏ）、１６ビットの文字コードの圧縮処理のループに入る。
【０２９３】
図６３は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その２）である。図６３において、コンピュータは、ステップＳ６２０４で取得された先頭位置のポインタを参照して、対象ファイル群Ｆｓから圧縮対象文字コードを取得してレジスタにセットする（ステップＳ６３０１）。
【０２９４】
つぎに、コンピュータは、圧縮対象文字コードについて、特定単一文字コードの構造体に対して２分木探索をおこなう（ステップＳ６３０２）。一致した場合（ステップＳ６３０３：Ｙｅｓ）、コンピュータは、該当する文字の葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ６３０４）。そして、コンピュータは、ポイントされた葉Ｌ♯の構造体に格納されている圧縮対象文字コードの圧縮符号を抽出する（ステップＳ６３０５）。
【０２９５】
この後、コンピュータは、探索された圧縮符号を圧縮バッファ６０００に格納して（ステップＳ６３０６）、ステップＳ６２０１に戻る。このループが１６ビットの文字コードの圧縮処理の流れとなる。一方、ステップＳ６３０３において一致する文字コードが存在しなかった場合（ステップＳ６３０３：Ｎｏ）、分割文字コードの圧縮処理のループに入る。
【０２９６】
図６４は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その３）である。図６４において、まず、コンピュータは、圧縮対象文字コードを上位８ビットと下位８ビットとに分割し（ステップＳ６４０１）、上位８ビットの分割文字コードを抽出する（ステップＳ６４０２）。そして、コンピュータは、分割文字コードの構造体に対して２分木探索をおこなう（ステップＳ６４０３）。
【０２９７】
そして、コンピュータは、探索された分割文字コードの葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ６４０４）。そして、コンピュータは、ポイントされた葉Ｌ♯の構造体に格納されている分割文字コードの圧縮符号を抽出する（ステップＳ６４０５）。この後、コンピュータは、探索された圧縮符号を圧縮バッファ６０００に格納する（ステップＳ６４０６）。
【０２９８】
つぎに、コンピュータは、下位８ビットが探索済みか否かを判断し（ステップＳ６４０７）、探索済みでない場合（ステップＳ６４０７：Ｎｏ）、コンピュータは、下位８ビットの分割文字コードを抽出して（ステップＳ６４０８）、ステップＳ６４０３〜Ｓ６４０６を実行する。一方、下位８ビットが探索済みである場合（ステップＳ６４０７：Ｙｅｓ）、ステップＳ６２０１に戻り、基礎単語の圧縮処理のループに入る。
【０２９９】
このように、２N分枝無節点ハフマン木を用いた圧縮処理では、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉Ｌ♯の構造体に格納されている文字情報を抽出して、圧縮バッファ６０００に書き込むだけでよい。したがって、圧縮処理の高速化を図ることができる。
【０３００】
また、圧縮対象文字コードが格納されている葉Ｌ♯の構造体を、基礎単語の構造体、特定単一文字コードの構造体および分割文字コードの構造体により即座に特定することができる。したがって、２N分枝無節点ハフマン木の葉を探索する必要がなく、圧縮処理の高速化を図ることができる。また、低位文字コードを上位ビットコードと下位ビットコードに分割することで、非特定単一文字を２５６種の分割文字コードの圧縮符号に圧縮することができる。したがって、圧縮率の向上を図ることができる。
【０３０１】
＜検索処理＞
つぎに、圧縮符号マップを用いた検索処理の流れ（Ａ）〜（Ｄ）について図６５〜図６７を用いて説明する。ここでは、検索文字列を「するめ」とした場合について説明する。
【０３０２】
図６５は、圧縮符号マップを用いた検索処理の流れ（Ａ）を示す説明図である。図６５において、（Ａ）検索処理では、検索文字列を構成する各文字情報「す」、「る」、「め」について、圧縮処理と同様の処理により、２N分枝無節点ハフマン木にアクセスして圧縮符号を取得する。そして、コンピュータは、検索文字列を構成する文字情報「す」、「る」、「め」ごとに、特定単一文字の圧縮符号マップから「す」の出現マップ、「る」の出現マップ、「め」の出現マップを取得する。
【０３０３】
図６６は、圧縮符号マップを用いた検索処理の流れ（Ｂ）を示す説明図である。図６５の（Ａ）のあと、検索文字列「するめ」を構成する２グラム文字列「する」、「るめ」について、分割順位以降であるか否かを判断する。「する」は分割順位よりも上位であるため、コンピュータは、「す」の圧縮符号および「る」の圧縮符号を連結した圧縮符号列でポイントすることにより、２グラム文字列の圧縮符号マップから「する」の出現マップを取得する。
【０３０４】
一方、「るめ」については、分割順位以降であるため、コンピュータは、第１グラム「る」の圧縮符号の上位コード（第１グラム上位コード）と第２グラム「め」の圧縮符号の上位コード（第２グラム上位コード）との連結符号でポイントする。これにより、コンピュータは、第１グラム上位コードおよび第２グラム上位コードの圧縮符号マップから、２グラム文字列について第１グラム「る」の上位コード「０ｘ８Ｂ」および第２グラム「め」の上位コード「０ｘ８１」となる出現マップを取得する。
【０３０５】
同様に、コンピュータは、第１グラム「る」の圧縮符号の上位コード（第１グラム上位コード）と第２グラム「め」の圧縮符号の下位コード（第２グラム下位コード）との連結符号でポイントする。これにより、コンピュータは、第１グラム上位コードおよび第２グラム下位コードの圧縮符号マップから、２グラム文字列について第１グラム「る」の上位コード「０ｘ８Ｂ」および第２グラム「め」の下位コード「０ｘ３０」となる出現マップを取得する。
【０３０６】
同様に、コンピュータは、第１グラム「る」の圧縮符号の下位コード（第１グラム下位コード）と第２グラム「め」の圧縮符号の上位コード（第２グラム上位コード）との連結符号でポイントする。これにより、コンピュータは、第１グラム下位コードおよび第２グラム上位コードの圧縮符号マップから、２グラム文字列について第１グラム「る」の下位コード「０ｘ３０」および第２グラム「め」の上位コード「０ｘ８１」となる出現マップを取得する。
【０３０７】
同様に、コンピュータは、第１グラム「る」の圧縮符号の下位コード（第１グラム下位コード）と第２グラム「め」の圧縮符号の下位コード（第２グラム下位コード）との連結符号でポイントする。これにより、コンピュータは、第１グラム下位コードおよび第２グラム下位コードの圧縮符号マップから、２グラム文字列について第１グラム「る」の下位コード「０ｘ３０」および第２グラム「め」の下位コード「０ｘ３０」となる出現マップを取得する。
【０３０８】
図６７は、圧縮符号マップを用いた検索処理の流れ（Ｃ）、（Ｄ）を示す説明図である。（Ｃ）では、コンピュータが、図６６の（Ｂ）において取得された各出現マップをＡＮＤ演算することで「するめ」が存在する可能性がある圧縮ファイルｆｉを圧縮ファイル群ｆｓから絞り込むことができる。
【０３０９】
（Ｄ）そして、コンピュータは、検索文字列を２N分枝無節点ハフマン木で圧縮した圧縮文字列を用いて、（Ｃ）で絞り込まれた圧縮ファイルｆｉを圧縮状態のまま、圧縮文字列と照合し、置換（たとえば、カラー表示のタグでの挟み込み）しながら圧縮ファイルｆｉを伸張する。
【０３１０】
＜照合・伸張例＞
つぎに、図６７の（Ｄ）による照合・伸張例について具体的に説明する。ここでは、検索文字列「するめ」の圧縮符号列を用いて圧縮ファイルｆｉについて照合しながら伸張する例について説明する。なお、例として、特定単一文字「す」の圧縮符号を「１１０００１００１１」（１０ビット）とし、特定単一文字「る」の圧縮符号を「０１０００１００１０」（８ビット）とし、特定単一文字「め」の圧縮符号を「１０１００１０１００」（１０ビット）とする。
【０３１１】
また、伸長処理では、レジスタに圧縮符号列をセットし、マスクパターンにより圧縮符号を抽出する。抽出した圧縮符号を、１パス（１枝分のアクセス）で２N分枝無節点ハフマン木の根から探索する。そして、アクセスした葉Ｌ♯の構造体に格納されている文字コードを読み出して伸長バッファに格納する。
【０３１２】
また、圧縮符号を抽出するため、マスクパターンのマスク位置をオフセットする。また、マスクパターンの初期値を"０ｘＦＦＦ０００００"とする。このマスクパターンは先頭１２ビットが“１”であり、後続の２０ビットが“０”のビット列である。
【０３１３】
図６８〜図７０は、図６７の（Ｄ）による照合・伸張例を示す説明図である。図６８では、特定単一文字「す」について照合・伸張する例（Ａ）を示している。図６８において、まず、ＣＰＵは、ビットアドレスａｂｉとバイトオフセットｂｙｏｓとビットオフセットｂｉｏｓとを算出する。ビットアドレスａｂｉは、抽出された圧縮符号のビット位置を示す値であり、今回のビットアドレスａｂｉは、前回のビットアドレスａｂｉに前回抽出された圧縮符号の圧縮符号長ｌｅｇを加算した値となる。なお、初期状態では、ビットアドレスａｂｉはａｂｉ＝０とする。
【０３１４】
バイトオフセットｂｙｏｓは、メモリに保持されている圧縮符号列のバイト境界を示す値であり、ビットアドレスａｂｉ／８の商で求められる。たとえば、バイトオフセットｂｙｏｓ＝０のときは、メモリに記憶されている先頭からの圧縮符号列をレジスタにセットし、バイトオフセットｂｙｏｓ＝１のときは、メモリに記憶されている先頭１バイト目からの圧縮符号列をレジスタにセットする。
【０３１５】
また、ビットオフセットｂｉｏｓは、マスクパターンのマスク位置（“ＦＦＦ”）をオフセットする値であり、ビットアドレスａｂｉ／８の余りである。たとえば、ビットオフセットｂｉｏｓ＝０のときは、マスク位置はシフトされないこととなり、マスクパターンは、"０ｘＦＦＦ０００００"となる。一方、ビットオフセットｂｉｏｓ＝４のときは、マスク位置は末尾方向に４ビットシフトすることとなり、マスクパターンは、"０ｘ０ＦＦＦ００００"となる。
【０３１６】
レジスタシフト数ｒｓは、マスクパターンとのＡＮＤ演算後のレジスタ内の圧縮符号列を末尾方向にシフトするビット数であり、ｒｓ＝３２−１２−ｂｉｏｓで求められる。このシフトにより、シフト後のレジスタの末尾ｍビットのビット列を対象ビット列として抽出する。対象ビット列の抽出後はレジスタをクリアする。
【０３１７】
なお、メモリ内のブロックは１バイトのビット列を示しており、内部の数字は、バイト境界となるバイト位置を示している。図６８では、ビットアドレスａｂｉ＝０により、バイトオフセットｂｙｏｓ＝０、ビットオフセットｂｉｏｓ＝０となる。バイトオフセットｂｙｏｓ＝０により、メモリに保持されている圧縮符号列のうち先頭から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０３１８】
また、ビットオフセットｂｉｏｓ＝０により、マスクパターンは、“０ｘＦＦＦ０００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘＦＦＦ０００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０３１９】
また、ビットオフセットｂｉｏｓ＝０により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−０＝２０となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に２０ビット分シフトする。このシフトによりレジスタには、“１１０００１００１１００”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“１１０００１００１１００”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０３２０】
２N分枝無節点ハフマン木の根の構造体には、抽出された対象ビット列“１１０００１００１１００”があるため、この対象ビット列と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、葉Ｌ６９１へのポインタ群の中の１つと一致するため、該当する葉Ｌ６９１へのポインタを読み出して、葉Ｌ６９１の構造体にアクセスする。
【０３２１】
葉Ｌ６９１の構造体には、文字コード“０ｘ５９３０”が格納されているため、当該文字コード“０ｘ５９３０”を抽出して伸長バッファに格納する。また、葉Ｌ６９１の構造体には、文字コード“０ｘ５９３０”の圧縮符号長ｌｅｇ（＝１０ビット）も格納されているため、文字コード“０ｘ５９３０”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝０＋１０＝１０となる。
【０３２２】
図６９では、特定単一文字「る」について照合・伸張する例（Ｂ）を示している。具体的には、図６８の状態（Ａ）からレジスタをバイトオフセットｂｉｏｓ分シフトした場合、前回である（Ａ）のビットアドレスａｂｉはａｂｉ＝０、圧縮符号長ｌｅｇは１０ビットであるため、（Ｂ）のビットアドレスａｂｉはａｂｉ＝１０ビットとなる。
【０３２３】
また、このビットアドレスａｂｉ＝１０により、バイトオフセットｂｙｏｓ＝１、ビットオフセットｂｉｏｓ＝２となる。バイトオフセットｂｙｏｓ＝１により、メモリに保持されている圧縮符号列のうち先頭１バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０３２４】
また、ビットオフセットｂｉｏｓ＝２により、マスクパターンは、“０ｘ３ＦＦＣ００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘ３ＦＦＣ００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０３２５】
また、ビットオフセットｂｉｏｓ＝２により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−２＝１８となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に１８ビット分シフトする。このシフトによりレジスタには、“０００００１０００１００１０”が残されるため、末尾１４ビットを対象ビット列として抽出する。この場合は、“０１０００１００１０”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０３２６】
２N分枝無節点ハフマン木の根の構造体には、抽出された対象ビット列“０１０００１００１０”があるため、このビット列と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“０１０００１００１０”が葉Ｌ２４へのポインタ群の中の１つと一致するため、該当する葉Ｌ２４へのポインタを読み出して、葉Ｌ２４の構造体にアクセスする。
【０３２７】
葉Ｌ２４の構造体には、文字コード“０ｘ８Ｂ３０”が格納されているため、当該文字コード“０ｘ８Ｂ３０”を抽出して伸長バッファに格納する。また、葉Ｌ２４の構造体には、文字コード“０ｘ８Ｂ３０”の圧縮符号長ｌｅｇ（＝８ビット）も格納されているため、文字コード“０ｘ８Ｂ３０”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝１０＋８＝１８となる。
【０３２８】
図７０では、特定単一文字「め」について照合・伸張する例（Ｃ）を示している。具体的には、図６９の状態（Ｂ）からレジスタをバイトオフセットｂｉｏｓ分シフトした場合、前回である（Ｂ）のビットアドレスａｂｉはａｂｉ＝１０、圧縮符号長ｌｅｇは８ビットであるため、（Ｃ）のビットアドレスａｂｉはａｂｉ＝１８ビットとなる。
【０３２９】
また、このビットアドレスａｂｉ＝１８により、バイトオフセットｂｙｏｓ＝２、ビットオフセットｂｉｏｓ＝２となる。バイトオフセットｂｙｏｓ＝２により、メモリに保持されている圧縮符号列のうち先頭２バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０３３０】
また、ビットオフセットｂｉｏｓ＝２により、マスクパターンは、“０ｘ３ＦＦＣ００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘ３ＦＦＣ００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０３３１】
また、ビットオフセットｂｉｏｓ＝２により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−２＝１８となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に１８ビット分シフトする。このシフトによりレジスタには、“００００１０１００１００００”が残されるため、末尾１４ビットを対象ビット列として抽出する。この場合は、“１０１００１００００”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０３３２】
２N分枝無節点ハフマン木の根の構造体には、抽出された対象ビット列“１０１００１００００”があるため、このビット列と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“１０１００１００００”が葉Ｌ１６７へのポインタ群の中の１つと一致するため、該当する葉Ｌ１６７へのポインタを読み出して、葉Ｌ１６７の構造体にアクセスする。
【０３３３】
葉Ｌ１６７の構造体には、文字コード“０ｘ８１３０”が格納されているため、当該文字コード“０ｘ８１３０”を抽出して伸長バッファに格納する。また、葉Ｌ１６７の構造体には、文字コード“０ｘ８１３０”の圧縮符号長ｌｅｇ（＝１０ビット）も格納されているため、文字コード“０ｘ８１３０”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝１８＋１０＝２８となる。
【０３３４】
＜検索処理手順＞
図７１は、本実施の形態にかかる検索処理手順を示すフローチャートである。まず、コンピュータは、検索文字列の入力を待ち受け（ステップＳ７１０１：Ｎｏ）、検索文字列が入力された場合（ステップＳ７１０１：Ｙｅｓ）、ファイル絞込み処理（ステップＳ７１０２）、伸長処理（ステップＳ７１０３）を実行する。ファイル絞込み処理（ステップＳ７１０２）は、図６７の（Ｃ）に示したように、圧縮ファイル群ｆｓの中から検索文字列を構成する文字情報が存在する対象ファイルＦｉの圧縮ファイルｆｉを絞り込む。ファイル絞込み処理（ステップＳ７１０２）の詳細は、図７２および図７３で説明する。
【０３３５】
伸長処理（ステップＳ７１０３）は、ファイル絞込み処理（ステップＳ７１０２）で絞り込まれた圧縮ファイルｆｉを伸長する過程で、図６７の（Ｄ）に示したように、伸長対象となる圧縮符号列と検索文字列の圧縮文字列とを照合する。伸長処理（ステップＳ７１０３）の詳細は、図７４および図７５で説明する。
【０３３６】
図７２は、図７１に示したファイル絞込み処理（ステップＳ７１０２）の詳細な処理手順を示すフローチャート（その１）である。まず、コンピュータは、検索文字列を対象文字列に設定し（ステップＳ７２０１）、最長一致検索処理を実行する（ステップＳ７２０２）。最長一致検索処理（ステップＳ７２０２）は、図３６に示した最長一致検索処理（ステップＳ３４０１）と同一処理であるため説明を省略する。
【０３３７】
そして、コンピュータは、基礎単語の構造体において、最長一致検索処理（ステップＳ７２０２）で得られた最長一致検索結果を２分探索する（ステップＳ７２０３）。最長一致検索結果が、基礎単語の構造体で探索された場合（ステップＳ７２０３：Ｙｅｓ）、対象文字列である基礎単語について、その基礎単語の出現マップを基礎単語の出現マップ群から取得する（ステップＳ７２０４）。
【０３３８】
そして、コンピュータは、対象文字列に後続があるか否かを判断する（ステップＳ７２０５）。後続がある場合（ステップＳ７２０５：Ｙｅｓ）、コンピュータは、後続文字列を対象文字列に設定して（ステップＳ７２０６）、最長一致検索処理（ステップＳ７２０２）に戻る。一方、後続がない場合（ステップＳ７２０５：Ｎｏ）、これまでに取得された出現マップ群のＡＮＤ演算で対象ファイルを絞り込む（ステップＳ７２０７）。これにより、ファイル絞込み処理（ステップＳ７１０２）は終了し、伸長処理（ステップＳ７１０３）に移行する。
【０３３９】
また、ステップＳ７２０３において、最長一致検索結果が、基礎単語の構造体で探索されなかった場合（ステップＳ７２０３：Ｎｏ）、図７３のステップＳ７３０１に移行する。具体的には、最長一致検索結果が基礎単語の構造体に登録されていない場合、または、最長一致検索で最長一致候補がなかった場合（ステップＳ７２０３：Ｎｏ）に、図７３のステップＳ７３０１に移行する。
【０３４０】
図７３は、図７１に示したファイル絞込み処理（ステップＳ７１０２）の詳細な処理手順を示すフローチャート（その２）である。図７３では、対象文字列を構成する文字ごとに、出現マップを取得する処理を示している。
【０３４１】
まず、コンピュータは、対象文字列の先頭文字を対象文字に設定する（ステップＳ７３０１）。つぎに、コンピュータは、特定単一文字の構造体において対象文字を２分探索する（ステップＳ７３０２）。対象文字が探索された場合（ステップＳ７３０３：Ｙｅｓ）、コンピュータは、特定単一文字の圧縮符号マップから対象文字の出現マップを取得する（ステップＳ７３０４）。そして、図７２のステップＳ７２０５に戻る。
【０３４２】
一方、ステップＳ７３０３において、探索されなかった場合（ステップＳ７３０３：Ｎｏ）、コンピュータは、対象文字を上位８ビットと下位８ビットに分割する（ステップＳ７３０５）。そして、コンピュータは、上位分割文字コードの圧縮符号マップの中から、ステップＳ７３０５の分割で得られた上位分割文字コードの出現マップを取得する（ステップＳ７３０６）。このあと、コンピュータは、２グラム文字列特定処理を実行する（ステップＳ７３０９）。２グラム文字列特定処理（ステップＳ７３０９）は、図４２に示した２グラム文字列特定処理（ステップＳ３９０６）と同一処理であるため説明を省略する。
【０３４３】
また、コンピュータは、下位分割文字コードの圧縮符号マップの中から、ステップＳ７３０５の分割で得られた下位分割文字コードの出現マップを取得する（ステップＳ７３０７）。また、コンピュータは、対象文字やステップＳ７５０５で分割された分割文字コードについて、２N分枝無節点ハフマン木の葉にアクセスし、照合フラグをＯＮにする（ステップＳ７３０８）。このあと、コンピュータは、２グラム文字列特定処理を実行する（ステップＳ７３０９）。
【０３４４】
そして、コンピュータは、２グラム文字列特定処理（ステップＳ７３０９）で２グラム文字列が特定されなかった場合（ステップＳ７３１０：Ｎｏ）、図７２のステップＳ７２０５に戻る。一方、２グラム文字列が特定された場合（ステップＳ７３１０：Ｙｅｓ）、特定された２グラム文字列の出現順位が分割順位Ｒ２ｇより上位であるか否かを判断する（ステップＳ７３１１）。
【０３４５】
分割順位Ｒ２ｇより上位である場合（ステップＳ７３１１：Ｙｅｓ）、コンピュータは、非分割の２グラム文字列の出現マップを取得する（ステップＳ７３１２）。具体的には、たとえば、コンピュータは、第１グラムの圧縮符号および第２グラムの圧縮符号を２N分枝無節点ハフマン木にアクセスすることで取得、連結し、２グラム文字列の圧縮符号マップから連結圧縮符号で指定された出現マップを取得する。
【０３４６】
一方、分割順位Ｒ２ｇ以降である場合（ステップＳ７３１１：Ｎｏ）、コンピュータは、連結符号群を生成する（ステップＳ７３１３）。具体的には、たとえば、コンピュータは、第１グラムの圧縮符号および第２グラムの圧縮符号を２N分枝無節点ハフマン木にアクセスすることで取得する。つぎに、４分割の場合、コンピュータは、第１グラムの圧縮符号および第２グラムの圧縮符号をそれぞれ上位コードと下位コードとに分割する。そして、第１グラム上位コードおよび第２グラム上位コードを連結した第１の連結符号、第１グラム上位コードおよび第２グラム下位コードを連結した第２の連結符号、第１グラム下位コードおよび第２グラム上位コードを連結した第３の連結符号、第１グラム下位コードおよび第２グラム下位コードを連結した第４の連結符号を生成する。
【０３４７】
そして、コンピュータは、２グラム文字列の出現マップ群を取得する（ステップＳ７３１４）。具体的には、たとえば、コンピュータは、第１分割圧縮符号マップから、ステップＳ７３１３で生成された第１の連結符号で指定された出現マップを取得する。また、コンピュータは、第２分割圧縮符号マップから、ステップＳ７３１３で生成された第２の連結符号で指定された出現マップを取得する。コンピュータは、第３分割圧縮符号マップから、ステップＳ７３１３で生成された第３の連結符号で指定された出現マップを取得する。コンピュータは、第４分割圧縮符号マップから、ステップＳ７３１３で生成された第４の連結符号で指定された出現マップを取得する。そして、図７２のステップＳ７２０５に戻る。
【０３４８】
このように、図７３に示した処理手順により、対象文字についての出現マップ群と２グラム文字列についての出現マップ群を取得することができる。したがって、図７２のステップＳ７２０７でのＡＮＤ演算により圧縮ファイルｆｉの絞込みができることとなる。
【０３４９】
図７４は、図７１に示した２N分枝無節点ハフマン木を用いた伸長処理（ステップＳ７１０３）の詳細な処理手順例を示すフローチャート（その１）である。図７４において、まず、コンピュータは、ビットアドレスａｂｉをａｂｉ＝０とし（ステップＳ７４０１）、バイトオフセットｂｙｏｓを算出し（ステップＳ７４０２）、ビットオフセットｂｉｏｓを算出する（ステップＳ７４０３）。そして、コンピュータは、バイトオフセットｂｙｏｓの位置からの圧縮符号列をレジスタｒ１にセットする（ステップＳ７４０４）。
【０３５０】
つぎに、コンピュータは、レジスタｒ２にセットされたマスクパターンをビットオフセットｂｉｏｓ分、末尾方向にシフトして（ステップＳ７４０５）、レジスタｒ１にセットされた圧縮符号列とのＡＮＤ演算をおこなう（ステップＳ７４０６）。このあと、コンピュータは、レジスタシフト数ｒｓを算出して（ステップＳ７４０７）、ＡＮＤ演算後のレジスタｒ２をレジスタシフト数ｒｓ分、末尾にシフトする（ステップＳ７４０８）。
【０３５１】
図７５は、図７１に示した２N分枝無節点ハフマン木を用いた伸長処理（ステップＳ７１０３）の詳細な処理手順例を示すフローチャート（その２）である。ステップＳ７４０８のあと、図７５において、コンピュータは、シフト後のレジスタｒ２から末尾Ｎビットを対象ビット列として抽出する（ステップＳ７５０１）。つぎに、コンピュータは、２N分枝無節点ハフマン木の根の構造体から葉Ｌ♯へのポインタを特定し（ステップＳ７５０２）、ポイント先となる葉Ｌ♯の構造体に１パスでアクセスする（ステップＳ７５０３）。このあと、コンピュータは、アクセス先の葉Ｌ♯の構造体の照合フラグがＯＮであるか否かを判断する（ステップＳ７５０４）。
【０３５２】
照合フラグがＯＮである場合（ステップＳ７５０４：Ｙｅｓ）、アクセス先の葉Ｌ♯の構造体内の文字情報について置換文字を伸長バッファに書き出して（ステップＳ７５０５）、ステップＳ７５０７に移行する。一方、照合フラグがＯＦＦの場合（ステップＳ７５０４：Ｎｏ）、アクセス先の葉Ｌ♯の構造体内の文字情報（伸長文字）を伸長バッファに書き出して（ステップＳ７５０６）、ステップＳ７５０７に移行する。
【０３５３】
ステップＳ７５０７では、コンピュータは、アクセス先の葉Ｌ♯の構造体から圧縮符号長ｌｅｇを抽出し（ステップＳ７５０７）、ビットアドレスａｂｉを更新する（ステップＳ７５０８）。このあと、コンピュータは、メモリに圧縮符号列があるか否か、具体的には、マスクパターンによるマスク処理が施されていない圧縮符号列があるか否かを判断する（ステップＳ７５０９）。たとえば、バイトオフセットｂｙｏｓに該当するバイト位置があるか否かにより判断する。圧縮符号列がある場合（ステップＳ７５０９：Ｙｅｓ）、図７４のステップＳ７４０２に戻る。一方、圧縮符号列がない場合（ステップＳ７５０９：Ｎｏ）、伸長処理（ステップＳ７１０３）を終了する。
【０３５４】
このような伸長処理（ステップＳ７１０３）により、圧縮状態のまま照合・伸長をおこなうことができ、伸長速度の高速化を図ることができる。
【０３５５】
以上説明したように、本実施の形態によれば、分割順位以降の２グラム文字列については２分割または４分割の出現マップ群を生成することで、圧縮符号マップのサイズ縮小と検索ノイズの低減化を図ることができる。
【０３５６】
また、対象ファイル群Ｆｓでの２グラム文字列の存否を示すビット列を連結符号で指定することで、圧縮符号マップの効率的なサイズ縮小を図ることができる。また、対象ファイル群Ｆｓを圧縮しない場合は、圧縮符号ではなく文字コードをそのまま利用することで、圧縮符号マップの分割処理の効率化を図ることができる。
【０３５７】
さらに、目標出現率に応じて分割順位を決定するため、２グラム文字列の総出現回数のうちどの程度の出現回数までの２グラム文字列の出現マップを分割対象外とするかを、容易に決定することができる。また、目標出現率を入力装置から操作入力することにより、利用者の要求に応じて分割順位を決定することができる。したがって、「この程度までの目標出現率であれば、検索ノイズを許容することができる」といったように、利用者の意図に応じて自由に決定することができ、圧縮符号マップの分割の自由度を高めることができる。
【０３５８】
また、目標出現率ではなく、単に２グラム文字列の出現回数について降順の順位により分割順位を決定することとしてもよい。この場合、目標出現率を用いた分割順位の計算を省略することができ、圧縮符号マップの分割処理の高速化を図ることができる。
【０３５９】
また、対象ファイル群Ｆｓに対しあらたに対象ファイルを追加する場合、追加後の対象ファイル群Ｆｓについて図３０に示した一連の処理を実行することで、圧縮符号マップの最適化を図ることができる。たとえば、対象ファイルＦｉが電子メールである場合、電子メールを送信または受信する都度、電子メールが保存されるため、あらたに保存された電子メールを追加した保存済みの電子メール群に対し、図３０に示した一連の処理を実行することとなる。
【０３６０】
また、圧縮符号を利用する場合、本実施の形態では、２N分枝無節点ハフマン木を採用している。２N分枝無節点ハフマン木を採用することで、文字情報ごとに圧縮符号に１パスでアクセスすることができるため、連結符号の生成の高速化を図ることができる。また、２N分枝無節点ハフマン木を用いることで、非圧縮の検索文字列が入力されても１パスで圧縮符号列に圧縮することができる。
【０３６１】
また、この圧縮符号列から連結符号を取り出すことで、分割された圧縮符号マップ内の出現マップに直接指定することができる。したがって、該当する出現マップを高速に抽出することができ、対象ファイル群Ｆｓを圧縮した圧縮ファイル群ｆｓから、２グラム文字列の圧縮符号列を含む圧縮ファイルｆｉを高速かつ高精度に絞り込むことができる。
【０３６２】
そして、このように絞り込まれた圧縮ファイルｆｉに対し、圧縮状態のまま圧縮文字列との照合、伸長をおこなうことで、メモリ使用量を最小限に抑えた検索処理を高速に実現することができる。
【０３６３】
また、上述した実施の形態では、２N分枝無節点ハフマン木および圧縮符号マップの生成と、検索と、を同一のコンピュータで実行する例について説明したが、別々のコンピュータで実行することとしてもよい。この場合、２N分枝無節点ハフマン木および圧縮符号マップを生成したコンピュータは、他のコンピュータに、対象ファイル群Ｆｓ（または圧縮ファイル群ｆｓ）、２N分枝無節点ハフマン木および圧縮符号マップを送信する。そして、他のコンピュータは、送信されてきた対象ファイル群Ｆｓ（または圧縮ファイル群ｆｓ）、２N分枝無節点ハフマン木および圧縮符号マップを用いて検索処理を実行することとなる。
【０３６４】
なお、本実施の形態においてフローチャートで説明した各処理は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。また、これらの処理について記述されたプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。
【符号の説明】
【０３６５】
ｆｓ  圧縮ファイル群
Ｆｓ  対象ファイル群
Ｍ２ａ  第１分割圧縮符号マップ（２分割）
Ｍ２ｂ  第２分割圧縮符号マップ（２分割）
Ｍ４ａ  第１分割圧縮符号マップ（４分割）
Ｍ４ｂ  第２分割圧縮符号マップ（４分割）
Ｍ４ｃ  第３分割圧縮符号マップ（４分割）
Ｍ４ｄ  第４分割圧縮符号マップ（４分割）
【図１】
0005605288.tif 000002
【図２】
0005605288.tif 000003
【図３】
0005605288.tif 000004
【図４】
0005605288.tif 000005
【図５】
0005605288.tif 000006
【図６】
0005605288.tif 000007
【図７】
0005605288.tif 000008
【図８】
0005605288.tif 000009
【図９】
0005605288.tif 000010
【図１０】
0005605288.tif 000011
【図１１】
0005605288.tif 000012
【図１２】
0005605288.tif 000013
【図１３】
0005605288.tif 000014
【図１４】
0005605288.tif 000015
【図１５】
0005605288.tif 000016
【図１６】
0005605288.tif 000017
【図１７】
0005605288.tif 000018
【図１８】
0005605288.tif 000019
【図１９】
0005605288.tif 000020
【図２０】
0005605288.tif 000021
【図２１】
0005605288.tif 000022
【図２２】
0005605288.tif 000023
【図２３】
0005605288.tif 000024
【図２４】
0005605288.tif 000025
【図２５】
0005605288.tif 000026
【図２６】
0005605288.tif 000027
【図２７】
0005605288.tif 000028
【図２８】
0005605288.tif 000029
【図２９】
0005605288.tif 000030
【図３０】
0005605288.tif 000031
【図３１】
0005605288.tif 000032
【図３２】
0005605288.tif 000033
【図３３】
0005605288.tif 000034
【図３４】
0005605288.tif 000035
【図３５】
0005605288.tif 000036
【図３６】
0005605288.tif 000037
【図３７】
0005605288.tif 000038
【図３８】
0005605288.tif 000039
【図３９】
0005605288.tif 000040
【図４０】
0005605288.tif 000041
【図４１】
0005605288.tif 000042
【図４２】
0005605288.tif 000043
【図４３】
0005605288.tif 000044
【図４４】
0005605288.tif 000045
【図４５】
0005605288.tif 000046
【図４６】
0005605288.tif 000047
【図４７】
0005605288.tif 000048
【図４８】
0005605288.tif 000049
【図４９】
0005605288.tif 000050
【図５０】
0005605288.tif 000051
【図５１】
0005605288.tif 000052
【図５２】
0005605288.tif 000053
【図５３】
0005605288.tif 000054
【図５４】
0005605288.tif 000055
【図５５】
0005605288.tif 000056
【図５６】
0005605288.tif 000057
【図５７】
0005605288.tif 000058
【図５８】
0005605288.tif 000059
【図５９】
0005605288.tif 000060
【図６０】
0005605288.tif 000061
【図６１】
0005605288.tif 000062
【図６２】
0005605288.tif 000063
【図６３】
0005605288.tif 000064
【図６４】
0005605288.tif 000065
【図６５】
0005605288.tif 000066
【図６６】
0005605288.tif 000067
【図６７】
0005605288.tif 000068
【図６８】
0005605288.tif 000069
【図６９】
0005605288.tif 000070
【図７０】
0005605288.tif 000071
【図７１】
0005605288.tif 000072
【図７２】
0005605288.tif 000073
【図７３】
0005605288.tif 000074
【図７４】
0005605288.tif 000075
【図７５】
0005605288.tif 000076
【図７６】
0005605288.tif 000077