(57)【特許請求の範囲】
【請求項１】
複数の文字列それぞれを１または複数のトークンの列に変換し、共通するトークンの列を開始端より併合して構成される木構造データと、該木構造データの末端ノードに関連付けられた識別子とを記憶するインデックスメモリと、
検索する文字列を１または複数のトークンの列に変換するトークナイザと、
前記トークナイザにより変換されたトークンの列を走査しながら前記インデックスメモリに記憶されている前記木構造データのノードの子ノードを選択して根ノードを始点とする経路を検索することにより、前記検索する文字列が前記複数の文字列の中に存在するかどうかを検出し、存在したときには該文字列を前記経路の末端ノードに関連付けられた識別子に対応づけて出力する検索部とを備える検索装置。
【請求項２】
前記木構造データは、前記複数の文字列それぞれを、文字または文字の並びであるトークンの１または複数の列に変換し、共通するトークンの列を開始端より併合して構成される請求項１に記載の検索装置
【請求項３】
前記インデックスメモリが記憶する木構造データを構成するノードには、そのノードから末端ノードまでのノードの個数が関連づけられており、
前記検索部は、ノードの子ノードの中から、次に走査するトークンから末端のトークンまでの個数が関連付けられている子ノードが存在しなければ、前記検索する文字列が前記複数の文字列の中に存在しないことを検出する請求項１または２に記載の検索装置。
【請求項４】
前記トークナイザは、前記検索する文字列を、定められた単語の有無にしたがって単語の列に区切ってトークンの列に変換する請求項１から３のいずれかに記載の検索装置。
【請求項５】
前記トークナイザは、前記検索する文字列中の１文字を１トークンとする請求項１から３のいずれかに記載の検索装置。
【請求項６】
複数の文字列それぞれを、文字または文字の並びであるトークンの１または複数の列に変換し、共通するトークンの列を開始端より併合して構成される木構造データと、該木構造データの末端ノードに関連付けられた識別子とを記憶部に記憶している計算機に、
検索する文字列を１または複数のトークンの列に変換させ、
変換されたトークンの列を走査しながら前記記憶部に記憶されている木構造データのノードの子ノードを選択して根ノードを始点とする経路を検索することにより、前記検索する文字列が前記複数の文字列の中に存在するかどうかを検出し、存在したときには該文字列を前記経路の末端ノードに関連付けられた識別子と対応づけて前記計算機に出力させるプログラム。
【請求項７】
前記木構造データは、前記複数の文字列それぞれを、文字または文字の並びであるトークンの１または複数の列に変換し、共通するトークンの列を開始端より併合して構成される請求項６に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、検索装置に関する。特に、登録された複数の文字列の集合に対し与えられた文字列を検索し、与えられた文字列が、登録された文字列であるかどうかを検出する検索装置に関する。
【背景技術】
【０００２】
文字列が、登録された文字列かどうかを検出する技術は情報処理において基本的な技術であり、広い技術分野において用いられている。例えば銀行業務においては、他行、特に外国銀行、からの振込の宛名人が自行に口座を有しているかどうかの確認を行なうなどのために用いられている。
【０００３】
文字列が、登録された文字列かどうかを検出する方法の一つとして、Ｂ木を用いる技術が知られている（例えば、特許文献１参照。）。Ｂ木においては、図１０に示されるように、木構造を構成するノードに、子ノードへのポインタと値とを格納し、「２３」より小さい値（例えば、辞書順において「２３」より前に並ぶ値）を格納する子ノードへのポインタをスロット１００１に格納し、「２３」より大きく「７１」より小さい値を格納する子ノードへのポインタをスロット１００２に格納し、「７１」より大きい値を格納する子ノードへのポインタをスロット１００３に格納する。ある値が与えられた場合には、「２３」、「７１」と順に比較を行い、「２３」、「７１」と等しければ登録された値であることが判明し、「２３」および「７１」と異なれば、比較の結果に応じて、子ノードへ移動する。
【０００４】
また、与えられた文字列が文字列テーブルに含まれているかどうかを判断する際に、文字列テーブルから文字列を取り出し、与えられた文字列と取り出した文字列との先頭文字を比較し、同じであれば、長さを比較し、長さも同じであれば、文字列の最後尾から文字を比較する方法が知られている（例えば、特許文献２参照。）。
【０００５】
また、文字列の一種である文書の全文検索を行なう際に、単語の長さを単語とともに記録して、単語の重複を排除する技術が知られている（例えば、特許文献３参照。）。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平８−８７５１１号公報
【特許文献２】特開平７−８５０７０号公報
【特許文献３】特開２０００−２００２８７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
Ｂ木などを用いる従来の技術においては、登録された文字列を絞り込むことが行なわれることにより、検索の効率化が図られている。しかしながら、絞り込まれた範囲内において、文字列を順次比較する必要がある。このため、文字列が登録されていないことを確認するためには、絞り込まれた範囲内の全ての文字列を比較することになる。したがって、文字列が登録されていることを検出することは少ない手間で行なえるものの、登録されていないことを検出するには、手間が掛かることになる。
【０００８】
本発明の目的の一つとして、与えられた文字列が、登録されていることの検出および登録されていないことの検出を、少ない手間により行なう検索装置などを提供する。
【０００９】
そこで、本発明の一実施形態として、複数の文字列それぞれを１または複数のトークンの列に変換し、共通するトークンの列を開始端より併合して構成される木構造データであり、前記木構造データのノードには末端ノードまでの長さの最大値および最小値が関連づけられている木構造データを記憶するインデックスメモリと、検索する文字列を１または複数のトークンの列に変換するトークナイザと、前記トークナイザにより変換されたトークンの列を走査しながら前記インデックスメモリに記憶されている木構造データのノードの子ノードを選択して根ノードを始点とする経路を検索することにより、前記検索する文字列が前記複数の文字列の中に存在するかどうかを検出する検索部と、を有し、前記検索部は、ノードの子ノードの中から、末端ノードまでの長さの最大値および最小値の範囲内に未走査のトークンの数を含む子ノードが存在しなければ、前記検索する文字列が前記複数の文字列の中に存在しないことを検出する検索装置を提供する。
【００１０】
より具体的には、検索部は、トークン列保持部と、トークン個数保持部と、トークン番号保持部と、ノード情報保持部とを備え、トークン列保持部は、前記トークナイザが変換したトークンの列の情報を保持し、トークン個数保持部は、未走査のトークンの個数を保持し、トークン番号保持部は、走査中のトークンの前記トークンの列における番号を保持し、ノード情報保持部は、現在到達しているノードの情報を保持し、現在到達しているノードの子ノードの中に、末端ノードまでの長さの最大値および最小値の範囲内にトークン個数保持部が保持している数を含む子ノードが存在しなければ、前記検索する文字列が前記複数の文字列の中に存在しないことを検出する。
【００１１】
また、本発明の一実施形態として、複数の文字列それぞれを１または複数のトークンの列に変換し、共通するトークンの列を開始端より併合して構成される木構造データであり、前記木構造データのノードには末端ノードまでの長さの最大値および最小値が関連づけられている木構造データを記憶部に記憶している計算機に、検索する文字列を１または複数のトークンの列に変換させ、変換されたトークンの列を走査しながら前記インデックスメモリに記憶されている木構造データのノードの子ノードを選択して根ノードを始点とする経路を検索することにより、前記検索する文字列が前記複数の文字列の中に存在するかどうかを検出させるためのプログラムであり、ノードの子ノードの中から、末端ノードまでの長さの最大値および最小値の範囲内に未走査のトークンの数を含む子ノードが存在しなければ、前記検索する文字列が前記複数の文字列の中に存在しないことを検出させるプログラムを提供する。
【００１２】
また、本発明の一実施形態として、複数の文字列それぞれを１または複数のトークンの列に変換し、共通するトークンの列を開始端より併合して構成される木構造データであり、前記木構造データのノードには末端ノードまでの長さの最大値および最小値が関連づけられている木構造データを記憶部に記憶している計算機の動作方法であり、前記計算機が、検索する文字列を１または複数のトークンの列に変換し、変換されたトークンの列を走査しながら前記インデックスメモリに記憶されている木構造データのノードの子ノードを選択して根ノードを始点とする経路を検索することにより、前記検索する文字列が前記複数の文字列の中に存在するかどうかを検出し、ノードの子ノードの中から、末端ノードまでの長さの最大値および最小値の範囲内に未走査のトークンの数を含む子ノードが存在しなければ、前記検索する文字列が前記複数の文字列の中に存在しないことを含む、計算機の動作方法を提供する。
【発明の効果】
【００１３】
本発明により、与えられた文字列が登録された文字列かどうかの検索の早期の段階において、与えられた文字列が登録されていないことが検出され、与えられた文字列が、登録されていることの検出および登録されていないことの検出を、従来よりも少ない手間によ
り行なうことが可能となる。
【図面の簡単な説明】
【００１４】
【図１】本発明の一実施形態に係る検索装置の機能ブロック図。
【図２】文字列が変換されたトークンの列に対応するデータ構造の一例図。
【図３】本発明の一実施形態に係る木構造データを構成するためのデータ構造の一例図。
【図４】本発明の一実施形態に係る複数の文字列と複数の文字列に対応する木構造の一例図。
【図５】本発明の一実施形態に係る木構造データを構成する処理のフローチャート。
【図６】本発明の一実施形態に係る検索装置の検索部の機能ブロック図。
【図７】本発明の一実施形態に係る検索装置の検索部の処理のフローチャート。
【図８】本発明の一実施形態に係る木構造の一例図と検索部の処理の一例図。
【図９】本発明の一実施形態に係る木構造データとそれを実現するデータ構造の一例図。
【図１０】Ｂ木の一例図。
【発明を実施するための形態】
【００１５】
以下、本発明を実施するための形態を実施形態として説明する。なお、本発明は、以下の実施形態に限定されることはなく、種々の変形を加えて実施することが可能である。
【００１６】
（実施形態１）
図１は、本発明の一実施形態に係る検索装置の機能ブロック図を示す。検索装置１００は、インデックスメモリ１０１と、トークナイザ１０２と、検索部１０３とを有する。
【００１７】
（インデックスメモリ）
インデックスメモリ１０１は、１または複数の木構造データを記憶する。インデックスメモリ１０１が記憶する１または複数の木構造データが表す木構造は次の２つの条件を満たす。
（条件１）複数の文字列それぞれを１または複数のトークンの列に変換して、共通するトークンの列を開始端より併合することにより、構成されている。
（条件２）木構造のノードには、末端ノードまでの長さの最大値および最小値が関連付けられている。
【００１８】
（木構造に関する定義）
本実施形態において、木構造とは、数学的に定義されるグラフ構造であり、そのグラフ構造は（イ）１または複数のノードを有し、（ロ）始点と終点とをノードして持つエッジによって始点のノードと終点のノードとを接続し、（ハ）単連結であり、かつ、（ニ）ループを構成するエッジが存在しないことを特徴とする。木構造を表すデータを木構造データと定義する。木構造データは、ノードとエッジとを表すデータ構造により表すことができる。このようなデータ構造としては、例えば後に図３を用いて説明されるデータ構造がある。
【００１９】
帰納的に、（１）木構造を定義しつつ同時に（２）根ノードと、（３）末端ノードと、（４）根ノードから末端ノードまでの長さの最大値および最小値とを定義すると次のようになる。
（定義１）（１）１つのノードは木構造である。（２、３）そのノードは、その木構造の根ノードでありかつ末端ノードである。（４）この木構造において、根ノードから末端ノードまでの長さの最大値および最小値はともに１である。
（定義２）（１）１または複数の木構造Ｔ１、…、Ｔｎがある場合、木構造Ｔ１、…
、Ｔｎのいずれのノードでもない新たなノードｐと木構造Ｔ１、…、Ｔｎのそれぞれの根ノードとを、ノードｐを始点としそれぞれの根ノードを終点とするｎ本のエッジそれぞれにより接続した構造は、新たな木構造である。（２）この新たな木構造の根ノードはノードｐであり、（３）この新たな木構造の末端ノードは、木構造Ｔ１、…、Ｔｎのそれぞれの末端ノードであり、（４）この新たな木構造の根ノードから末端ノードまでの長さの最大値は、｛Ｔ１の根ノードから末端ノードまでの長さの最大値、…、Ｔｎの根ノードから末端ノードまでの長さの最大値｝の最大値に１を加えた値であり、この新たな木構造の根ノードから末端ノードまでの長さの最小値は、｛Ｔ１の根ノードから末端ノードまでの長さの最小値、…、Ｔｎの根ノードから末端ノードまでの長さの最小値｝の最小値に１を加えた値である。
【００２０】
木構造の任意のノードｑから、ノードｑを始点としノードｒ１を終点とするエッジｅ１があり、ノードｒ１を始点としノードｒ２を終点とするエッジｅ２があり、…、ノードｒ（ｎ−１）を始点としノードｒｎを終点とするエッジｅｎがあるとき、ノードの列ｑ、ｒ１、ｒ２、…、ｒ（ｎ−１）、ｒｎを「ノードｑを始点とする経路」と定義し、ノードｑからノードｒｎまでの長さを「ｎ」と定義する。
【００２１】
（トークンの列に関する定義）
図２は、文字列を１または複数のトークンの列に変換することを説明するための図である。トークンとは文字または文字の並びである単語を表すデータ構造をいう。文字列を１または複数のトークンの列に変換するとは、文字列を、その構成要素である文字または単語を表すデータ構造の並びに変換することをいう。文字列をトークンの列に変換することは、字句解析（Ｌｅｘｉｃａｌ  Ａｎａｌｙｓｉｓ）と称されることもある。
【００２２】
図２は、一例として、文字列「ＴＹ  ＨＫ  ＢＭＢ  ＮＫＹＭ」をトークンの列に変換する際に、空白を表す文字「  」を単語間の区切りとして扱うことにより、単語「ＴＹ」、「ＨＫ」、「ＢＭＢ」、「ＮＫＹＭ」それぞれに対応する４つのトークンの並びに区切られることを示している。
【００２３】
図２の（ａ）、（ｂ）それぞれは、変換される文字列をトークンの列に変換した場合のトークンの並びを表すデータ構造の例を示している。図２の（ａ）は、５つの要素（スロット）からなる配列が用意され、スロット２０１には、文字列「ＴＹ」へのポインタ（「ＴＹ」が格納されたメモリのアドレス）、スロット２０２には、文字列「ＨＫ」へのポインタ、スロット２０３には、文字列「ＢＭＢ」へのポインタ、スロット２０４には、文字列「ＮＫＹＭ」へのポインタが格納され、スロット２０５には、トークンの列の終わりであることを示す値（例えば、ＮＵＬＬ）が格納されている状態を示す。なお、５つのスロットからなる配列の代わりに、５つのリストが直列に連結されたデータ構造などを用いてもよい。
【００２４】
図２の（ｂ）は、図２の（ａ）と同様に、５つのスロットからなる配列が用意されていることを示しているが、各スロットは、文字列「ＴＹ  ＨＫ  ＢＭＢ  ＮＫＹＭ」が格納されているメモリの領域２１０の中のアドレスと、トークンが表す文字列の長さとを格納している。すなわち、スロット２１１には、領域２１０の「ＴＹ」の開始文字である「Ｔ」が格納されているアドレスと、「ＴＹ」の文字数である２とが格納され、スロット２１２には、領域２１０の「ＨＫ」の開始文字である「Ｈ」が格納されているアドレスと、「ＨＫ」の文字数である２とが格納され、スロット２１３には、領域２１０の、「ＢＭＢ」の開始文字である開始文字である「Ｂ」が格納されているアドレスと、「ＢＭＢ」の文字数である３とが格納され、スロット２１４には、領域２１０の「ＮＫＹＭ」の開始文字である「Ｎ」が格納されているアドレスと、「ＮＫＹＭ」の文字数である４とが格納されている。また、スロット２１５には、トークンの列の終わりである値と、例えば０とが格納
されている。
【００２５】
文字列をトークンの列に変換する場合には、図２に示したように、空白やその他の記号を表す文字により文字列を区切り、単語としてのトークンの列に変化することができる。また、空白やその他の記号を表す文字が含まれない場合や空白やその他の記号を表す文字を区切りとしない場合には、あらかじめ定められた単語を、文字列の始め（文字列の１文字目）から順に取得してトークンのデータ構造としてもよい。例えば、あらかじめ定められた単語が「ＴＹ」、「ＨＫ」である場合には、文字列「ＨＫＴＹ」は「ＨＫ」と「ＴＹ」とに対応するトークンの列に変換することができる。また、文字列「ＴＹＫＴＪＭＨＫ」は、「ＫＴＪＭ」があらかじめ定められている単語ではないが、前後の「ＴＹ」、「ＨＫ」はあらかじめ定められた単語であるので、あらかじめ定められた単語の有無により、「ＴＹ」、「ＫＴＪＭ」、「ＨＫ」という単語のトークンの列に変換することができる。
【００２６】
また、文字列を構成する１文字それぞれを１つのトークンに対応させて、トークンの列に変換することも可能である。例えば、文字列「ＴＹＨＫ」は、「Ｔ」、「Ｙ」、「Ｈ」、「Ｋ」という文字のトークンの列に変換することができる。一般に、文字コードによっては全ての１文字が等しいバイト数で構成されるとは限らない。そこで、全ての１文字が等しいバイト数で構成されない文字コードを用いる場合などには、このように１文字を１トークンとして、文字列をトークンの列に変換することもできる。
【００２７】
なお、トークンの列において、１番目のトークンを「トークン列の開始端」という。例えば、図２の例においては、「ＴＹ」に対応するトークンがトークン列の開始端となる。
【００２８】
（トークンの列の併合により構成される木構造に関する定義）
上述の（条件１）における、「共通するトークンの列を開始端より併合する」とは、次の処理をいう。第１のトークンの列Ａ１Ａ２…ＡｎＢ１Ｂ２…Ｂｍと第２のトークンの列Ａ１Ａ２…ＡｎＣ１Ｃ２…Ｃｋとが与えられた場合、この２つトークンの列は、開始端Ａ１よりｎ個のトークンの部分列Ａ１Ａ２…Ａｎが共通している。そこで、Ａ１からＡｎのそれぞれのトークンに対応するノードを順に直列にエッジで接続し、Ａ１に対応するノードを根ノードとし、Ａｎに対応するノードを末端ノードとする木構造を作る。次に、Ａｎに対応するノードの子ノードを、Ｂ１に対応するノードとＣ１に対応するノードとし、Ｂ１からＢｍそれぞれのトークンに対応するノードを順に直列にエッジで接続し、また、Ｃ１からＣｋのそれぞれに対応するノードを順に直列にエッジで接続することをいう。
【００２９】
なお、２つのトークンの列において、共通するトークンの列が開始端より存在しない場合には、２つの異なる木構造が構成される。例えば、ＤＥＦとＧＥＦのように、開始端のトークンであるＤとＧとが異なる場合には、トークンＤ、トークンＥおよびトークンＦそれぞれに対応するノードを順に直列にエッジで接続した木構造と、トークンＧ、トークンＥおよびトークンＦそれぞれに対応するノードを順に直列にエッジで接続した木構造とが構成される。
【００３０】
なお、文字列の先頭には、文字数０の空文字列が存在するとして、先頭の空文字列をトークンとすれば、共通するトークンの列が開始端より存在しない場合でも、１つの木構造を生成することができ、このような場合でも本発明の一実施形態は適用可能である。
【００３１】
（部分木に関する定義）
なお、以下では、トークンの列Ｄ１Ｄ２…Ｄｎについて、Ｄ１からＤｎそれぞれに対応するノードを順に直列にエッジで接続して得られる木構造を、トークンの列Ｄ１Ｄ２…Ｄｎに対応する木構造ということにする。また、木構造の根ノードを開始点として、エッジの始点から終点を順に辿って得られる経路を木構造の部分木ということにする。例えば、
トークンの列Ｅ１Ｅ２Ｅ３Ｅ４Ｅ５に対応する木構造の部分木として、Ｅ１、Ｅ１Ｅ２、Ｅ１Ｅ２Ｅ３やＥ１Ｅ２Ｅ３Ｅ４に対応する木構造を挙げることができる。
【００３２】
また、すでに、共通するトークンの列を開始端より併合して構成された木構造がすでに存在する場合において、新たなトークンの列を追加するとは、その新たなトークンの列の開始端からの部分列に対応する木構造が、すでに存在する木構造のいずれかの木構造の部分木となれば、部分列以外のトークンの列に対応する木構造の根ノードを、その部分木の最後のノードの子ノードとする。もし、新たなトークンの列の開始側の部分に対応する木構造が、すでに存在する木構造のどの部分木ともならない場合には、その新たなトークンの列に対応する木構造を追加する。
【００３３】
（ノードとエッジとを表すデータ構造の例）
本実施形態においては、（条件２）として述べたように、木構造を構成するノードそれぞれには、そのノードを根ノードとする木構造の末端ノードまでの長さの最大値および最小値が関連付けられている。そこで、インデックスメモリ１０１が記憶する木構造データは、例えば、図３に示すデータ構造により、ノードとそのノードを始点とするエッジとを表して記憶される。
【００３４】
図３において、１つのデータ構造には４つのスロット３０１−３０４が含まれ、第１スロット３０１には、トークンが表す文字または文字列が格納される。第２スロットには、そのノードを根ノードとする木構造の末端ノードまでの長さの最大値が格納される。第３スロットには、そのノードを根ノードとする木構造の末端ノードまでの長さの最小値が格納される。第４スロット３０４には、子ノードの情報が格納され、これによりエッジが表される。なお、第１スロット３０１には、トークンが表す文字または文字列そのものが格納される必要はなく、トークンが表す文字または文字列へのポインタなど、トークンが表す文字または文字列を表すための情報が格納されていればよい。
【００３５】
スロット３０４に格納される子ノードの情報とは、子ノードを表すデータ構造を参照するために必要な情報である。例えば、子ノードに対応するデータ構造が格納されているメモリのアドレスである。１つのノードの子ノードが複数存在すれば、複数のメモリのアドレスが第４スロット３０４に格納される。また、末端ノードを表すデータ構造においては、子ノードの情報は格納されないこととなる。
【００３６】
（トークンの列に対応する木構造の例）
図４は、複数のトークンの列と、その複数のトークンの列から共通するトークンの列を開始端より併合して構成される木構造との例を示す。
【００３７】
図４の（ａ）に示すように、第１のトークンの列として、ＡＢＣＤ、第２のトークンの列としてＡＢＤＥＣ、第３のトークンの列として、ＡＣＥＢＥＦ、第４のトークンの列として、ＡＣＥＢＧＨが与えられたとする。これらのトークンの列から、共通するトークンの列を開始端より併合して構成される木構造は、図４の（ｂ）に示すように、各ノードに対応するデータ構造４０１−４１４を用いて構成される。例えばデータ構造４０１は、トークンＡのノードに対応する。トークンＡは複数のトークンの列の全ての開始端に現れるので、データ構造４０１に対応するノードの末端ノードまでの長さの最大値は、ＡＣＥＢＥＦおよびＡＣＥＢＧＨのトークンの個数である６となり、最小値は、ＡＢＣＤのトークンの個数である４となる。
【００３８】
データ構造４０１に対応するノードの子ノードとして、データ構造４０２に対応するノードとデータ構造４０８に対応するノードとがある。前者は、トークンＢに対応し、後者はトークンＣに対応する。このため、データ構造４０１の第４のスロットの値として、デ
ータ構造４０２とデータ構造４０８とのそれぞれが格納されているアドレスと、アドレスの列の終わりを示す値ＮＵＬＬとが格納されている。データ構造４０２には、ＢＤＥＣとＢＣＤとに対応して、データ構造４０２に対応するノードを根ノードとする木構造の末端ノードまでの最大値および最小値として、４および３が格納され、子ノードを表す情報として、ＣＤというトークンの列に対応する木構造の根ノードに対応するデータ構造４０３とＤＥＣというノード列に対応する木構造の根ノードに対応するデータ構造４０５とのそれぞれが格納されているアドレスが格納されている。以下、データ構造４０４−４１４は同様に説明される。
【００３９】
特に、末端ノードに対応するデータ構造４０４、４０７、４１２、４１４において、それに対応するノードを根ノードとする木構造の末端ノードまでの長さの最大値と最小値とは同じになり、１である。したがって、末端ノードまでの長さの最大値と最小値とがともに１であるかどうかにより、末端ノードであるかどうかを判定できる。
【００４０】
（共通するトークンの列を開始端より併合する処理のフローチャートの例）
共通するトークンの列を開始端より併合してトークンに対応するノードを用いて構成された木構造の構成方法については、一般的に述べたが、それをフローチャートで具体的に示した例が、図５である。
【００４１】
ステップＳ５０１の処理として、変数ＬとＭとの初期化を行なう。すなわち、変数Ｌに、併合するべきトークンの列のトークンの個数を代入し、変数Ｍに、１を代入する。図５のフローチャートにおいては、トークンの列を走査し、開始端より順にトークンの文字列を取得し、木構造の根ノードから順にノードの文字列と比較を行なう。このとき、変数Ｌは、未走査のトークンの数を表し、変数Ｍは、開始端より何番目のトークンを現在注目しているかを表す。
【００４２】
ステップＳ５０２の処理として、配列Ｎの初期化を行なう。配列Ｎは、木構造の根ノードを始点とする経路の情報を格納する。そこで、Ｍが１であるステップＳ５０２においては、配列ＮのＭ番目の要素Ｎ［Ｍ］に、木構造の根ノードに対応するデータ構造であって、開始端のトークンの文字列を第１のスロットに格納しているデータ構造のアドレスを代入する。なお、そのような木構造の根ノードに対応するデータ構造が存在しない場合には、Ｎ［Ｍ］にはＮＵＬＬが代入されるものとする。
【００４３】
ステップＳ５０３として、Ｎ［Ｍ］の値がＮＵＬＬであるかどうかを判断する。もし、Ｎ［Ｍ］の値がＮＵＬＬであれば、共通するトークンの列が開始端より存在しない。そこで、ステップＳ５０４へ処理を移行させ、トークンの列に対応する木構造を構成して追加する。
【００４４】
ステップＳ５０３において、Ｎ［Ｍ］の値がＮＵＬＬでなければ、共通するトークンの列が開始端よりする。そこで、ステップＳ５０５に処理を移行させ、Ｎ［Ｍ］の表すノードの最大値及び最小値の調整を行なう。すなわち、Ｌの値が、Ｎ［Ｍ］の表すノードの末端ノードまでの長さの最大値を超えていれば、Ｌを、Ｎ［Ｍ］の表すノードの最大値として格納する。また、Ｌの値が、Ｎ［Ｍ］の表すノードの末端ノードまでの長さの最小値を下回っていれば、Ｌを、Ｎ［Ｍ］の表すノードの最小値として格納する。
【００４５】
ステップＳ５０６の処理として、トークンを一つ処理したので、Ｌの値を１減少させ、次のトークンを処理するために、Ｍの値を１増加させる。ステップＳ５０７の処理として、Ｌの値が０と等しいかどうかを判定する。もし、Ｌの値が０に等しければ、トークンの列の全てのトークンに対応するノードが木構造に存在したので、処理を終了する。Ｌの値が０に等しくなければ、ステップＳ５０８へ処理を移行する。
【００４６】
ステップＳ５０８の処理として、Ｎ［Ｍ−１］の表すノードの子ノードのうち、Ｍ番目のトークンの文字列を持つノードのアドレスを変数Ｎ［Ｍ］に代入する。
【００４７】
ステップＳ５０９の処理として、Ｎ［Ｍ］の値がＮＵＬＬであるかどうかを判定する。もし、Ｎ［Ｍ］の値がＮＵＬＬであれば、ステップＳ５１０へ処理を移行させ、Ｍ番目以後のトークンの列に対応する木構造を生成し、その根ノードを、Ｎ［Ｍ−１］の子ノードとして追加する。
【００４８】
ステップＳ５０９の処理において、Ｎ［Ｍ］の値がＮＵＬＬでなければ、Ｍ番目のトークンとＮ［Ｍ］に対応するノードとの処理のために、ステップＳ５０５へ戻る。
【００４９】
インデックスメモリ１０１は、複数の文字列が与えられた場合、それぞれの文字列について、例えば図５のフローチャートを実行して得られる木構造データを記憶する。
【００５０】
インデックスメモリ１０１に、複数の文字列が与えられ、条件１と条件２とを満たす木構造に対応する木構造データが記憶されているときには、新たな文字列が、複数の文字列の中に存在するかどうかは、次のようにして検出することができる。すなわち、新たな文字列をトークンの列に変換し、図５のフローチャートを実行した場合に、ステップＳ５０７において、変数Ｌの値が０となったときに、Ｎ［Ｍ］が末端ノードであるかどうかにより検出することができる。そこで、以下では、複数の文字列が与えられ、条件１と条件２とを満たす木構造に対応する木構造データが記憶されている場合に、新たな文字列が、複数の文字列の中に存在するかどうかを検出する処理についてより詳細に説明する。また、新たな文字列のことを、「検索する文字列」という。
【００５１】
（トークナイザ）
トークナイザ１０２は、検索する文字列を１または複数のトークンの列に変換する。変換されたトークンの列は、検索装置１００のメモリに格納され、例えば格納されたメモリのアドレスが、検索部１０３に伝達される。
【００５２】
（検索部）
検索部１０３は、トークナイザ１０２により検索する文字列から変換されたトークンの列を走査し、インデックスメモリ１０１に記憶されている木構造データのノードの子ノードを選択して根ノードを始点とする経路を検索する。すなわち、検索部１０３は、トークナイザ１０２により検索する文字列から変換されたトークンの列を開始端から順に走査し、走査中のトークンの情報を取得する。そして、取得されたトークンの情報を用いて、インデックスメモリ１０１に記憶されている木構造データの表す木構造の走査中のノードの子ノードの中からノードを選択する。これを、「子ノードを選択する」という。
【００５３】
子ノードを選択するときには、選択される子ノードの末端ノードまでの長さの最大値以下かつ最小値以上の範囲に、未走査のトークンの数を含むように選択する。もし、未走査のトークンの数が、どの子ノードの末端ノードまでの長さの最大値を超えていたり、あるいは、どの子ノードの末端ノードまでの長さの最小値を下回っていたりすれば、検索する文字列のトークンの個数が、複数の文字列のどの文字列のトークンの個数と同じにならないので、検索する文字列は、複数の文字列のどの文字列とも異なることが直ちに検出できる。
【００５４】
そこで、検索部１０３は、図６に示すように、トークン列保持部６０２と、トークン個数保持部６０３と、トークン番号保持部６０４と、ノード情報保持部６０５とを有していてもよい。トークン列保持部６０２は、トークナイザが、検索する文字列を変換したトー
クンの列を保持する。例えば、図２の（ａ）や図２の（ｂ）に示す配列のアドレスを、レジスタなどを用いて記憶する。トークン個数保持部６０３は、トークナイザが、検索する文字列を変換したトークンの列のトークンの個数を保持する。例えば、トークンの個数を、レジスタなどを用いて記憶する。トークン番号保持部６０４は、トークンの列の中で、現在走査しているトークンの番号を保持する。例えば、トークンの番号を、レジスタなどを用いて記憶する。ノード情報保持部６０５は、木構造データの現在走査しているノードに対応するデータ構造に関する情報を記憶する。例えば、ノードに対応するデータ構造のアドレスを、レジスタなどを用いて記憶する。
【００５５】
図７は、検索部１０３の処理の流れを説明するフローチャートである。変数Ｌは未走査のトークンの数を保持する変数である。変数Ｍは、何番目のトークンを走査しているかを表す変数である。そこで、ステップＳ７０１として、変数Ｌにトークナイザから伝達されたトークンの列のトークンの個数を代入する。また、変数Ｍに１を代入する。なお、変数Ｌは、トークン個数保持部６０３に対応し、変数Ｍは、トークン番号保持部６０４に対応する。
【００５６】
ステップＳ７０２の処理として、１番目のトークンの文字列を持ち、変数Ｌの値が、かつ、末端ノードまでの長さの最大値と最小値との範囲内となる根ノードの情報を変数Ｎに代入する。変数Ｎは、ノード情報保持部６０５に対応する。
【００５７】
ステップＳ７０３の処理として、Ｎの値がＮＵＬＬかどうかを判定する。Ｎの値がＮＵＬＬであれば、１番目のトークンの文字列を持ち、かつ、末端ノードまでの長さの最大値と最小値との範囲内となる根ノードが存在しないことであるので、検索する文字列は登録されていない。すなわち、複数の文字列の中に検索する文字列は存在しない。したがって、ステップＳ７０４処理を移行し、文字列は登録されていないと判断する。
【００５８】
ステップＳ７０３においてＮの値がＮＵＬＬでなければ、ステップＳ７０５へ処理を移行し、トークンを１つ走査したので、未走査のトークンの数を格納する変数Ｌの値を１減少させ、次のトークンを走査するために、変数Ｍの値を１増加させる。
【００５９】
ステップＳ７０６の処理として、変数Ｌの値が０に等しいかどうかを判定する。もし変数Ｌの値が０に等しければ、トークンの列の全てのトークンを走査したので、ステップＳ７０７へ処理を移行させる。ステップＳ７０７の処理として、変数Ｎが末端ノードを表すかどうかを判定する。もし、Ｎが末端ノードでなければ、ステップＳ７０８へ処理を移行させ、文字列は登録されていないと判断する。ステップＳ７０７において、Ｎが末端ノードであると判定されれば、ステップＳ７０９へ処理を移行させ、文字列は登録されていると判断する。
【００６０】
ステップＳ７０６において、Ｌが０と等しくないと判定されれば、ステップＳ７１０へ処理を移行し、変数Ｎの表すノードの子ノードのうち、Ｍ番目のトークンの文字列を持ち、かつ、変数Ｌの値が、末端ノードまでの長さの最大値と最小値との範囲内となるノードの情報を代入する。
【００６１】
ステップＳ７１１の処理として、変数Ｎの値がＮＵＬＬであるかどうかを判定する。変数Ｎの値がＮＵＬＬであれば、Ｍ番目のトークンに対応するノードが存在しないこととなる。したがって、ステップＳ７１２に処理を移行させ、文字列は登録されていないと判断する。
【００６２】
ステップＳ７１１において、変数のＮの値がＮＵＬＬでないと判定されれば、ステップＳ７０５へ戻る。
【００６３】
なお、本実施形態に係る検索装置は、計算機にプログラムを実行させることにより実現することができる。すなわち、インデックスメモリ１０１を計算機のメモリや二次記憶として実現し、トークナイザ１０２と検索部１０３とをそれぞれ実現するモジュールとして有するプログラムを計算機のＣＰＵに実行させることにより実現できる。
【００６４】
トークナイザ１０２を実現するモジュールは、例えば、検索する文字列が格納されたメモリのアドレスから文字列を読出して、メモリ中の領域にトークンの列を表すデータ構造を構成し、その領域のアドレスを、検索部１０３を実現するモジュールに伝達する。
【００６５】
検索部１０３を実現するモジュールは、トークン列保持部６０２、トークン個数保持部６０３、トークン番号保持部６０４、ノード情報保持部６０５に対応するレジスタなどを操作し、トークンの列に変換された文字列が、インデックスメモリ１０１に記憶された木構造に対応する文字列の中に存在するかどうかなどを検出する。
【００６６】
なお、検索装置は、ＬＳＩなどを組み合わせて、ハードウェアのみによって実現することもできる。
【００６７】
（実施例）
図８は、図５と図７とのフローチャートの処理の例を示す。図８の（ａ）に示すように、登録される文字列が「ＭＲ  ＭＡＩＮＥＴ  ＣＯＬＴＤ」と「ＭＲ  ＭＡＩＮＥＴ  ＳＹＳＴＥＭ  ＣＯＬＴＤ」とであれば、図５のフローチャートの処理により、図８の（ｂ）に示す木構造が生成される。したがって、インデックスメモリ１０１には、図８の（ｂ）に示す木構造を表す木構造データが記憶される。
【００６８】
検索する文字列が、「ＭＲ  ＭＡＩＮＥＴ」であれば、トークナイザ１０２により、図８の（ｃ）に示すデータ構造によって表されるトークンの列が生成される。このトークンの列が、検索部１０３に伝達されると、ステップＳ７０２において、Ｎの値がＮＵＬＬとなる。なぜならば、ノード１は、１番目のトークンの文字列である「ＭＲ」を有するが、トークンの列のトークンの個数が２であり、２はノード１から末端ノードまでの長さの最大値４と最小値３との範囲に含まれないので、ステップＳ７０３においてＳ７０４へ分岐し、文字列は登録されていないと判断される。実際、図８の（ａ）には、「ＭＲ  ＭＡＩＮＥＴ」と一致する文字列は含まれていない。したがって、「ＭＡＩＮＥＴ」に対応するトークンを走査するまでもなく、「ＭＲ  ＭＡＩＮＥＴ」が登録されていないと判断できる。
【００６９】
検索文字列が、「ＭＲ  ＭＡＩＮＥＴ  ＣＯＬＴＤ」であれば、トークナイザ１０２により、図８の（ｄ）に示すデータ構造によって表されるトークンの列が生成される。このトークンの列が、検索部１０３に伝達されると、変数Ｌ、Ｍ、Ｎの値は図８の（ｅ）に示されるように遷移する。すなわち、ステップＳ７０１における変数Ｌ、Ｍ、Ｎの値は行２１に示されるものとなる。ただし、Ｎの値は初期化前であり、ＮＵＬＬとした。ステップＳ７０２が実行されると、変数Ｌ、Ｍ、Ｎの値は、行２２に示すように、Ｎの値がノード１を表すようになる。ステップＳ７０５が終了すると、変数Ｌ、Ｍ、Ｎの値は、行２３に示すようになる。ステップＳ７０６が実行され、ステップＳ７１０が実行されると、変数Ｌ、Ｍ、Ｎの値は、行２４に示すようになる。ステップＳ７１１において、Ｎの値はＮＵＬＬではないので、ステップＳ７０５に処理が戻り、変数Ｌ、Ｍ、Ｎの値は行２５に示すようになる。
【００７０】
ステップＳ７０６、Ｓ７１０の処理により、変数Ｌ、Ｍ、Ｎの値は、行２６に示すようになり、ステップＳ７１１においてＮの値はＮＵＬＬではないので、ステップＳ７０５へ
処理が戻り、変数Ｌ、Ｍ、Ｎの値は行２７に示すようになる。ステップＳ７０６において、変数Ｌの値が０になっているので、ステップＳ７０７へ分岐し、ノード３は末端ノードなので、ステップＳ７０９に分岐する。したがって、ステップＳ７０９において、文字列は登録されていると判断される。実際、図８（ａ）には、第２の文字列に「ＭＲ  ＭＡＩＮＥＴ  ＣＯＬＴＤ」が存在する。このように、登録されている文字列を検索する場合であっても、トークンの列と一致しないノードを走査することがない。
【００７１】
（応用例）
本実施形態に係る検索装置は、例えば振込の宛名人が取引先として登録されているかどうかを検出し、また、振込の宛名人が取引先であれば、その口座番号などを取得するために用いることができる。すなわち、あらかじめ、取引先の口座の名義人の名前を表す文字列それぞれをトークンの列に変換し、共通するトークンの列を開始端より併合して構成される木構造データをインデックスメモリ１０１に記憶する。このとき、木構造データには末端ノードまでの長さの最大値および最小値を関連づけておく。
【００７２】
そして、振込の宛名人の名前が入力された場合、その名前を表す文字列をトークナイザ１０２に伝達し、トークンの列に変換し、検索部１０３により名前を表す文字列が、取引先の口座の名義人の名前の文字列の中に存在するかを検出する。
【００７３】
例えば図７のフローチャートのＳ７０８、Ｓ７１２の処理が実行される場合には、振込の宛名人が取引先として登録されていないとする。また、末端ノードに、取引先の口座番号など関連付けておくことにより、ステップＳ７０９の処理が実行される場合に、変数Ｎの表すノードに関連付けられた口座番号などを取得することにより、取引先の口座番号などを取得することができ、振込の処理などを行なうことができる。
【００７４】
（実施形態２）
本発明の実施形態２として、図３に示したデータ構造の変形例を図９に示す。図９の（ａ）において、データ構造は、６つのスロットを有し、スロット９０１、９０４、９０５、９０６は、図３におけるスロット３０１、３０２、３０３、３０４にそれぞれ対応する。図９においては、スロット９０２、９０３が示されている。スロット９０２には、スロット９０１に記憶される文字列の先頭の文字列が格納される。また、スロット９０３には、その文字列の長さが格納される。例えば、スロット９０１に「ＭＴＵ」が格納される場合には、スロット９０２、スロット９０３にはそれぞれ、Ｍ、３が格納される。
【００７５】
図９の（ｂ）は、（ａ）に示すデータ構造を用いて、図８の（ａ）に示す文字列に対応する木構造データを示す。
【００７６】
このようなデータ構造を用いる場合には、図７のフローチャートのステップＳ７０２とステップＳ７１０において、まず、トークンの文字列の先頭の文字が、スロット９０２に格納されている文字と同じであり、かつ、トークンの文字列の長さが、スロット９０３に格納されている値と同じノードのアドレスを得るようにする。もし、トークンの文字列の先頭の文字が、スロット９０２に格納されている文字と同じであり、かつ、トークンの文字列の長さが、スロット９０３に格納されている値と同じノードが根ノードあるいは子ノードとして存在しなければ、トークンの文字列とスロット９０１の文字列とを比較するまでもなく、検索する文字列が、複数の文字列の中に存在しないことを検出することができる。
【００７７】
また、ノードに、末端ノードまでの長さの最大値および最小値を関連付けるのではなく、末端ノードまでの長さのリストを関連付けておいてもよい。この場合には、未走査のトークンの数が、子ノードに関連付けられているリストになければ、検索する文字列が、複
数の文字列の中に存在しないことを検出することができる。
【符号の説明】
【００７８】
１００  検索装置、１０１  インデックスメモリ、１０２  トークナイザ、１０３  検索部
【図１】
0005628365.tif 000002
【図２】
0005628365.tif 000003
【図３】
0005628365.tif 000004
【図４】
0005628365.tif 000005
【図５】
0005628365.tif 000006
【図６】
0005628365.tif 000007
【図７】
0005628365.tif 000008
【図８】
0005628365.tif 000009
【図９】
0005628365.tif 000010
【図１０】
0005628365.tif 000011