(57)【要約】【課題】ＡＣマシンの状態数を増加させることなくあいまい検索を実現させ、照合結果となるキーワードの類似度を正確に判定すること。【解決手段】検索装置１００は、照合処理部１５０ｂがテキストデータを取得した場合に、ＡＣマシン１４０ｃとテキストデータの各文字とを順次比較し、通常遷移した際に、文字に対応する点数をスコア配列１４０ｄに登録し、フェイラ遷移した場合に、遷移先と遷移元の距離（dist）の差に基づいて、スコア配列１４０ｄの点数を前に詰める。そして、照合処理部１５０ｂは、状態が照合状態に遷移した場合に、スコア配列１４０ｄに含まれる点数を合計することで、照合されたキーワードの点数を判定する。【選択図】図３１
2010218140.tif 000002
【特許請求の範囲】
【請求項１】
複数のＯＲ条件の文字列検索において、該ＯＲ条件の文字列に含まれる正解文字に対して、該正解文字ではないが条件一致と見なされる許容文字を設定して照合処理する曖昧検索を、ＡＣオートマトンで実行する検索装置であって、
複数の条件文字列の文字桁毎に、正解文字および許容文字、各文字に対応する点数を設定するとともに、特定の条件文字列の特定文字桁数までは一致したがその後に不一致が発生した際、あるいは、特定の条件文字列がすべて一致した際に、他の条件文字列の特定の文字桁の文字へ遷移するフェイラ遷移を設定したＡＣオートマトンのトライ構造を生成する生成手段と、
前記トライ構造の文字桁毎に、検索対象である対象文字列が一致した正解文字あるいは許容文字列に対応付けられた点数が管理される点数テーブルと、
前記対象文字列を記憶装置から抽出し、該対象文字列に含まれる文字が前記トライ構造における特定の文字桁の正解文字あるいは許容文字と一致するか照合し、文字が一致する場合は、一致した文字桁に対応付けて正解文字または許容文字に対応する点数を前記点数テーブルに記録し、更に該対象文字列の次の文字について、該トライ構造の次の文字桁の正解文字または許容文字と照合することを順次繰り返す照合手段と、
対象文字列の次の文字を照合する際、前記フェイラ遷移に基づいて前記他の条件文字列の特定の文字列に移動する場合、該フェイラ遷移の遷移元と遷移先の文字桁の桁数の差を識別し、前記点数テーブルに記録された各文字桁の点数を、現在対応付けられた文字桁から該識別した桁数の差分だけ減じた文字桁の点数に変更する変更手段と、
いずれかの条件文字列の全文字桁で文字一致した時点で、前記点数テーブルに記録されている点数の合計を算出し、該合計点数に基づき条件文字列と前記対象文字列に含まれる文字列の類似度を出力する出力手段を、
備えることを特徴とする検索装置。
【請求項２】
複数のＯＲ条件の文字列検索において、該条件の文字列に含まれる正解文字に対して、該正解文字ではないが条件一致と見なされる許容文字を設定して照合処理する曖昧検索を、ＡＣオートマトンで実行する検索装置の検索方法であって、
前記検索装置は、トライ構造の文字桁毎に、検索対象である対象文字列が一致した正解文字あるいは許容文字列に対応付けられた点数が管理される点数テーブルを有し、
前記検索装置が、
前記複数の条件文字列の文字桁毎に、正解文字および許容文字、各文字に対応する点数を設定するとともに、特定の条件文字列の特定文字桁数までは一致したがその後に不一致が発生した際、あるいは、特定の条件文字列がすべて一致した際に、他の条件文字列の特定の文字桁の文字へ遷移するフェイラ遷移を設定したＡＣオートマトンのトライ構造を生成する生成ステップと、
前記対象文字列を記憶装置から抽出し、該対象文字列に含まれる文字が前記トライ構造における特定の文字桁の正解文字あるいは許容文字と一致するか照合し、文字が一致する場合は、一致した文字桁に対応付けて正解文字または許容文字に対応する点数を前記点数テーブルに記録し、更に該対象文字列の次の文字について、該トライ構造の次の文字桁の正解文字または許容文字と照合することを順次繰り返す照合ステップと、
対象文字列の次の文字を照合する際、前記フェイラ遷移に基づいて前記他の条件文字列の特定の文字列に移動する場合、該フェイラ遷移の遷移元と遷移先の文字桁の桁数の差を識別し、前記点数テーブルに記録された各文字桁の点数を、現在対応付けられた文字桁から該識別した桁数の差分だけ減じた文字桁の点数に変更する変更ステップと、
いずれかの条件文字列の全文字桁で文字一致した時点で、前記点数テーブルに記録されている点数の合計を算出し、該合計点数に基づき条件文字列と前記対象文字列に含まれる文字列の類似度を出力する出力ステップを、
含んだことを特徴とする検索方法。
【請求項３】
複数のＯＲ条件の文字列検索において、該条件の文字列に含まれる正解文字に対して、該正解文字ではないが条件一致と見なされる許容文字を設定して照合処理する曖昧検索を、コンピュータにＡＣオートマトンで実行させるためのプログラムを記憶したコンピュータ読取り可能な記憶媒体であって、
前記コンピュータは、トライ構造の文字桁毎に、検索対象である対象文字列が一致した正解文字あるいは許容文字列に対応付けられた点数が管理される点数テーブルを有し、
前記コンピュータに、
前記複数の条件文字列の文字桁毎に、正解文字および許容文字、各文字に対応する点数を設定するとともに、特定の条件文字列の特定文字桁数までは一致したがその後に不一致が発生した際、あるいは、特定の条件文字列がすべて一致した際に、他の条件文字列の特定の文字桁の文字へ遷移するフェイラ遷移を設定したＡＣオートマトンのトライ構造を生成する生成機能と、
前記対象文字列を記憶装置から抽出し、該対象文字列に含まれる文字が前記トライ構造における特定の文字桁の正解文字あるいは許容文字と一致するか照合し、文字が一致する場合は、一致した文字桁に対応付けて正解文字または許容文字に対応する点数を前記点数テーブルに記録し、更に該対象文字列の次の文字について、該トライ構造の次の文字桁の正解文字または許容文字と照合することを順次繰り返す照合機能と、
対象文字列の次の文字を照合する際、前記フェイラ遷移に基づいて前記他の条件文字列の特定の文字列に移動する場合、該フェイラ遷移の遷移元と遷移先の文字桁の桁数の差を識別し、前記点数テーブルに記録された各文字桁の点数を、現在対応付けられた文字桁から該識別した桁数の差分だけ減じた文字桁の点数に変更する変更手順と、
いずれかの条件文字列の全文字桁で文字一致した時点で、前記点数テーブルに記録されている点数の合計を算出し、該合計点数に基づき条件文字列と前記対象文字列に含まれる文字列の類似度を出力する出力機能を、
を実現させるためのプログラムを記録した記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＡＣマシンを用いてパターン照合を実行する検索装置等に関する。
【背景技術】
【０００２】
近年、検索システムのコアエンジンとしてＡＣマシン（Aho-Corasick  machines）が利用されている。このＡＣマシンは、テキストデータ（文字列）が与えられた場合にパターン照合を実行し、検索対象の文字列（キーワードまたはパターンと呼ぶ）の出現位置をテキストデータ中から高速に算出するものである（例えば、特許文献１、非特許文献１〜３参照）。
【０００３】
ＡＣマシンによるパターン照合は、テキストデータＤを１回スキャンするだけで終了するため、検索対象のキーワードの数がどれだけ増えても計算時間はＯ（｜Ｄ｜）で一定である。また、ＡＣマシンは、テキストデータへの前処理を必要とせず、そのまま１スキャンで計算できるという手軽さから、リアルタイム処理、オンデマンド処理、ストリーム処理などに特に適している。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平２−０７１３８８号公報
【非特許文献】
【０００５】
【非特許文献１】A.V.Aho  and  M.J  Corasick,"Efficient  String  Matching:An  Aid  to  Bibliographic  Search",Comm.ACM,Vol.18,No.6,pages  333-340,1975
【非特許文献２】S.Arikawa  and  T.  Shinohara,"A  Run-Time  Efficient  Realization  of  Aho-Corasick  Pattern  Matting  Machines",New  Generation  Comput.,Vol.2,No.2,pages  171-186,1984
【非特許文献３】有川・篠原「文字列パターン照合アルゴリズム」、コンピュータソフトウェア、Vol.4,No.2,pages2-23,1987.
【発明の概要】
【発明が解決しようとする課題】
【０００６】
例えば、大文字と小文字のように、類似した文字を区別しないあいまい検索を、ＡＣマシンを用いて実現させた場合、ヒットしたキーワードのうち、どの程度が大文字でどの程度が小文字なのか（類似度）を判定することが求められる。
【０００７】
しかし、上述したＡＣマシンをそのまま適用すると、パターン照合が終了した時点で、ヒットしたキーワードがＡＣマシン上のどの経路を通ってヒットしたのかを判定することが出来ない。従って、ヒットした文字のうち、どの程度が大文字でどの程度が小文字なのかを判定することができない。
【０００８】
なお、各文字における候補の組合せを全て展開したＡＣマシンを作成すれば、ヒットした文字のうち、どの程度が大文字でどの程度が小文字なのかを判定することが可能となる。しかし、かかる手法では、ＡＣマシンに含まれる状態数が、指数的に増加してしまうため、現実的ではない。
【０００９】
すなわち、ＡＣマシンの状態数を増加させることなくあいまい検索を実現させ、照合結果となるキーワードの類似度を正確に判定することが重要な課題となっている。
【００１０】
開示の技術は、上記に鑑みてなされたものであって、ＡＣマシンの状態数を増加させることなくあいまい検索を実現させ、照合結果となるキーワードの類似度を正確に判定することが出来る検索装置、検索方法、記憶媒体を提供することを目的とする。
【課題を解決するための手段】
【００１１】
この検索装置は、複数のＯＲ条件の文字列検索において、該条件の文字列に含まれる正解文字に対して、該正解文字ではないが条件一致と見なされる許容文字を設定して照合処理する曖昧検索を、ＡＣオートマトンで実行する検索装置であって、前記複数の条件文字列の文字桁毎に、正解文字および許容文字、各文字に対応する点数を設定するとともに、特定の条件文字列の特定文字桁数までは一致したがその後に不一致が発生した際、あるいは、特定の条件文字列がすべて一致した際に、他の条件文字列の特定の文字桁の文字へ遷移するフェイラ遷移を設定したＡＣオートマトンのトライ構造を生成する生成手段と、前記トライ構造の文字桁毎に、検索対象である対象文字列が一致した正解文字あるいは許容文字列に対応付けられた点数が管理される点数テーブルと、前記対象文字列を記憶装置から抽出し、該対象文字列に含まれる文字が前記トライ構造における特定の文字桁の正解文字あるいは許容文字と一致するか照合し、文字が一致する場合は、一致した文字桁に対応付けて正解文字または許容文字に対応する点数を前記点数テーブルに記録し、更に該対象文字列の次の文字について、該トライ構造の次の文字桁の正解文字または許容文字と照合することを順次繰り返す照合手段と、対象文字列の次の文字を照合する際、前記フェイラ遷移に基づいて前記他の条件文字列の特定の文字列に移動する場合、該フェイラ遷移の遷移元と遷移先の文字桁の桁数の差を識別し、前記点数テーブルに記録された各文字桁の点数を、現在対応付けられた文字桁から該識別した桁数の差分だけ減じた文字桁の点数に変更する変更手段と、いずれかの条件文字列の全文字桁で文字一致した時点で、前記点数テーブルに記録されている点数の合計を算出し、該合計点数に基づき条件文字列と前記対象文字列に含まれる文字列の類似度を出力する出力手段を、備えることを要件とする。
【発明の効果】
【００１２】
この検索装置によれば、ＡＣマシンの状態数を増加させることなくあいまい検索を実現させ、照合結果となるキーワードの類似度を正確に判定することができる。
【図面の簡単な説明】
【００１３】
【図１】図１は、従来のＡＣマシンのデータ構造の一例を示す図である。
【図２】図２は、従来の状態構造体のデータ構造の一例を示す図である。
【図３】図３は、従来のＡＣマシンを構築する処理手順を示すフローチャートである。
【図４】図４は、従来のパターン集合ΠのトライＴ構築処理の処理手順を示すフローチャートである。
【図５】図５は、従来のパターン登録処理の処理手順を示すフローチャートである。
【図６】図６は、従来のフェイラ遷移追加処理の処理手順を示すフローチャート（１）である。
【図７】図７は、従来のフェイラ遷移追加処理の処理手順を示すフローチャート（２）である。
【図８】図８は、従来のパターン集合ΠのトライＴ構築処理を説明するための図（１）である。
【図９】図９は、従来のパターン集合ΠのトライＴ構築処理を説明するための図（２）である。
【図１０】図１０は、従来のパターン集合ΠのトライＴ構築処理を説明するための図（３）である。
【図１１】図１１は、従来のフェイラ遷移追加処理を説明するための図（１）である。
【図１２】図１２は、従来のフェイラ遷移追加処理を説明するための図（２）である。
【図１３】図１３は、従来のフェイラ遷移追加処理を説明するための図（３）である。
【図１４】図１４は、従来のフェイラ遷移追加処理を説明するための図（４）である。
【図１５】図１５は、従来のフェイラ遷移追加処理を説明するための図（５）である。
【図１６】図１６は、従来のフェイラ遷移追加処理を説明するための図（６）である。
【図１７】図１７は、従来のフェイラ遷移追加処理を説明するための図（７）である。
【図１８】図１８は、従来のフェイラ遷移追加処理を説明するための図（８）である。
【図１９】図１９は、従来のフェイラ遷移追加処理を説明するための図（９）である。
【図２０】図２０は、従来のパターン照合処理の処理手順を示すフローチャートである。
【図２１】図２１は、従来のパターン照合処理を説明するための図（１）である。
【図２２】図２２は、従来のパターン照合処理を説明するための図（２）である。
【図２３】図２３は、従来のパターン照合処理を説明するための図（３）である。
【図２４】図２４は、従来のパターン照合処理を説明するための図（４）である。
【図２５】図２５は、従来のパターン照合処理を説明するための図（５）である。
【図２６】図２６は、従来のパターン照合処理を説明するための図（６）である。
【図２７】図２７は、あいまいパターンを受け付ける従来のＡＣマシンの一例を示す図である。
【図２８】図２８は、従来技術の問題点を説明するための図（１）である。
【図２９】図２９は、従来技術の問題点を説明するための図（２）である。
【図３０】図３０は、本実施例にかかる検索装置の概要を説明するための図である。
【図３１】図３１は、本実施例にかかる検索装置の構成を示す図である。
【図３２】図３２は、本実施例にかかるコスト管理テーブルのデータ構造の一例を示す図である。
【図３３】図３３は、本実施例にかかる状態構造体のデータ構造の一例を示す図である。
【図３４】図３４は、本実施例にかかるスコア配列のデータ構造の一例を示す図である。
【図３５】図３５は、本実施例にかかるトライＴ構築処理を説明するための図（１）である。
【図３６】図３６は、本実施例にかかるトライＴ構築処理を説明するための図（２）である。
【図３７】図３７は、本実施例にかかるトライＴ構築処理を説明するための図（３）である。
【図３８】図３８は、本実施例にかかるフェイラ遷移追加処理を説明するための図（１）である。
【図３９】図３９は、本実施例にかかるフェイラ遷移追加処理を説明するための図（２）である。
【図４０】図４０は、本実施例にかかるフェイラ遷移追加処理を説明するための図（３）である。
【図４１】図４１は、本実施例にかかるフェイラ遷移追加処理を説明するための図（４）である。
【図４２】図４２は、本実施例にかかるフェイラ遷移追加処理を説明するための図（５）である。
【図４３】図４３は、本実施例にかかるフェイラ遷移追加処理を説明するための図（６）である。
【図４４】図４４は、本実施例にかかるフェイラ遷移追加処理を説明するための図（７）である。
【図４５】図４５は、本実施例にかかるフェイラ遷移追加処理を説明するための図（８）である。
【図４６】図４６は、本実施例にかかるフェイラ遷移追加処理を説明するための図（９）である。
【図４７】図４７は、本実施例にかかるパターン照合処理を説明するための図（１）である。
【図４８】図４８は、本実施例にかかるパターン照合処理を説明するための図（２）である。
【図４９】図４９は、本実施例にかかるパターン照合処理を説明するための図（３）である。
【図５０】図５０は、本実施例にかかるパターン照合処理を説明するための図（４）である。
【図５１】図５１は、本実施例にかかるパターン照合処理を説明するための図（５）である。
【図５２】図５２は、本実施例にかかるパターン照合処理を説明するための図（６）である。
【図５３】図５３は、照合結果出力部が出力する照合結果の一例を示す図である。
【図５４】図５４は、本実施例にかかる検索装置１００がＡＣマシンを構築する処理手順を示すフローチャートである。
【図５５】図５５は、本実施例にかかるパターン集合ΠのトライＴの構築処理の処理手順を示すフローチャートである。
【図５６】図５６は、本実施例にかかるパターン登録処理の処理手順を示すフローチャートである。
【図５７】図５７は、本実施例にかかるフェイラ遷移追加処理の処理手順を示すフローチャート（１）である。
【図５８】図５８は、本実施例にかかるフェイラ遷移追加処理の処理手順を示すフローチャート（２）である。
【図５９】図５９は、本実施例にかかる照合処理の処理手順を示すフローチャートである。
【図６０】図６０は、実施例に示した検索装置に対応するコンピュータのハードウェア構成を示す図である。
【発明を実施するための形態】
【００１４】
以下に、本願の開示する（発明の名称）の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
【実施例】
【００１５】
まず、本実施例を説明する前に、従来のＡＣマシン（ＡＣオートマトン）について説明する。図１は、従来のＡＣマシンのデータ構造の一例を示す図である。図１に示すＡＣマシンは、テキストデータが入力された場合に、キーワード「ＡＣ、ＢＡ、ＢＢ、ＢＡＡ、ＢＡＣＤ」の位置を算出するＡＣマシンである。
【００１６】
図１に示すように、ＡＣマシンは、状態０〜８を有しており、各状態は、初期状態、通常状態、照合状態に分別される。初期状態は、初めにテキストデータと照合される状態であり、通常状態は、２番目以降にテキストデータと照合される状態である。照合状態は、テキストデータが特定のキーワードにヒットした場合に遷移する状態である。図１に示す例では、初期状態を状態１とし、通常状態を状態１，３とし、照合状態は状態２，４〜８とする。
【００１７】
ＡＣマシンは、テキストデータの文字を初期状態０から順次照合し、通常遷移とフェイラ（Failure）遷移を繰り返すことで、テキストデータに含まれるテキスト（例えば、図１の集合Πに含まれるテキスト）の出現位置を算出する。
【００１８】
ここで、通常遷移は、照合対象となる状態において、テキストデータの比較対象となる文字による遷移先が存在する場合の遷移を示す。例えば、状態１において、テキストデータの比較対象となる文字がＣの場合には、通常遷移となる。テキストデータの文字がＣの場合には、状態１から状態２に通常遷移する。
【００１９】
一方、通常遷移の条件に該当しない場合には、フェイラ遷移となる。例えば、状態１において、テキストデータの比較対象となる文字がＣ以外の場合には、フェイラ遷移となる。状態１においてフェイラ遷移した場合には、状態０となる。ＡＣマシンでは、各状態に一本ずつフェイラ遷移が存在する。図１で省略されているフェイラ遷移は、全て初期状態０に向かっているものとする。
【００２０】
ここで、図１に示したＡＣマシンが有する状態（状態構造体）のデータ構造について説明する。図２は、従来の状態構造体のデータ構造の一例を示す図である。図２に示すように、この状態構造体は、各状態を識別する状態ＩＤと、パターンリストと、通常遷移先へのポインタと、フェイラ遷移先へのポインタを有する。
【００２１】
ここで、パターンリストは、状態構造体が照合状態の場合に、該当するキーワードを格納する。例えば、状態２（状態ＩＤ２）の状態構造体に含まれるパターンリストは、ＡＣとなる。
【００２２】
次に、従来技術の装置（以下、従来装置；図示略）が、ＡＣマシンを構築する処理手順について説明する。図３は、従来のＡＣマシンを構築する処理手順を示すフローチャートである。図３に示すように、従来装置は、パターン集合Π（検索対象となるキーワードの集合）を取得し（ステップＳ１０）、パターン集合ΠのトライＴの構築処理を実行する（ステップＳ１１）。そして、従来装置は、フェイラ遷移追加処理を実行し（ステップＳ１２）、ＡＣマシンα（Π）を出力する（ステップＳ１３）。
【００２３】
次に、図３のステップＳ１１に示したパターン集合Πのトライ木構築処理について説明する。図４は、従来のパターン集合ΠのトライＴの構築処理の処理手順を示すフローチャートである。図４に示すように、従来装置は、初期状態（id＝０）を作成し、トライＴ（Π）を初期状態のみで構成されるトライに設定する（ステップＳ２０）。
【００２４】
従来装置は、初期状態における通常遷移先のポインタを全て初期状態（id＝０）に設定し（ステップＳ２１）、パターン集合Πにパターンが存在するか否かを判定する（ステップＳ２２）。パターンが存在しない場合には（ステップＳ２３，Ｎｏ）、トライＴ（Π）を出力する（ステップＳ２４）。
【００２５】
一方、パターン集合Πにパターンが存在する場合には（ステップＳ２３，Ｙｅｓ）、パターン集合Πから１つのパターンを取り出し、取り出したパターンをパターンｐに設定し（ステップＳ２５）、パターン登録処理を実行する（ステップＳ２６）。
【００２６】
次に、図４のステップＳ２６に示したパターン登録処理について説明する。図５は、従来のパターン登録処理の処理手順を示すフローチャートである。図５に示すように、従来装置は、状態ｓをトライＴの初期状態に設定し（ステップＳ３０）、パターンｐに次の文字が存在するか否かを判定する（ステップＳ３１）。
【００２７】
パターンｐに次の文字が存在しない場合には（ステップＳ３２，Ｎｏ）、従来装置は、状態ｓのパターンリストPlistにパターンｐを代入し（ステップＳ３３）、トライＴを出力する（ステップＳ３４）。
【００２８】
一方、パターンｐに次の文字が存在する場合には（ステップＳ３２，Ｙｅｓ）、従来装置は、次の文字をａとし、ａのasciiコードをcode(a)に設定し（ステップＳ３５）、状態ｓの通常遷移先へのポインタg[code(a)]がNullであるか否かを判定する（ステップＳ３６）。
【００２９】
通常遷移先へのポインタg[code(a)]がNullではない場合には（ステップＳ３７，Ｎｏ）、ステップＳ３９に移行する。一方、従来装置は、通常遷移先へのポインタg[code(a)]がNullの場合には（ステップＳ３７，Ｙｅｓ）、状態ｎを新規作成し、状態ｓの通常遷移先へのポインタg[code(a)]をｎに設定する（ステップＳ３８）。そして、従来装置は、状態ｓにg[code(a)]を代入し（ステップＳ３９）、ステップＳ３１に移行する。
【００３０】
次に、図３のステップＳ１２に示したフェイラ遷移追加処理について説明する。図６および図７は、従来のフェイラ遷移追加処理の処理手順を示すフローチャートである。図６に示すように、従来装置は、初期状態から通常遷移先となる状態を判定し、判定した状態をキュー（queue）に登録する（ステップＳ４０）。
【００３１】
そして、従来装置は、キューに登録された状態（状態構造体）のフェイラ遷移先に初期状態を登録し（ステップＳ４１）、キューに状態が存在するか否かを判定する（ステップＳ４２）。キューに状態が存在しない場合には（ステップＳ４３，Ｎｏ）、トライＴをＡＣマシンαとして出力する（ステップＳ４４）。
【００３２】
一方、キューに状態が存在する場合には（ステップＳ４３，Ｙｅｓ）、キューの先頭の状態を取り出し、取り出した状態を状態ｓに設定し（ステップＳ４５）、状態ｓの通常遷移先へのポインタが全てNullであるか否かを判定する（ステップＳ４６）。状態ｓの通常遷移先へのポインタが全てNullの場合には（ステップＳ４７，Ｙｅｓ）、ステップＳ４２に移行する。
【００３３】
一方、状態ｓの通常遷移先へのポインタが全てNullではない場合には（ステップＳ４７，Ｎｏ）、図７に示すように、従来装置は、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、抽出した文字ａを集合Ｘに格納する（ステップＳ４８）。
【００３４】
従来装置は、集合Ｘに文字が存在するか否かを判定し（ステップＳ４９）、集合Ｘに文字が存在しない場合には（ステップＳ５０，Ｎｏ）、ステップＳ４２に移行する。一方、集合Ｘに文字が存在する場合には（ステップＳ５０，Ｙｅｓ）、集合Ｘから文字ａを一つ取り出し、取り出した文字ａに該当する文字を集合Ｘから削除する（ステップＳ５１）。
【００３５】
従来装置は、状態ｓの通常遷移先をキューの最後尾に追加し（ステップＳ５２）、フェイラ遷移を繰り返し、文字ａに対する通常遷移先がNullにならない最初の状態を状態ｆに設定する（ステップＳ５３）。従来装置は、フェイラ遷移先の状態から文字ａの通常遷移先へのポインタfnext=g[code(a)]を判定する（ステップＳ５４）。
【００３６】
従来装置は、状態ｓから文字ａにより遷移する状態nextを判定し（ステップＳ５５）、状態nextのフェイラ遷移先をfnext=g[code(a)]に設定し（ステップＳ５６）、状態nextのフェイラ遷移先の状態にパターンリストが存在する場合に、かかるパターンリストを状態nextのパターンリストに追加し（ステップＳ５７）、ステップＳ４９に移行する。
【００３７】
次に、図３のステップＳ１１で示したパターン集合ΠのトライＴ構築処理を、具体例を用いて説明する。図８〜図１０は、従来のパターン集合ΠのトライＴ構築処理を説明するための図である。ここでは一例として、パターン集合ΠをΠ＝｛ＡＣ、ＢＡ、ＢＢ、ＢＡＡ、ＢＡＣＤ｝とする。
【００３８】
まず、従来装置は、初期状態（id＝０）を作成し、初期状態の状態構造体における通常遷移先を全て初期状態に設定する（図８、ステップＳ６０）。そして、従来装置は、パターン集合Πからパターン「ＡＣ」を取り出す。従来装置は、文字Ａを選択し、文字Ａによる初期状態（id＝０）の通常遷移先を通常状態（id＝１）に設定する。また、従来装置は、文字Ｃを選択し、文字Ｃによる通常状態（id＝１）の通常遷移先を照合状態（id＝２）に設定し、照合状態のパターンリストを「ＡＣ」に設定する（図８、ステップＳ６１）。文字Ｃは、パターン「ＡＣ」最後尾の文字であるため、状態２は、照合状態となる。
【００３９】
従来装置は、初期状態（id＝０）に戻り、パターン集合Πからパターン「ＢＡ」を取り出す。従来装置は、文字Ｂを選択し、文字Ｂによる初期状態（id＝０）の通常遷移先を通常状態（id＝３）に設定する。また、従来装置は、文字Ａを選択し、文字Ａによる通常状態（id＝３）の通常遷移先を照合状態（id＝４）に設定し、照合状態のパターンリストを「ＢＡ」に設定する（図８、ステップＳ６２）。文字Ａは、パターン「ＢＡ」の最後尾の文字であるため、状態４は、照合状態となる。
【００４０】
従来装置は、初期状態（id＝０）に戻り、パターン集合Πからパターン「ＢＢ」を取り出し、文字Ｂを選択する。ここで、文字Ｂによる初期状態（id＝０）の通常遷移先は通常状態（id＝３）であり、既に作成済みであるため、現在の状態を通常状態（id＝３）に遷移する。また、従来装置は、文字Ｂを選択し、文字Ｂによる通常状態（id＝３）の通常遷移先を照合状態（id＝５）に設定し、パターンリストを「ＢＢ」に設定する（図９、ステップＳ６３）。文字Ｂは、パターン「ＢＢ」の最後尾の文字であるため、状態５は、照合状態となる。
【００４１】
従来装置は、初期状態（id＝０）に戻り、パターン集合Πからパターン「ＢＡＡ」を取り出し、文字Ｂを選択する。ここで、文字Ｂによる初期状態（id＝０）の通常遷移先は、通常状態（id＝３）であり、既に作成済みであるため、現在の状態を通常状態（id＝３）に遷移する。また、従来装置は、文字Ａを選択する。ここで、文字Ａによる通常状態（id＝３）の通常遷移先は、照合状態（id＝４）であり、既に作成済みであるため、現在の状態を照合状態（id＝４）に設定する。また、従来装置は、文字Ａを選択する。文字Ａによる照合状態（id＝４）の通常遷移先を照合状態（id＝６）に設定し、パターンリストを「ＢＡＡ」に設定する（図９、ステップＳ６４）。文字Ａは、パターン「ＢＡＡ」の最後尾の文字であるため、状態６は、照合状態となる。
【００４２】
従来装置は、初期状態（id＝０）に戻り、パターン集合Πからパターン「ＢＡＣＤ」を取り出し、文字Ｂを選択する。ここで、文字Ｂによる初期状態（id＝０）の通常遷移先は、通常状態（id＝３）であり、既に登録済みであるため、現在の状態を通常状態（id＝３）に遷移する。また、従来装置は、文字Ａを選択する。ここで、文字Ａによる通常状態（id＝３）の通常遷移先は、照合状態（id＝４）であり、既に作成済みであるため、現在の状態を照合状態（id＝４）に設定する。
【００４３】
また、従来装置は、文字Ｃを選択し、文字Ｃによる照合状態（id＝４）の通常遷移先を通常状態（id＝７）に設定する。また、従来装置は、文字Ｄを選択し、文字Ｄによる通常状態（id＝７）の通常遷移先を照合状態（id＝８）に設定し、パターンリストを「ＢＡＣＤ」に設定する（図１０、ステップＳ６５）。文字Ｄは、パターン「ＢＡＣＤ」の最後尾の文字であるため、状態８は、照合状態となる。ステップＳ６５が終了した段階で、パターン集合Πに含まれる全てのパターンの登録が終了し、トライＴの構築処理が終了する。
【００４４】
次に、図３のステップＳ１２に示したフェイラ遷移追加処理を、具体例を用いて説明する。図１１〜図１９は、従来のフェイラ遷移追加処理を説明するための図である。従来装置は、初期状態（id＝０）からの通常遷移先となる状態を判定し、判定した状態をキュー（Queue）に登録し、キューに登録された状態のフェイラ遷移先に初期状態０を登録する。ここで、初期状態の通常遷移先は、通常状態１、３となるので、キューに１、３を登録する。また、通常状態１、３のフェイラ遷移先を初期状態０に設定する（図１１参照）。
【００４５】
次に、従来装置は、キューの先頭の状態１を取り出し、取り出した状態１を状態ｓに設定する。従来装置は、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。この場合は、従来装置は、文字Ｃを抽出し、集合Ｘに文字Ｃを格納する。
【００４６】
従来装置は、集合Ｘから文字Ｃを取り出し、状態ｓの通常遷移先となる状態２をキューの最後尾に追加する。従来装置は、状態１からフェイラ遷移した初期状態０に移行し、文字Ｃに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、初期状態０となる。従来装置は、状態ｓ（通常状態１）から文字Ｃにより遷移する状態nextを判定し、判定した状態（照合状態２）のフェイラ遷移先を初期状態０に設定する（図１２参照）。
【００４７】
従来装置は、キューの先頭の状態３を取り出し、取り出した状態３を状態ｓに設定する。従来装置は、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。この場合は、従来装置は、文字Ａ、Ｂを抽出し、集合Ｘに文字Ａ、Ｂを格納する。
【００４８】
従来装置は、集合Ｘから文字Ａを取り出し、状態ｓの文字Ａの通常遷移先となる状態４をキューの最後尾に追加する。従来装置は、状態ｓからフェイラ遷移した初期状態（id＝０）に移行し、文字Ａに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態１となる。従来装置は、状態ｓ（通常状態３）から文字Ａにより遷移する状態nextを判定し、判定した状態（照合状態４）のフェイラ遷移先を状態１に設定する（図１３の状態４参照）。
【００４９】
従来装置は、集合Ｘから文字Ｂを取り出し、状態ｓ（通常状態３）の文字Ｂの通常遷移先となる状態５をキューの最後尾に追加する。従来装置は、状態ｓからフェイラ遷移した初期状態０に移行し、文字Ｂに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態３となる。従来装置は、状態ｓから文字Ｂにより遷移する状態nextを判定し、判定した状態（照合状態５）のフェイラ遷移先を状態３に設定する（図１３の状態５参照）。
【００５０】
従来装置は、キューの先頭の状態２を取り出し、取り出した状態２を状態ｓに設定する。従来装置は、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。状態ｓに通常遷移先は存在しないので、次のステップに移行する（図１４参照）。
【００５１】
従来装置は、キューの先頭の状態４を取り出し、取り出した状態４を状態ｓに設定する。従来装置は、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。この場合は、従来装置は、文字Ａ、Ｃを抽出し、集合Ｘに文字Ａ、Ｃを格納する。
【００５２】
従来装置は、集合Ｘから文字Ａを取り出し、状態ｓ（照合状態４）の文字Ａの通常遷移先となる状態６をキューの最後尾に追加する。従来装置は、状態ｓからフェイラ遷移した状態１に移行する。状態１において、文字Ａに対する通常遷移先はNullであるため、再度フェイラ遷移し、初期状態０に移行する。
【００５３】
そして、初期状態０において、文字Ａに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態１となる。従来装置は、状態ｓ（通常状態４）から文字Ａにより遷移する状態nextを判定し、判定した状態（照合状態６）のフェイラ遷移先を状態１に設定する（図１５の状態６参照）。
【００５４】
従来装置は、集合Ｘから文字Ｃを取り出し、状態ｓ（照合状態４）の文字Ｃの通常遷移先となる状態７をキューの最後尾に追加する。従来装置は、状態ｓからフェイラ遷移した状態１に移行し、文字Ｃに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態２となる。従来装置は、状態ｓから文字Ｃによる遷移する状態nextを判定し、判定した状態（通常状態７）のフェイラ遷移先を状態２に設定する。
【００５５】
また、従来装置は、状態７のフェイラ遷移先が照合状態２となるため、状態２のパターンリストを状態７のパターンリストに追加することで、状態７を照合状態７に設定する（図１５の状態７参照）。
【００５６】
従来装置は、キューの先頭の状態５を取り出し、取り出した状態５を状態ｓに設定する。従来装置は、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。状態ｓに通常遷移先は存在しないので、次のステップに移行する（図１６参照）。
【００５７】
従来装置は、キューの先頭の状態６を取り出し、取り出した状態６を状態ｓに設定する。従来装置は、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。状態ｓに通常遷移先は存在しないので、次のステップに移行する（図１７参照）。
【００５８】
従来装置は、キューの先頭の状態７を取り出し、取り出した状態７を状態ｓに設定する。従来装置は、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。この場合は、従来装置は、文字Ｄを抽出し、集合Ｘに文字Ｄを格納する。
【００５９】
従来装置は、集合Ｘから文字Ｄを取り出し、状態ｓ（照合状態７）の文字Ｄの通常遷移先となる状態８をキューの最後尾に追加する。従来装置は、状態ｓからフェイラ遷移した状態２に移行する。状態２において、文字Ｄに対する通常遷移先はNullであるため、再度フェイラ遷移し、初期状態０に移行する。
【００６０】
そして、初期状態０において、文字Ｄに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、初期状態０となる。従来装置は、状態ｓ（照合状態７）から文字Ｄにより遷移する状態nextを判定し、判定した状態（照合状態８）のフェイラ遷移先を初期状態０に設定する（図１８の状態８参照）。
【００６１】
従来装置は、キューの先頭の状態８を取り出し、取り出した状態８を状態ｓに設定する。従来装置は、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。状態ｓに通常遷移先は存在しないので、次のステップに移行する。そして、キューに状態が存在しなくなった場合に、パターン集合ΠのＡＣマシンが完了する（図１９参照）。
【００６２】
次に、従来のＡＣマシンを用いたテキストデータのパターン照合処理について説明する。図２０は、従来のパターン照合処理の処理手順を示すフローチャートである。図２０に示すように、従来装置は、状態ｓをＡＣマシンαの初期状態に設定し（ステップＳ７０）、オフセットｄ＝０に設定し、集合Ｒを空集合に設定する（ステップＳ７１）。
【００６３】
従来装置は、テキストデータＤに（ｄ+１）文字目が存在するか否かを判定し（ステップＳ７２）、（ｄ+１）文字目が存在しない場合には（ステップＳ７３，Ｎｏ）、集合Ｒを出力する（ステップＳ７４）。
【００６４】
一方、テキストデータＤに（ｄ+１）文字目が存在する場合には（ステップＳ７３，Ｙｅｓ）、従来装置は、（ｄ+１）文字目の文字を文字ａに設定し（ステップＳ７５）、ｄ＝ｄ+１に設定する（ステップＳ７６）。
【００６５】
従来装置は、状態ｓに文字ａの通常遷移先が存在するか否かを判定する（ステップＳ７７）。通常遷移先が存在する場合には（ステップＳ７８，Ｙｅｓ）、状態ｓのg[code(a)]を状態ｓに代入し（ステップＳ７９）、状態ｓが照合状態の場合に、状態ｓのパターンリストをオフセットｄに対応付けて集合Ｒに登録し（ステップＳ８０）、ステップＳ７２に移行する。
【００６６】
通常遷移先が存在しない場合には（ステップＳ７８，Ｎｏ）、状態ｓのフェイラ遷移先を状態ｓに設定し（ステップＳ８１）、状態ｓが照合状態の場合に、状態ｓのパターンリストをオフセットｄに対応付けて集合Ｒに登録し（ステップＳ８２）、ステップＳ７７に移行する。
【００６７】
次に、図２０に示したパターン照合処理を、具体例を用いて説明する。図２１〜図２６は、従来のパターン照合処理を説明するための図である。ここでは一例として、パターン集合ΠをΠ＝｛ＡＣ、ＢＡ、ＢＢ、ＢＡＡ、ＢＡＣＤ｝としたＡＣマシンを用い、テキストデータＤを「ＣＢＡＡＣ」として説明を行う。
【００６８】
従来装置は、状態ｓをＡＣマシンαの初期状態０に設定し、集合Ｒを空集合に設定する（図２１参照）。従来装置は、テキストデータＤから文字Ｃを読み出し、オフセットをｄ＝１に設定する。状態ｓに文字Ｃによる通常遷移先が存在しないので、従来装置は、状態ｓをフェイラ遷移させ、状態ｓをフェイラ遷移先の初期状態０に設定する（図２２参照）。
【００６９】
従来装置は、テキストデータＤから文字Ｂを読み出し、オフセットをｄ＝２に設定する。状態ｓ（初期状態０）において、文字Ｂによる通常遷移先は、状態３となるので、従来装置は、状態ｓを状態３に設定する（図２３参照）。
【００７０】
従来装置は、テキストデータＤから文字Ａを読み出し、オフセットをｄ＝３に設定する。状態ｓ（通常状態３）において、文字Ａによる通常遷移先は、状態４となるので、従来装置は、状態ｓを状態４に設定する。状態ｓが照合状態となったので、従来装置は、状態ｓのパターンリスト「ＢＡ」と、オフセット「３」を集合Ｒに登録する（図２４参照）。
【００７１】
従来装置は、テキストデータＤから文字Ａを読み出し、オフセットをｄ＝４に設定する。状態ｓ（照合状態４）において、文字Ａによる通常遷移先は、状態６となるので、従来装置は、状態ｓを状態６に設定する。状態ｓが照合状態となったので、従来装置は、状態ｓのパターンリスト「ＢＡＡ」と、オフセット「４」を集合Ｒに登録する（図２５参照）。
【００７２】
従来装置は、テキストデータＤから文字Ｃを読み出し、オフセットをｄ＝５に設定する。状態ｓ（照合状態６）において、文字Ｃによる通常遷移先は、存在しないので、フェイラ遷移し、状態ｓを状態１に設定する。状態ｓにおいて、文字Ｃによる通常遷移先は、状態２となるので、従来装置は、状態ｓを状態２に設定する。状態ｓが照合状態となったので、従来装置は、状態ｓのパターンリスト「ＡＣ」と、オフセット「５」を集合Ｒに登録する（図２６参照）。
【００７３】
従来装置は、図２６に示した集合Ｒを、照合結果として出力する。かかる照合結果を参照すると、テキストデータのオフセット３にキーワード「ＢＡ」が存在し、オフセット４にキーワード「ＢＡＡ」が存在し、オフセット５にキーワード「ＡＣ」が存在することが分かる。
【００７４】
次に、大文字と小文字（例えば、Ａとａ）のように、類似した文字を区別しないあいまい検索を、ＡＣマシンを用いて実現させる場合について説明する。ＡＣマシンを用いて、あいまい検索を実現させる場合には、あいまいな文字を同一状態に遷移させるようなオートマトンとして表現すればよい。
【００７５】
図２７は、あいまいパターンを受け付ける従来のＡＣマシンの一例を示す図である。図２７に示す例では、パターン集合Π＝｛（Ａ｜ａ）（Ｃ｜ｃ）、（Ｂ｜ｂ）（Ａ｜ａ）、（Ｂ｜ｂ）（Ｂ｜ｂ）、（Ｂ｜ｂ）（Ａ｜ａ）（Ａ｜ａ）、（Ｂ｜ｂ）（Ａ｜ａ）（Ｃ｜ｃ）（Ｄ｜ｄ）｝により構築されたＡＣマシンである。ここで、（ｘ｜ｙ）は、ｘでもｙでも良い旨を示す。例えば、パターン集合Πに含まれるキーワード（Ａ｜ａ）（Ｃ｜ｃ）に該当するキーワードは、ＡＣ、ａＣ、Ａｃ、ａｃが含まれる。
【００７６】
ここで、図２７に示すＡＣマシンの状態遷移の一例を説明する。例えば、現在の状態が初期状態０であり、テキストデータＤの文字がＡまたはａの場合には、初期状態０から通常状態１に現在の状態を遷移する。このように、あいまい検索を、ＡＣマシンで実現させると、２本以上（図２７に示す例では２本）の通常遷移先が存在することなる。その他の状態遷移方法は、図１に示した従来のＡＣマシンと同様である。
【００７７】
ところで、図２７に示したＡＣマシンを用いてパターン照合処理を実行する場合に、ヒットしたキーワード（集合Ｒに登録されたキーワード）の内、どの程度が大文字でどの程度が小文字なのかを判定すること（類似度を判定すること）が求められる。
【００７８】
しかし、図２７に示したＡＣマシンをそのまま適用すると、パターン照合が終了した時点で、ヒットしたキーワードがＡＣマシン上のどの経路を通ってヒットしたのかを判定することが出来ない。図２７において、照合状態２に到達するまでに、初期状態０から状態１に向かうまでに「Ａ」または「ａ」の２通り、状態１から照合状態２に向かうまでに「Ｃ」または「ｃ」の２通りが存在する。
【００７９】
従って、照合状態２（キーワード（Ａ｜ａ）（Ｃ｜ｃ）にヒットする状態）に至る経路は合計で４通り存在するが、いずれの経路でも照合状態２に到達するため、各経路を区別できず、ヒットしたキーワードのうち、どの程度が大文字でどの程度が小文字なのかを判定することができない。
【００８０】
かかる課題を解消するための手段として、各文字における候補の組合せを全て展開したＡＣマシンを作成すれば、ヒットした文字のうち、どの程度が大文字でどの程度が小文字なのかを判定することが可能となる。例えば、大文字に１点、小文字に０点を割り振り、図２８に示すとおり、全ての文字を展開して点数を割り付け、図２９に示すＡＣマシンを作成すればよい。図２８および図２９は、従来技術の問題点を説明するための図である。
【００８１】
例えば、図２８に示すキーワードＡＣは、大文字を２つ含むので２点となり、キーワードＡｃ、ａＣは、大文字を一つ含むので１点となり、キーワードａｃは大文字を含まないので０点となる。そして、キーワード（Ａ｜ａ）（Ｃ｜ｃ）に対して、４通りの経路を用意してやれば、キーワード（Ａ｜ａ）（Ｃ｜ｃ）にヒットした際の点数を参照することで、どの程度が大文字でどの程度が小文字なのかを判定することが可能となる。
【００８２】
しかしながら、図２８のように展開した文字列を全てＡＣマシンで表現すると、図２９に示すように、ＡＣマシンの状態数が膨大な数となってしまうため、現実的ではない。図２９に示すＡＣマシンの状態数は、キーワードサイズに応じて指数的に増加してしまう。
【００８３】
次に、本実施例にかかる検索装置の概要について説明する。図３０は、本実施例にかかる検索装置の概要を説明するための図である。図３０に示すように、本実施例にかかる検索装置は、図２７と同様にして、あいまいな文字を同一状態に遷移させるようなＡＣオートマトンを作成すると共に、ＡＣマシンの各辺に点数をつけ、オートマトンの状態を遷移させながら逐次的に点数計算を行う。
【００８４】
具体的には、ある状態からある状態に遷移する場合に、大文字により通常遷移した場合には、１点を加算し、小文字により通常遷移した場合には、０点を加算することで、点数計算を行う。例えば、図３０において、初期状態０から、文字Ａにより状態１に通常遷移した場合には１点を加算し、文字ａにより状態１に通常遷移した場合には、０点を加算する。
【００８５】
更に、本実施例にかかる検索装置は、ある状態からある状態にフェイラ遷移した場合には、遷移元の状態のレベルと、遷移先の状態のレベルとの差に基づいて、点数を補正することで、パターン照合終了時の点数を正確なものとする。ここで、状態のレベルは、初期状態から該当状態までの距離を示す。
【００８６】
図３０を用いて、各状態のレベルを具体的に示すと、状態１、３は、初期状態０からの距離が１なので、レベル１となる。状態６、７は、初期状態０からの距離が３なので、レベル３となる。状態８は、初期状態０からの距離が４なので、レベル４となる。
【００８７】
このように、本実施例にかかる検索装置は、あいまいな文字を同一状態に遷移させるようなＡＣオートマトンを作成すると共に、ＡＣマシンの各辺に点数をつけ、オートマトンの状態を遷移させながら逐次的に点数計算を行っている。したがって、本実施例にかかる検索装置によれば、各文字における候補の組合せを全て展開すること無く、ヒットしたキーワードの内、どの程度が大文字でどの程度が小文字なのかを判定することができる。
【００８８】
次に、本実施例で用いる用語の定義を行う。Σは、アルファベット（文字の集合）を示し、あいまい文字セットを、Σの部分集合とする。あいまい文字セット｛ａ、ｂ、・・・｝⊆Σを（ａ｜ｂ｜・・・）と記述することにする。任意のｐ∈（Σ∪Ａ）＊をパターンと呼ぶ。コスト表Ｃを、Σの各文字に整数を割当てる関数として定義する。検索装置に入力するテキストデータＤを、Ｄ∈Σ＊とする。また、あいまい文字セットの集合をＡ＝Σ２とする。
【００８９】
本実施例にかかる検索装置は一例として、テキストデータＤ、パターン集合Π、点数を管理するコスト管理テーブルを受け付け、テキストデータＤに対して、各パターンｐ∈Πの全ての照合位置および照合コストを検索結果として出力するものとする。
【００９０】
本実施例では、パターン集合Πとして第１〜３の条件を満たすもののみを取り扱う。第１の条件として、あいまい文字セットで使われている文字は、単独使用できない。例えば、あいまい文字セット（ａ｜Ａ）があるパターンｐ∈Πで使われている場合には、Πの任意のパターンにおいて、文字ａ∈ΣおよびＡ∈Σを単独で用いることが出来ない。
【００９１】
第２の条件として、Π中のパターンで使われている相違なるあいまい文字セットに、同一の文字を使うことは出来ない。例えば、（ａ｜Ａ）と（ａ｜ｂ）を、Π中で同時に使いことは出来ない。第３の条件として、１つのあいまい文字セットに、２通り以上の得点を割当てることはできない。すなわち、各あいまい文字セットにおける得点割り当ては、Πにおいて共通でなくてはならない。
【００９２】
次に、本実施例にかかる検索装置１００の構成について説明する。図３１は、本実施例にかかる検索装置１００の構成を示す図である。図３１に示すように、この検索装置１００は、入力部１１０、出力部１２０、入出力制御部１３０、記憶部１４０、制御部１５０を有する。
【００９３】
このうち、入力部１１０は、パターン集合、スコア配列、コスト管理テーブル、テキストデータ等を入力する入力部であり、キーボードやマウス、マイク等に対応する。出力部１２０は、ＡＣマシンによる照合結果などを出力する出力部であり、モニタ（若しくはディスプレイ、タッチパネル）に対応する。入出力制御部１３０は、入力部１１０、出力部１２０、記憶部１４０、制御部１５０によるデータの入出力を制御する処理部である。
【００９４】
記憶部１４０は、制御部１５０による各種処理に必要なデータおよびプログラムを記憶する記憶部である。この記憶部１４０は、パターン集合１４０ａと、コスト管理テーブル１４０ｂと、ＡＣマシン１４０ｃと、スコア配列１４０ｄを有する。
【００９５】
このうち、パターン集合１４０ａは、テキストデータから検索するキーワード（あいまいパターン）の集合である。本実施例では一例として、パターン集合１４０ａを、Π＝｛（Ａ｜ａ）（Ｃ｜ｃ）、（Ｂ｜ｂ）（Ａ｜ａ）、（Ｂ｜ｂ）（Ｂ｜ｂ）、（Ｂ｜ｂ）（Ａ｜ａ）（Ａ｜ａ）、（Ｂ｜ｂ）（Ａ｜ａ）（Ｃ｜ｃ）（Ｄ｜ｄ）｝とする。
【００９６】
コスト管理テーブル１４０ｂは、文字の種別とコスト（点数）を対応付けて記憶するテーブルである。図３２は、本実施例にかかるコスト管理テーブル１４０ｂのデータ構造の一例を示す図である。
【００９７】
ＡＣマシン１４０ｃは、パターン集合１４０ａに基づいて生成されるＡＣマシンである。例えば、パターン集合Π＝｛（Ａ｜ａ）（Ｃ｜ｃ）、（Ｂ｜ｂ）（Ａ｜ａ）、（Ｂ｜ｂ）（Ｂ｜ｂ）、（Ｂ｜ｂ）（Ａ｜ａ）（Ａ｜ａ）、（Ｂ｜ｂ）（Ａ｜ａ）（Ｃ｜ｃ）（Ｄ｜ｄ）｝に対応するＡＣマシンは、図３０に示したＡＣマシンとなる。
【００９８】
本実施例にかかるＡＣマシンも従来と同様にして、複数の状態構造体から構成されている。図３３は、本実施例にかかる状態構造体のデータ構造の一例を示す図である。図３３に示すように、本実施例にかかる状態構造体は、各状態を識別する状態ＩＤ「id」と、パターンリスト「plist」と、通常遷移先へのポインタg[1]〜g[256]と、フェイラ遷移先へのポインタ「fail」と、初期状態（ルートノード）からの距離「dist」を有する。
【００９９】
図３１の説明に戻ると、スコア配列１４０ｄは、ＡＣマシン上で状態が遷移することで変化する初期状態から現在の状態までの距離と、点数とを管理するテーブルである。図３４は、本実施例にかかるスコア配列１４０ｄのデータ構造の一例を示す図である。図３４に示すように、このスコア配列１４０ｄは、初期状態からの距離（初期状態から現在の状態までの距離）と点数とを対応付けて記憶している。
【０１００】
制御部１５０は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する制御部である。図３１に示すように、制御部１５０は、ＡＣマシン構築処理部１５０ａと、照合処理部１５０ｂと、照合結果出力部１５０ｃを有する。
【０１０１】
ＡＣマシン構築処理部１５０ａは、パターン集合１４０ａに基づいて、ＡＣマシン１４０ｃを作成する処理部である。ＡＣマシン構築処理部１５０ａは、ＡＣマシン１４０ｄを作成する場合に、初めにトライ構築を行った後に、フェイラ遷移追加処理を実行する。
【０１０２】
まず、ＡＣマシン構築処理部１５０ａが実行する、トライＴ構築について具体的に説明する。ここでは、パターン集合をΠ＝｛（Ａ｜ａ）（Ｃ｜ｃ）、（Ｂ｜ｂ）（Ａ｜ａ）、（Ｂ｜ｂ）（Ｂ｜ｂ）、（Ｂ｜ｂ）（Ａ｜ａ）（Ａ｜ａ）、（Ｂ｜ｂ）（Ａ｜ａ）（Ｃ｜ｃ）（Ｄ｜ｄ）｝として説明する。図３５〜図３７は、本実施例にかかるトライＴ構築処理を説明するための図である。
【０１０３】
まず、ＡＣマシン構築処理部１５０ａは、初期状態０を作成し、初期状態の状態構造体における通常遷移先を全て初期状態に設定する（図３５、ステップＳ９０）。そして、ＡＣマシン構築処理部１５０ａは、パターン集合Πからパターン「（Ａ｜ａ）（Ｃ｜ｃ）」を取り出す。ＡＣマシン構築処理部１５０ａは、文字（Ａ｜ａ）を選択し、文字Ａおよびａによる初期状態０の通常遷移先を通常状態１に設定し、distを「１」に設定する。
【０１０４】
ＡＣマシン構築処理部１５０ａは、文字（Ｃ｜ｃ）を選択し、文字Ｃおよびｃによる通常状態１の通常遷移先を照合状態２に設定し、照合状態のパターンリストを「（Ａ｜ａ）（Ｃ｜ｃ）」に設定する。文字（Ｃ｜ｃ）は、パターン「（Ａ｜ａ）（Ｃ｜ｃ）」最後尾の文字であるため、状態２は、照合状態となる。また、ＡＣマシン構築処理部１５０ａは、照合状態２のdistを「２」に設定する（図３５、ステップＳ９１）。
【０１０５】
ＡＣマシン構築処理部１５０ａは、初期状態０に戻り、パターン集合Πからパターン「（Ｂ｜ｂ）（Ａ｜ａ）」を取り出す。ＡＣマシン構築処理部１５０ａは、文字（Ｂ｜ｂ）を選択し、文字Ｂおよびｂによる初期状態０の通常遷移先を通常状態３に設定し、distを「１」に設定する。
【０１０６】
ＡＣマシン構築処理部１５０ａは、文字（Ａ｜ａ）を選択し、文字Ａおよびａによる通常状態３の通常遷移先を照合状態４に設定し、照合状態のパターンリストを「（Ｂ｜ｂ）（Ａ｜ａ）」に設定する。文字（Ａ｜ａ）は、パターン「（Ｂ｜ｂ）（Ａ｜ａ）」の最後尾の文字であるため、状態４は、照合状態となる。また、ＡＣマシン構築処理部１５０ａは、照合状態４のdistを「２」に設定する（図３５、ステップＳ９２）。
【０１０７】
ＡＣマシン構築処理部１５０ａは、初期状態０に戻り、パターン集合Πからパターン「（Ｂ｜ｂ）（Ｂ｜ｂ）」を取り出し、文字（Ｂ｜ｂ）を選択する。ここで、文字Ｂおよびｂによる初期状態０の通常遷移先は通常状態３であり、既に作成済みであるため、現在の状態を通常状態３に遷移する。また、ＡＣマシン構築処理部１５０ａは、文字（Ｂ｜ｂ）を選択し、文字Ｂおよびｂによる通常状態３の通常遷移先を照合状態５に設定し、パターンリストを「（Ｂ｜ｂ）（Ｂ｜ｂ）」に設定する。文字（Ｂ｜ｂ）は、パターン「（Ｂ｜ｂ）（Ｂ｜ｂ）」の最後尾の文字であるため、状態５は、照合状態となる。また、ＡＣマシン構築処理部１５０ａは、照合状態２のdistを「２」に設定する（図３６、ステップＳ９３）。
【０１０８】
ＡＣマシン構築処理部１５０ａは、初期状態０に戻り、パターン集合Πからパターン「（Ｂ｜ｂ）（Ａ｜ａ）（Ａ｜ａ）」を取り出し、文字（Ｂ｜ｂ）を選択する。ここで、文字Ｂおよびｂによる初期状態０の通常遷移先は、通常状態３であり、既に作成済みであるため、現在の状態を通常状態３に遷移する。また、ＡＣマシン構築処理部１５０ａは、文字（Ａ｜ａ）を選択する。ここで、文字Ａおよびａによる通常状態３の通常遷移先は、照合状態４であり、既に作成済みであるため、現在の状態を照合状態４に設定する。また、ＡＣマシン構築処理部１５０ａは、文字（Ａ｜ａ）を選択する。文字Ａおよびａによる照合状態４の通常遷移先を照合状態６に設定し、パターンリストを「（Ｂ｜ｂ）（Ａ｜ａ）（Ａ｜ａ）」に設定する。文字（Ａ｜ａ）は、パターン「（Ｂ｜ｂ）（Ａ｜ａ）（Ａ｜ａ）」の最後尾の文字であるため、状態６は、照合状態となる。また、ＡＣマシン構築処理部１５０ａは、照合状態６のdistを「３」に設定する（図３６、ステップＳ９４）。
【０１０９】
ＡＣマシン構築処理部１５０ａは、初期状態０に戻り、パターン集合Πからパターン「（Ｂ｜ｂ）（Ａ｜ａ）（Ｃ｜ｃ）（Ｄ｜ｄ）」を取り出し、文字（Ｂ｜ｂ）を選択する。ここで、文字Ｂおよびｂによる初期状態０の通常遷移先は、通常状態３であり、既に登録済みであるため、現在の状態を通常状態３に遷移する。また、ＡＣマシン構築処理部１５０ａは、文字（Ａ｜ａ）を選択する。ここで、文字Ａおよびａによる通常状態３の通常遷移先は、照合状態４であり、既に作成済みであるため、現在の状態を照合状態４に設定する。
【０１１０】
また、ＡＣマシン構築処理部１５０ａは、文字（Ｃ｜ｃ）を選択し、文字Ｃおよびｃによる照合状態４の通常遷移先を通常状態７に設定し、distを「３」に設定する。また、ＡＣマシン構築処理部１５０ａは、文字（Ｄ｜ｄ）を選択し、文字Ｄおよびｄによる通常状態７の通常遷移先を照合状態８に設定し、パターンリストを「（Ｂ｜ｂ）（Ａ｜ａ）（Ｃ｜ｃ）（Ｄ｜ｄ）」に設定する。文字（Ｄ｜ｄ）は、パターン「（Ｂ｜ｂ）（Ａ｜ａ）（Ｃ｜ｃ）（Ｄ｜ｄ）」の最後尾の文字であるため、状態８は、照合状態となる。
【０１１１】
また、ＡＣマシン構築処理部１５０ａは、照合状態８のdistを「４」に設定する（図３７、ステップＳ９５）。ステップＳ９５が終了した段階で、パターン集合Πに含まれる全てのパターン（あいまいパターン）の登録が終了し、トライＴの構築処理が終了する。
【０１１２】
次に、ＡＣマシン構築処理部１５０ａが実行するフェイラ遷移追加処理について説明する。なお、ＡＣマシン構築処理部１５０ａは、上述したトライＴ構築処理で作成したトライＴに対して、フェイラ遷移追加処理を行うものとする。
【０１１３】
図３８〜図４６は、本実施例にかかるフェイラ遷移追加処理を説明するための図である。ＡＣマシン構築処理部１５０ａは、初期状態０からの通常遷移先となる状態を判定し、判定した状態をキュー（Queue）に登録し、キューに登録された状態のフェイラ遷移先に初期状態０を登録する。ここで、初期状態の通常遷移先は、通常状態１、３となるので、キューに１、３を登録する。また、通常状態１、３のフェイラ遷移先を初期状態０に設定する（図３８参照）。
【０１１４】
次に、ＡＣマシン構築処理部１５０ａは、キューの先頭の状態１を取り出し、取り出した状態１を状態ｓに設定する。ＡＣマシン構築処理部１５０ａは、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。この場合は、ＡＣマシン構築処理部１５０ａは、文字（Ｃ｜ｃ）を抽出し、集合Ｘに文字（Ｃ｜ｃ）を格納する。
【０１１５】
ＡＣマシン構築処理部１５０ａは、集合Ｘから文字（Ｃ｜ｃ）を取り出し、状態ｓの通常遷移先となる状態２をキューの最後尾に追加する。ＡＣマシン構築処理部１５０ａは、状態１からフェイラ遷移した初期状態０に移行し、文字（Ｃ｜ｃ）に対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、初期状態０となる。ＡＣマシン構築処理部１５０ａは、状態ｓ（通常状態１）から文字Ｃまたはｃにより遷移する状態nextを判定し、判定した状態（照合状態２）のフェイラ遷移先を初期状態０に設定する（図３９参照）。
【０１１６】
ＡＣマシン構築処理部１５０ａは、キューの先頭の状態３を取り出し、取り出した状態３を状態ｓに設定する。ＡＣマシン構築処理部１５０ａは、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。この場合、従来装置は、文字（Ａ｜ａ）、（Ｂ｜ｂ）を抽出し、集合Ｘに文字（Ａ｜ａ）、（Ｂ｜ｂ）を格納する。
【０１１７】
ＡＣマシン構築処理部１５０ａは、集合Ｘから文字（Ａ｜ａ）を取り出し、状態ｓの文字（Ａ｜ａ）の通常遷移先となる状態４をキューの最後尾に追加する。ＡＣマシン構築処理部１５０ａは、状態ｓからフェイラ遷移した初期状態０に移行し、文字（Ａ｜ａ）に対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態１となる。ＡＣマシン構築処理部１５０ａは、状態ｓ（通常状態３）から文字Ａまたはａにより遷移する状態nextを判定し、判定した状態（照合状態４）のフェイラ遷移先を状態１に設定する（図４０の状態４参照）。
【０１１８】
ＡＣマシン構築処理部１５０ａは、集合Ｘから文字（Ｂ｜ｂ）を取り出し、状態ｓ（通常状態３）の文字（Ｂ｜ｂ）の通常遷移先となる状態５をキューの最後尾に追加する。ＡＣマシン構築処理部１５０ａは、状態ｓからフェイラ遷移した初期状態０に移行し、文字Ｂに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態３となる。ＡＣマシン構築処理部１５０ａは、状態ｓから文字Ｂまたはｂにより遷移する状態nextを判定し、判定した状態（照合状態５）のフェイラ遷移先を状態３に設定する（図４０の状態５参照）。
【０１１９】
ＡＣマシン構築処理部１５０ａは、キューの先頭の状態２を取り出し、取り出した状態２を状態ｓに設定する。ＡＣマシン構築処理部１５０ａは、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。状態ｓに通常遷移先は存在しないので、次のステップに移行する（図４１参照）。
【０１２０】
ＡＣマシン構築処理部１５０ａは、キューの先頭の状態４を取り出し、取り出した状態４を状態ｓに設定する。ＡＣマシン構築処理部１５０ａは、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。この場合は、ＡＣマシン構築処理部１５０ａは、文字（Ａ｜ａ）、（Ｃ｜ｃ）を抽出し、集合Ｘに文字（Ａ｜ａ）、（Ｃ｜ｃ）を格納する。
【０１２１】
ＡＣマシン構築処理部１５０ａは、集合Ｘから文字（Ａ｜ａ）を取り出し、状態ｓ（照合状態４）の文字（Ａ｜ａ）の通常遷移先となる状態６をキューの最後尾に追加する。ＡＣマシン構築処理部１５０ａは、状態ｓからフェイラ遷移した状態１に移行する。状態１において、文字Ａに対する通常遷移先はNullであるため、再度フェイラ遷移し、初期状態０に移行する。
【０１２２】
そして、初期状態０において、文字（Ａ｜ａ）に対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態１となる。ＡＣマシン構築処理部１５０ａは、状態ｓ（通常状態４）から文字（Ａ｜ａ）により遷移する状態nextを判定し、判定した状態（照合状態６）のフェイラ遷移先を状態１に設定する（図４２の状態６参照）。
【０１２３】
ＡＣマシン構築処理部１５０ａは、集合Ｘから文字（Ｃ｜ｃ）を取り出し、状態ｓ（照合状態４）の文字（Ｃ｜ｃ）の通常遷移先となる状態７をキューの最後尾に追加する。ＡＣマシン構築処理部１５０ａは、状態ｓからフェイラ遷移した状態１に移行し、文字（Ｃ｜ｃ）に対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態２となる。ＡＣマシン構築処理部１５０ａは、状態ｓから文字（Ｃ｜ｃ）による遷移する状態nextを判定し、判定した状態（通常状態７）のフェイラ遷移先を状態２に設定する。
【０１２４】
また、ＡＣマシン構築処理部１５０ａは、状態７のフェイラ遷移先が照合状態２となるため、状態２のパターンリストを状態７のパターンリストに追加することで、状態７を照合状態７に設定する（図４２の状態７参照）。
【０１２５】
ＡＣマシン構築処理部１５０ａは、キューの先頭の状態５を取り出し、取り出した状態５を状態ｓに設定する。ＡＣマシン構築処理部１５０ａは、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。状態ｓに通常遷移先は存在しないので、次のステップに移行する（図４３参照）。
【０１２６】
ＡＣマシン構築処理部１５０ａは、キューの先頭の状態６を取り出し、取り出した状態６を状態ｓに設定する。ＡＣマシン構築処理部１５０ａは、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。状態ｓに通常遷移先は存在しないので、次のステップに移行する（図４４参照）。
【０１２７】
ＡＣマシン構築処理部１５０ａは、キューの先頭の状態７を取り出し、取り出した状態７を状態ｓに設定する。ＡＣマシン構築処理部１５０ａは、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。この場合、従来装置は、文字（Ｄ｜ｄ）を抽出し、集合Ｘに文字（Ｄ｜ｄ）を格納する。
【０１２８】
ＡＣマシン構築処理部１５０ａは、集合Ｘから文字（Ｄ｜ｄ）を取り出し、状態ｓ（照合状態７）の文字（Ｄ｜ｄ）の通常遷移先となる状態８をキューの最後尾に追加する。ＡＣマシン構築処理部１５０ａは、状態ｓからフェイラ遷移した状態２に移行する。状態２において、文字（Ｄ｜ｄ）に対する通常遷移先はNullであるため、再度フェイラ遷移し、初期状態０に移行する。
【０１２９】
そして、初期状態０において、文字Ｄに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、初期状態０となる。ＡＣマシン構築処理部１５０ａは、状態ｓ（照合状態７）から文字（Ｄ｜ｄ）により遷移する状態nextを判定し、判定した状態（照合状態８）のフェイラ遷移先を初期状態０に設定する（図４５の状態８参照）。
【０１３０】
ＡＣマシン構築処理部１５０ａは、キューの先頭の状態８を取り出し、取り出した状態８を状態ｓに設定する。ＡＣマシン構築処理部１５０ａは、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、集合Ｘに格納する。状態ｓに通常遷移先は存在しないので、次のステップに移行する。そして、キューに状態が存在しなくなった場合に、パターン集合ΠのＡＣマシンが完了する（図４６参照）。
【０１３１】
このように、ＡＣマシン構築処理部１５０ａは、図３５〜図３７に示したトライＴ構築処理、図３８〜図４６に示したフェイラ遷移追加処理を実行することにより、パターン集合１４０ａからＡＣマシン１４０ｃを作成する。
【０１３２】
図３１の説明に戻ると、照合処理部１５０ｂは、ＡＣマシン１４０ｃを用いて、テキストデータを照合し、照合結果を出力する処理部である。また、照合処理部１５０ｂは、コスト管理テーブル１４０ｂを基にして、通常遷移を行なうたびに、文字に応じた点数をスコア配列１４０ｄに登録し、登録された点数を集計することで、照合されたキーワードの点数を算出する。また、照合処理部１５０ｂは、照合処理の途中で、フェイラ遷移が発生した場合には、フェイラ遷移元の状態のdistと、フェイラ遷移先の状態のdistとの差分を基にして、スコア配列１４０ｄの点数を前に詰める。
【０１３３】
以下において、照合処理部１５０ｂの処理を具体的に説明する。図４７〜図５２は、本実施例にかかるパターン照合処理を説明するための図である。ここでは一例として、照合対象となるテキストデータを「ＣｂａＡＣ」として、パターン照合処理を説明する。
【０１３４】
照合処理部１５０ｂは、テキストデータの１文字目（オフセット１）の文字Ｃを読み出し、状態ｓを初期状態０とする。そして、照合処理部１５０ｂは、状態ｓの文字Ｃによる遷移先を判定すると、状態ｓの文字Ｃによる通常遷移先は初期状態０なので、再び状態ｓを初期状態０に設定する（図４７参照）。
【０１３５】
照合処理部１５０ｂは、テキストデータの２文字目（オフセット２）の文字ｂを読み出し、状態ｓ（初期状態０）の文字ｂによる遷移先を判定する。状態ｓの文字ｂによる通常遷移先は状態３なので、状態ｓを状態３に設定する。また、照合処理部１５０ｂは、通常遷移した場合に、コスト管理テーブル１４０ｂと、文字の種類と比較して点数を判定する。そして、照合処理部１５０ｂは、判定した点数と、通常遷移先の状態のdistに応じて、スコア配列１４０ｄに点数を登録する。
【０１３６】
文字ｂのコストは「０」であり、通常遷移先の状態３のdistは「１」であるため、照合処理部１５０ｂは、スコア配列１４０ｄの「初期状態からの距離１」に対応する点数を０に設定する（図４８参照）。
【０１３７】
照合処理部１５０ｂは、テキストデータの３文字目（オフセット３）の文字ａを読み出し、状態ｓ（状態３）の文字ａによる遷移先を判定する。状態ｓの文字ａによる通常遷移先は状態４なので、状態ｓを状態４に設定する。また、文字ａのコストは「０」であり、通常遷移先の状態４のdistは「２」であるため、照合処理部１５０ｂは、スコア配列１４０ｄの「初期状態からの距離２」に対応する点数を０に設定する。
【０１３８】
また、状態４は、パターン（Ｂ｜ｂ）（Ａ｜ａ）の照合状態であるため、照合処理部１５０ｂは、パターン（Ｂ｜ｂ）（Ａ｜ａ）にヒットしたと判定する。そして、照合処理部１５０ｂは、パターン（Ｂ｜ｂ）（Ａ｜ａ）と、現在のオフセット３と、現在のスコア配列の点数の合計値「０」を対応付けて集合Ｒに登録する（図４９参照）。
【０１３９】
照合処理部１５０ｂは、テキストデータの４文字目（オフセット４）の文字Ａを読み出し、状態ｓ（状態４）の文字Ａによる遷移先を判定する。状態ｓの文字Ａによる通常遷移先は状態６なので、状態ｓを状態６に設定する。また、文字Ａのコストは「１」であり、通常遷移先の状態６のdistは「３」であるため、照合処理部１５０ｂは、スコア配列１４０ｄの「初期状態からの距離３」に対応する点数を１に設定する。
【０１４０】
また、状態６は、パターン（Ｂ｜ｂ）（Ａ｜ａ）（Ａ｜ａ）の照合状態であるため、照合処理部１５０ｂは、パターン（Ｂ｜ｂ）（Ａ｜ａ）（Ａ｜ａ）にヒットしたと判定する。そして、照合処理部１５０ｂは、パターン（Ｂ｜ｂ）（Ａ｜ａ）（Ａ｜ａ）と、現在のオフセット４と、現在のスコア配列の点数の合計値「１」を対応付けて集合Ｒに登録する（図５０参照）。
【０１４１】
照合処理部１５０ｂは、テキストデータの５文字目（オフセット５）の文字Ｃを読み出し、状態ｓ（状態６）の文字Ｃによる遷移先を判定する。状態ｓの文字Ｃによる通常遷移先は存在しないので、フェイラ遷移となり、フェイラ遷移先となる状態１を状態ｓに設定する。
【０１４２】
ここで、フェイラ遷移元となる状態６のdistは「３」であり、フェイラ遷移先となる状態１のdistは「１」であるため、各distの差は「２」となる。従って、照合処理部１５０ｂは、スコア配列１４０ｄの点数を２だけ前に詰めると共に、点数の存在していた「初期状態からの距離２、３」に対応する点数をNullに設定する（図５１参照）。
【０１４３】
そして、照合処理部１５０ｂは、状態ｓ（状態１）の文字Ｃによる遷移先を判定する。状態ｓの文字Ｃによる通常遷移先は状態２なので、状態ｓを状態２に設定する。また、文字Ｃのコストは「１」であり、通常遷移先の状態２のdistは「２」であるため、照合処理部１５０ｂは、スコア配列１４０ｄの「初期状態からの距離２」に対応する点数を１に設定する。
【０１４４】
また、状態２は、パターン（Ａ｜ａ）（Ｃ｜ｃ）の照合状態であるため、照合処理部１５０ｂは、パターン（Ａ｜ａ）（Ｃ｜ｃ）にヒットしたと判定する。そして、照合処理部１５０ｂは、パターン（Ａ｜ａ）（Ｃ｜ｃ）と、現在のオフセット５と、現在のスコア配列の点数の合計値２を対応付けて集合Ｒに登録する（図５２参照）。テキストデータの最後の文字に対する遷移先を判定した後に、パターン照合処理を終了する。
【０１４５】
このように、照合処理部１５０ｂが、フェイラ遷移先と遷移後のdistの差に基づいて、スコア配列１４０ｄの点数を詰めることで、初期状態０からフェイラ遷移した先の状態までに至る点数のみをスコア配列１４０ｄに残すので、各照合状態の点数を正確に算出することができる。
【０１４６】
例えば、図５１において、フェイラ遷移先（状態１）と遷移後（状態６）のdistの差は、２であるため、スコア配列１４０ｄを前に２だけ詰めており、初期状態０からフェイラ遷移した先の状態１（dist１）までの点数のみをスコア配列１４０ｄに残している（文字Ａにより状態１に移行したことをスコア配列１４０ｄに残している）。従って、図５１の場合では、状態１から照合状態２に通常遷移し、照合したパターン（Ａ｜ａ）（Ｃ｜ｃ）の点数が２であると正確に算出することができる。
【０１４７】
図３１の説明に戻ると、照合結果出力部１５０ｃは、照合処理部１５０ｂの照合結果を出力部１２０に出力する処理部である。例えば、図５２等に示したＡＣマシンを用いてテキストデータのパターン照合処理を実行した場合には、図５３に示す照合結果を出力する。図５３は、照合結果出力部１５０ｃが出力する照合結果の一例を示す図である。図５３の照合結果を参照することにより、テキストデータに含まれるパターンの種類、テキストデータ中のパターンの存在位置、どの程度大文字が存在するのかを判定することが出来る。
【０１４８】
次に、本実施例にかかる検索装置１００の処理手順について説明する。図５４は、本実施例にかかる検索装置１００がＡＣマシンを構築する処理手順を示すフローチャートである。図５４に示すように、検索装置１００は、パターン集合Πを取得し（ステップＳ１０１）、ＡＣマシン構築処理部１５０ａが、パターン集合ΠのトライＴの構築処理を実行する（ステップＳ１０２）。そして、ＡＣマシン構築処理部１５０ａが、フェイラ遷移追加処理を実行し（ステップＳ１０３）、ＡＣマシンを出力する（ステップＳ１０４）。
【０１４９】
次に、図５４のステップＳ１０２に示したパターン集合ΠのトライＴの構築処理について説明する。かかるパターン集合ΠのトライＴの構築処理をＡＣマシン構築処理部１５０ａが実行することにより、パターン集合１４０ａから、トライＴが生成される（例えば、図３７参照）。
【０１５０】
図５５は、本実施例にかかるパターン集合ΠのトライＴの構築処理の処理手順を示すフローチャートである。図５５に示すように、ＡＣマシン構築処理部１５０ａは、初期状態（id＝０）を作成し、トライＴ（Π）を初期状態のみで構成されるトライに設定する（ステップＳ２０１）。
【０１５１】
ＡＣマシン構築処理部１５０ａは、初期状態のdistを０に設定し（ステップＳ２０２）、初期状態の通常遷移先を全て初期状態に設定し（ステップＳ２０３）、パターン集合Πにパターンが存在するか否かを判定する（ステップＳ２０４）。
【０１５２】
パターン集合Πにパターンが存在しない場合には（ステップＳ２０５，Ｎｏ）、ＡＣマシン構築処理部１５０ａは、トライＴ（Π）を出力する（ステップＳ２０６）。一方、パターン集合Πにパターンが存在する場合には（ステップＳ２０５，Ｙｅｓ）、ＡＣマシン構築処理部１５０ａは、パターン集合Πから１つのパターンを取り出し、取り出したパターンをパターンｐに設定し（ステップＳ２０７）、パターン登録処理を実行し（ステップＳ２０８）、ステップＳ２０４に移行する。
【０１５３】
次に、図５５のステップＳ２０８に示したパターン登録処理について説明する。図５６は、本実施例にかかるパターン登録処理の処理手順を示すフローチャートである。図５６に示すように、ＡＣマシン構築処理部１５０ａは、状態ｓをトライＴの初期状態に設定し（ステップＳ３０１）、距離ｄを１に設定する（ステップＳ３０２）。
【０１５４】
ＡＣマシン構築処理部１５０ａは、パターンｐに次の文字が存在するか否かを判定し（ステップＳ３０３）、存在しない場合には（ステップＳ３０４，Ｎｏ）、状態ｓのパターンリストplistにパターンｐを代入し（ステップＳ３０５）、トライＴを出力する（ステップＳ３０６）。
【０１５５】
一方、パターンｐに次の文字が存在する場合には（ステップＳ３０４，Ｙｅｓ）、ＡＣマシン構築処理部１５０ａは、状態ｓのdistにｄを登録し、ｄ＝ｄ＋１に設定する（ステップＳ３０７）。ＡＣマシン構築処理部１５０ａは、次の文字をａとし、文字ａがあいまい文字であるか否かを判定する（ステップＳ２０６）。
【０１５６】
次の文字があいまい文字の場合には（ステップＳ３０９，Ｙｅｓ）、ＡＣマシン構築処理部１５０ａは、ａに含まれる全ての文字に対してasciiコードをcode(a)に設定し（ステップＳ３１０）、状態ｓの通常遷移g[code(a)]がNullであるか否かを判定する（ステップＳ３１１）。
【０１５７】
状態ｓの通常遷移g[code(a)]がNullの場合には（ステップＳ３１２，Ｙｅｓ）、ＡＣマシン構築処理部１５０ａは、状態ｎを新規作成し、g[code(a)]＝ｎに設定し（ステップＳ３１１）、状態ｓにg[code(a)]を代入する（状態ｎを状態ｓとする）（ステップＳ３１３）。一方、状態ｓの通常遷移g[code(a)]がNullではない場合には（ステップＳ３１２，Ｎｏ）、ステップＳ３１４に移行する。
【０１５８】
ところで、ステップＳ３０９において、次の文字があいまい文字ではない場合には（ステップＳ３０９，Ｎｏ）、文字ａのasciiコードをcode(a)に設定し（ステップＳ３１５）、状態ｓの通常遷移g[code(a)]がNullであるか否かを判定する（ステップＳ３１６）。
【０１５９】
状態ｓの通常遷移g[code(a)]がNullの場合には（ステップＳ３１７，Ｙｅｓ）、ＡＣマシン構築処理部１５０ａは、状態ｎを新規作成し、g[code(a)]＝ｎに設定し（ステップＳ３１８）、状態ｓにg[code(a)]を代入し（状態ｎを状態ｓとする）（ステップＳ３１９）、ステップＳ３０３に移行する。一方、状態ｓの通常遷移g[code(a)]がNullではない場合には（ステップＳ３１７，Ｎｏ）、ステップＳ３１９に移行する。
【０１６０】
次に、図５４のステップＳ１０３に示したフェイラ遷移追加処理について説明する。かかるフェイラ遷移追加処理を実行することにより、トライＴの各状態にフェイラ遷移先が追加され、ＡＣマシンが完成する。図５７および図５８は、本実施例にかかるフェイラ遷移追加処理の処理手順を示すフローチャートである。
【０１６１】
図５７に示すように、ＡＣマシン構築処理部１５０ａは、初期状態から通常遷移先となる状態を判定し、判定した状態をキュー（queue）に登録する（ステップＳ４０１）。ただし、ステップＳ４０１において、ＡＣマシン構築処理部１５０ａは、同一状態を２度以上キューに加えないこととする。
【０１６２】
続いて、ＡＣマシン構築処理部１５０ａは、キューに登録された状態（状態構造体）のフェイラ遷移先に初期状態を登録し（ステップＳ４０２）、キューに状態が存在するか否かを判定する（ステップＳ４０３）。キューに状態が存在しない場合には（ステップＳ４０４，Ｎｏ）、トライＴをＡＣマシンαとして出力する（ステップＳ４０５）。
【０１６３】
一方、キューに状態が存在する場合には（ステップＳ４０４，Ｙｅｓ）、ＡＣマシン構築処理部１５０ａは、キューの先頭の状態を取り出し、取り出した状態を状態ｓに設定し（ステップＳ４０６）、状態ｓの通常遷移先へのポインタが全てNullであるか否かを判定する（ステップＳ４０７）。状態ｓの通常遷移先へのポインタが全てNullの場合には（ステップＳ４０８，Ｙｅｓ）、ステップＳ４０３に移行する。
【０１６４】
一方、状態ｓの通常遷移先へのポインタが全てNullではない場合には（ステップＳ４０８，Ｎｏ）、図５８に示すように、ＡＣマシン構築処理部１５０ａは、状態ｓにおいて、g[code(a)]≠Nullとなる全ての文字ａを抽出し、抽出した文字ａを集合Ｘに格納する（ステップＳ４０９）。
【０１６５】
ＡＣマシン構築処理部１５０ａは、集合Ｘに文字が存在するか否かを判定し（ステップＳ４１０）、集合Ｘに文字が存在しない場合には（ステップＳ４１１，Ｎｏ）、ステップＳ４０３に移行する。一方、集合Ｘに文字が存在する場合には（ステップＳ４１１，Ｙｅｓ）、集合Ｘから文字ａを一つ取り出し、取り出した文字ａに該当する文字を集合Ｘから削除する（ステップＳ４１２）。
【０１６６】
ＡＣマシン構築処理部１５０ａは、状態ｓの通常遷移先をキューの最後尾に追加し（ステップＳ４１３）、フェイラ遷移を繰り返し、文字ａに対する通常遷移先がNullにならない最初の状態を状態ｆに設定する（ステップＳ４１４）。ＡＣマシン構築処理部１５０ａは、フェイラ遷移先の状態から文字ａの通常遷移先へのポインタfnext=g[code(a)]を判定する（ステップＳ４１５）。
【０１６７】
ＡＣマシン構築処理部１５０ａは、状態ｓから文字ａにより遷移する状態nextを判定し（ステップＳ４１６）、状態nextのフェイラ遷移先をfnext=g[code(a)]に設定し（ステップＳ４１８）、状態nextのフェイラ遷移先の状態にパターンリストが存在する場合に、かかるパターンリストを状態nextのパターンリストに追加し（ステップＳ４１７）、ステップＳ４１０に移行する。ただし、ステップＳ４１８において、ＡＣマシン構築処理部１５０ａは、パターンリスト中に同一パターンの重複登録は実行しないものとする。
【０１６８】
次に、本実施例にかかる検索装置が実行する照合処理の処理手順について説明する。図５９は、本実施例にかかる照合処理の処理手順を示すフローチャートである。図５９に示すように、検索装置１００は、照合処理部１５０ｂが状態ｓをＡＣマシンαの初期状態に設定し（ステップＳ５０１）、オフセットｄ＝０、集合Ｒを空集合、スコア配列を空配列に設定する（ステップＳ５０２）。
【０１６９】
照合処理部１５０ｂは、テキストデータＤに（ｄ＋１）文字目が存在するか否かを判定し（ステップＳ５０３）、テキストデータＤに（ｄ＋１）文字目が存在しない場合には（ステップＳ５０４，Ｎｏ）、集合Ｒ（照合結果）を出力する（ステップＳ５０５）。
【０１７０】
一方、テキストデータＤに（ｄ＋１）文字目が存在する場合には（ステップＳ５０４，Ｙｅｓ）、照合処理部１５０ｂは、（ｄ＋１）文字目の文字をａに設定し（ステップＳ５０６）、ｄ＝ｄ＋１に設定する（ステップＳ５０７）。
【０１７１】
照合処理部１５０ｂは、状態ｓの文字ａの通常遷移先が存在するか否かを判定する（ステップＳ５０８）。状態ｓの文字ａの通常遷移先が存在しない場合には（ステップＳ５０９，Ｎｏ）、状態ｓのフェイラ遷移先を状態ｓに設定する（ステップＳ５１０）。
【０１７２】
照合処理部１５０ｂは、フェイラ遷移により距離差分（遷移元のdistと遷移先のdistとの差分）だけ、スコア配列１４０ｄの点数を前に詰め、詰めた後の後方余白をNullに設定する（ステップＳ５１１）。また、照合処理部１５０ｂは、フェイラ遷移先から文字ａにより遷移し、状態ｓが照合状態の場合に、状態ｓのパターンリストと、オフセットｄとスコアを対応付けて集合Ｒに登録し（ステップＳ５１２）、ステップＳ５０８に移行する。ステップＳ５１２において、照合処理部１５０ｂは、スコア配列１４０ｄの点数を合計することで、スコアを算出する。
【０１７３】
ところで、ステップＳ５０９において、状態ｓに文字ａの通常遷移先が存在する場合には（ステップＳ５０９，Ｙｅｓ）、照合処理部１５０ｂは、状態ｓのg[code]を状態ｓに代入する（状態ｓの文字ａによる遷移先を新たに状態ｓとする）（ステップＳ５１３）。照合処理部１５０ｂは、状態ｓのdistに対応するコストに文字ａのコストを登録し（ステップＳ５１４）、状態ｓが照合状態の場合に、状態ｓのパターンリストと、オフセットｄと、スコアを対応づけて集合Ｒに登録し（ステップＳ５１５）、ステップＳ５０３に移行する。
【０１７４】
上述してきたように、本実施例にかかる検索装置１００は、照合処理部１５０ｂがテキストデータを取得した場合に、ＡＣマシン１４０ｃとテキストデータの各文字とを順次比較し、通常遷移した際に、文字に対応する点数をスコア配列１４０ｄに登録し、フェイラ遷移した場合に、遷移先と遷移元の距離（dist）の差に基づいて、スコア配列１４０ｄの点数を前に詰める。そして、照合処理部１５０ｂは、状態が照合状態に遷移した場合に、スコア配列１４０ｄに含まれる点数（類似度）を合計することで、照合されたキーワードの点数を判定するので、ＡＣマシンの状態数を増加させることなくあいまい検索を実現させ、照合結果となるキーワードの類似度を正確に判定することができる。
【０１７５】
ところで、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１７６】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【０１７７】
図６０は、実施例に示した検索装置１００に対応するコンピュータのハードウェア構成を示す図である。図６０に示すように、このコンピュータ（検索装置）１０は、入力装置１１、モニタ１２、ＲＡＭ（Random  Access  Memory）１３、ＲＯＭ（Read  Only  Memory）１４、ネットワークを介して他の装置とデータ通信を実行する通信制御装置１５、媒体読取装置１６、ＣＰＵ（Central  Processing  Unit）１７、ＨＤＤ（Hard  Disk  Drive）１８をバス１９で接続している。
【０１７８】
そして、ＨＤＤ１８には、上述した検索装置１００の機能と同様の機能を発揮するＡＣマシン構築プログラム１８ｂ、照合プログラム１８ｃが記憶されている。ＣＰＵ１７が、ＡＣマシン構築プログラム１８ｂ、照合プログラム１８ｃを読み出して実行することにより、ＡＣマシン構築プロセス１７ａ、照合プロセス１７ｂが起動される。
【０１７９】
ここで、ＡＣマシン構築プロセス１７ａは、図３１に示したＡＣマシン構築処理部１５０ａに対応する。また、照合プロセス１７ｂは、図３１に示した照合処理部１５０ｂ、照合結果出力部１５０ｃに対応する。
【０１８０】
なお、ＨＤＤ１８は、図３１で示した記憶部１４０に記憶されたデータに対応する各種データ１８ａを記憶している。ＣＰＵ１７は、ＨＤＤ１８に記憶された各種データ１８ａをＲＡＭ１３に読み出し、ＲＡＭ１３に格納された各種データ１３ａを用いてＡＣマシンの構築、テキストデータに対するパターン照合を実行する。
【符号の説明】
【０１８１】
１０    コンピュータ
１１    入力装置
１２    モニタ
１３    ＲＡＭ
１３ａ，１８ａ  各種データ
１４    ＲＯＭ
１５    通信制御装置
１６    媒体読取装置
１７    ＣＰＵ
１７ａ  ＡＣマシン構築プロセス
１７ｂ  照合プロセス
１８    ＨＤＤ
１８ｂ  ＡＣマシン構築プログラム
１８ｃ  照合プログラム
１９    バス
１００    検索装置
１１０    入力部
１２０    出力部
１３０    入出力制御部
１４０    記憶部
１４０ａ  パターン集合
１４０ｂ  コスト管理テーブル
１４０ｃ  ＡＣマシン
１４０ｄ  スコア配列
【図１】
2010218140.tif 000003
【図２】
2010218140.tif 000004
【図３】
2010218140.tif 000005
【図４】
2010218140.tif 000006
【図５】
2010218140.tif 000007
【図６】
2010218140.tif 000008
【図７】
2010218140.tif 000009
【図８】
2010218140.tif 000010
【図９】
2010218140.tif 000011
【図１０】
2010218140.tif 000012
【図１１】
2010218140.tif 000013
【図１２】
2010218140.tif 000014
【図１３】
2010218140.tif 000015
【図１４】
2010218140.tif 000016
【図１５】
2010218140.tif 000017
【図１６】
2010218140.tif 000018
【図１７】
2010218140.tif 000019
【図１８】
2010218140.tif 000020
【図１９】
2010218140.tif 000021
【図２０】
2010218140.tif 000022
【図２１】
2010218140.tif 000023
【図２２】
2010218140.tif 000024
【図２３】
2010218140.tif 000025
【図２４】
2010218140.tif 000026
【図２５】
2010218140.tif 000027
【図２６】
2010218140.tif 000028
【図２７】
2010218140.tif 000029
【図２８】
2010218140.tif 000030
【図２９】
2010218140.tif 000031
【図３０】
2010218140.tif 000032
【図３１】
2010218140.tif 000033
【図３２】
2010218140.tif 000034
【図３３】
2010218140.tif 000035
【図３４】
2010218140.tif 000036
【図３５】
2010218140.tif 000037
【図３６】
2010218140.tif 000038
【図３７】
2010218140.tif 000039
【図３８】
2010218140.tif 000040
【図３９】
2010218140.tif 000041
【図４０】
2010218140.tif 000042
【図４１】
2010218140.tif 000043
【図４２】
2010218140.tif 000044
【図４３】
2010218140.tif 000045
【図４４】
2010218140.tif 000046
【図４５】
2010218140.tif 000047
【図４６】
2010218140.tif 000048
【図４７】
2010218140.tif 000049
【図４８】
2010218140.tif 000050
【図４９】
2010218140.tif 000051
【図５０】
2010218140.tif 000052
【図５１】
2010218140.tif 000053
【図５２】
2010218140.tif 000054
【図５３】
2010218140.tif 000055
【図５４】
2010218140.tif 000056
【図５５】
2010218140.tif 000057
【図５６】
2010218140.tif 000058
【図５７】
2010218140.tif 000059
【図５８】
2010218140.tif 000060
【図５９】
2010218140.tif 000061
【図６０】
2010218140.tif 000062