(57)【特許請求の範囲】
【請求項１】
コンピュータに、
複数のテキストデータの少なくともいずれかに含まれる複数の要素それぞれについて、前記複数のテキストデータそれぞれに対する存否情報を生成し、
前記存否情報より、前記複数のテキストデータの軸に対し複数のハッシュ関数を適用した複数ハッシュ化軸を用いたハッシュ化インデックス情報を生成する際に、前記存否情報では独立であるが前記ハッシュ化インデックス情報では重複する衝突データの検知を行い、
前記検知された衝突が特定の条件を満たす場合、衝突データそれぞれに対し前記複数ハッシュ化軸のいずれか１つに対し追加の値を設定して対応づける
処理を実行させることを特徴とするインデックス生成プログラム。
【請求項２】
前記対応づける処理は、前記複数ハッシュ化軸のいずれか１つで連続して衝突が発生した場合に、前記衝突が発生したハッシュ化軸に対応する前記要素に対する存否情報を用いて存否の比率を集計し、集計した存否の比率のうち存在する率が閾値より大きい場合に、前記要素に対する存否情報を分割し、前記複数ハッシュ化軸のいずれか１つに対し分割先を設定して対応づける
処理を実行させることを特徴とする請求項１に記載のインデックス生成プログラム。
【請求項３】
前記要素に対する存否情報が分割された場合の前記分割先を、前記要素の低頻度単語の領域とする
ことを特徴とする請求項２に記載のインデックス生成プログラム。
【請求項４】
前記ハッシュ化軸の大きさは、レジスタの大きさに合わせたビット数である
ことを特徴とする請求項１または請求項２に記載のインデックス生成プログラム。
【請求項５】
前記複数の要素の単位は、単語単位である
ことを特徴とする請求項１に記載のインデックス生成プログラム。
【請求項６】
前記複数の要素の単位は、Ｎグラム（Ｎは２以上）の文字単位である
ことを特徴とする請求項１に記載のインデックス生成プログラム。
【請求項７】
コンピュータが、
複数のテキストデータの少なくともいずれかに含まれる複数の要素それぞれについて、前記複数のテキストデータそれぞれに対する存否情報を生成し、
前記存否情報より、前記複数のテキストデータの軸に対し複数のハッシュ関数を適用した複数ハッシュ化軸を用いたハッシュ化インデックス情報を生成する際に、前記存否情報では独立であるが前記ハッシュ化インデックス情報では重複する衝突データの検知を行い、
前記検知された衝突が特定の条件を満たす場合、衝突データそれぞれに対し前記複数ハッシュ化軸のいずれか１つに対し追加の値を設定して対応づける
各処理を実行することを特徴とするインデックス生成方法。
【請求項８】
複数のテキストデータの少なくともいずれかに含まれる複数の要素それぞれについて、前記複数のテキストデータそれぞれに対する存否情報を生成する生成部と、
前記生成部によって生成された存否情報より、前記複数のテキストデータの軸に対し複数のハッシュ関数を適用した複数ハッシュ化軸を用いたハッシュ化インデックス情報を生成する際に、前記存否情報では独立であるが前記ハッシュ化インデックス情報では重複する衝突データの検知を行う検知部と、
前記検知部によって検知された衝突が特定の条件を満たす場合、衝突データそれぞれに対し前記複数ハッシュ化軸のいずれか１つに対し追加の値を設定して対応づける設定部と、
を有することを特徴とするインデックス生成装置。
【請求項９】
コンピュータに、
２以上の文字より構成される要素およびテキストデータの識別情報を受け付けると、受け付けた要素に対する複数ハッシュ化軸をそれぞれ復元し、
前記それぞれ復元されたビット列の各ビットが示す、複数のテキストデータそれぞれにおける前記要素の存否情報に基づいて、前記受け付けたテキストデータの識別情報に対応する前記要素の存否情報を検索する
処理を実行させることを特徴とする検索プログラム。
【請求項１０】
コンピュータが、
２以上の文字より構成される要素およびテキストデータの識別情報を受け付けると、受け付けた要素に対する複数ハッシュ化軸をそれぞれ復元し、
前記それぞれ復元されたビット列の各ビットが示す、複数のテキストデータそれぞれにおける前記要素の存否情報に基づいて、前記受け付けたテキストデータの識別情報に対応する前記要素の存否情報を検索する
各処理を実行することを特徴とする検索方法。
【請求項１１】
２以上の文字より構成される要素およびテキストデータの識別情報を受け付けると、受け付けた要素に対する複数ハッシュ化軸をそれぞれ復元する復元部と、
前記復元部によってそれぞれ復元されたビット列の各ビットが示す、複数のテキストデータそれぞれにおける前記要素の存否情報に基づいて、前記受け付けたテキストデータの識別情報に対応する前記要素の存否情報を検索する検索部と、
を有することを特徴とする検索装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、インデックス生成プログラムなどに関する。
【背景技術】
【０００２】
テキストデータの検索を高速化するために、テキストデータに含まれる文字ごとの、ファイルごとの存否をインデックス化した、ビットマップ型インデックスが知られている（例えば、特許文献１−３参照）。
【０００３】
日本語のテキストデータについて、ビットマップ型インデックスを生成する場合、テキストデータに使用されている文字や単語の種類が非常に多いため、インデックスのサイズが大きくなる。加えて、インデックスの密度が低くなるため、ハッシュ関数を用いたサイズ縮小が行われる。
【０００４】
従来の技術の一例では、複数の底によるハッシュ関数を適用し、ハッシュ化ビットマップを作成した結果、衝突（コンフリクト）が最小となるハッシュ関数を決定することが開示されている。また、決定したハッシュ関数および当該ハッシュ関数に基づくハッシュ化ビットマップを用いて、当該ハッシュ関数の評価値によって番地付けされたハッシュ化ビットマップ上の番地の内容が既にセットされているか否かをチェックすることが開示されている（例えば、特許文献１参照）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特許第２７５３２２８号公報
【特許文献２】特許第３２６３９６３号公報
【特許文献３】特開２０１２−２１６０８８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、テキストデータのビットマップ型インデックスにおいて、ほとんどのファイルに対応したビットが「１」となる行が存在することがあるため、ハッシュ関数を適用した場合に、衝突が起こり得るという問題がある。例えば、英文の「ｔｈｅ」や「ｏｎ」のような高頻度の単語では、ほとんどのファイルについて、ビットマップ型インデックスのビットが「１」になる行が存在するため、ハッシュ関数を適用した場合に、衝突が起こり得る。
【０００７】
従来の技術では、ハッシュ関数の出力値が衝突するか否か、予測できない場合については、対処がなされていない。一方、衝突が予測できる場合は、衝突が生じないようにハッシュ関数の対象から外す等の対処が行われており、不統一であった。従来の技術の一例でも、衝突が最小となるハッシュ関数を選択することで、衝突が生じた場合の対処を減らしているに過ぎない。実際に衝突が生じた場合には、正しいビットマップを復元することができず、インデックスの精度が低下し、検索速度が遅くなる。
【０００８】
１つの側面では、ビットマップ型インデックスをハッシュ化する際に、ビットの衝突を回避することを目的とする。
【課題を解決するための手段】
【０００９】
第１の案では、インデックス生成プログラムは、コンピュータに、複数のテキストデータの少なくともいずれかに含まれる複数の要素それぞれについて、前記複数のテキストデータそれぞれに対する存否情報を生成し、前記存否情報より、前記複数のテキストデータの軸に対し複数のハッシュ関数を適用した複数ハッシュ化軸を用いたハッシュ化インデックス情報を生成する際に、前記存否情報では独立であるが前記ハッシュ化インデックス情報では重複する衝突データの検知を行い、前記検知された衝突が特定の条件を満たす場合、衝突データそれぞれに対し前記複数ハッシュ化軸のいずれか１つに対し追加の値を設定して対応づける処理を実行させる。
【発明の効果】
【００１０】
１つの態様によれば、ビットマップ型インデックスをハッシュ化する際に、衝突による精度の低下を回避することができる。
【図面の簡単な説明】
【００１１】
【図１Ａ】図１Ａは、実施例に係るハッシュ化インデックス生成処理の一例を示す図（１）である。
【図１Ｂ】図１Ｂは、実施例に係るハッシュ化インデックス生成処理の一例を示す図（２）である。
【図２】図２は、ハッシュノイズの説明をする図である。
【図３Ａ】図３Ａは、実施例に係るビットマップ型インデックスの一例を示す図である。
【図３Ｂ】図３Ｂは、実施例に係るビットマップ型インデックスの別の例を示す図である。
【図４Ａ】図４Ａは、実施例に係るハッシュ化ビットマップ復元処理の一例を示す図（１）である。
【図４Ｂ】図４Ｂは、実施例に係るハッシュ化ビットマップ復元処理の一例を示す図（２）である。
【図５】図５は、実施例に係る検索処理の一例を示す図である。
【図６】図６は、実施例に係るインデックス生成装置の構成を示す機能ブロック図である。
【図７】図７は、実施例に係るインデックス生成処理のフローチャートの一例を示す図である。
【図８】図８は、実施例に係る検索装置の構成を示す機能ブロック図である。
【図９】図９は、実施例に係る検索処理のフローチャートの一例を示す図である。
【図１０】図１０は、実施例に係る情報処理装置のハードウェア構成を示す図である。
【図１１】図１１は、コンピュータで動作するプログラムの構成例を示す図である。
【発明を実施するための形態】
【００１２】
以下に、本願の開示するインデックス生成プログラム、インデックス生成装置、インデックス生成方法、検索プログラム、検索装置および検索方法の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
【００１３】
［実施例に係るハッシュ化インデックス生成の一例］
図１Ａおよび図１Ｂは、実施例に係るハッシュ化インデックス生成処理の一例を示す図である。図１Ａおよび図１Ｂに示すように、ハッシュ化インデックス生成処理は、ビットマップ型インデックスのサイズ縮小を実現するために、ビットマップ型インデックスからハッシュ化インデックスを生成する。すなわち、ハッシュ化インデックス生成処理は、隣接した複数のハッシュ値（底）を基に、２次元（単語の軸とファイルの軸）にハッシュ化を適用したハッシュ化インデックスを生成する。
【００１４】
ここでいうビットマップ型インデックスとは、テキストデータに含まれる単語について、ファイルごとの存否をインデックス化したビットマップのことをいう。図１Ａに示すように、ビットマップ型インデックスＢＩのＸ軸はファイルＩＤ（Identification）を表し、ビットマップ型インデックスＢ１のＹ軸は単語ＩＤを表す。すなわち、ビットマップ型インデックスＢＩは、単語ＩＤが示す単語の、複数のファイルＩＤが示すファイルごとの存否を表す。一例として、ある単語ＩＤに対応するビットマップｂｉ１が示されている。ある単語ＩＤが示す単語がファイルに存在する場合には、当該単語のファイルの存否として２進数の「１」が設定され、当該単語がファイルに存在しない場合には、当該単語のファイルの存否として２進数の「０」が設定される。なお、ビットマップ型インデックスＢＩの詳細の説明は、後述する。
【００１５】
例えば、図１Ａに示すように、インデックス生成装置は、単語ＩＤに対応するビットマップそれぞれについてハッシュ関数を適用した複数のハッシュ化ビットマップを生成する。ここでは、インデックス生成装置は、３２ビットレジスタを想定し、一例として２９と３１のハッシュ値（底）を基に、各ビットマップをハッシュ化する。具体的には、インデックス生成装置は、１つの底のハッシュ化ビットマップについて、単語ＩＤに対応するビットマップの各ビットの位置を底で割った余りの位置に、当該ビットマップの各ビットの値を設定する。一例として、インデックス生成装置は、底２９のハッシュ化ビットマップｈ１１について、ビットマップｂｉ１の各ビットの位置を底２９で割った余りの位置に、ビットマップｂｉ１の各ビットの値を設定する。ビットマップｂｉ１の３５ビット目の位置のビット値「１」は、ハッシュ化ビットマップｈ１１の６ビット目に設定される。ビットマップｂｉ１の４２ビット目の位置のビット値「１」は、ハッシュ化ビットマップｈ１１の１３ビット目に設定される。インデックス生成装置は、底３１のハッシュ化ビットマップｈ１２について、ビットマップｂｉ１の各ビットの位置を底３１で割った余りの位置に、ビットマップｂｉ１の各ビットの値を設定する。ビットマップｂｉ１の３５ビット目の位置のビット値「１」は、ハッシュ化ビットマップｈ１２の４ビット目に設定される。ビットマップｂｉ１の４２ビット目の位置のビット値「１」は、ハッシュ化ビットマップｈ１２の１１ビット目に設定される。すなわち、インデックス生成装置は、ビットマップの０ビット目からの各ビットを順番にハッシュ化ビットマップの０ビット目から設定し、（底−１）ビット目まで設定する。そして、インデックス生成装置は、再度折り返してハッシュ化ビットマップの０ビット目から既にハッシュ化ビットマップに設定された値とＯＲ演算した値を設定する。
【００１６】
ここで、インデックス生成装置は、ハッシュ化ビットマップを生成する際、ハッシュの衝突（ハッシュノイズ）を検知する場合がある。例えば、超高頻度の単語は、複数のファイルに存在するため、超高頻度の単語に対応するビットマップの複数位置のビット値が「１」に設定される。すると、ビットマップがハッシュ化されると、ハッシュ化ビットマップの同じ位置に「１」が重複して設定されることがある。超高頻度の単語の一例として、１グラムの場合には、「ｔｈｅ」や「ｏｎ」が挙げられる。２グラムの場合には、「ｉｎ  ｔｈｅ」、「ｏｎ  ｔｈｅ」や「ｏｆ  ｔｈｅ」が挙げられる。
【００１７】
そこで、インデックス生成装置は、ハッシュノイズに対して、ハッシュの衝突監視を行い、０／１比率の測定やビットマップの分割により、ハッシュノイズの低減化を行う。例えば、図１Ｂに示すように、インデックス生成装置は、ハッシュの衝突を監視し、ハッシュの衝突を検知すると、ハッシュ化ビットマップのビット重複履歴フラグに重複していることを示す「１」を設定する。ここでは、ハッシュ化ビットマップの空いている３１ビット目の位置をビット重複履歴フラグとする。
【００１８】
インデックス生成装置は、ハッシュ化ビットマップのいずれか１つで連続して衝突が発生した場合に、衝突が発生したハッシュ化ビットマップに対応する単語ＩＤのビットマップの存否情報を用いて存否（１／０）の比率を集計する。ハッシュ化ビットマップで連続して衝突が発生したか否の判定は、このハッシュ化ビットマップのビット重複履歴フラグを用いれば良い。すなわち、インデックス生成装置は、ハッシュ化ビットマップで衝突が発生した場合に、このハッシュ化ビットマップのビット重複履歴フラグに既に重複していることを示す「１」が設定されていれば、連続して衝突が発生したと判定する。連続に衝突が発生する場合には、単語ＩＤに対応するビットマップの「１」の比率が予め定められた閾値を超過していると推測されるからである。閾値の一例として、５０％が挙げられる。なお、閾値は、これに限定されず、ハッシュノイズが急激に増加すると推測されるビットマップ内の「１」の最小比率であれば良い。
【００１９】
インデックス生成装置は、「１」の比率が閾値より大きい場合には、衝突が発生したハッシュ化ビットマップに対応する単語ＩＤのビットマップを分割する。具体的には、インデックス生成装置は、衝突が発生したハッシュ化ビットマップに対応する単語ＩＤのビットマップの偶数番目の位置のビットを抽出し、新たにビットマップを生成する。加えて、インデックス生成装置は、衝突が発生したハッシュ化ビットマップに対応する単語ＩＤのビットマップの奇数番目の位置のビットを抽出し、新たにビットマップを生成する。一例として、衝突が発生したハッシュ化ビットマップに対応する単語ＩＤの分割前のビットマップをｂｉ１とする。すると、インデックス生成装置は、分割前のビットマップｂｉ１の偶数番目の位置の各ビットを抜き出して、新たなビットマップｂｉ１０を生成する。インデックス生成装置は、分割前のビットマップｂｉ１の奇数番目の位置の各ビットを抜き出して、新たなビットマップｂｉ１１を生成する。
【００２０】
インデックス生成装置は、分割した新たなビットマップｂｉ１０、ｂｉ１１を、分割先として低頻度単語の領域に格納する。インデックス生成装置は、複数ハッシュ化ビットマップのいずれか１つに対し分割先を設定する。なお、ビットマップ型インデックスＢＩは、超高頻度単語の領域、高頻度単語の領域、低頻度単語の領域から形成される。低頻度単語の領域は、最下位の部分に形成される。
【００２１】
そして、インデックス生成装置は、ビットマップを分割後に、分割先の各ビットマップに対して、図１Ａで示したように、複数のハッシュ化ビットマップを生成する。これにより、インデックス生成装置は、ハッシュ化ビットマップのデータが衝突する場合であっても、ハッシュ化前のビットマップの偶数番目のデータと奇数番目のデータとを分割してそれぞれハッシュ化することで、データの衝突を回避することが可能となる。
【００２２】
［ハッシュノイズの説明］
ここで、ハッシュノイズについて、図２を参照して説明する。図２は、ハッシュノイズの説明をする図である。図２に示すように、ハッシュノイズは、０／１比率が閾値を超過すると、急激に増加する傾向にある。すなわち、単語に対応するビットマップは、０／１比率が閾値を超過すると、ハッシュ化した場合に、ハッシュノイズが急激に増加する。具体的には、超高頻度の単語の場合、単語に対応する軸（ビットマップ）は、０／１比率が閾値を超過するので、ハッシュ化した場合に、ハッシュノイズが急激に増加する。この結果、ハッシュノイズが急激に増加すると、例えばハッシュ化を復元する際に正しく復元できないこととなり、他の単語へも悪影響が広がる。そこで、インデックス生成装置は、０／１比率が閾値より大きい単語に対応するビットマップを分割することにより、分割後のビットマップをハッシュ化しても、ハッシュノイズを軽減することができる。
【００２３】
［ビットマップ型インデックスの一例］
次に、実施例に係るビットマップ型インデックスの一例を、図３Ａおよび図３Ｂを参照して説明する。図３Ａは、実施例に係るビットマップ型インデックスの一例を示す図である。図３Ａに示すように、ビットマップ型インデックスＢＩは、超高頻度の単語、高頻度の単語および低頻度の単語に係る圧縮付号（単語ＩＤに対応）ごとにビットマップを対応づける。ビットマップとは、超高頻度の単語、高頻度の単語および低頻度の単語がいずれの圧縮ファイルに含まれるかを表す符号ビット列である。ビットマップの各ビットが、各圧縮ファイルに超高頻度の単語、高頻度の単語および低頻度の単語が含まれているか否かを表す。なお、かかる単語は、要素の一例である。
【００２４】
ビットマップ型インデックスＢＩは、例えば、３２種類の超高頻度単語ごと、８Ｋ（８０００）種類の高頻度の単語および１６Ｋ（１６０００）種類の低頻度単語ごとにビットマップを対応づける。超高頻度単語とは、出現頻度集計用のテキストファイル群において各単語の出現頻度を集計した場合に、出現頻度の高い単語を表す。例えば、超高頻度単語は、頻度集計用のテキストファイル群での出現頻度が上位３２位までの単語である。高頻度単語は、頻度集計用のテキストファイル群での出現頻度が上位８０００位までの単語である。また、低頻度単語は、頻度集計用のテキストファイル群での出現頻度の順位が２４０００位未満であって、符号化するファイルから抽出された数値文字列または単語である。単語の一例として、未知語が挙げられる。なお、未知語とは、超高頻度単語および高頻度単語に含まれない単語であり、符号化するファイルの中で繰り返し出現する特長がある単語のことをいう。
【００２５】
例えば、ビットマップ型インデックスＢＩの有効行１行目は、圧縮符号が示す単語「ｔｈｅ」のビットマップが「・・・１１０１」となっている。ビットマップ型インデックスＢＩの有効行１行目のビットマップは、「ｔｈｅ」の圧縮符号が含まれるファイルを表す。ビットマップ「・・・１１０１」は、１ビット目に「1」が格納されているのでファイル１に「ｔｈｅ」が含まれ、２ビット目に「0」が格納されているのでファイル２に「ｔｈｅ」が含まれず、３ビット目に「1」が格納されているのでファイル３に「ｔｈｅ」が含まれることを表す。また、ビットマップ「・・・１１０１」は、４ビット目に「1」が格納されているのでファイル４に「ｔｈｅ」が含まれていることを表す。なお、ビットマップ「・・・１１０１」は、ファイル５以降の他の各ファイルに「ｔｈｅ」が含まれるか否かについても表す。
【００２６】
ビットマップ型インデックスＢＩを用いることで、入力文字列を構成する単語が、どのファイルに存在するかを、高速に絞り込むことができる。例えば、入力文字列「ｉｎ  ｆｒｏｎｔ  ｏｆ  ｔｈｅ」を構成する単語「ｉｎ」、「ｆｒｏｎｔ」、「ｏｆ」および「ｔｈｅ」が、「ファイル１」に存在することを、高速に絞り込むことができる。
【００２７】
なお、ビットマップ型インデックスＢＩは、単語に係る圧縮付号ごとにビットマップを対応づけると説明した。しかしながら、ビットマップ型インデックスＢＩは、これに限定されず、Ｎグラム（Ｎは２以上）の文字に係る圧縮符号ごとにビットマップを対応づけても良い。かかるＮグラムの文字は、要素の別の例である。図３Ｂは、実施例に係るビットマップ型インデックスの別の例を示す図である。図３Ｂは、Ｎグラムを２グラムとした場合の例である。図３Ｂに示すように、ビットマップ型インデックスＢＩは、２グラム文字に係る圧縮符号ごとにビットマップを対応づける。ここでいうビットマップとは、２グラム文字がいずれの圧縮ファイルに含まれるかを表す符号ビット列である。ビットマップの各ビットが、各圧縮ファイルに２グラム文字が含まれているか否かを表す。
【００２８】
例えば、ビットマップ型インデックスＢＩの有効行１行目は、圧縮符号が示す２グラム文字「ａａ」のビットマップが「・・・１１０１」となっている。ビットマップ型インデックスＢＩの有効行１行目のビットマップは、「ａａ」の圧縮符号が含まれるファイルを表す。ビットマップ「・・・１１０１」は、１ビット目に「１」が格納されているのでファイル１に「ａａ」が含まれ、２ビット目に「０」が格納されているのでファイル２に「ａａ」が含まれず、３ビット目に「１」が格納されているのでファイル３に「ａａ」が含まれることを表す。また、ビットマップ「・・・１１０１」は、４ビット目に「１」が格納されているのでファイル４に「ａａ」が含まれていることを表す。なお、ビットマップ「・・・１１０１」は、ファイル５以降の他の各ファイルに「ａａ」が含まれるか否かについても表す。
【００２９】
［実施例に係るハッシュ化ビットマップ復元の一例］
図４Ａおよび図４Ｂは、実施例に係るハッシュ化ビットマップ復元処理の一例を示す図である。図４Ａおよび図４Ｂに示すように、ハッシュ化ビットマップ復元処理は、ハッシュ化ビットマップから、ハッシュ化を展開した単語ＩＤに対応するビットマップへ復元する。図４Ａは、ハッシュ化ビットマップに分割先が設定されていない場合であり、図４Ｂは、ハッシュ化ビットマップに分割先が設定されている場合である。ハッシュ化ビットマップ復元処理は、入力文字列を構成する単語がどのファイルに存在するかを検索する際に実行される。
【００３０】
例えば、図４Ａに示すように、検索装置は、単語およびテキストデータのファイルＩＤの入力を受け付けると、受け付けた単語が示す単語ＩＤに対応する複数のハッシュ化ビットマップをハッシュ化インデックスＨＩから抽出する。検索装置は、複数のハッシュ化ビットマップのいずれかに分割先が設定されているか否かを判定する。ここでは、検索装置は、複数のハッシュ化ビットマップのいずれにも分割先が設定されていない。
【００３１】
検索装置は、複数のハッシュ化ビットマップをそれぞれビットマップに展開する（第１の復元処理）。ここでは、検索装置は、１つの底のハッシュ化ビットマップの復元先のビットマップについて、底に整数（０〜）を乗算して得られた値にハッシュ化ビットマップの各ビットの位置を加算した位置に、ハッシュ化ビットマップの各ビットの値を設定する。一例として、検索装置は、底２９のハッシュ化ビットマップｈ２１の復元先のビットマップｂｉ２１について、底２９に「０」を乗算した値にハッシュ化ビットマップｈ２１の各ビットの位置を加算した位置に、ハッシュ化ビットマップｈ２１の各ビットの値を設定する。検索装置は、底２９のハッシュ化ビットマップｈ２１の復元先のビットマップｂｉ２１について、底２９に「１」を乗算した値にハッシュ化ビットマップｈ２１の各ビットの位置を加算した位置に、ハッシュ化ビットマップｈ２１の各ビットの値を設定する。検索装置は、復元先の底２９のビットマップｂｉ２１の最大ビットの位置のビットの値が設定されるまで繰り返す。同様に、検索装置は、底３１のハッシュ化ビットマップｈ２２の復元先のビットマップｂｉ２２について、底３１に「０」を乗算した値にハッシュ化ビットマップｈ２２の各ビットの位置を加算した位置に、ハッシュ化ビットマップｈ２２の各ビットの値を設定する。検索装置は、底３１のハッシュ化ビットマップｈ２２の復元先のビットマップｂｉ２２について、底３１に「１」を乗算した値にハッシュ化ビットマップｈ２２の各ビットの位置を加算した位置に、ハッシュ化ビットマップｈ２２の各ビットの値を設定する。検索装置は、復元先のビットマップｂｉ２２の最大ビットの位置のビットの値が設定されるまで繰り返す。
【００３２】
検索装置は、第１の復元処理で復元されたそれぞれのビットマップの対応する位置のビットをＡＮＤ演算する（第２の復元処理）。ここでは、検索装置は、底２９のハッシュ化ビットマップｈ２１から復元されたビットマップｂｉ２１と、底３１のハッシュ化ビットマップｈ２２から復元されたビットマップｂｉ２２とをＡＮＤ演算する。検索装置は、ＡＮＤ結果のビットマップｂｉ２を復元結果として出力する。
【００３３】
図４Ｂは、複数のハッシュ化ビットマップのいずれかに分割先が設定されている場合である。図４Ａに示したように、検索装置は、分割先に格納された偶数のビットマップにおける底２９のハッシュ化ビットマップについて、第１の復元処理を行う。検索装置は、分割先に格納された偶数のビットマップにおける底３１のハッシュ化ビットマップについて、第１の復元処理を行う。そして、図４Ｂに示すように、検索装置は、第１の復元処理で復元されたそれぞれのビットマップを用いて、第２の復元処理を行う。第２の復元処理のＡＮＤ結果は、ビットマップｂｉ３０である。
【００３４】
同様に、図４Ａに示したように、検索装置は、分割先に格納された奇数のビットマップにおける底２９のハッシュ化ビットマップについて、第１の復元処理を行う。検索装置は、分割先に格納された奇数のビットマップにおける底３１のハッシュ化ビットマップについて、第１の復元処理を行う。そして、図４Ｂに示すように、検索装置は、第１の復元処理で復元されたそれぞれのビットマップを用いて、第２の復元処理を行う。第２の復元処理のＡＮＤ結果は、ビットマップｂｉ３１である。
【００３５】
検索装置は、第２の復元処理で復元されたそれぞれのビットマップの対応する位置のビットをＯＲ演算する（併合処理）。ここでは、検索装置は、ビットマップｂｉ３０と、ビットマップｂｉ３１とをＯＲ演算する。検索装置は、ＯＲ結果のビットマップｂｉ３を復元結果として出力する。
【００３６】
［実施例に係る検索処理の一例］
図５は、実施例に係る検索処理の一例を示す図である。図５に示すように、検索処理を実行する検索装置は、単語およびテキストデータのファイルＩＤの入力を受け付けると、受け付けた単語が示す単語ＩＤに対する複数のハッシュ化ビットマップをハッシュ化インデックスＨＩから抽出する。ここでは、単語として「Ｍｉｃｋｅｙ」、ファイルＩＤとして「ファイル３３」が受け付けられたとする。すると、検索装置は、単語として受け付けられた「Ｍｉｃｋｅｙ」が示す単語ＩＤ「Ａ００１ｈ」に対する複数のハッシュ化ビットマップｈ４１，ｈ４２をハッシュ化インデックスＨＩから抽出する。
【００３７】
検索装置は、抽出した単語ＩＤに対する複数のハッシュ化ビットマップを復元する。複数のハッシュ化ビットマップの復元処理は、図４Ａおよび図４Ｂに示した処理である。復元結果は、単語ＩＤに対応するビットマップで表わされる。ここでは、検索装置は、単語ＩＤ「Ａ００１ｈ」に対する複数のハッシュ化ビットマップｈｉ４を復元し、ビットマップｂｉ４０を復元結果として出力する。複数のハッシュ化ビットマップｈｉ４には、底２９のハッシュ化ビットマップｈ４１と底３１のハッシュ化ビットマップｈ４２とが含まれる。
【００３８】
検索装置は、復元結果である単語ＩＤのビットマップの各ビットが示す、複数のファイルそれぞれにおける単語ＩＤが示す単語の存否情報に基づいて、受け付けたファイルＩＤに対応する当該単語ＩＤが示す単語の存否情報を検索する。一例として、検索装置は、ビットマップｂｉ４０の各ビットのうち、ファイルＩＤとして受け付けられた「ファイル３３」に対するビットの値に基づいて、単語の存否情報を検索する。ここでは、検索装置は、ファイルＩＤとして受け付けられた「ファイル３３」に対するビットの値が「１」であるので、「ファイル３３」に単語「Ｍｉｃｋｅｙ」が存在すると判断する。検索装置は、検索結果として存在する旨を出力する。これにより、検索装置は、ハッシュ化インデックスＨＩをビットマップ型インデックスＢＩに復元し、復元されたビットマップ型インデックスＢＩを用いることで、入力文字列を構成する単語が、どのファイルに存在するかを、高速に絞り込むことができる。
【００３９】
なお、入力として受け付けられる単語は、単語のみならず、複数の単語で構成される文字列であっても良い。入力として受け付けられる単語が、複数の単語で構成される文字列である場合には、検索装置は、以下のように処理すれば良い。すなわち、検索装置は、入力文字列およびファイルＩＤの入力を受け付けると、受け付けた入力文字列を字句解析する。ここでいう字句解析とは、入力文字列を単語に分割することをいう。そして、検索装置は、字句解析した結果である複数の単語の単語毎に、単語が示す単語ＩＤに対する複数のハッシュ化ビットマップを復元する。そして、検索装置は、復元結果である複数の単語に対応するビットマップから、受け付けたファイルＩＤに対応する、単語ＩＤが示す単語の存否情報を抽出する。そして、検索装置は、抽出した存否情報をＡＮＤ演算し、ＡＮＤ結果に基づいて、受け付けたファイルＩＤに対応する、受け付けた入力文字列の存否情報を検索する。
【００４０】
例えば、複数の単語で構成される文字列を入力として受け付けた場合の検索処理について、図３を参照して説明する。入力文字列として「ｉｎ  ｆｒｏｎｔ  ｏｆ  ｔｈｅ」、ファイルＩＤとして「ファイル１」が受け付けられたとする。すると、検索装置は、「ｉｎ  ｆｒｏｎｔ  ｏｆ  ｔｈｅ」を字句解析し、入力文字列を「ｉｎ」、「ｆｒｏｎｔ」、「ｏｆ」および「ｔｈｅ」のそれぞれの単語に分割する。検索装置は、単語「ｉｎ」、「ｆｒｏｎｔ」、「ｏｆ」および「ｔｈｅ」に対応する各ビットマップから、「ファイル１」に対応する存否情報として「１」（存在）を抽出する。そして、検索装置は、抽出した存否情報をＡＮＤ演算し、ＡＮＤ結果「１」に基づいて、「ファイル１」に対応する、受け付けた入力文字列の存否情報を検索する。ここでは、検索装置は、検索結果として存在する旨を出力する。これにより、検索装置は、入力文字列が複数の単語で構成される場合であっても、入力文字列がどのファイルに存在するのかを、高速に絞り込むことができる。
【００４１】
［実施例に係るインデックス生成装置の構成］
次に、図６を参照して、実施例に係るインデックス生成処理を実行するインデックス生成装置１００の構成について説明する。図６は、実施例に係るインデックス生成装置の構成を示す機能ブロック図である。図６に示すように、インデックス生成装置１００は、制御部１１０と記憶部１２０とを有する。
【００４２】
制御部１１０は、図１Ａおよび図１Ｂに示したハッシュ化インデックス生成処理を実行する処理部である。制御部１１０は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。そして、制御部１１０は、例えば、ＡＳＩＣやＦＰＧＡなどの集積回路の電子回路に対応する。または、制御部１１０は、ＣＰＵやＭＰＵなどの電子回路に対応する。また、制御部１１０は、ハッシュ化部１１１、重複判定部１１２、０／１比率集計部１１３およびビットマップ分割部１１４を有する。
【００４３】
記憶部１２０は、例えばフラッシュメモリやＦＲＡＭ（登録商標）などの不揮発性の半導体メモリ素子などの記憶装置に対応する。記憶部１２０は、ビットマップ型インデックス１２１およびハッシュ化インデックス１２２を有する。なお、ビットマップ型インデックス１２１の構成は、図３と同様であるので、その説明を省略する。ハッシュ化インデックス１２２の構成は、各単語ＩＤに対応するハッシュ化ビットマップの構成（図１Ａおよび図１Ｂ参照）と同様であるので、その説明を省略する。
【００４４】
ハッシュ化部１１１は、複数のハッシュ値（底）を基に、ビットマップ型インデックス１２１の各軸（ビットマップ）をハッシュ化する。例えば、ハッシュ化部１１１は、ビットマップ型インデックス１２１を記憶部１２０から読み出す。ハッシュ化部１１１は、読み出したビットマップ型インデックス１２１に含まれる複数の単語ＩＤに対応するビットマップそれぞれについて、複数のハッシュ化ビットマップを生成する。一例として、ハッシュ化部１１１は、複数の単語ＩＤに対応するビットマップそれぞれについて、２９と３１のハッシュ値（底）に基づいたそれぞれのハッシュ化ビットマップを生成する。すなわち、ハッシュ化部１１１は、ビットマップの０ビット目からの各ビットを順番にハッシュ化ビットマップの０ビット目から設定し、（底−１）ビット目まで設定する。そして、ハッシュ化部１１１は、再度折り返してハッシュ化ビットマップの０ビット目から既にハッシュ化ビットマップに設定された値とＯＲ演算した値を設定する。
【００４５】
また、ハッシュ化部１１１は、全ての単語ＩＤに対応するビットマップに対してハッシュ化ビットマップを生成すると、生成されたハッシュ化ビットマップを纏めたハッシュ化インデックス１２２を記憶部１２０に格納する。
【００４６】
重複判定部１１２は、ハッシュ化部１１１によって単語ＩＤに対するビットマップがハッシュ化される際に、ハッシュ化ビットマップに「１」が重複して設定されるか否かを判定する。すなわち、重複判定部１１２は、ハッシュの重複（衝突）を監視する。かかる判定処理は、複数のハッシュ化ビットマップのそれぞれに対して行われる。重複判定部１１２は、ハッシュ化ビットマップに「１」が重複して設定される場合には、ハッシュ化ビットマップのビット重複履歴フラグに重複していることを示す「１」を設定する。重複判定部１１２は、ハッシュ化ビットマップに「１」が重複して設定されない場合には、ハッシュ化ビットマップのビット重複履歴フラグに重複していないことを示す「０」を設定する。
【００４７】
０／１比率集計部１１３は、単語ＩＤに対するビットマップの０／１比率を集計する。例えば、０／１比率集計部１１３は、重複判定部１１２によってハッシュ化ビットマップに「１」が連続して重複設定されるか否かを判定する。一例として、０／１比率集計部１１３は、ハッシュ化ビットマップのビット重複履歴フラグに既に重複していることを示す「１」が設定されているか否かを判定する。すなわち、０／１比率集計部１１３は、ハッシュ化ビットマップのビット重複履歴フラグに既に「１」が設定されている場合には、直前のハッシュ化および今回のハッシュ化で連続して「１」が重複して設定されたと判断する。そして、０／１比率集計部１１３は、ハッシュ化ビットマップに「１」が連続して重複設定された場合には、当該ハッシュ化ビットマップに対応する単語ＩＤに対応するビットマップの０／１比率を集計する。０／１比率集計部１１３は、「１」の比率が閾値より大きいか否かを判定する。０／１比率集計部１１３は、「１」の比率が閾値より大きい場合には、ハッシュノイズが急激に増加していると判断し、後述するビットマップ分割部１１４にビットマップを分割させる。
【００４８】
ビットマップ分割部１１４は、単語ＩＤに対応するビットマップを分割する。例えば、ビットマップ分割部１１４は、０／１比率集計部１１３によって単語ＩＤに対応するビットマップの「１」の比率が閾値より大きいと判定された場合には、ハッシュ化ビットマップに対応する単語ＩＤのビットマップを分割する。一例として、ビットマップ分割部１１４は、ハッシュ化ビットマップに対応する単語ＩＤのビットマップの偶数番目の位置のビットを抽出する。ビットマップ分割部１１４は、新たなビットマップの全ビットを「０」に初期化し、初期化後に、抽出された偶数番目の位置のビットを設定する。ビットマップ分割部１１４は、ハッシュ化ビットマップに対応する単語ＩＤのビットマップの奇数番目の位置のビットを抽出する。ビットマップ分割部１１４は、新たなビットマップの全ビットを「０」に初期化し、初期化後に、抽出された奇数番目の位置のビットを設定する。そして、ビットマップ分割部１１４は、複数のハッシュ化ビットマップのどちらか一方に対して、分割履歴フラグに分割したことを示す「１」を設定する。加えて、ビットマップ分割部１１４は、このハッシュ化ビットマップに対して、分割先を設定し、分割されたビットマップを分割先に格納する。分割されたビットマップの分割先は、例えば、低頻度単語の領域である。
【００４９】
［インデックス生成処理のフローチャート］
図７は、実施例に係るインデックス生成処理のフローチャートの一例を示す図である。
【００５０】
まず、インデックス生成装置１００は、ビットマップ型インデックス１２１を受け取る（ステップＳ１１）。すると、インデックス生成装置１００は、受け取ったビットマップ型インデックス１２１から、次の単語ＩＤに対応するビットマップを読み出す（ステップＳ１２）。
【００５１】
インデックス生成装置１００は、読み出したビットマップの各ビットについて、底α、底βをそれぞれ用いてハッシュ化する（ステップＳ１３）。例えば、インデックス生成装置１００は、底αのハッシュ化ビットマップについて、単語ＩＤに対応するビットマップの各ビットの位置を底αで割った余りの位置に、各ビットの値を設定する。インデックス生成装置１００は、底βのハッシュ化ビットマップについて、単語ＩＤに対応するビットマップの各ビットの位置を底βで割った余りの位置に、各ビットの値を設定する。すなわち、インデックス生成装置１００は、単語ＩＤに対応するビットマップの０ビット目からの各ビットを順番にハッシュ化ビットマップの０ビット目から設定し、（底−１）ビット目まで設定したら、再度折り返して０ビット目からＯＲ演算した結果を設定する。
【００５２】
インデックス生成装置１００は、ハッシュ化ビットマップのハッシュ化の位置に既に「１」が設定されているか否かを判定する（ステップＳ１４）。なお、かかる判定は、底α、底β毎に行われる。ハッシュ化ビットマップのハッシュ化の位置に「１」が設定されていないと判定した場合には（ステップＳ１４；Ｎｏ）、インデックス生成装置１００は、該当底のハッシュ化ビットマップのハッシュ化の位置に「１」を設定する（ステップＳ１５）。そして、インデックス生成装置１００は、該当底のハッシュ化ビットマップのビット重複履歴フラグに「０」（非重複）を設定する（ステップＳ１６）。そして、インデックス生成装置１００は、次の単語ＩＤを選択すべく、ステップＳ１２に移行する。
【００５３】
一方、ハッシュ化ビットマップのハッシュ化の位置に「１」が既に設定されていると判定した場合には（ステップＳ１４；Ｙｅｓ）、インデックス生成装置１００は、ビット重複履歴フラグに既に「１」（重複）が設定されているか否かを判定する（ステップＳ１７）。なお、かかる判定は、底α、底β毎に行われる。ビット重複履歴フラグに「１」（重複）が設定されていないと判定した場合には（ステップＳ１７；Ｎｏ）、インデックス生成装置１００は、該当底のハッシュ化ビットマップのビット重複履歴フラグに「１」（重複）を設定する（ステップＳ１８）。そして、インデックス生成装置１００は、次の単語ＩＤを選択すべく、ステップＳ１２に移行する。
【００５４】
一方、ビット重複履歴フラグに「１」（重複）が既に設定されていると判定した場合には（ステップＳ１７；Ｙｅｓ）、インデックス生成装置１００は、該当底のハッシュ化ビットマップに対応するビットマップの０／１比率を集計する（ステップＳ１９）。インデックス生成装置１００は、「１」の比率が閾値より大きいか否かを判定する（ステップＳ２０）。「１」の比率が閾値より大きくないと判定した場合には（ステップＳ２０；Ｎｏ）、インデックス生成装置１００は、該当底のハッシュ化ビットマップのビット重複履歴フラグに「０」（非重複）を設定する（ステップＳ２１）。そして、インデックス生成装置１００は、次の単語ＩＤを選択すべく、ステップＳ１２に移行する。
【００５５】
一方、「１」の比率が閾値より大きいと判定した場合には（ステップＳ２０；Ｙｅｓ）、インデックス生成装置１００は、どちらか一方のハッシュ化ビットマップに対して、以下の情報を設定する。すなわち、インデックス生成装置１００は、分割履歴フラグに「１」（分割）を設定し、分割先に低頻度単語の領域を設定する（ステップＳ２２）。
【００５６】
続いて、インデックス生成装置１００は、現単語ＩＤに対応するビットマップを分割し、分割したビットマップを分割先が示す領域に格納する（ステップＳ２３）。例えば、インデックス生成装置１００は、現単語ＩＤに対応するビットマップの偶数番目の位置のビットを抽出する。インデックス生成装置１００は、新たなビットマップの全ビットを「０」に初期化し、初期化後に、抽出された偶数番目の位置のビットを設定する。インデックス生成装置１００は、現単語ＩＤに対応するビットマップの奇数番目の位置のビットを抽出する。インデックス生成装置１００は、新たなビットマップの全ビットを「０」に初期化し、初期化後に、抽出された奇数番目の位置のビットを設定する。インデックス生成装置１００は、分割された新たなビットマップを分割先が示す低頻度単語の領域に格納する。
【００５７】
そして、インデックス生成装置１００は、全ての単語ＩＤを選択したか否かを判定する（ステップＳ２４）。全ての単語ＩＤを選択していないと判定した場合には（ステップＳ２４；Ｎｏ）、インデックス生成装置１００は、次の単語ＩＤを選択すべく、ステップＳ１２に移行する。
【００５８】
一方、全ての単語ＩＤを選択したと判定した場合には（ステップＳ２４；Ｙｅｓ）、インデックス生成装置１００は、生成されたハッシュ化ビットマップを纏めたハッシュ化インデックス１２２を記憶部１２０に格納する（ステップＳ２５）。そして、インデックス生成装置１００は、インデックス生成処理を終了する。なお、テキストデータの圧縮処理において、インデックス生成が行われる場合は、字句解析により、単語ＩＤとファイルＩＤが決定されるため、記憶部のビットマップ型インデックスへの出力を省略し、直接、ハッシュ化インデックスを生成することが可能である。
【００５９】
［実施例に係る検索装置の構成］
次に、図８を参照して、実施例に係る検索処理を実行する検索装置２００の構成について説明する。図８は、実施例に係る検索装置の構成を示す機能ブロック図である。図８に示すように、検索装置２００は、制御部２１０と記憶部２２０とを有する。
【００６０】
制御部２１０は、図５に示した検索処理を実行する処理部である。制御部２１０は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。そして、制御部２１０は、例えば、ＡＳＩＣやＦＰＧＡなどの集積回路の電子回路に対応する。または、制御部２１０は、ＣＰＵやＭＰＵなどの電子回路に対応する。また、制御部２１０は、検索キー受付部２１１、分割先有無判定部２１２、分割無し復元部２１３、分割有り復元部２１４、検索処理部２１５および検索結果出力部２１６を有する。
【００６１】
記憶部２２０は、例えばフラッシュメモリやＦＲＡＭなどの不揮発性の半導体メモリ素子などの記憶装置に対応する。記憶部２２０は、ハッシュ化インデックス２２１と復元ビットマップ２２２、および絞込みビットマップ２２３を有する。なお、ハッシュ化インデックス２２１と復元ビットマップの構成は、各単語ＩＤに対応するハッシュ化ビットマップとビットマップの構成（図１Ａおよび図１Ｂ参照）と同様であるので、その説明を省略する。また、絞込みビットマップ２２３の構成は、各単語とＡＮＤ結果に対応するビットマップの構成（図３参照）と同様であるので、その説明を省略する。
【００６２】
検索キー受付部２１１は、検索キーを受け付ける。例えば、検索キー受付部２１１は、検索キーとして検索対象の単語および検索対象のファイルＩＤを受け付ける。
【００６３】
分割先有無判定部２１２は、検索対象の単語に対応するハッシュ化ビットマップを用いて、分割先の有無を判定する。例えば、分割先有無判定部２１２は、検索対象の単語が示す単語ＩＤに対する複数のハッシュ化ビットマップをハッシュ化インデックス２２１から抽出する。分割先有無判定部２１２は、抽出した複数のハッシュ化ビットマップのうちいずれかのハッシュ化ビットマップに分割先が設定されているか否かを判定する。一例として、分割先有無判定部２１２は、いずれかのハッシュ化ビットマップの分割履歴フラグに分割したことを示す「１」が設定されているか否かを判定する。分割先有無判定部２１２は、「１」が設定されていれば、分割先が「有る」と判定する。分割先有無判定部２１２は、「０」が設定されていれば、分割先が「無い」と判定する。
【００６４】
分割無し復元部２１３は、分割先有無判定部２１２によって分割先が「無い」と判定された場合には、検索対象の単語に対応する複数のハッシュ化ビットマップを復元する。
【００６５】
例えば、分割無し復元部２１３は、複数のハッシュ化ビットマップをそれぞれビットマップに展開する（第１の復元処理）。一例として、分割無し復元部２１３は、底２９のハッシュ化ビットマップの復元先のビットマップについて、底２９に整数（０〜）を乗算した値にハッシュ化ビットマップの各ビットの位置を加算した位置に、ハッシュ化ビットマップの各ビットの値を設定する。分割無し復元部２１３は、底３１のハッシュ化ビットマップの復元先のビットマップについて、底３１に整数（０〜）を乗算した値にハッシュ化ビットマップの各ビットの位置を加算した位置に、ハッシュ化ビットマップの各ビットの値を設定する。すなわち、分割無し復元部２１３は、ハッシュ化ビットマップの０ビット目からの各ビットを順番に復元先のビットマップの０ビット目から設定し、（底−１）ビット目まで処理する。そして、分割無し復元部２１３は、再度折り返してハッシュ化ビットマップの０ビット目からハッシュ化ビットマップの値を設定する。
【００６６】
また、分割無し復元部２１３は、第１の復元処理で展開されたそれぞれのビットマップの対応する位置のビットをＡＮＤ演算する（第２の復元処理）。一例として、分割無し復元部２１３は、底２９のハッシュ化ビットマップを展開したビットマップと、底３１にハッシュ化ビットマップを展開したビットマップとをＡＮＤ演算する。そして、分割無し復元部２１３は、ＡＮＤ結果のビットマップを復元結果として検索処理部２１５に出力する。
【００６７】
分割有り復元部２１４は、分割先有無判定部２１２によって分割先が「有る」と判定された場合には、分割先のハッシュ化ビットマップを復元する。
【００６８】
例えば、分割有り復元部２１４は、「有る」と判定されたハッシュ化ビットマップの分割先に格納された偶数における複数のハッシュ化ビットマップをそれぞれビットマップに展開する（第１の復元処理）。分割有り復元部２１４は、第１の復元処理で展開されたそれぞれのビットマップの対応する位置のビットをＡＮＤ演算し、偶数におけるビットマップを出力する（第２の復元処理）。また、分割有り復元部２１４は、「有る」と判定されたハッシュ化ビットマップの分割先に格納された奇数における複数のハッシュ化ビットマップをそれぞれビットマップに展開する（第１の復元処理）。分割有り復元部２１４は、第１の復元処理で展開されたそれぞれのビットマップの対応する位置のビットをＡＮＤ演算し、奇数におけるビットマップを出力する（第２の復元処理）。なお、第１の復元処理および第２の復元処理は、分割無し復元部２１３の処理と同様であるので、その説明を省略する。
【００６９】
また、分割有り復元部２１４は、第２の復元処理で復元された偶数におけるビットマップと第２の復元処理で復元された奇数におけるビットマップとをＯＲ演算する（併合処理）。そして、分割有り復元部２１４は、ＯＲ結果のビットマップを復元結果として検索処理部２１５に出力する。
【００７０】
検索処理部２１５は、検索対象の単語に対応するビットマップに基づいて、検索対象のファイルＩＤに対応する当該単語の存否情報を検索する。例えば、検索処理部２１５は、復元結果のビットマップの各ビットのうち、検索対象のファイルＩＤに対するビットの値に基づいて、検索対象の単語の存否情報を検索する。
【００７１】
検索結果出力部２１６は、検索処理部２１５によって検索された結果を出力する。例えば、検索結果出力部２１６は、存否情報が「１」であれば、検索結果として存在する旨を出力する。検索結果出力部２１６は、存否情報が「０」であれば、検索結果として存在しない旨を出力する。
【００７２】
［検索処理のフローチャート］
図９は、実施例に係る検索処理のフローチャートの一例を示す図である。
【００７３】
まず、検索装置２００は、検索する単語およびファイルＩＤを受け付ける（ステップＳ３１）。検索装置２００は、ハッシュ化インデックス２２１を記憶部２２０から読み出す（ステップＳ３２）。検索装置２００は、読み出したハッシュ化インデックス２２１から、検索対象の単語が示す単語ＩＤに対応する、底α、底βの各ハッシュ化ビットマップを選択する（ステップＳ３３）。
【００７４】
検索装置２００は、どちらか一方のハッシュ化ビットマップに分割先が設定されているか否かを判定する（ステップＳ３４）。どちらか一方のハッシュ化ビットマップに分割先が設定されていないと判定した場合には（ステップＳ３４；Ｎｏ）、検索装置２００は、選択されたハッシュ化ビットマップを展開する（ステップＳ３５）。なお、かかる復元処理は、底αおよび底βにおけるハッシュ化ビットマップ毎に行われる。すなわち、検索装置２００は、底αのハッシュ化ビットマップについて、第１の復元処理を行う。検索装置２００は、底βのハッシュ化ビットマップについて、第１の復元処理を行う。
【００７５】
そして、検索装置２００は、底αのビットマップと底βのビットマップとをＡＮＤ演算する（ステップＳ３６）。すなわち、検索装置２００は、第１の復元処理によって復元された底αのビットマップおよび底βのビットマップを用いて、第２の復元処理を行う。そして、検索装置２００は、復元後のビットマップについて検索処理をすべく、ステップＳ４２に移行する。
【００７６】
一方、どちらか一方のハッシュ化ビットマップに分割先が設定されていると判定した場合には（ステップＳ３４；Ｙｅｓ）、検索装置２００は、分割先に格納されたハッシュ化ビットマップ（偶数）を展開する（ステップＳ３７）。なお、かかる復元処理は、底αおよび底βにおけるハッシュ化ビットマップ（偶数）毎に行われる。すなわち、検索装置２００は、底αのハッシュ化ビットマップ（偶数）について、第１の復元処理を行う。検索装置２００は、底βのハッシュ化ビットマップ（偶数）について、第１の復元処理を行う。
【００７７】
そして、検索装置２００は、底αのビットマップ（偶数）と底βのビットマップ（偶数）とをＡＮＤ演算する（ステップＳ３８）。すなわち、検索装置２００は、第１の復元処理によって復元された底αのビットマップ（偶数）および底βのビットマップ（偶数）を用いて、第２の復元処理を行う。
【００７８】
続いて、検索装置２００は、分割先に格納されたハッシュ化ビットマップ（奇数）を展開する（ステップＳ３９）。なお、かかる復元処理は、底αおよび底βにおけるハッシュ化ビットマップ（奇数）毎に行われる。すなわち、検索装置２００は、底αのハッシュ化ビットマップ（奇数）について、第１の復元処理を行う。検索装置２００は、底βのハッシュ化ビットマップ（奇数）について、第１の復元処理を行う。
【００７９】
そして、検索装置２００は、底αのビットマップ（奇数）と底βのビットマップ（奇数）とをＡＮＤ演算する（ステップＳ４０）。すなわち、検索装置２００は、第１の復元処理によって復元された底αのビットマップ（奇数）および底βのビットマップ（奇数）を用いて、第２の復元処理を行う。
【００８０】
そして、検索装置２００は、ＡＮＤ演算後のビットマップ（偶数）とビットマップ（奇数）とをＯＲ演算（併合）する（ステップＳ４１）。すなわち、検索装置２００は、第２の復元処理によって復元されたビットマップ（偶数）およびビットマップ（奇数）を用いて、併合処理を行う。そして、検索装置２００は、復元後のビットマップについて検索処理をすべく、ステップＳ４２に移行する。
【００８１】
ステップＳ４２において、検索装置２００は、復元後のビットマップに対して、検索対象のファイルＩＤに対するビットが「１」であるか否かを判定する（ステップＳ４２）。ビットが「１」でないと判定した場合には（ステップＳ４２；Ｎｏ）、検索装置２００は、存在しない旨を示す「ＮＧ」を検索結果として出力する（ステップＳ４３）。そして、検索装置２００は、検索処理を終了する。
【００８２】
一方、ビットが「１」であると判定した場合には（ステップＳ４２；Ｙｅｓ）、検索装置２００は、存在する旨を示す「ＯＫ」を検索結果として出力する（ステップＳ４４）。そして、検索装置２００は、検索処理を終了する。
【００８３】
［実施例の効果］
上記実施例によれば、インデックス生成装置１００は、複数のファイルの少なくともいずれかに含まれる複数の要素それぞれについて、複数のファイルそれぞれに対する存否情報を生成する。そして、インデックス生成装置１００は、存否情報より、複数のファイルの軸に対し複数のハッシュ関数を適用した複数ハッシュ化軸を用いたハッシュ化インデックス情報を生成する際に、存否情報では独立であるがハッシュ化インデックス情報では重複する衝突データの検知を行う。インデックス生成装置１００は、検知された衝突が特定の条件を満たす場合、衝突データそれぞれに対し複数ハッシュ化軸のいずれか１つに対し追加の値を設定して対応づける。かかる構成によれば、インデックス生成装置１００は、ハッシュ化インデックス情報が特定の条件により衝突する場合に、複数ハッシュ化軸のうち１つの軸を拡張することで、衝突を回避できる。
【００８４】
また、上記実施例によれば、インデックス生成装置１００は、複数ハッシュ化軸のいずれか１つで連続して衝突が発生した場合に、衝突が発生したハッシュ化軸に対応する要素に対するに対する存否情報を用いて存否の比率を集計する。インデックス生成装置１００は、集計した存否の比率のうち存在する率が閾値より大きい場合に、要素に対する存否情報を分割する。インデックス生成装置１００は、複数ハッシュ化軸のいずれか１つに対し分割先を設定して対応づける。かかる構成によれば、インデックス生成装置１００は、要素に対する存否情報を分割することで、存否情報の軸を拡張することで、ハッシュノイズを軽減することができる。
【００８５】
また、上記実施例によれば、インデックス生成装置１００は、ハッシュ化軸の大きさは、レジスタの大きさに合わせたビット数である。かかる構成によれば、インデックス生成装置１００は、ハッシュ化軸の大きさをレジスタの大きさに合わせることで、複数ハッシュ化軸の論理演算を高速に行うことができ、ビットマップのハッシュ化を高速に行うことができるとともに、ハッシュ化の復元を高速に行うことができる。
【００８６】
［実施例に関連する他の態様］
以下、上述の実施形態における変形例の一部を説明する。下記の変形例のみでなく、本発明の本旨を逸脱しない範囲の設計変更は適宜行われうる。
【００８７】
また、実施例に係るインデックス生成装置１００は、３２ビットレジスタを想定し、２９と３１のハッシュ値（底）を基に、各ビットマップをハッシュ化するとして説明した。実施例では、１つのビットマップを４４ビットとして説明した。しかしながら、２９および３１のハッシュ値（底）は、一例であって、これに限定されない。ビットマップのビット数も、一例であって、これに限定されない。２つのハッシュ値（底）は、複数のファイル内のそれぞれの単語の種類の数に応じて決定されれば良い。例えば、単語の種類数が１００００であるとすると、一方の底で割った余りと他方の底で割った余りとから表わされる２次元の行列が約１００００となるように、２つの底が選択される。２つの底は、隣接した素数であれば良い。選択される２つの素数は、行列の数が１００００の場合、一例として、９７と１０１である。つまり、最小公倍数が約１００００となる２次元のマトリックス空間の中で、ある単語について一方のハッシュおよび他方のハッシュで求められる余りの組は、他の単語について求められる余りの組と衝突しない（重複しない）であろうという推測に基づくものである。
【００８８】
また、実施例に係るインデックス生成装置１００は、隣接した複数のハッシュ値（底）を基に、２次元（単語の軸とファイルの軸）にハッシュ化を適用したハッシュ化インデックスを生成すると説明した。しかしながら、インデックス生成装置１００は、ファイルの軸に代えてブロックの軸としても良い。すなわち、単語ＩＤの存否情報は、ブロック単位であるとしても良い。
【００８９】
また、実施例に係るビットマップ型インデックスＢＩは、２次元で表わされるものとして説明した。すなわち、Ｘ軸はファイルＩＤを表し、Ｙ軸は単語ＩＤを表す。しかしながら、ビットマップ型インデックスＢＩは、３次元で表わせるものとしても良い。例えば、Ｘ軸は１グラム目の単語ＩＤを表し、Ｙ軸は２グラム目の単語ＩＤを表し、Ｚ軸はファイルＩＤを表す。かかる場合には、インデックス生成装置１００は、Ｘ軸とＺ軸とで表わされる２次元空間に関して、２つのハッシュ値（底）を基に、各ビットマップをハッシュ化すれば良い。加えて、インデックス生成装置１００は、Ｙ軸とＺ軸とで表わされる２次元空間に関して、２つのハッシュ値（底）を基に、各ビットマップをハッシュ化すれば良い。そして、検索装置２００は、２グラムの文字列およびファイルＩＤの入力を受け付けると、以下のように検索処理を行えば良い。まず、検索装置２００は、１グラム目の単語が示す単語ＩＤに対する複数のハッシュ化ビットマップを復元する。検索装置２００は、復元結果である１グラム目の単語の単語ＩＤのビットマップの各ビットが示す、複数のファイルそれぞれにおける単語ＩＤが示す単語の存否情報に基づいて、受け付けたファイルＩＤに対応する当該単語ＩＤが示す単語の存否情報を検索する。次に、検索装置２００は、２グラム目の単語が示す単語ＩＤに対する複数のハッシュ化ビットマップを復元する。検索装置２００は、復元結果である２グラム目の単語の単語ＩＤのビットマップの各ビットが示す、複数のファイルそれぞれにおける単語ＩＤが示す単語の存否情報に基づいて、受け付けたファイルＩＤに対応する当該単語ＩＤが示す単語の存否情報を検索する。そして、検索装置２００は、検索された、１グラム目の単語の存否情報と２グラム目の単語の存否情報とをＡＮＤ演算して、２グラムの文字列の存否情報を検索する。
【００９０】
また、実施例に係る情報処理装置１００は、圧縮辞書に対応するツリー構造としてケヤキ木を生成すると説明した。しかしながら、情報処理装置１００は、これに限定されず、圧縮辞書に対応するツリー構造としてハフマン木を生成するものとしても良い。すなわち、情報処理装置１００は、属性毎の単語を、それぞれ圧縮辞書に対応するハフマン木を構成する葉に割り当て、それぞれの葉に、対応する単語の圧縮符号、属性および単語へのポインタを設定すれば良い。そして、情報処理装置１００は、生成されたハフマン木を用いて、圧縮状態のソースコードの内部コード化を行ない、内部コードを用いて、構文解析およびインタープリタの実行を行えば良い。
【００９１】
また、実施例に示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【００９２】
［情報処理装置のハードウェア構成］
実施例のインデックス生成装置１００および検索装置２００を含む情報処理装置のハードウェア構成を、図１０を参照して説明する。図１０は、実施例に係る情報処理装置のハードウェア構成を示す図である。図１０の例が示すように、コンピュータ４００は、各種演算処理を実行するＣＰＵ４０１と、ユーザからのデータ入力を受け付ける入力装置４０２と、モニタ４０３とを有する。また、コンピュータ４００は、記憶媒体からプログラム等を読み取る媒体読取装置４０４と、他の装置と接続するためのインターフェース装置４０５と、他の装置と無線により接続するための無線通信装置４０６とを有する。また、コンピュータ４００は、各種情報を一時記憶するＲＡＭ４０７と、ハードディスク装置４０８とを有する。また、各装置４０１〜４０８は、バス４０９に接続される。
【００９３】
ハードディスク装置４０８には、例えば図６に示したハッシュ化部１１１、重複判定部１１２、０／１比率集計部１１３およびビットマップ分割部１１４の各処理部と同様の機能を有するインデックス生成プログラムが記憶される。また、ハードディスク装置４０８には、インデックス生成プログラムを実現するための各種データが記憶される。ハードディスク装置４０８には、例えば図８に示した分割先有無判定部２１２、分割無し復元部２１３、分割有り復元部２１４および検索処理部２１５の各処理部と同様の機能を有する検索プログラムが記憶される。また、ハードディスク装置４０８には、検索プログラムを実現するための各種データが記憶される。
【００９４】
ＣＰＵ４０１は、ハードディスク装置４０８に記憶された各プログラムを読み出して、ＲＡＭ４０７に展開して実行することで各種の処理を行う。これらのプログラムは、コンピュータ４００を、例えば図６に示したハッシュ化部１１１、重複判定部１１２、０／１比率集計部１１３およびビットマップ分割部１１４として機能させることができる。これらのプログラムは、コンピュータ４００を、例えば図８に示した分割先有無判定部２１２、分割無し復元部２１３、分割有り復元部２１４および検索処理部２１５として機能させることができる。
【００９５】
なお、上記のインデックス生成プログラムおよび検索プログラムは、必ずしもハードディスク装置４０８に記憶されている必要はない。例えば、コンピュータ４００が読み取り可能な記憶媒体に記憶されたプログラムを、コンピュータ４００が読み出して実行するようにしてもよい。コンピュータ４００が読み取り可能な記憶媒体は、例えば、ＣＤ−ＲＯＭやＤＶＤディスク、ＵＳＢ（Universal  Serial  Bus）メモリ等の可搬型記録媒体、フラッシュメモリ等の半導体メモリ、ハードディスクドライブ等が対応する。また、公衆回線、インターネット、ＬＡＮ（Local  Area  Network）等に接続された装置にプログラムを記憶させておき、コンピュータ４００がこれらからプログラムを読み出して実行するようにしてもよい。
【００９６】
図１１は、コンピュータで動作するプログラムの構成例を示す図である。コンピュータ４００において、図１１に示すハードウェア群２６（４０１〜４０９）の制御を行なうＯＳ（オペレーティング・システム）２７が動作する。ＯＳ２７に従った手順でＣＰＵ４０１が動作して、ハードウェア群２６の制御・管理が行なわれることにより、アプリケーションプログラム２９やミドルウェア２８に従った処理がハードウェア群２６で実行される。さらに、コンピュータ４００において、ミドルウェア２８またはアプリケーションプログラム２９が、ＲＡＭ４０７に読み出されてＣＰＵ４０１により実行される。
【００９７】
例えば、ＣＰＵ４０１によりインデックス生成命令を受け付けた場合、ミドルウェア２８またはアプリケーションプログラム２９の少なくとも一部に基づく処理を行なうことで、（それらの処理をＯＳ２７に基づいてハードウェア群２６を制御して）制御部１１０のインデックス生成機能が実現される。インデックス生成機能は、それぞれアプリケーションプログラム２９自体に含まれてもよいし、アプリケーションプログラム２９に従って呼び出されることで実行されるミドルウェア２８の一部であってもよい。ＣＰＵ４０１により検索キーを受け付けた場合、ミドルウェア２８またはアプリケーションプログラム２９の少なくとも一部に基づく処理を行なうことで、（それらの処理をＯＳ２７に基づいてハードウェア群２６を制御して）制御部２１０の検索機能が実現される。検索機能は、それぞれアプリケーションプログラム２９自体に含まれてもよいし、アプリケーションプログラム２９に従って呼び出されることで実行されるミドルウェア２８の一部であってもよい。
【符号の説明】
【００９８】
１００  インデックス生成装置
１１０  制御部
１１１  ハッシュ化部
１１２  重複判定部
１１３  ０／１比率集計部
１１４  ビットマップ分割部
１２０  記憶部
１２１  ビットマップ型インデックス
１２２  ハッシュ化インデックス
２００  検索装置
２１０  制御部
２１１  検索キー受付部
２１２  分割先有無判定部
２１３  分割無し復元部
２１４  分割有り復元部
２１５  検索処理部
２１６  検索結果出力部
２２０  記憶部
２２１  ハッシュ化インデックス
【図１Ａ】
0006551131.tif 000002
【図１Ｂ】
0006551131.tif 000003
【図２】
0006551131.tif 000004
【図３Ａ】
0006551131.tif 000005
【図３Ｂ】
0006551131.tif 000006
【図４Ａ】
0006551131.tif 000007
【図４Ｂ】
0006551131.tif 000008
【図５】
0006551131.tif 000009
【図６】
0006551131.tif 000010
【図７】
0006551131.tif 000011
【図８】
0006551131.tif 000012
【図９】
0006551131.tif 000013
【図１０】
0006551131.tif 000014
【図１１】
0006551131.tif 000015