(57)【要約】  接頭辞集合特定部８１は、各検索候補文字列の先頭文字から抽出される連続する１文字以上の文字列である接頭辞の集合から、入力された文字列で終わる接頭辞の集合を特定する。接頭辞特定部８２は、入力された文字列で終わる接頭辞の集合の中から、接頭辞ごとにその接頭辞で始まる検索候補文字列に対応づけられた文字列スコアのうち最も大きい文字列スコアで定義される接頭辞スコアが最大の接頭辞を特定する。文字列特定部８３は、特定された接頭辞で始まる検索候補文字列の中から、文字列スコアが最大の検索候補文字列を特定する。
2015025467.tif 000002
【特許請求の範囲】
【請求項１】
優先的に検索すべき度合いを示す文字列スコアが対応づけられた検索候補文字列の集合から、入力された文字列を含む検索候補文字列を検索する文字列検索装置であって、
各検索候補文字列の先頭文字から抽出される連続する１文字以上の文字列である接頭辞の集合から、入力された文字列で終わる接頭辞の集合を特定する接頭辞集合特定部と、
入力された文字列で終わる接頭辞の集合の中から、前記接頭辞ごとに当該接頭辞で始まる検索候補文字列に対応づけられた文字列スコアのうち最も大きい文字列スコアで定義される接頭辞スコアが最大の接頭辞を特定する接頭辞特定部と、
特定された接頭辞で始まる検索候補文字列の中から、前記文字列スコアが最大の検索候補文字列を特定する文字列特定部とを備えた
ことを特徴とする文字列検索装置。
【請求項２】
検索範囲を管理する検索管理部を備え、
前記検索管理部は、文字列特定部によって特定された検索候補文字列の接頭辞で始まる検索候補文字列の中から、すでに特定された検索候補文字列を除く検索候補文字列の範囲を特定し、接頭辞集合特定部により特定された接頭辞の集合から、接頭辞特定部により特定された接頭辞を除いた接頭辞の範囲を特定し、
接頭辞特定部は、前記検索管理部により特定された接頭辞の範囲から、接頭辞スコアが最大の接頭辞を特定し、
文字列特定部は、前記検索管理部により特定された検索候補文字列の範囲から、文字列スコアが最大の検索候補文字列を特定する
請求項１記載の文字列検索装置。
【請求項３】
検索管理部は、接頭辞特定部が特定した接頭辞と接頭辞スコアのペア、および、文字列特定部が特定した検索対象文字列と文字列スコアのペアを保持するキューを含み、
前記検索管理部は、前記キューに保持されたペアの中から、接頭辞スコアまたは文字列スコアのうち、最大のスコアの接頭辞または検索対象文字列を特定し、最大のスコアが文字列スコアだった場合、当該文字列スコアの検索対象文字列をキューから除外して出力対象と特定し、最大のスコアが接頭辞スコアだった場合、当該接頭辞スコアの接頭辞をキューから除外し、
接頭辞特定部は、最大のスコアが接頭辞スコアだった場合、キューから除外された接頭辞の次に大きい接頭辞スコアの接頭辞を特定し、
文字列特定部は、最大のスコアが文字列スコアだった場合、キューから除外された検索対象文字列を特定する際に用いられた接頭辞と同じ接頭辞で始まる検索対象文字列の中で、当該除外された検索対象文字列の次に大きい文字列スコアを特定し、最大のスコアが接頭辞スコアだった場合、前記接頭辞特定部によって特定された接頭辞で始まる検索対象文字列の中から、文字列スコアが最も大きい検索対象文字列を特定する
請求項２記載の文字列検索装置。
【請求項４】
トライ木のデータ構造で表わされた検索候補文字列の集合から生成され、ＸＢＷのデータ構造を有する接頭辞の集合と、前記トライ木のデータ構造から生成されるパトリシア木であって、当該パトリシア木の各ノードに対応する文字列が除外されノード間の親子関係を表わす木構造のみ有するパトリシア木とを記憶する検索情報記憶部を備え、
接頭辞特定部は、前記ＸＢＷのデータ構造を有する接頭辞の集合から、接頭辞スコアが最大の接頭辞の位置を特定し、
検索管理部は、特定された前記接頭辞の位置から、前記パトリシア木において対応するノードの位置を特定する
請求項１から請求項３のうちのいずれか１項に記載の文字列検索装置。
【請求項５】
文字列特定部は、検索管理部により特定されたノードの位置配下に存在する検索候補文字列の中から文字列スコアが最大の検索候補文字列の位置を特定し、ＸＢＷのデータ構造を有する接頭辞の集合から、前記特定した位置に対応する検索候補文字列を特定する
請求項４記載の文字列検索装置。
【請求項６】
接頭辞特定部は、第一のＲＭＱ構造で表わされた接頭辞と接頭辞スコアとの関係をもとに、当該第一のＲＭＱ構造を用いて、特定された接頭辞の集合を範囲検索することにより、最大の接頭辞スコアの接頭辞を特定する
請求項１から請求項５のうちのいずれか１項に記載の文字列検索装置。
【請求項７】
文字列特定部は、第二のＲＭＱ構造で表わされた検索候補文字列と文字列スコアとの関係をもとに、当該第二のＲＭＱ構造を用いて、特定された接頭辞で始まる検索候補文字列を範囲検索することにより、最大の文字列スコアの検索候補文字列を特定する
請求項１から請求項６のうちのいずれか１項に記載の文字列検索装置。
【請求項８】
優先的に検索すべき度合いを示す文字列スコアが対応づけられた検索候補文字列の集合から、入力された文字列を含む検索候補文字列を検索する文字列検索方法であって、
各検索候補文字列の先頭文字から抽出される連続する１文字以上の文字列である接頭辞の集合から、入力された文字列で終わる接頭辞の集合を特定する接頭辞集合特定ステップと、
入力された文字列で終わる接頭辞の集合の中から、前記接頭辞ごとに当該接頭辞で始まる検索候補文字列に対応づけられた文字列スコアのうち最も大きい文字列スコアで定義される接頭辞スコアが最大の接頭辞を特定する接頭辞特定ステップと、
特定された接頭辞で始まる検索候補文字列の中から、前記文字列スコアが最大の検索候補文字列を特定する文字列特定ステップとを含む
ことを特徴とする文字列検索方法。
【請求項９】
検索範囲を管理する検索管理ステップを含み、
前記検索管理ステップで、文字列特定ステップで特定された検索候補文字列の接頭辞で始まる検索候補文字列の中から、すでに特定された検索候補文字列を除く検索候補文字列の範囲を特定し、接頭辞集合特定ステップで特定された接頭辞の集合から、接頭辞特定ステップで特定された接頭辞を除いた接頭辞の範囲を特定し、
接頭辞特定ステップで、前記検索管理ステップで特定された接頭辞の範囲から、接頭辞スコアが最大の接頭辞を特定し、
文字列特定ステップで、前記検索管理ステップで特定された検索候補文字列の範囲から、文字列スコアが最大の検索候補文字列を特定する
請求項８記載の文字列検索方法。
【請求項１０】
優先的に検索すべき度合いを示す文字列スコアが対応づけられた検索候補文字列の集合から、入力された文字列を含む検索候補文字列を検索するコンピュータに適用される文字列検索プログラムであって、
前記コンピュータに、
各検索候補文字列の先頭文字から抽出される連続する１文字以上の文字列である接頭辞の集合から、入力された文字列で終わる接頭辞の集合を特定する接頭辞集合特定処理、
入力された文字列で終わる接頭辞の集合の中から、前記接頭辞ごとに当該接頭辞で始まる検索候補文字列に対応づけられた文字列スコアのうち最も大きい文字列スコアで定義される接頭辞スコアが最大の接頭辞を特定する接頭辞特定処理、および、
特定された接頭辞で始まる検索候補文字列の中から、前記文字列スコアが最大の検索候補文字列を特定する文字列特定処理
を実行させるための文字列検索プログラム。
【請求項１１】
コンピュータに、
検索範囲を管理する検索管理処理を実行させ、
前記検索管理処理で、文字列特定処理で特定された検索候補文字列の接頭辞で始まる検索候補文字列の中から、すでに特定された検索候補文字列を除く検索候補文字列の範囲を特定させ、接頭辞集合特定処理で特定された接頭辞の集合から、接頭辞特定処理で特定された接頭辞を除いた接頭辞の範囲を特定させ、
接頭辞特定処理で、前記検索管理処理で特定された接頭辞の範囲から、接頭辞スコアが最大の接頭辞を特定させ、
文字列特定処理で、前記検索管理処理で特定された検索候補文字列の範囲から、文字列スコアが最大の検索候補文字列を特定させる
請求項１０記載の文字列検索プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、入力された文字列に部分一致するキーを検索する文字列検索装置、文字列検索方法および文字列検索プログラムに関する。
【背景技術】
【０００２】
人間のテキスト入力を支援する方法が普及し、我々の生活に欠かせないものになっている。入力支援として、例えば、検索エンジンの入力フォームに検索候補の検索キーワードを表示したり、ＷｅｂブラウザのＵＲＬ（Uniform Resource Locator）入力フォームに候補とするＵＲＬを表示したりすることが挙げられる。他にも、ＩＭＥ（Input Method Editor ）の予測変換時に変換候補を表示したり、スペルチェッカーにおいて正しいスペルの候補を表示したりすることも入力支援の一例である。【０００３】
このような入力支援は、辞書の検索として実現される。ユーザが入力しそうな文字列を、あらかじめ辞書にキーとして登録しておく。ユーザが新たに文字列の入力を開始したとき、ユーザが入力した文字列を検索クエリとして辞書を検索し、入力候補として適切なキーを取得して、画面上に表示する。例えば、検索キーワードの推薦では、過去にユーザが入力した検索キーワードをあらかじめ辞書に登録しておき、入力の候補として用いる。【０００４】
実際の場面では、候補に該当する全てのキーを列挙する必要はない。例えば、検索キーワードを推薦する場面では、入力頻度が高い上位ｋ個を候補として推薦すればよい。このように、スコアが大きい上位ｋ個のキーを検索する問題は、Ｔｏｐ−ｋ検索（Ｔｏｐ−ｋ辞書検索）と呼ばれる。【０００５】
非特許文献１では、ＲＭＱ  Ｔｒｉｅという、トライ（ｔｒｉｅ）とＲＭＱ（Ranged Minimum Query）構造を利用することで、前方一致するキーの中から上位のキーを高速に取得するデータ構造が記載されている。【０００６】
図９は、ＲＭＱ  Ｔｒｉｅを示す説明図である。図９に示す例では、検索クエリＰを接頭辞として持つノードｖを見つけ、ノードｖの配下のキーの範囲［ａ，ｂ］を得る。［ａ，ｂ］に含まれるキーは、全て検索クエリＰを接頭辞として持つ。このとき、各キーに対応づけて並べられたスコアの配列Ｒのうち範囲［ａ，ｂ］の範囲のスコアを検索することで、検索クエリＰを接頭辞として持つスコア上位ｋ個のキーを得る。【０００７】
非特許文献１には、ＲＭＱ  Ｔｒｉｅと同様に、前方一致するキーの中から上位のキーを高速に取得するために用いられるデータ構造が、他に２種類記載されている。【０００８】
また、非特許文献２には、文書検索におけるＴｏｐ−ｋ検索について記載されている。この手法は、文書検索用のデータ構造を基礎として、そのデータ構造にＴｏｐ−ｋ検索に必要な付加データを追加することで、Ｔｏｐ−ｋ検索を実現する。
【先行技術文献】
【非特許文献】
【０００９】
【非特許文献１】Bo-June (Paul) Hsu and Giuseppe Ottaviano, "Space-Efficient Data Structures for Top-k Completion", WWW '13 Proceedings of the 22nd international conference on World Wide Web, p583-594, May, 2013
【非特許文献２】Wing-Kai Hon, Rahul Shah, Sharma V. Thankachan, "Towards an Optimal Space-and-Query-Time Index for Top-k Document Retrieval", CPM'12 Proceedings of the 23rd Annual conference on Combinatorial Pattern Matching, p173-184
【発明の概要】
【発明が解決しようとする課題】
【００１０】
辞書に含まれるキーが大規模化すると、入力文字列に該当するキーの数も多くなるため、検索に時間がかかってしまう。そのため、候補とするキーを高速に取得することが求められる。【００１１】
一方、非特許文献１に記載された各データ構造を利用することで、前方一致するキーの候補を高速に取得することは可能であるが、部分一致するキーの候補を取得することは困難である。【００１２】
また、非特許文献２に記載されたデータ構造を用いることで、文書検索におけるＴｏｐ−ｋ検索を実現することができる。しかし、文書検索の際に用いられるデータはサイズが大きいため、文書検索に用いられる検索方法をそのまま辞書向けに適用した場合、対象とするデータサイズが大きくなってしまうという問題がある。【００１３】
そこで、本発明は、データ量を削減しつつ高速に文字列の部分一致検索を行うことができる文字列検索装置、文字列検索方法および文字列検索プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１４】
本発明による文字列検索装置は、優先的に検索すべき度合いを示す文字列スコアが対応づけられた検索候補文字列の集合から、入力された文字列を含む検索候補文字列を検索する文字列検索装置であって、各検索候補文字列の先頭文字から抽出される連続する１文字以上の文字列である接頭辞の集合から、入力された文字列で終わる接頭辞の集合を特定する接頭辞集合特定部と、入力された文字列で終わる接頭辞の集合の中から、接頭辞ごとにその接頭辞で始まる検索候補文字列に対応づけられた文字列スコアのうち最も大きい文字列スコアで定義される接頭辞スコアが最大の接頭辞を特定する接頭辞特定部と、特定された接頭辞で始まる検索候補文字列の中から、文字列スコアが最大の検索候補文字列を特定する文字列特定部とを備えたことを特徴とする。【００１５】
本発明による文字列検索方法は、優先的に検索すべき度合いを示す文字列スコアが対応づけられた検索候補文字列の集合から、入力された文字列を含む検索候補文字列を検索する文字列検索方法であって、各検索候補文字列の先頭文字から抽出される連続する１文字以上の文字列である接頭辞の集合から、入力された文字列で終わる接頭辞の集合を特定する接頭辞集合特定ステップと、入力された文字列で終わる接頭辞の集合の中から、接頭辞ごとにその接頭辞で始まる検索候補文字列に対応づけられた文字列スコアのうち最も大きい文字列スコアで定義される接頭辞スコアが最大の接頭辞を特定する接頭辞特定ステップと、特定された接頭辞で始まる検索候補文字列の中から、文字列スコアが最大の検索候補文字列を特定する文字列特定ステップとを含むことを特徴とする。【００１６】
本発明による文字列検索プログラムは、優先的に検索すべき度合いを示す文字列スコアが対応づけられた検索候補文字列の集合から、入力された文字列を含む検索候補文字列を検索するコンピュータに適用される文字列検索プログラムであって、コンピュータに、各検索候補文字列の先頭文字から抽出される連続する１文字以上の文字列である接頭辞の集合から、入力された文字列で終わる接頭辞の集合を特定する接頭辞集合特定処理、入力された文字列で終わる接頭辞の集合の中から、接頭辞ごとにその接頭辞で始まる検索候補文字列に対応づけられた文字列スコアのうち最も大きい文字列スコアで定義される接頭辞スコアが最大の接頭辞を特定する接頭辞特定処理、および、特定された接頭辞で始まる検索候補文字列の中から、文字列スコアが最大の検索候補文字列を特定する文字列特定処理を実行させることを特徴とする。
【発明の効果】
【００１７】
本発明によれば、データ量を削減しつつ高速に文字列の部分一致検索を行うことができる。
【図面の簡単な説明】
【００１８】
【図１】本発明による文字列検索装置の第１の実施形態の構成例を示すブロック図である。
【図２】キーに対応するトライ木の例を示す説明図である。
【図３】第１のＸＢＷの例を示す説明図である。
【図４】第２のＸＢＷの例を示す説明図である。
【図５】検索情報記憶部が記憶するデータ構造の例を示す説明図である。
【図６】第１の実施形態の文字列検索装置の動作例を示すフローチャートである。
【図７】文字列スコアの大きいキーを選択する処理の例を示す説明図である。
【図８】本発明による文字列検索装置の概要を示すブロック図である。
【図９】ＲＭＱ  Ｔｒｉｅを示す説明図である。
【発明を実施するための形態】
【００１９】
まず初めに、本発明の文字列検索装置の概略を説明する。本発明は、辞書向けデータ構造であるＸＢＷをＴｏｐ−ｋ検索に拡張することにより、入力された文字列に部分一致する上位のキーを検索するデータ構造を、省スペースかつ高速に実現するものである。
【００２０】
本発明では、検索候補文字列であるキーごとに、優先的に検索すべき度合いを示すスコア（以下、文字列スコアと記す。）が割り当てられ、キーの集合は、トライ木の構造で表わされる。
【００２１】
また、キーの集合に含まれるキーの全ての接頭辞は、辞書検索に用いられるＸＢＷ構造で表される。本発明の文字列検索装置は、このＸＢＷ構造を利用して、入力された文字列で終わる接頭辞の範囲を特定する。また、各接頭辞には、その接頭辞で始まるキーの中で最大のスコア（以下、接頭辞スコアと記す。）が対応付けられる。そこで、文字列検索装置は、特定した接頭辞の範囲の中で、最大の接頭辞スコアの接頭辞を特定する。
【００２２】
本発明では、特定された接頭辞の範囲内で最大の接頭辞スコアを特定するために、ＲＭＱ構造が用いられる。以下、最大の接頭辞スコアを特定するため、接頭辞と接頭辞スコアとの関係を表わすために用いられるＲＭＱ構造を、第一のＲＭＱ構造と記す。文字列検索装置は、この第一のＲＭＱ構造を用いて、特定された接頭辞の範囲内で最大の接頭辞スコアの接頭辞を特定する。
【００２３】
さらに、文字列検索装置は、特定された接頭辞で始まるキーの中で最大の文字列スコアのキーを特定する。このとき、特定された接頭辞は、トライ木における一つのノードに対応する。そこで、各ノード配下に存在するキーの範囲の中で最大の文字列スコアを特定するため、最大の接頭辞スコアと特定する場合と同様、ＲＭＱ構造が用いられる。以下、キーと文字列スコアとの関係を表わすために用いられるＲＭＱ構造を、第二のＲＭＱ構造と記す。文字列検索装置は、この第二のＲＭＱ構造を用いて、特定された接頭辞で始まるキーの範囲の中から最大の文字列スコアのキーを特定する。
【００２４】
最大の文字列スコアのキーを特定した後、文字列検索装置は、この文字列検索をＴｏｐ−ｋ検索に適用するため、文字列スコアが２番目以降のキーを検索する処理を行う。２番目以降のキーが存在する位置は、既に特定された接頭辞で始まるキーの２番目以降か、まだ特定されていない接頭辞の１番目以降である。
【００２５】
そこで、文字列検索装置は、特定された接頭辞の接頭辞スコアと特定されたキーの文字列スコアを保持しておく。文字列検索装置は、保持する文字列スコアと接頭辞スコアのうち、最大のスコアとなるキーまたは接頭辞を選択する。それがキーであれば、そのキーと同じ接頭辞で始まるキーの中で、次に文字列スコアが大きいキーを検索する。また、それが接頭辞であれば、その接頭辞の次に接頭辞スコアが大きい接頭辞を検索する。これを繰り返すことで、入力された文字列を含むキーのうち、文字列スコアが上位となるものを効率的に検索できる。
【００２６】
以下、本発明の文字列検索装置の実施形態を、図面を参照してより具体的に説明する。
【００２７】
実施形態１． 
図１は、本発明による文字列検索装置の第１の実施形態の構成例を示すブロック図である。本実施形態の文字列検索装置は、入力部１０と、接頭辞集合特定部２０と、検索管理部３０と、接頭辞特定部３１と、文字列特定部３２と、出力部４０と、検索情報記憶部５０とを備えている。
【００２８】
入力部１０は、一文字以上の文字列を入力する。本実施形態の文字列検索装置は、入力された文字列に部分一致するキーを検索する。以下の説明では、入力される文字列のことを検索クエリ（または、単にクエリ）Ｐと記す。
【００２９】
検索情報記憶部５０は、検索候補文字列であるキーの集合を記憶する。本実施形態で用いられるキーには、上述するように文字列スコアが対応づけられる。すなわち、本実施形態の文字列検索装置は、キーの集合から、より文字列スコアが大きいキーを優先的に検索する。
【００３０】
本実施形態では、データ量を削減するため、検索対象とするキーは、トライ木の構造を利用して表わされる。図２は、キーに対応するトライ木の例を示す説明図である。例えば、図２に例示する４つの単語（ａｂａ，ａｂｃｃ，ｃａｂ，ｃａｃ）が存在する場合、トライ木は、共通する文字を共通のノードに配置するように構成される。検索情報記憶部５０は、トライ木で表わされたキーそのものを記憶してもよく、後述するように、トライ木の構造のみを記憶してもよい。
【００３１】
また、木構造で表わされた各葉ノードが、各キーに対応する。そこで、検索情報記憶部５０は、図２に例示する各キーのスコア（文字列スコア）を各葉ノードに対応付けて記憶する。これにより、トライ木を探索して葉ノードに到達したとき、その葉ノードが表すキーに対応する文字列スコアを取得できる。
【００３２】
さらに、検索情報記憶部５０は、クエリＰで終わる文字列を検索できるように、接頭辞ｐの集合を記憶する。ここで、接頭辞ｐとは、各キーの先頭文字から抽出される連続する１文字以上の文字列である。この接頭辞ｐの集合は、末尾から辞書式順序にソートされていてもよい。
【００３３】
本実施形態では、このような接頭辞の集合を表わすため、ＸＢＷという構造を利用する。ＸＢＷは、ラベルつきの木構造を効率的に表現することができるデータ構造である。トライ木をこのＸＢＷ構造を用いて表現することで、クエリＰで終わる接頭辞ｐの範囲検索が可能になる。
【００３４】
ＸＢＷは、同等の操作を実現するデータ構造を２種類の方法で実現できることが知られている。第１のＸＢＷは、辞書の各接頭辞について、その接頭辞に対応するトライ木上のノードにおいて子ノードを表す文字を対応付ける構造を有する。第２のＸＢＷは、辞書の各接頭辞について、その接頭辞に対応するトライ木上のノードにおいて親ノードとなる接頭辞のＩＤを対応付ける構造を有する。以下、それぞれのＸＢＷの内容を説明する。
【００３５】
図３は、第１のＸＢＷの例を示す説明図である。図３に例示する第１のＸＢＷでは、トライ木の各ノードに対応する接頭辞が末尾から辞書式順序で並べられ、それぞれの接頭辞について、子ノードを表す文字が対応づけられる。このような構造により、各接頭辞から特定の文字を表す子ノードに移動することが可能になり、トライ木と同等の動作を実現できる。また、クエリＰで終わる接頭辞ｐを範囲検索することができる。
【００３６】
図４は、第２のＸＢＷの例を示す説明図である。図４に例示する第２のＸＢＷでは、トライ木の各ノードに対応する接頭辞が末尾から辞書式順序で並べられ、各接頭辞にＩＤが付与される。そして、それぞれの接頭辞について、その親のＩＤが対応づけられる。このような構造により、次の親ノードに移動することが可能になる。また、第１のＸＢＷと同様に、クエリＰで終わる接頭辞ｐを範囲検索することができる。
【００３７】
なお、第２のＸＢＷでは、親のＩＤしか持たないため、子ノードを探索することは困難である。ただし、第２のＸＢＷを利用する場合でも、クエリＰで終わる接頭辞ｐの範囲検索は可能である。本実施形態では、いずれのＸＢＷも利用可能である。
【００３８】
第１のＸＢＷについては参照文献１に、第２のＸＢＷについては参照文献２に記載されている。
＜参照文献１＞Paolo Ferragina, Fabrizio Luccio, Giovanni Manzini and S. Muthukrishnan, "Structuring labeled trees for optimal succinctness, and beyond", FOCS '05 Proceedings of the 46th Annual IEEE Symposium on Foundations of Computer Science, Pages 184-196
＜参照文献２＞Wing-Kai Hon, Tsung-Han Ku, Rahul Shah, Sharma V. Thankachan, and Jerey Scott Vitter, “Faster compressed dictionary matching”, SPIRE'10 Proceedings of the 17th international conference on String processing and information retrieval, Pages 191-200
【００３９】
また、本実施形態では、接頭辞ごとにスコア（すなわち、接頭辞スコア）を定義する。接頭辞スコアは、その接頭辞で始まるキーに対応づけられた文字列スコアのうち最も大きい文字列スコアで定義される。このスコアを式で表すと式１のようになる。式１における右辺のＳｃｏｒｅは、文字列スコアを表わし、式１における左辺のＳｃｏｒｅは、接頭辞スコアを表わす。
【００４０】
Ｓｃｏｒｅ（ｐ）＝ｍａｘ｛Ｓｃｏｒｅ（接頭辞ｐで始まるキー）｝  ・・・（式１）
【００４１】
本実施形態では、キーの集合が木構造で表わされているため、ある接頭辞で始まるキーは、その接頭辞に対応するノードの配下に存在する。したがって、接頭辞スコアは、そのノード配下に存在するキーの中で最も大きい文字列スコアになる。
【００４２】
本実施形態では、ＸＢＷ構造に第一のＲＭＱ構造を追加し、その第一のＲＭＱ構造を利用して各ノードに対応する接頭辞スコアを特定できるようにする。具体的には、ＲＭＱで用いられる配列に、各接頭辞の接頭辞スコアを格納する。以下、接頭辞スコアが格納される配列を、接頭辞スコア列Ｒｐと記す。接頭辞は末尾を基準にソートされているため、同じ文字列で終わる接頭辞は、ひとつながりの範囲で特定される。したがって、第一のＲＭＱ構造を用いることで、接頭辞スコア列Ｒｐの任意の範囲における最大値を特定できる。
【００４３】
さらに、本実施形態では、第二のＲＭＱ構造を利用して各キーの文字列スコアを特定できるようにする。具体的には、ＲＭＱで用いられる配列に、各キーの文字列スコアを格納する。以下、文字列スコアが格納される配列を、文字列スコア列Ｒｋと記す。各キーは、先頭からソートされているため、ある接頭辞で始まるキーは、ひとつながりの範囲で特定される。したがって、第二のＲＭＱ構造を用いることで、文字列スコア列Ｒｋの任意の範囲における最大値を特定できる。
【００４４】
図５は、検索情報記憶部が記憶するデータ構造の例を示す説明図である。本実施形態におけるＸＢＷ構造は、トライ木のノードごとに３つの要素の組を有する集合Ｓで表わされる。Ｓｌａｓｔは、バイナリのフラグであり、ノードの親ノードにとってそのノードが最後の子供である場合に１になり、それ以外は０になる。Ｓαは、ノードが表わす文字である。Ｓπは、ノードの親ノードに対応する接頭辞であり、ルートから親ノードまでの文字を順番に結合した文字列である。なお、Ｓπには、ノード自身の文字は含まれない。３つの要素の組は、各要素に含まれる接頭辞の末尾の文字から先頭の文字までを比較して辞書式順序でソートされる。図５に示す例では、ソートされた各組（Ｓπ，Ｓα，Ｓｌａｓｔ）に、先頭から順に行番号が付与される。なお、図５において、＄はキーの先頭を示し、＃はキーの末尾を示す。
【００４５】
また、図５に示すように、接頭辞ごとに接頭辞スコアＲｐが定義される。接頭辞スコアＲｐは、上述するように、各キーに対応づけられた文字列スコアから算出されるため、明示的に接頭辞スコアは保持されなくてもよい。図５に例示する接頭辞ＩＤは、辞書に含まれる全ての接頭辞を、末尾からソートした順に付与される。したがって、接頭辞ＩＤの順番は、Ｓｌａｓｔに１が設定されている接頭辞の順番と一致する。
【００４６】
図５に例示する構造によって、クエリＰで終わる接頭辞の範囲を特定できる。例えば、クエリ“ａｂ”で終わる接頭辞に対応する行は、行番号７〜９に対応する行（すなわち、“＄ａｂ”，“＄ｃａｂ”に相当する行）であることが分かる。また、“＄ａｂ”および“＄ｃａｂ”の接頭辞スコアＲｐは、それぞれ接頭辞ＩＤ＝４，５に対応する９および４であることも分かる。
【００４７】
接頭辞の範囲を特定できれば、その範囲でスコアが最大となる接頭辞のＩＤを第一のＲＭＱ構造で取得することができる。さらに、第一のＲＭＱ構造を再帰的に利用することで、スコアの大きさが２位以下の接頭辞ＩＤを取得することができる。
【００４８】
以上のことから、ＸＢＷ構造を用いることで、クエリＰで終わる接頭辞ｐの中から接頭辞スコアが上位となる接頭辞ｐを任意の数だけ選択することが可能になる。
【００４９】
接頭辞集合特定部２０は、検索情報記憶部５０に記憶された接頭辞の集合から、入力された文字列を含む接頭辞の集合を特定する。具体的には、接頭辞集合特定部２０は、入力された文字列で終わる接頭辞の集合を特定する。例えば、検索情報記憶部５０が図５に例示する接頭辞の集合を記憶している場合、文字列として“ａｂ”が入力されると、接頭辞集合特定部２０は、行番号７〜９の範囲に存在する接頭辞（すなわち、“＄ａｂ”，“＄ｃａｂ”）を接頭辞の集合として特定する。
【００５０】
接頭辞特定部３１は、接頭辞集合特定部２０によって特定された接頭辞の集合の中から、接頭辞スコアが上位の接頭辞を特定する。接頭辞特定部３１は、接頭辞スコアが最も大きい接頭辞または接頭辞スコアの上位ｎ件に該当する接頭辞を特定してもよい（ｎは任意の自然数）。
【００５１】
文字列特定部３２は、特定された接頭辞で始まるキーのうち、文字列スコアが上位のキーを特定する。文字列特定部３２は、文字列スコアが最も大きいキーまたは文字列スコアの上位ｍ件に該当するキーを検索してもよい（ｍは任意の自然数）。
【００５２】
例えば、図５において、接頭辞特定部３１が接頭辞を“＄ａｂ”と特定したとする。この場合、特定された接頭辞“＄ａｂ”で始まるキーは、“ａｂａ”と“ａｂｃｃ”である。“ａｂａ”の文字列スコアは３であり、“ａｂｃｃ”の文字列スコアは９である。この場合、文字列特定部３２は、キーとして“ａｂｃｃ”を選択すればよい。
【００５３】
検索管理部３０は、接頭辞特定部３１が検索する接頭辞の範囲を特定する。また、検索管理部３０は、文字列特定部３２が検索するキーの範囲を特定し、文字列特定部３２によって特定されたキーを、検索対象のキーと特定する。
【００５４】
具体的には、検索管理部３０は、まず、接頭辞集合特定部２０が特定した接頭辞の範囲を、接頭辞特定部３１が検索する接頭辞の範囲と特定する。そして、検索管理部３０は、その特定された範囲内の接頭辞で始まるキーを文字列特定部３２が検索するキーの範囲と特定する。そして、検索管理部３０は、文字列特定部３２によって特定されたキーを、検索対象のキーと特定する。
【００５５】
その後、検索管理部３０は、文字列特定部３２によって特定されたキーの接頭辞で始まるキーの中から、すでに特定されたキーを除いた範囲を特定する。さらに、検索管理部３０は、接頭辞集合特定部２０により特定された接頭辞の集合から、接頭辞特定部３１により特定された接頭辞を除いた範囲を特定する。
【００５６】
そして、検索管理部３０は、接頭辞特定部３１および文字列特定部３２に、各処理を実行させる。具体的には、接頭辞特定部３１は、検索管理部３０により特定された接頭辞の範囲から、接頭辞スコアが最大の接頭辞を特定する。さらに、文字列特定部３２は、検索管理部３０により特定されたキーの範囲から、文字列スコアが最大のキーを特定する。
【００５７】
検索管理部３０は、接頭辞の範囲から特定された接頭辞の接頭辞スコアと、キーの範囲の中から特定されたキーの文字列スコアとを比較する。比較した結果、最も大きいスコアが文字列スコアだった場合、そのキーと同じ接頭辞で始まるキーの中で、そのキーの次に文字列スコアが大きいキーを検索する。具体的には、検索管理部３０は、そのキーを特定した際に用いたキーの範囲から、そのキーを除外して二分し、その２つの範囲を特定する。文字列特定部３２は、その２つの範囲の中から文字列スコアが最大となるキーを特定する。
【００５８】
最も大きいスコアが接頭辞スコアだった場合、その接頭辞の次に接頭辞スコアが大きい接頭辞を検索する。具体的には、検索管理部３０は、その接頭辞を特定した際に用いた接頭辞の範囲から、その接頭辞を除外して二分し、その２つの範囲を特定する。接頭辞特定部３１は、その範囲の中から接頭辞スコアが最大となる接頭辞を特定する。
【００５９】
出力部４０は、検索管理部３０により特定されたキーを検索結果として出力する。
【００６０】
接頭辞集合特定部２０と、検索管理部３０と、接頭辞特定部３１と、文字列特定部３２とは、プログラム（文字列検索プログラム）に従って動作するコンピュータのＣＰＵによって実現される。例えば、プログラムは、文字列検索装置の記憶部（図示せず）に記憶され、ＣＰＵは、そのプログラムを読み込み、プログラムに従って、接頭辞集合特定部２０、検索管理部３０、接頭辞特定部３１および文字列特定部３２として動作してもよい。
【００６１】
また、接頭辞集合特定部２０と、検索管理部３０と、接頭辞特定部３１と、文字列特定部３２とは、それぞれが専用のハードウェアで実現されていてもよい。
【００６２】
次に、本実施形態の文字列検索装置の動作を説明する。図６は、本実施形態の文字列検索装置の動作例を示すフローチャートである。ここでは、ｋ個のキーを候補として選択するものとする。また、検索管理部３０が、接頭辞特定部３１が特定した接頭辞および接頭辞スコアのペアと、文字列特定部３２が特定したキーおよび文字列スコアのペアとを保持する優先度付きキュー（図示せず）を含んでいるものとする。この優先度付きキューは、候補とする情報を保持するためのキューである。以下の説明では、優先度付きキューのことを、単にキューと記す。
【００６３】
入力部１０は、検索する文字列を入力する（ステップＳ１１）。接頭辞集合特定部２０は、検索情報記憶部５０を参照して、入力された文字列を含む接頭辞の集合を特定する（ステップＳ１２）。
【００６４】
接頭辞特定部３１は、接頭辞集合特定部２０が特定した接頭辞の集合の中から、接頭辞スコアが最も大きい接頭辞を特定し、特定した接頭辞と接頭辞スコアのペアをキューに保持する（ステップＳ１３）。
【００６５】
文字列特定部３２は、特定された接頭辞で始まるキーの中から、文字列スコアが最も大きいキーを特定し、特定したキーと文字列スコアのペアをキューに保持する（ステップＳ１４）。
【００６６】
次に、検索管理部３０は、キューに保持された接頭辞スコアまたは文字列スコアのうち、最大のスコアの接頭辞またはキーを特定する（ステップＳ１５）。そして、検索管理部３０は、最大のスコアが、接頭辞スコアか文字列スコアかを判断する（ステップＳ１６）。
【００６７】
最大のスコアが文字列スコアだった場合（ステップＳ１６における「文字列スコア」）、検索管理部３０は、その文字列スコアのキーを、出力対象として特定し、キューからは除外する（ステップＳ１７）。そして、文字列特定部３２は、除外されたキーを特定する際に用いられたキーの範囲の中で、除外したキーの次に大きい文字列スコアのキーを特定し、特定したキーと文字列スコアのペアをキューに保持する（ステップＳ１８）。
【００６８】
一方、最大のスコアが接頭辞スコアだった場合（ステップＳ１６における「接頭辞スコア」）、検索管理部３０は、その接頭辞スコアの接頭辞を、キューから除外する（ステップＳ１９）。そして、接頭辞特定部３１は、除外された接頭辞を特定する際に用いられた接頭辞の範囲の中で、除外した接頭辞の次に大きい接頭辞スコアの接頭辞を特定し、特定した接頭辞と接頭辞スコアのペアをキューに保持する（ステップＳ２０）。
【００６９】
さらに、文字列特定部３２は、ステップＳ２０で特定された接頭辞で始まるキーの中から、文字列スコアが最も大きいキーを特定し、特定したキーと文字列スコアのペアをキューに保持する（ステップＳ２１）。
【００７０】
キューが空になった、または、キューの中で最大のスコアが、それまでに見つかっているｋ番目に大きい文字列スコアを下回った場合（ステップＳ２２におけるＹｅｓ）、検索管理部３０は、それまでに見つかったキーを上位のキーとして出力する（ステップＳ２３）。一方、キーが空でなく、かつ、キューの中で最大のスコアが、それまでに見つかっているｋ番目に大きい文字列スコアを下回っていない場合（ステップＳ２２におけるＮｏ）、ステップＳ１５以降の処理が繰り返される。
【００７１】
このように、接頭辞特定部３１によって特定された接頭辞と接頭辞スコアのペア、および、文字列特定部３２によって特定されたキーと文字列スコアのペアを、同じ優先度付きキューに入れておくことで、接頭辞スコアまたは文字列スコアのうち、最も大きいスコアのペアを取り出すことができる。
【００７２】
以下、図６に例示する動作を具体例を用いて説明する。図７は、文字列スコアの大きいキーを選択する処理の例を示す説明図である。図７に示す例では、文字列“ｇｒｅｓ”が入力され、この文字列に部分一致するキーを３つ（ｋ＝３）検索する方法を示している。図７の左側の枠内に例示するリストが、ＸＢＷ構造を模式的に示したリストであり、数字が接頭辞スコアを表わし、文字が接頭辞を表わす。また、図７の右側の枠内に例示するリストが、トライ木を模式的に示したリストであり、数字が文字列スコアを表わし、文字がキーを表わす。
【００７３】
接頭辞集合特定部２０は、文字列“ｇｒｅｓ”に部分一致するキーの範囲をＸＢＷ構造で表わされた接頭辞の集合の中から、“ａｇｇｒｅｓ”，“ｃｏｎｇｒｅｓ”，“ｐｒｏｇｒｅｓ”を候補として特定する。接頭辞が特定されれば、その接頭辞で始まるキーを特定することができる。
【００７４】
接頭辞特定部３１は、決定された接頭辞の集合の中から、入力された文字列“ｇｒｅｓ”で終わる接頭辞の中で接頭辞スコアが最も大きい接頭辞を選択する。図７では、選択された接頭辞を接頭辞スコアが高い順に並べた状態を示している。図７に示す例では、“ｃｏｎｇｒｅｓ”の接頭辞スコアが４５で最も大きい。そこで、接頭辞特定部３１は、“ｃｏｎｇｒｅｓ”を接頭辞として特定する。
【００７５】
文字列特定部３２は、選択された接頭辞で始まるキーの中から文字列スコアが最も大きいキーを選択する。図７に示す例では、“ｃｏｎｇｒｅｓ”が接頭辞になるキーは、“ｃｏｎｇｒｅｓｓ”，“ｃｏｎｇｒｅｓｓｉｏｎａｌ”，“ｃｏｎｇｒｅｓｓｍｅｎ”の３つ存在する。このうち、文字列スコアが最も大きいキーは、“ｃｏｎｇｒｅｓｓ”である。そこで、文字列特定部３２は、１つ目のキーとして、“ｃｏｎｇｒｅｓｓ”を特定し、検索管理部３０は、特定された“ｃｏｎｇｒｅｓｓ”を検索対象のキーと特定する。
【００７６】
この段階では、まだキーは１つしか特定されていないため、キーを特定する処理が繰り返される。
【００７７】
検索管理部３０は、上述するように、候補とする情報を保持するための優先度付きキュー（図示せず）を備えておき、このキューにこれまで見つかった接頭辞およびキーをそのスコアとともに保持しておく。
【００７８】
検索管理部３０は、キューを参照し、キューに保持されている接頭辞及びキーの中から、最大のスコアのものを選択する。選択されたものがキーであった場合、文字列特定部３２は、そのキーを検索したときと同じキーの範囲のなかで、次に文字列スコアが大きいキーを検索する。選択されたものが接頭辞であった場合、接頭辞特定部３１は、その接頭辞を検索したときと同じ接頭辞の範囲のなかで、その接頭辞の次に接頭辞スコアが大きい接頭辞を検索する。
【００７９】
この例の場合、接頭辞スコア４５の接頭辞“ｃｏｎｇｒｅｓ”と、文字列スコア４５のキー“ｃｏｎｇｒｅｓｓ”がキューに保持されている。このときスコアは同値なので、キーと接頭辞のどちらを先に検索しても良い。キーを検索する場合、検索管理部３０は、まずキー“ｃｏｎｇｒｅｓｓ”をポップしてキューから除外する。そして、文字列特定部３２は、キー“ｃｏｎｇｒｅｓｓ”を得たときと同じ接頭辞“ｃｏｎｇｒｅｓ”で始まるキーの中で、キー“ｃｏｎｇｒｅｓｓ”の次に大きい文字列スコアを持つキーを検索する。具体的には、検索管理部３０は、キー“ｃｏｎｇｒｅｓｓ”を得たときに探索したキーの範囲について、今度は“ｃｏｎｇｒｅｓｓ”を除外して二分し、文字列特定部３２は、その２つの範囲の中で文字列スコアが最大となるキーを検索する。このとき、キー“ｃｏｎｇｒｅｓｓ”を除外して二分した２つの範囲のうち、“ｃｏｎｇｒｅｓｓ”よりも辞書順で前の範囲にはキーが存在しない。そのため、辞書順が後の範囲で最大の文字列スコアとなるキーだけを求めればよい。そのキーは文字列スコア１３のキー“ｃｏｎｇｒｅｓｓｍｅｎ”である。よって、検索管理部３０は、このキーを新たにキューに保持する。
【００８０】
接頭辞を検索する場合、検索管理部３０は、まず接頭辞“ｃｏｎｇｒｅｓ”をポップしてキューから除外する。そして、接頭辞特定部３１は、接頭辞“ｃｏｎｇｒｅｓ”の次に大きい接頭辞スコアを持つ接頭辞を検索する。具体的には、検索管理部３０は、接頭辞“ｃｏｎｇｒｅｓ”を得た時に探索した接頭辞の範囲について、今度は“ｃｏｎｇｒｅｓ”を除外して二分し、接頭辞特定部３１は、その２つの範囲の中で接頭辞スコアが最大となる接頭辞を検索する。このとき、接頭辞“ｃｏｎｇｒｅｓ”を除外して二分した２つの範囲で接頭辞スコアが大きい接頭辞は、それぞれ、接頭辞スコア１２の接頭辞“ａｇｇｒｅｓ”および接頭辞スコア２１の接頭辞“ｐｒｏｇｒｅｓ”である。よって、検索管理部３０は、この２つの接頭辞を新たにキューに保持する。
【００８１】
さらに続けて、文字列特定部３２は、接頭辞“ａｇｇｒｅｓ”および接頭辞“ｐｒｏｇｒｅｓ”について、それぞれの接頭辞で始まる文字列スコアが最大のキーを取得する。これにより、文字列スコア１２のキー“ａｇｇｒｅｓｉｖｅ”、および文字列スコア２１のキー“ｐｒｏｇｒｅｓｓ”が得られる。これにより、さきほど取得した２つの接頭辞のうち、接頭辞“ａｇｇｒｅｓ”の接頭辞スコアが１２であり、接頭辞“ｐｒｏｇｒｅｓ”の接頭辞スコアが２１であったことを確認できる。
【００８２】
本実施形態では、ＲＭＱ構造だけを保持しており、接頭辞スコア自体は保持していない。ＲＭＱ構造だけでは、接頭辞スコアが最大となる接頭辞がどれであるかを見つけることはできるが、その具体的な接頭辞スコアは計算できない。よって、その範囲で接頭辞スコアが最大となる接頭辞を取得したあと、その接頭辞スコアが具体的にどんな値であるか判断するためには、その接頭辞で始まるキーのうち最大となる文字列スコアを取得する必要がある。
【００８３】
以上の処理により、キューには５つのスコアが保持されている。接頭辞スコア２１の接頭辞“ｐｒｏｇｒｅｓ”、接頭辞スコア１２の接頭辞“ａｇｇｒｅｓ”、文字列スコア２１のキー“ｐｒｏｇｒｅｓｓ”、文字列スコア１３のキー“ｃｏｎｇｒｅｓｓｍｅｎ”、文字列スコア１２のキー“ａｇｇｒｅｓｉｖｅ”である。
【００８４】
このうち、スコアが最大であるのは、接頭辞スコア２１の接頭辞“ｐｒｏｇｒｅｓ”もしくは文字列スコア２１のキー“ｐｒｏｇｒｅｓｓ”なので、このどちらかの接頭辞もしくはキーについて探索すればよい。
【００８５】
この処理を繰り返す。もし、新たに見つかった接頭辞の接頭辞スコアが、それまでに見つかっているｋ番目に大きい文字列スコアを下回っている場合は、検索管理部３０は、その接頭辞をキューに登録しない。その接頭辞の次に接頭辞スコアが大きい接頭辞は、それよりもさらにスコアが小さいからである。同様に、新たに見つかったキーのスコアが、それまでに見つかっているｋ番目に大きい文字列スコアを下回っている場合、検索管理部３０は、そのキーをキューに登録しない。これにより、接頭辞スコアが小さい接頭辞や文字列スコアが小さいキーについては探索せずに済ませることができ、上位ｋ個のキーを効率的に収集できる。
【００８６】
キューが空になるか、キューの中で最大となるスコアが、それまでに見つかっているｋ番目に大きい文字列スコアを下回ったら探索終了となる。
【００８７】
以上のように、本実施形態によれば、接頭辞集合特定部２０が、接頭辞の集合から、入力された文字列で終わる接頭辞の集合を特定し、接頭辞特定部３１が、入力された文字列で終わる接頭辞の集合の中から、接頭辞スコアが最大の接頭辞を特定する。そして、文字列特定部３２が、特定された接頭辞で始まるキーの中から、文字列スコアが最大のキーを特定する。
【００８８】
具体的には、本実施形態では、接頭辞とキーについてのインデックスを作成しているため、全ての部分文字列についてインデックスを作成するよりも辞書サイズを削減できる。また、本実施形態では、接頭辞特定部３１が、接頭辞スコアが大きい接頭辞を特定し、文字列特定部３２が、その接頭辞の中から文字列スコアの大きいキーを探索するため、スコアが大きい方から探せば、効率的に上位ｋ個のキーを検索できる。したがって、データ量を削減しつつ高速に文字列の部分一致検索を行うことができる。
【００８９】
例えば、日本語辞書や英語辞書、クエリログやＵＲＬは、共通する接頭辞を有することが多い。本実施形態の文字列検索装置では、共通する接頭辞をまとめることが可能なデータ構造としてトライ木を利用するため、データサイズを削減できる。なお、本実施形態では、トライ木のデータ構造を利用してキーを表わす場合を例示したが、データ構造は、パトリシア木であってもよい。パトリシア木を用いることで、トライ木の木構造よりもデータサイズを削減できる。
【００９０】
また、本実施形態の文字列検索装置は、検索範囲を管理する検索管理部３０を備えている。具体的には、検索管理部３０は、文字列特定部３２によって特定されたキーの接頭辞で始まるキーの中から、すでに特定されたキーを除く範囲を特定し、接頭辞集合特定部２０により特定された接頭辞の集合から、接頭辞特定部３１により特定された接頭辞を除く範囲を特定する。そして、接頭辞特定部３１が、検索管理部３０により特定された接頭辞の範囲から、接頭辞スコアが最大の接頭辞を特定し、文字列特定部３２が、検索管理部３０により特定されたキーの範囲から、文字列スコアが最大のキーを特定する。このようにすることで、辞書向けのデータ構造として利用されるＸＢＷをＴｏｐ−ｋ検索に拡張できるため、上位ｋ個の候補を部分一致検索する際、省スペースかつ高速に処理を実現できる。
【００９１】
実施形態２．
次に、本発明による文字列検索装置の第２の実施形態を説明する。本実施形態の文字列検索装置の構成は、第１の実施形態と同様である。ただし、第２の実施形態の文字列検索装置は、第１の実施形態の文字列装置よりも、保持するデータ量をより削減できるようにするものである。
【００９２】
第１の実施形態で説明したトライ木Ｔからは、２つのデータ構造が生成される。１つは、接頭辞に関するデータ構造であり、もう１つは、キーに関するデータ構造である。
【００９３】
接頭辞に関するデータ構造は、トライ木ＴのＸＢＷ表現であるｘｂｗと、付随する第一のＲＭＱ構造を含む。第１の実施形態で説明したように、ｘｂｗ上では、接頭辞が末尾からソートされた順序に並んでいる。
【００９４】
また、第１の実施形態で示した接頭辞スコア列Ｒｐに対し、第一のＲＭＱ構造が生成される。このとき、検索情報記憶部５０は、接頭辞スコア列Ｒｐを、明示的に保持しなくてもよく、接頭辞スコア列Ｒｐから計算された第一のＲＭＱ構造のみ保持するようにしてもよい。
【００９５】
キーに関するデータ構造は、トライ木Ｔから生成されるパトリシア木Ｔｃと、第二のＲＭＱ構造と、文字列スコア列Ｒｋを含む。パトリシア木Ｔｃの木構造は、ＤＦＵＤＳで表わされる。さらに、パトリシア木Ｔｃにおいて、木構造の葉ノードのみを識別するため、ノード数と同数のビット列が用意される。
【００９６】
一般的なパトリシア木は、各ノードに対応する文字列を保持する。一方、本実施形態の検索情報記憶部５０は、各ノードに対応する文字列を除去し、ノード間の親子関係を表わす木構造のみ記憶する。このような木構造のみ記憶する理由については、後述される。
【００９７】
以下の説明では、図５に例示するように、各キーが、先頭の文字から辞書式順序にソートされ、各キーには、その順番にキーＩＤが振られているものとする。また、各接頭辞も、末尾から辞書式順序にソートされ、各接頭辞には、その順番に接頭辞ＩＤが振られているものとする。また、接頭辞ＩＤの範囲を［ｓｐ，ｅｐ］と記し、接頭辞を表わす集合Ｓ上の範囲を［ｓｓ，ｅｓ］と記す。
【００９８】
接頭辞集合特定部２０は、入力された文字列で終わる接頭辞ＩＤの範囲［ｓｐ，ｅｐ］を特定する。具体的には、接頭辞集合特定部２０は、ｘｂｗを用いて、接頭辞の末尾が入力された文字列になっている範囲［ｓｓ，ｅｓ］を特定する。ただし、この範囲［ｓｓ，ｅｓ］は、集合Ｓ上の範囲であるため、接頭辞ＩＤの範囲［ｓｐ，ｅｐ］に変換する必要がある。そこで、接頭辞集合特定部２０は、Ｓｌａｓｔ上で［ｓｓ，ｅｓ］に含まれる最初の１と最後の１が何番目の１であるか特定することで、［ｓｐ，ｅｐ］を特定する。Ｓｌａｓｔ上で１になる要素が、接頭辞ＩＤと同じ順序で一対一に対応しているからである。
【００９９】
接頭辞特定部３１は、特定された接頭辞ＩＤの範囲［ｓｐ，ｅｐ］から、接頭辞スコアが最大の接頭辞を特定する。具体的には、接頭辞特定部３１は、第一のＲＭＱ構造を利用して、［ｓｐ，ｅｐ］の範囲内で接頭辞スコアが最大になる接頭辞の位置を特定する。なお、ここで特定された接頭辞の位置をｉｐと記す。
【０１００】
検索管理部３０は、特定された接頭辞の位置ｉｐから、この接頭辞で始まるキーの範囲を特定する。以下、特定された接頭辞で始まるキーの範囲を［ｓｋ，ｅｋ］と記す。具体的には、検索管理部３０は、まず、Ｓ上での対応する位置ｉｓとして、接頭辞の位置ｉｐに対応する接頭辞を有する最後のノードを特定する。
【０１０１】
次に、検索管理部３０は、ｘｂｗにおいて、この接頭辞を表わす文字列を復元する。具体的には、検索管理部３０は、ｘｂｗにおけるｉｓ行目が表わすノードから親を辿っていったときの文字を結合することで、文字列を復元する。ノードから親に向かって移動する回数は、接頭辞の長さと等しい。
【０１０２】
このとき、検索管理部３０は、辿ったＳ上の各位置ｉｓについて、ｉｓより手前で最も近いＳｌａｓｔ［ｉｆ］＝１になる位置ｉｆとの差分ｄ＝ｉｓ−ｉｆを計算する。そして、検索管理部３０は、親に向かって辿った順序と逆の順に、計算した値を配列ｄへ格納する。ただし、上記のｉｆが存在しない場合、検索管理部３０は、ｉｆ＝０とした値を配列ｄへ格納する。
【０１０３】
次に、検索管理部３０は、パトリシア木Ｔｃにおいて、配列ｄに保存されている順序に従い、親ノードから子ノードへ対象とする位置を移動させる。ただし、配列ｄの対応する値が１である場合、検索管理部３０は、その値を無視して、次の値について処理を行う。
【０１０４】
ｘｂｗとＴｃは、同じトライ木Ｔから生成されているため、ノードの子が１つである場合を除き、各ノードが持つ子の数とその順序は一致する。そのため、配列ｄに従ってＴｃ上の対象とする位置を移動させると、その位置は、接頭辞に対応するＴｃ上のノードｕｃに到達する。
【０１０５】
検索管理部３０は、次に、ＤＦＵＤＳを用いて、到達したノードｕｃの子孫に対応するキーの範囲［ｓｋ，ｅｋ］を特定する。［ｓｋ，ｅｋ］に含まれるキーは、全てｕｃの子であることから、［ｓｋ，ｅｋ］は、特定された接頭辞で始まるキーの範囲を示していると言える。
【０１０６】
文字列特定部３２は、特定されたキーの範囲［ｓｋ，ｅｋ］から、文字列スコアが最大のキーＩＤ（以下、ｉｋと記す。）を特定する。具体的には、文字列特定部３２は、第二のＲＭＱ構造を利用して、［ｓｋ，ｅｋ］の範囲内で接頭辞スコアが最大になるキーの位置ｉｋを特定する。
【０１０７】
文字列特定部３２は、特定したキーＩＤの位置ｉｋから、キーの文字列を特定する。ｉｋは、パトリシア木Ｔｃ上のｉｋ番目の葉ノードｕｉに対応する。そこで、文字列特定部３２は、ｕｉからパトリシア木Ｔｃの親ノードへ辿り、親に向かって辿った順序と逆の順に、子ノードの番号を配列ｄへ格納する。文字列特定部３２は、この配列ｄに従って、ｘｂｗをルートから順に辿ることで、ｕｉに対応するｘｂｗ上のノードの位置を特定できる。なお、子ノードが１つの場合、配列ｄを参照せず無条件に葉ノードの方向へ移動させればよい。パトリシア木Ｔｃの葉ノードに対応するトライ木のノードの子孫に枝分かれは存在しない。そのため、文字列特定部３２は、一本鎖を辿ることで、キーを正確に復元できる。
【０１０８】
以上のように、キーの情報はｘｂｗから得られる。そのため、パトリシア木の各ノードが保持している文字列を除外して、ノード間の親子関係だけ残しておけばよい。
【０１０９】
例えば、図５において、“＄ａｂ”には、ルートから１番目の子供を選択し、さらに、選択したノードで１番目の子供を選択すると辿りつける。そこで、検索管理部３０は、選択したノードを特定するための配列ｄにｄ＝１，１という情報を格納してもよい。
【０１１０】
以下、図５に示す例を使って、本実施形態の文字列検索装置の具体的な動作を説明する。ここでは、検索クエリＰ＝“ａｂ”とし、ｋ＝２とする。Ｐで終わるＳ上の範囲は、［ｓｓ，ｅｓ］＝［７，９］である。これに対応するＲｐ上の範囲は、［ｓｐ，ｅｐ］＝［４，５］である。この範囲で最大の接頭辞スコアの位置は、ｉｐ＝４である。これは、Ｓ上における位置ｉＳ＝８に対応する。このｉＳに対応する接頭辞は、“＄ａｂ”であり、どちらも１番目の子であるため、配列ｄ＝１，１が得られる。
【０１１１】
Ｔｃ上で、ルートノードを出発し、１番目の子ノードに移動し、もう一度１番目の子ノードに移動すると、“＄ａｂ”に対応するノードに到着する。このノード配下で最大の文字列スコアは９であり、このキーは、キーＩＤ＝１で識別されるキーである。そこで、キーＩＤと文字列スコアのペア〈１，９〉が得られる。これが、図５における辞書で、最大の文字列スコアのキーである。
【０１１２】
上位２個目のキーは、同じ接頭辞の２番目のキーか、他の接頭辞の１番目のキーである。同じ接頭辞の２番目のキーは、キーＩＤ＝０で識別されるキーであり、その文字列スコア＝３である（以下、〈０，３〉と記す。）。一方、他の接頭辞の１番目のキーを求めるには、最大の接頭辞スコアとしてさきほど特定された接頭辞ｉｐ＝４を除外した接頭辞の範囲を特定する。この接頭辞ｉｐ＝４を除外して接頭辞の範囲を２分することで、範囲［ｓｐ，ｅｐ］＝［５，５］が特定される。そこで、範囲［ｓｐ，ｅｐ］＝［５，５］で最大の接頭辞スコアの接頭辞を特定し、その中で最大の文字列スコアのキーを特定する処理が行われる。図５に示す例では、接頭辞“＄ｃａｂ”で始まるキーの中で最大文字列スコアのキーを特定することに相当する。この結果、新たに、キーＩＤと文字列スコアのペア〈２，４〉が特定される。
【０１１３】
ここまでに、３つの候補のペアが特定されるが、スコアが小さい〈０，３〉は除外される。最終的に残ったペアは、〈１，９〉と〈２，４〉である。この２つのペアが特定された後、各ペアからキーを復元する処理が行われる。Ｔｃにおけるパスｄは、それぞれ、１，２と、２，１である。このキーに対応するもとの辞書におけるキーは、ｘｂｗをルートから辿ることで一意に求まり、“＄ａｂｃｃ＃”と“＄ｃａｂ＃”になる。
【０１１４】
次に、本実施形態で説明したデータ構造を用いた場合のデータサイズについて説明する。トライ木Ｔとスコア配列Ｒｋが与えられるとすると、ノード数ｔ＞キー数ｌが成り立つ。一般に、ノード数ｔは、キー数ｌの１０倍程度である。
【０１１５】
本実施形態で説明したデータ構造を用いた場合、データサイズは、以下に示す式２で表わされる。
【０１１６】
｜ＸＢＷ｜＋｜第一のＲＭＱ構造（接頭辞）｜
＋｜Ｔｃ（パトリシア木）｜＋｜第二のＲＭＱ構造（キー）｜＋｜Ｒｋ（スコア）｜
・・・（式２）
【０１１７】
式２において、｜ＸＢＷ｜は、トライ木Ｔをｘｂｗで表わした場合のデータサイズを示し、｜Ｒｋ（スコア）｜は、文字列スコアの配列のサイズを表わす。
【０１１８】
また、Ｔｃ（パトリシア木）は、トライ木Ｔから生成され、その木構造は、ＤＦＵＤＳで表現される。本実施形態では、木構造の葉ノードだけを識別するため、ノード数と同数のビット列が用意され、このビット列の各ビットを用いて葉ノードか否かが識別される。そして、本実施形態のパトリシア木は、文字列が除去され、木構造のみで表わされる。上述するように、文字列の情報は、ｘｂｗから得られるためである。
【０１１９】
パトリシア木のノード数は、最大２ｌ−１であるが、ＤＦＵＤＳでノード数の２倍、葉ノードを識別するビット列にノード数と同数のビットが必要になる。そのため、｜Ｔｃ（パトリシア木）｜は、６ｌ＋ｏ（ｌ）ビットで表現される。
【０１２０】
さらに、キーの文字列スコア配列Ｒｋ（スコア）に対して、第二のＲＭＱ構造（キー）が生成される。｜第二のＲＭＱ構造（キー）｜は、２ｌ＋ｏ（ｌ）ビットで表現される。
【０１２１】
｜ＸＢＷ｜と｜Ｒｋ（スコア）｜を、辞書およびスコアの実現に必要な最低限のデータとすると、本実施形態で説明したデータ構造を実現する場合、オーバヘッドは、最大で２ｔ＋６ｌ＋ｏ（ｔ）となり、一般的な方法に比べ、データ量が削減されている。
【０１２２】
次に、本実施形態で説明したデータ構造を用いた場合の計算量について説明する。計算量は、Ｏ（ｋ（ｌｏｇ（ｋ）＋｜Ｐ｜＋ｈ））で算出される。ここで、｜Ｐ｜はクエリの長さを示し、ｈは、辞書に登録されているキーの平均長さを表わす。このように、本実施形態で説明したデータ構造を用いた場合、データサイズには依存せずに検索処理を実行できる。
【０１２３】
次に、本発明の概要を説明する。図８は、本発明による文字列検索装置の概要を示すブロック図である。本発明による文字列検索装置は、優先的に検索すべき度合いを示す文字列スコアが対応づけられた検索候補文字列（例えば、キー）の集合から、入力された文字列を含む検索候補文字列を検索する文字列検索装置であって、各検索候補文字列の先頭文字から抽出される連続する１文字以上の文字列である接頭辞の集合（例えば、ＸＢＷのデータ構造による接頭辞の集合）から、入力された文字列で終わる接頭辞の集合を決定する接頭辞集合特定部８１（例えば、接頭辞集合特定部２０）と、入力された文字列で終わる接頭辞の集合の中から、接頭辞ごとにその接頭辞で始まる検索候補文字列に対応づけられた文字列スコアのうち最も大きい文字列スコアで定義される接頭辞スコア（例えば、式１により定義される接頭辞スコア）が最大の接頭辞を特定する接頭辞特定部８２（例えば、接頭辞特定部３１）と、特定された接頭辞で始まる検索候補文字列の中から、文字列スコアが最大の検索候補文字列を特定する文字列特定部８３（例えば、文字列特定部３２）とを備えている。
【０１２４】
このように、接頭辞特定部８２が、接頭辞スコアが大きい接頭辞を特定し、文字列特定部８３が、その接頭辞の中から文字列スコアの大きい検索候補文字列を探索するため、スコアが大きい方から探せば、効率的に上位ｋ個の検索候補文字列を検索できる。
【０１２５】
さらに、文字列検索装置は、検索範囲を管理する検索管理部（例えば、検索管理部３０）を備えていてもよい。検索管理部は、文字列特定部８３によって特定された検索候補文字列の接頭辞で始まる検索候補文字列の中から、すでに特定された検索候補文字列を除く検索候補文字列の範囲を特定し、接頭辞集合特定部８１により特定された接頭辞の集合から、接頭辞特定部８２により特定された接頭辞を除いた接頭辞の範囲を特定してもよい。また、接頭辞特定部８２は、検索管理部により特定された接頭辞の範囲から、接頭辞スコアが最大の接頭辞を特定し、文字列特定部８３は、検索管理部により特定された検索候補文字列の範囲から、文字列スコアが最大の検索候補文字列を特定してもよい。
【０１２６】
このとき、検索管理部は、接頭辞特定部８２が特定した接頭辞と接頭辞スコアのペア、および、文字列特定部８３が特定した検索対象文字列と文字列スコアのペアを保持するキュー（例えば、優先度付きキュー）を含んでいてもよい。そして、検索管理部は、キューに保持されたペアの中から、接頭辞スコアまたは文字列スコアのうち、最大のスコアの接頭辞または検索対象文字列を特定し、最大のスコアが文字列スコアだった場合、その文字列スコアの検索対象文字列をキューから除外して出力対象と特定し、最大のスコアが接頭辞スコアだった場合、当該接頭辞スコアの接頭辞をキューから除外してもよい。さらに、接頭辞特定部８２は、最大のスコアが接頭辞スコアだった場合、キューから除外された接頭辞の次に大きい接頭辞スコアの接頭辞を特定し、文字列特定部８３は、最大のスコアが文字列スコアだった場合、キューから除外された検索対象文字列を特定する際に用いられた接頭辞と同じ接頭辞で始まる検索対象文字列の中で、その除外された検索対象文字列の次に大きい文字列スコアを特定し、最大のスコアが接頭辞スコアだった場合、接頭辞特定部８２によって特定された接頭辞で始まる検索対象文字列の中から、文字列スコアが最も大きい検索対象文字列を特定してもよい。
【０１２７】
このように、接頭辞と接頭辞スコアのペア、および、検索対象文字列と文字列スコアのペアの両方のペアを１つのキューに保持することで、キュー内に保持される接頭辞スコアまたは文字列スコアを基に、最も大きいスコアが接頭辞スコアか文字列スコアかを判断できる。この最も大きいスコアに基づいて接頭辞特定部８２および文字列特定部８３が上述する処理を繰り返すことで、文字列スコアが上位の検索対象文字列を効率的に特定できる。
【０１２８】
また、文字列検索装置は、トライ木のデータ構造で表わされた検索候補文字列の集合から生成され、ＸＢＷのデータ構造を有する接頭辞の集合（例えば、ｘｂｗ）と、トライ木のデータ構造から生成されるパトリシア木であって、そのパトリシア木の各ノードに対応する文字列が除外されノード間の親子関係を表わす木構造のみ有するパトリシア木（例えば、パトリシア木Ｔｃ）とを記憶する検索情報記憶部（例えば、検索情報記憶部５０）を備えていてもよい。そして、接頭辞特定部８２が、ＸＢＷのデータ構造を有する接頭辞の集合から、接頭辞スコアが最大の接頭辞の位置を特定し、検索管理部は、特定された接頭辞の位置から、パトリシア木において対応するノードの位置（例えば、ｕｃ）を特定してもよい。このような構成により、検索に用いる記憶するデータ量を削減できる。
【０１２９】
このとき、文字列特定部８３は、検索管理部により特定されたノードの位置配下に存在する検索候補文字列の中から文字列スコアが最大の検索候補文字列の位置（例えば、ｕｉ）を特定し、ＸＢＷのデータ構造を有する接頭辞の集合から、特定した位置に対応する検索候補文字列を特定してもよい。
【０１３０】
また、接頭辞特定部８２は、第一のＲＭＱ構造で表わされた接頭辞と接頭辞スコアとの関係をもとに、その第一のＲＭＱ構造を用いて、特定された接頭辞の集合を範囲検索することにより、最大の接頭辞スコアの接頭辞を特定してもよい。
【０１３１】
また、文字列特定部８３は、第二のＲＭＱ構造で表わされた検索候補文字列と文字列スコアとの関係をもとに、その第二のＲＭＱ構造を用いて、特定された接頭辞で始まる検索候補文字列を範囲検索することにより、最大の文字列スコアの検索候補文字列を特定してもよい。
【０１３２】
以上、実施形態及び実施例を参照して本願発明を説明したが、本願発明は上記実施形態および実施例に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【０１３３】
この出願は、２０１３年８月２１日に出願された日本特許出願２０１３−１７１２９１を基礎とする優先権を主張し、その開示の全てをここに取り込む。
【産業上の利用可能性】
【０１３４】
本発明は、入力された文字列に部分一致するキーを検索する文字列検索装置に好適に適用される。本発明による文字列検索装置は、例えば、検索サービスを提供する際に利用可能である。
【符号の説明】
【０１３５】
１０  入力部
２０  接頭辞集合特定部
３０  検索管理部
３１  接頭辞特定部
３２  文字列特定部
４０  出力部
５０  検索情報記憶部
【図１】
2015025467.tif 000003
【図２】
2015025467.tif 000004
【図３】
2015025467.tif 000005
【図４】
2015025467.tif 000006
【図５】
2015025467.tif 000007
【図６】
2015025467.tif 000008
【図７】
2015025467.tif 000009
【図８】
2015025467.tif 000010
【図９】
2015025467.tif 000011
【国際調査報告】
2015025467.tif 000012
2015025467.tif 000013
2015025467.tif 000014
2015025467.tif 000015