まず、本実施例を説明する前に、従来のACマシン(ACオートマトン)について説明する。図1は、従来のACマシンのデータ構造の一例を示す図である。図1に示すACマシンは、テキストデータが入力された場合に、キーワード「AC、BA、BB、BAA、BACD」の位置を算出するACマシンである。
図1に示すように、ACマシンは、状態0〜8を有しており、各状態は、初期状態、通常状態、照合状態に分別される。初期状態は、初めにテキストデータと照合される状態であり、通常状態は、2番目以降にテキストデータと照合される状態である。照合状態は、テキストデータが特定のキーワードにヒットした場合に遷移する状態である。図1に示す例では、初期状態を状態1とし、通常状態を状態1,3とし、照合状態は状態2,4〜8とする。
ACマシンは、テキストデータの文字を初期状態0から順次照合し、通常遷移とフェイラ(Failure)遷移を繰り返すことで、テキストデータに含まれるテキスト(例えば、図1の集合Πに含まれるテキスト)の出現位置を算出する。
ここで、通常遷移は、照合対象となる状態において、テキストデータの比較対象となる文字による遷移先が存在する場合の遷移を示す。例えば、状態1において、テキストデータの比較対象となる文字がCの場合には、通常遷移となる。テキストデータの文字がCの場合には、状態1から状態2に通常遷移する。
一方、通常遷移の条件に該当しない場合には、フェイラ遷移となる。例えば、状態1において、テキストデータの比較対象となる文字がC以外の場合には、フェイラ遷移となる。状態1においてフェイラ遷移した場合には、状態0となる。ACマシンでは、各状態に一本ずつフェイラ遷移が存在する。図1で省略されているフェイラ遷移は、全て初期状態0に向かっているものとする。
ここで、図1に示したACマシンが有する状態(状態構造体)のデータ構造について説明する。図2は、従来の状態構造体のデータ構造の一例を示す図である。図2に示すように、この状態構造体は、各状態を識別する状態IDと、パターンリストと、通常遷移先へのポインタと、フェイラ遷移先へのポインタを有する。
ここで、パターンリストは、状態構造体が照合状態の場合に、該当するキーワードを格納する。例えば、状態2(状態ID2)の状態構造体に含まれるパターンリストは、ACとなる。
次に、従来技術の装置(以下、従来装置;図示略)が、ACマシンを構築する処理手順について説明する。図3は、従来のACマシンを構築する処理手順を示すフローチャートである。図3に示すように、従来装置は、パターン集合Π(検索対象となるキーワードの集合)を取得し(ステップS10)、パターン集合ΠのトライTの構築処理を実行する(ステップS11)。そして、従来装置は、フェイラ遷移追加処理を実行し(ステップS12)、ACマシンα(Π)を出力する(ステップS13)。
次に、図3のステップS11に示したパターン集合Πのトライ木構築処理について説明する。図4は、従来のパターン集合ΠのトライTの構築処理の処理手順を示すフローチャートである。図4に示すように、従来装置は、初期状態(id=0)を作成し、トライT(Π)を初期状態のみで構成されるトライに設定する(ステップS20)。
従来装置は、初期状態における通常遷移先のポインタを全て初期状態(id=0)に設定し(ステップS21)、パターン集合Πにパターンが存在するか否かを判定する(ステップS22)。パターンが存在しない場合には(ステップS23,No)、トライT(Π)を出力する(ステップS24)。
一方、パターン集合Πにパターンが存在する場合には(ステップS23,Yes)、パターン集合Πから1つのパターンを取り出し、取り出したパターンをパターンpに設定し(ステップS25)、パターン登録処理を実行する(ステップS26)。
次に、図4のステップS26に示したパターン登録処理について説明する。図5は、従来のパターン登録処理の処理手順を示すフローチャートである。図5に示すように、従来装置は、状態sをトライTの初期状態に設定し(ステップS30)、パターンpに次の文字が存在するか否かを判定する(ステップS31)。
パターンpに次の文字が存在しない場合には(ステップS32,No)、従来装置は、状態sのパターンリストPlistにパターンpを代入し(ステップS33)、トライTを出力する(ステップS34)。
一方、パターンpに次の文字が存在する場合には(ステップS32,Yes)、従来装置は、次の文字をaとし、aのasciiコードをcode(a)に設定し(ステップS35)、状態sの通常遷移先へのポインタg[code(a)]がNullであるか否かを判定する(ステップS36)。
通常遷移先へのポインタg[code(a)]がNullではない場合には(ステップS37,No)、ステップS39に移行する。一方、従来装置は、通常遷移先へのポインタg[code(a)]がNullの場合には(ステップS37,Yes)、状態nを新規作成し、状態sの通常遷移先へのポインタg[code(a)]をnに設定する(ステップS38)。そして、従来装置は、状態sにg[code(a)]を代入し(ステップS39)、ステップS31に移行する。
次に、図3のステップS12に示したフェイラ遷移追加処理について説明する。図6および図7は、従来のフェイラ遷移追加処理の処理手順を示すフローチャートである。図6に示すように、従来装置は、初期状態から通常遷移先となる状態を判定し、判定した状態をキュー(queue)に登録する(ステップS40)。
そして、従来装置は、キューに登録された状態(状態構造体)のフェイラ遷移先に初期状態を登録し(ステップS41)、キューに状態が存在するか否かを判定する(ステップS42)。キューに状態が存在しない場合には(ステップS43,No)、トライTをACマシンαとして出力する(ステップS44)。
一方、キューに状態が存在する場合には(ステップS43,Yes)、キューの先頭の状態を取り出し、取り出した状態を状態sに設定し(ステップS45)、状態sの通常遷移先へのポインタが全てNullであるか否かを判定する(ステップS46)。状態sの通常遷移先へのポインタが全てNullの場合には(ステップS47,Yes)、ステップS42に移行する。
一方、状態sの通常遷移先へのポインタが全てNullではない場合には(ステップS47,No)、図7に示すように、従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、抽出した文字aを集合Xに格納する(ステップS48)。
従来装置は、集合Xに文字が存在するか否かを判定し(ステップS49)、集合Xに文字が存在しない場合には(ステップS50,No)、ステップS42に移行する。一方、集合Xに文字が存在する場合には(ステップS50,Yes)、集合Xから文字aを一つ取り出し、取り出した文字aに該当する文字を集合Xから削除する(ステップS51)。
従来装置は、状態sの通常遷移先をキューの最後尾に追加し(ステップS52)、フェイラ遷移を繰り返し、文字aに対する通常遷移先がNullにならない最初の状態を状態fに設定する(ステップS53)。従来装置は、フェイラ遷移先の状態から文字aの通常遷移先へのポインタfnext=g[code(a)]を判定する(ステップS54)。
従来装置は、状態sから文字aにより遷移する状態nextを判定し(ステップS55)、状態nextのフェイラ遷移先をfnext=g[code(a)]に設定し(ステップS56)、状態nextのフェイラ遷移先の状態にパターンリストが存在する場合に、かかるパターンリストを状態nextのパターンリストに追加し(ステップS57)、ステップS49に移行する。
次に、図3のステップS11で示したパターン集合ΠのトライT構築処理を、具体例を用いて説明する。図8〜図10は、従来のパターン集合ΠのトライT構築処理を説明するための図である。ここでは一例として、パターン集合ΠをΠ={AC、BA、BB、BAA、BACD}とする。
まず、従来装置は、初期状態(id=0)を作成し、初期状態の状態構造体における通常遷移先を全て初期状態に設定する(図8、ステップS60)。そして、従来装置は、パターン集合Πからパターン「AC」を取り出す。従来装置は、文字Aを選択し、文字Aによる初期状態(id=0)の通常遷移先を通常状態(id=1)に設定する。また、従来装置は、文字Cを選択し、文字Cによる通常状態(id=1)の通常遷移先を照合状態(id=2)に設定し、照合状態のパターンリストを「AC」に設定する(図8、ステップS61)。文字Cは、パターン「AC」最後尾の文字であるため、状態2は、照合状態となる。
従来装置は、初期状態(id=0)に戻り、パターン集合Πからパターン「BA」を取り出す。従来装置は、文字Bを選択し、文字Bによる初期状態(id=0)の通常遷移先を通常状態(id=3)に設定する。また、従来装置は、文字Aを選択し、文字Aによる通常状態(id=3)の通常遷移先を照合状態(id=4)に設定し、照合状態のパターンリストを「BA」に設定する(図8、ステップS62)。文字Aは、パターン「BA」の最後尾の文字であるため、状態4は、照合状態となる。
従来装置は、初期状態(id=0)に戻り、パターン集合Πからパターン「BB」を取り出し、文字Bを選択する。ここで、文字Bによる初期状態(id=0)の通常遷移先は通常状態(id=3)であり、既に作成済みであるため、現在の状態を通常状態(id=3)に遷移する。また、従来装置は、文字Bを選択し、文字Bによる通常状態(id=3)の通常遷移先を照合状態(id=5)に設定し、パターンリストを「BB」に設定する(図9、ステップS63)。文字Bは、パターン「BB」の最後尾の文字であるため、状態5は、照合状態となる。
従来装置は、初期状態(id=0)に戻り、パターン集合Πからパターン「BAA」を取り出し、文字Bを選択する。ここで、文字Bによる初期状態(id=0)の通常遷移先は、通常状態(id=3)であり、既に作成済みであるため、現在の状態を通常状態(id=3)に遷移する。また、従来装置は、文字Aを選択する。ここで、文字Aによる通常状態(id=3)の通常遷移先は、照合状態(id=4)であり、既に作成済みであるため、現在の状態を照合状態(id=4)に設定する。また、従来装置は、文字Aを選択する。文字Aによる照合状態(id=4)の通常遷移先を照合状態(id=6)に設定し、パターンリストを「BAA」に設定する(図9、ステップS64)。文字Aは、パターン「BAA」の最後尾の文字であるため、状態6は、照合状態となる。
従来装置は、初期状態(id=0)に戻り、パターン集合Πからパターン「BACD」を取り出し、文字Bを選択する。ここで、文字Bによる初期状態(id=0)の通常遷移先は、通常状態(id=3)であり、既に登録済みであるため、現在の状態を通常状態(id=3)に遷移する。また、従来装置は、文字Aを選択する。ここで、文字Aによる通常状態(id=3)の通常遷移先は、照合状態(id=4)であり、既に作成済みであるため、現在の状態を照合状態(id=4)に設定する。
また、従来装置は、文字Cを選択し、文字Cによる照合状態(id=4)の通常遷移先を通常状態(id=7)に設定する。また、従来装置は、文字Dを選択し、文字Dによる通常状態(id=7)の通常遷移先を照合状態(id=8)に設定し、パターンリストを「BACD」に設定する(図10、ステップS65)。文字Dは、パターン「BACD」の最後尾の文字であるため、状態8は、照合状態となる。ステップS65が終了した段階で、パターン集合Πに含まれる全てのパターンの登録が終了し、トライTの構築処理が終了する。
次に、図3のステップS12に示したフェイラ遷移追加処理を、具体例を用いて説明する。図11〜図19は、従来のフェイラ遷移追加処理を説明するための図である。従来装置は、初期状態(id=0)からの通常遷移先となる状態を判定し、判定した状態をキュー(Queue)に登録し、キューに登録された状態のフェイラ遷移先に初期状態0を登録する。ここで、初期状態の通常遷移先は、通常状態1、3となるので、キューに1、3を登録する。また、通常状態1、3のフェイラ遷移先を初期状態0に設定する(図11参照)。
次に、従来装置は、キューの先頭の状態1を取り出し、取り出した状態1を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。この場合は、従来装置は、文字Cを抽出し、集合Xに文字Cを格納する。
従来装置は、集合Xから文字Cを取り出し、状態sの通常遷移先となる状態2をキューの最後尾に追加する。従来装置は、状態1からフェイラ遷移した初期状態0に移行し、文字Cに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、初期状態0となる。従来装置は、状態s(通常状態1)から文字Cにより遷移する状態nextを判定し、判定した状態(照合状態2)のフェイラ遷移先を初期状態0に設定する(図12参照)。
従来装置は、キューの先頭の状態3を取り出し、取り出した状態3を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。この場合は、従来装置は、文字A、Bを抽出し、集合Xに文字A、Bを格納する。
従来装置は、集合Xから文字Aを取り出し、状態sの文字Aの通常遷移先となる状態4をキューの最後尾に追加する。従来装置は、状態sからフェイラ遷移した初期状態(id=0)に移行し、文字Aに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態1となる。従来装置は、状態s(通常状態3)から文字Aにより遷移する状態nextを判定し、判定した状態(照合状態4)のフェイラ遷移先を状態1に設定する(図13の状態4参照)。
従来装置は、集合Xから文字Bを取り出し、状態s(通常状態3)の文字Bの通常遷移先となる状態5をキューの最後尾に追加する。従来装置は、状態sからフェイラ遷移した初期状態0に移行し、文字Bに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態3となる。従来装置は、状態sから文字Bにより遷移する状態nextを判定し、判定した状態(照合状態5)のフェイラ遷移先を状態3に設定する(図13の状態5参照)。
従来装置は、キューの先頭の状態2を取り出し、取り出した状態2を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する(図14参照)。
従来装置は、キューの先頭の状態4を取り出し、取り出した状態4を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。この場合は、従来装置は、文字A、Cを抽出し、集合Xに文字A、Cを格納する。
従来装置は、集合Xから文字Aを取り出し、状態s(照合状態4)の文字Aの通常遷移先となる状態6をキューの最後尾に追加する。従来装置は、状態sからフェイラ遷移した状態1に移行する。状態1において、文字Aに対する通常遷移先はNullであるため、再度フェイラ遷移し、初期状態0に移行する。
そして、初期状態0において、文字Aに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態1となる。従来装置は、状態s(通常状態4)から文字Aにより遷移する状態nextを判定し、判定した状態(照合状態6)のフェイラ遷移先を状態1に設定する(図15の状態6参照)。
従来装置は、集合Xから文字Cを取り出し、状態s(照合状態4)の文字Cの通常遷移先となる状態7をキューの最後尾に追加する。従来装置は、状態sからフェイラ遷移した状態1に移行し、文字Cに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態2となる。従来装置は、状態sから文字Cによる遷移する状態nextを判定し、判定した状態(通常状態7)のフェイラ遷移先を状態2に設定する。
また、従来装置は、状態7のフェイラ遷移先が照合状態2となるため、状態2のパターンリストを状態7のパターンリストに追加することで、状態7を照合状態7に設定する(図15の状態7参照)。
従来装置は、キューの先頭の状態5を取り出し、取り出した状態5を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する(図16参照)。
従来装置は、キューの先頭の状態6を取り出し、取り出した状態6を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する(図17参照)。
従来装置は、キューの先頭の状態7を取り出し、取り出した状態7を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。この場合は、従来装置は、文字Dを抽出し、集合Xに文字Dを格納する。
従来装置は、集合Xから文字Dを取り出し、状態s(照合状態7)の文字Dの通常遷移先となる状態8をキューの最後尾に追加する。従来装置は、状態sからフェイラ遷移した状態2に移行する。状態2において、文字Dに対する通常遷移先はNullであるため、再度フェイラ遷移し、初期状態0に移行する。
そして、初期状態0において、文字Dに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、初期状態0となる。従来装置は、状態s(照合状態7)から文字Dにより遷移する状態nextを判定し、判定した状態(照合状態8)のフェイラ遷移先を初期状態0に設定する(図18の状態8参照)。
従来装置は、キューの先頭の状態8を取り出し、取り出した状態8を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する。そして、キューに状態が存在しなくなった場合に、パターン集合ΠのACマシンが完了する(図19参照)。
次に、従来のACマシンを用いたテキストデータのパターン照合処理について説明する。図20は、従来のパターン照合処理の処理手順を示すフローチャートである。図20に示すように、従来装置は、状態sをACマシンαの初期状態に設定し(ステップS70)、オフセットd=0に設定し、集合Rを空集合に設定する(ステップS71)。
従来装置は、テキストデータDに(d+1)文字目が存在するか否かを判定し(ステップS72)、(d+1)文字目が存在しない場合には(ステップS73,No)、集合Rを出力する(ステップS74)。
一方、テキストデータDに(d+1)文字目が存在する場合には(ステップS73,Yes)、従来装置は、(d+1)文字目の文字を文字aに設定し(ステップS75)、d=d+1に設定する(ステップS76)。
従来装置は、状態sに文字aの通常遷移先が存在するか否かを判定する(ステップS77)。通常遷移先が存在する場合には(ステップS78,Yes)、状態sのg[code(a)]を状態sに代入し(ステップS79)、状態sが照合状態の場合に、状態sのパターンリストをオフセットdに対応付けて集合Rに登録し(ステップS80)、ステップS72に移行する。
通常遷移先が存在しない場合には(ステップS78,No)、状態sのフェイラ遷移先を状態sに設定し(ステップS81)、状態sが照合状態の場合に、状態sのパターンリストをオフセットdに対応付けて集合Rに登録し(ステップS82)、ステップS77に移行する。
次に、図20に示したパターン照合処理を、具体例を用いて説明する。図21〜図26は、従来のパターン照合処理を説明するための図である。ここでは一例として、パターン集合ΠをΠ={AC、BA、BB、BAA、BACD}としたACマシンを用い、テキストデータDを「CBAAC」として説明を行う。
従来装置は、状態sをACマシンαの初期状態0に設定し、集合Rを空集合に設定する(図21参照)。従来装置は、テキストデータDから文字Cを読み出し、オフセットをd=1に設定する。状態sに文字Cによる通常遷移先が存在しないので、従来装置は、状態sをフェイラ遷移させ、状態sをフェイラ遷移先の初期状態0に設定する(図22参照)。
従来装置は、テキストデータDから文字Bを読み出し、オフセットをd=2に設定する。状態s(初期状態0)において、文字Bによる通常遷移先は、状態3となるので、従来装置は、状態sを状態3に設定する(図23参照)。
従来装置は、テキストデータDから文字Aを読み出し、オフセットをd=3に設定する。状態s(通常状態3)において、文字Aによる通常遷移先は、状態4となるので、従来装置は、状態sを状態4に設定する。状態sが照合状態となったので、従来装置は、状態sのパターンリスト「BA」と、オフセット「3」を集合Rに登録する(図24参照)。
従来装置は、テキストデータDから文字Aを読み出し、オフセットをd=4に設定する。状態s(照合状態4)において、文字Aによる通常遷移先は、状態6となるので、従来装置は、状態sを状態6に設定する。状態sが照合状態となったので、従来装置は、状態sのパターンリスト「BAA」と、オフセット「4」を集合Rに登録する(図25参照)。
従来装置は、テキストデータDから文字Cを読み出し、オフセットをd=5に設定する。状態s(照合状態6)において、文字Cによる通常遷移先は、存在しないので、フェイラ遷移し、状態sを状態1に設定する。状態sにおいて、文字Cによる通常遷移先は、状態2となるので、従来装置は、状態sを状態2に設定する。状態sが照合状態となったので、従来装置は、状態sのパターンリスト「AC」と、オフセット「5」を集合Rに登録する(図26参照)。
従来装置は、図26に示した集合Rを、照合結果として出力する。かかる照合結果を参照すると、テキストデータのオフセット3にキーワード「BA」が存在し、オフセット4にキーワード「BAA」が存在し、オフセット5にキーワード「AC」が存在することが分かる。
次に、大文字と小文字(例えば、Aとa)のように、類似した文字を区別しないあいまい検索を、ACマシンを用いて実現させる場合について説明する。ACマシンを用いて、あいまい検索を実現させる場合には、あいまいな文字を同一状態に遷移させるようなオートマトンとして表現すればよい。
図27は、あいまいパターンを受け付ける従来のACマシンの一例を示す図である。図27に示す例では、パターン集合Π={(A|a)(C|c)、(B|b)(A|a)、(B|b)(B|b)、(B|b)(A|a)(A|a)、(B|b)(A|a)(C|c)(D|d)}により構築されたACマシンである。ここで、(x|y)は、xでもyでも良い旨を示す。例えば、パターン集合Πに含まれるキーワード(A|a)(C|c)に該当するキーワードは、AC、aC、Ac、acが含まれる。
ここで、図27に示すACマシンの状態遷移の一例を説明する。例えば、現在の状態が初期状態0であり、テキストデータDの文字がAまたはaの場合には、初期状態0から通常状態1に現在の状態を遷移する。このように、あいまい検索を、ACマシンで実現させると、2本以上(図27に示す例では2本)の通常遷移先が存在することなる。その他の状態遷移方法は、図1に示した従来のACマシンと同様である。
ところで、図27に示したACマシンを用いてパターン照合処理を実行する場合に、ヒットしたキーワード(集合Rに登録されたキーワード)の内、どの程度が大文字でどの程度が小文字なのかを判定すること(類似度を判定すること)が求められる。
しかし、図27に示したACマシンをそのまま適用すると、パターン照合が終了した時点で、ヒットしたキーワードがACマシン上のどの経路を通ってヒットしたのかを判定することが出来ない。図27において、照合状態2に到達するまでに、初期状態0から状態1に向かうまでに「A」または「a」の2通り、状態1から照合状態2に向かうまでに「C」または「c」の2通りが存在する。
従って、照合状態2(キーワード(A|a)(C|c)にヒットする状態)に至る経路は合計で4通り存在するが、いずれの経路でも照合状態2に到達するため、各経路を区別できず、ヒットしたキーワードのうち、どの程度が大文字でどの程度が小文字なのかを判定することができない。
かかる課題を解消するための手段として、各文字における候補の組合せを全て展開したACマシンを作成すれば、ヒットした文字のうち、どの程度が大文字でどの程度が小文字なのかを判定することが可能となる。例えば、大文字に1点、小文字に0点を割り振り、図28に示すとおり、全ての文字を展開して点数を割り付け、図29に示すACマシンを作成すればよい。図28および図29は、従来技術の問題点を説明するための図である。
例えば、図28に示すキーワードACは、大文字を2つ含むので2点となり、キーワードAc、aCは、大文字を一つ含むので1点となり、キーワードacは大文字を含まないので0点となる。そして、キーワード(A|a)(C|c)に対して、4通りの経路を用意してやれば、キーワード(A|a)(C|c)にヒットした際の点数を参照することで、どの程度が大文字でどの程度が小文字なのかを判定することが可能となる。
しかしながら、図28のように展開した文字列を全てACマシンで表現すると、図29に示すように、ACマシンの状態数が膨大な数となってしまうため、現実的ではない。図29に示すACマシンの状態数は、キーワードサイズに応じて指数的に増加してしまう。
次に、本実施例にかかる検索装置の概要について説明する。図30は、本実施例にかかる検索装置の概要を説明するための図である。図30に示すように、本実施例にかかる検索装置は、図27と同様にして、あいまいな文字を同一状態に遷移させるようなACオートマトンを作成すると共に、ACマシンの各辺に点数をつけ、オートマトンの状態を遷移させながら逐次的に点数計算を行う。
具体的には、ある状態からある状態に遷移する場合に、大文字により通常遷移した場合には、1点を加算し、小文字により通常遷移した場合には、0点を加算することで、点数計算を行う。例えば、図30において、初期状態0から、文字Aにより状態1に通常遷移した場合には1点を加算し、文字aにより状態1に通常遷移した場合には、0点を加算する。
更に、本実施例にかかる検索装置は、ある状態からある状態にフェイラ遷移した場合には、遷移元の状態のレベルと、遷移先の状態のレベルとの差に基づいて、点数を補正することで、パターン照合終了時の点数を正確なものとする。ここで、状態のレベルは、初期状態から該当状態までの距離を示す。
図30を用いて、各状態のレベルを具体的に示すと、状態1、3は、初期状態0からの距離が1なので、レベル1となる。状態6、7は、初期状態0からの距離が3なので、レベル3となる。状態8は、初期状態0からの距離が4なので、レベル4となる。
このように、本実施例にかかる検索装置は、あいまいな文字を同一状態に遷移させるようなACオートマトンを作成すると共に、ACマシンの各辺に点数をつけ、オートマトンの状態を遷移させながら逐次的に点数計算を行っている。したがって、本実施例にかかる検索装置によれば、各文字における候補の組合せを全て展開すること無く、ヒットしたキーワードの内、どの程度が大文字でどの程度が小文字なのかを判定することができる。
次に、本実施例で用いる用語の定義を行う。Σは、アルファベット(文字の集合)を示し、あいまい文字セットを、Σの部分集合とする。あいまい文字セット{a、b、・・・}⊆Σを(a|b|・・・)と記述することにする。任意のp∈(Σ∪A)*をパターンと呼ぶ。コスト表Cを、Σの各文字に整数を割当てる関数として定義する。検索装置に入力するテキストデータDを、D∈Σ*とする。また、あいまい文字セットの集合をA=Σ2とする。
本実施例にかかる検索装置は一例として、テキストデータD、パターン集合Π、点数を管理するコスト管理テーブルを受け付け、テキストデータDに対して、各パターンp∈Πの全ての照合位置および照合コストを検索結果として出力するものとする。
本実施例では、パターン集合Πとして第1〜3の条件を満たすもののみを取り扱う。第1の条件として、あいまい文字セットで使われている文字は、単独使用できない。例えば、あいまい文字セット(a|A)があるパターンp∈Πで使われている場合には、Πの任意のパターンにおいて、文字a∈ΣおよびA∈Σを単独で用いることが出来ない。
第2の条件として、Π中のパターンで使われている相違なるあいまい文字セットに、同一の文字を使うことは出来ない。例えば、(a|A)と(a|b)を、Π中で同時に使いことは出来ない。第3の条件として、1つのあいまい文字セットに、2通り以上の得点を割当てることはできない。すなわち、各あいまい文字セットにおける得点割り当ては、Πにおいて共通でなくてはならない。
次に、本実施例にかかる検索装置100の構成について説明する。図31は、本実施例にかかる検索装置100の構成を示す図である。図31に示すように、この検索装置100は、入力部110、出力部120、入出力制御部130、記憶部140、制御部150を有する。
このうち、入力部110は、パターン集合、スコア配列、コスト管理テーブル、テキストデータ等を入力する入力部であり、キーボードやマウス、マイク等に対応する。出力部120は、ACマシンによる照合結果などを出力する出力部であり、モニタ(若しくはディスプレイ、タッチパネル)に対応する。入出力制御部130は、入力部110、出力部120、記憶部140、制御部150によるデータの入出力を制御する処理部である。
記憶部140は、制御部150による各種処理に必要なデータおよびプログラムを記憶する記憶部である。この記憶部140は、パターン集合140aと、コスト管理テーブル140bと、ACマシン140cと、スコア配列140dを有する。
このうち、パターン集合140aは、テキストデータから検索するキーワード(あいまいパターン)の集合である。本実施例では一例として、パターン集合140aを、Π={(A|a)(C|c)、(B|b)(A|a)、(B|b)(B|b)、(B|b)(A|a)(A|a)、(B|b)(A|a)(C|c)(D|d)}とする。
コスト管理テーブル140bは、文字の種別とコスト(点数)を対応付けて記憶するテーブルである。図32は、本実施例にかかるコスト管理テーブル140bのデータ構造の一例を示す図である。
ACマシン140cは、パターン集合140aに基づいて生成されるACマシンである。例えば、パターン集合Π={(A|a)(C|c)、(B|b)(A|a)、(B|b)(B|b)、(B|b)(A|a)(A|a)、(B|b)(A|a)(C|c)(D|d)}に対応するACマシンは、図30に示したACマシンとなる。
本実施例にかかるACマシンも従来と同様にして、複数の状態構造体から構成されている。図33は、本実施例にかかる状態構造体のデータ構造の一例を示す図である。図33に示すように、本実施例にかかる状態構造体は、各状態を識別する状態ID「id」と、パターンリスト「plist」と、通常遷移先へのポインタg[1]〜g[256]と、フェイラ遷移先へのポインタ「fail」と、初期状態(ルートノード)からの距離「dist」を有する。
図31の説明に戻ると、スコア配列140dは、ACマシン上で状態が遷移することで変化する初期状態から現在の状態までの距離と、点数とを管理するテーブルである。図34は、本実施例にかかるスコア配列140dのデータ構造の一例を示す図である。図34に示すように、このスコア配列140dは、初期状態からの距離(初期状態から現在の状態までの距離)と点数とを対応付けて記憶している。
制御部150は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する制御部である。図31に示すように、制御部150は、ACマシン構築処理部150aと、照合処理部150bと、照合結果出力部150cを有する。
ACマシン構築処理部150aは、パターン集合140aに基づいて、ACマシン140cを作成する処理部である。ACマシン構築処理部150aは、ACマシン140dを作成する場合に、初めにトライ構築を行った後に、フェイラ遷移追加処理を実行する。
まず、ACマシン構築処理部150aが実行する、トライT構築について具体的に説明する。ここでは、パターン集合をΠ={(A|a)(C|c)、(B|b)(A|a)、(B|b)(B|b)、(B|b)(A|a)(A|a)、(B|b)(A|a)(C|c)(D|d)}として説明する。図35〜図37は、本実施例にかかるトライT構築処理を説明するための図である。
まず、ACマシン構築処理部150aは、初期状態0を作成し、初期状態の状態構造体における通常遷移先を全て初期状態に設定する(図35、ステップS90)。そして、ACマシン構築処理部150aは、パターン集合Πからパターン「(A|a)(C|c)」を取り出す。ACマシン構築処理部150aは、文字(A|a)を選択し、文字Aおよびaによる初期状態0の通常遷移先を通常状態1に設定し、distを「1」に設定する。
ACマシン構築処理部150aは、文字(C|c)を選択し、文字Cおよびcによる通常状態1の通常遷移先を照合状態2に設定し、照合状態のパターンリストを「(A|a)(C|c)」に設定する。文字(C|c)は、パターン「(A|a)(C|c)」最後尾の文字であるため、状態2は、照合状態となる。また、ACマシン構築処理部150aは、照合状態2のdistを「2」に設定する(図35、ステップS91)。
ACマシン構築処理部150aは、初期状態0に戻り、パターン集合Πからパターン「(B|b)(A|a)」を取り出す。ACマシン構築処理部150aは、文字(B|b)を選択し、文字Bおよびbによる初期状態0の通常遷移先を通常状態3に設定し、distを「1」に設定する。
ACマシン構築処理部150aは、文字(A|a)を選択し、文字Aおよびaによる通常状態3の通常遷移先を照合状態4に設定し、照合状態のパターンリストを「(B|b)(A|a)」に設定する。文字(A|a)は、パターン「(B|b)(A|a)」の最後尾の文字であるため、状態4は、照合状態となる。また、ACマシン構築処理部150aは、照合状態4のdistを「2」に設定する(図35、ステップS92)。
ACマシン構築処理部150aは、初期状態0に戻り、パターン集合Πからパターン「(B|b)(B|b)」を取り出し、文字(B|b)を選択する。ここで、文字Bおよびbによる初期状態0の通常遷移先は通常状態3であり、既に作成済みであるため、現在の状態を通常状態3に遷移する。また、ACマシン構築処理部150aは、文字(B|b)を選択し、文字Bおよびbによる通常状態3の通常遷移先を照合状態5に設定し、パターンリストを「(B|b)(B|b)」に設定する。文字(B|b)は、パターン「(B|b)(B|b)」の最後尾の文字であるため、状態5は、照合状態となる。また、ACマシン構築処理部150aは、照合状態2のdistを「2」に設定する(図36、ステップS93)。
ACマシン構築処理部150aは、初期状態0に戻り、パターン集合Πからパターン「(B|b)(A|a)(A|a)」を取り出し、文字(B|b)を選択する。ここで、文字Bおよびbによる初期状態0の通常遷移先は、通常状態3であり、既に作成済みであるため、現在の状態を通常状態3に遷移する。また、ACマシン構築処理部150aは、文字(A|a)を選択する。ここで、文字Aおよびaによる通常状態3の通常遷移先は、照合状態4であり、既に作成済みであるため、現在の状態を照合状態4に設定する。また、ACマシン構築処理部150aは、文字(A|a)を選択する。文字Aおよびaによる照合状態4の通常遷移先を照合状態6に設定し、パターンリストを「(B|b)(A|a)(A|a)」に設定する。文字(A|a)は、パターン「(B|b)(A|a)(A|a)」の最後尾の文字であるため、状態6は、照合状態となる。また、ACマシン構築処理部150aは、照合状態6のdistを「3」に設定する(図36、ステップS94)。
ACマシン構築処理部150aは、初期状態0に戻り、パターン集合Πからパターン「(B|b)(A|a)(C|c)(D|d)」を取り出し、文字(B|b)を選択する。ここで、文字Bおよびbによる初期状態0の通常遷移先は、通常状態3であり、既に登録済みであるため、現在の状態を通常状態3に遷移する。また、ACマシン構築処理部150aは、文字(A|a)を選択する。ここで、文字Aおよびaによる通常状態3の通常遷移先は、照合状態4であり、既に作成済みであるため、現在の状態を照合状態4に設定する。
また、ACマシン構築処理部150aは、文字(C|c)を選択し、文字Cおよびcによる照合状態4の通常遷移先を通常状態7に設定し、distを「3」に設定する。また、ACマシン構築処理部150aは、文字(D|d)を選択し、文字Dおよびdによる通常状態7の通常遷移先を照合状態8に設定し、パターンリストを「(B|b)(A|a)(C|c)(D|d)」に設定する。文字(D|d)は、パターン「(B|b)(A|a)(C|c)(D|d)」の最後尾の文字であるため、状態8は、照合状態となる。
また、ACマシン構築処理部150aは、照合状態8のdistを「4」に設定する(図37、ステップS95)。ステップS95が終了した段階で、パターン集合Πに含まれる全てのパターン(あいまいパターン)の登録が終了し、トライTの構築処理が終了する。
次に、ACマシン構築処理部150aが実行するフェイラ遷移追加処理について説明する。なお、ACマシン構築処理部150aは、上述したトライT構築処理で作成したトライTに対して、フェイラ遷移追加処理を行うものとする。
図38〜図46は、本実施例にかかるフェイラ遷移追加処理を説明するための図である。ACマシン構築処理部150aは、初期状態0からの通常遷移先となる状態を判定し、判定した状態をキュー(Queue)に登録し、キューに登録された状態のフェイラ遷移先に初期状態0を登録する。ここで、初期状態の通常遷移先は、通常状態1、3となるので、キューに1、3を登録する。また、通常状態1、3のフェイラ遷移先を初期状態0に設定する(図38参照)。
次に、ACマシン構築処理部150aは、キューの先頭の状態1を取り出し、取り出した状態1を状態sに設定する。ACマシン構築処理部150aは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。この場合は、ACマシン構築処理部150aは、文字(C|c)を抽出し、集合Xに文字(C|c)を格納する。
ACマシン構築処理部150aは、集合Xから文字(C|c)を取り出し、状態sの通常遷移先となる状態2をキューの最後尾に追加する。ACマシン構築処理部150aは、状態1からフェイラ遷移した初期状態0に移行し、文字(C|c)に対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、初期状態0となる。ACマシン構築処理部150aは、状態s(通常状態1)から文字Cまたはcにより遷移する状態nextを判定し、判定した状態(照合状態2)のフェイラ遷移先を初期状態0に設定する(図39参照)。
ACマシン構築処理部150aは、キューの先頭の状態3を取り出し、取り出した状態3を状態sに設定する。ACマシン構築処理部150aは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。この場合、従来装置は、文字(A|a)、(B|b)を抽出し、集合Xに文字(A|a)、(B|b)を格納する。
ACマシン構築処理部150aは、集合Xから文字(A|a)を取り出し、状態sの文字(A|a)の通常遷移先となる状態4をキューの最後尾に追加する。ACマシン構築処理部150aは、状態sからフェイラ遷移した初期状態0に移行し、文字(A|a)に対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態1となる。ACマシン構築処理部150aは、状態s(通常状態3)から文字Aまたはaにより遷移する状態nextを判定し、判定した状態(照合状態4)のフェイラ遷移先を状態1に設定する(図40の状態4参照)。
ACマシン構築処理部150aは、集合Xから文字(B|b)を取り出し、状態s(通常状態3)の文字(B|b)の通常遷移先となる状態5をキューの最後尾に追加する。ACマシン構築処理部150aは、状態sからフェイラ遷移した初期状態0に移行し、文字Bに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態3となる。ACマシン構築処理部150aは、状態sから文字Bまたはbにより遷移する状態nextを判定し、判定した状態(照合状態5)のフェイラ遷移先を状態3に設定する(図40の状態5参照)。
ACマシン構築処理部150aは、キューの先頭の状態2を取り出し、取り出した状態2を状態sに設定する。ACマシン構築処理部150aは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する(図41参照)。
ACマシン構築処理部150aは、キューの先頭の状態4を取り出し、取り出した状態4を状態sに設定する。ACマシン構築処理部150aは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。この場合は、ACマシン構築処理部150aは、文字(A|a)、(C|c)を抽出し、集合Xに文字(A|a)、(C|c)を格納する。
ACマシン構築処理部150aは、集合Xから文字(A|a)を取り出し、状態s(照合状態4)の文字(A|a)の通常遷移先となる状態6をキューの最後尾に追加する。ACマシン構築処理部150aは、状態sからフェイラ遷移した状態1に移行する。状態1において、文字Aに対する通常遷移先はNullであるため、再度フェイラ遷移し、初期状態0に移行する。
そして、初期状態0において、文字(A|a)に対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態1となる。ACマシン構築処理部150aは、状態s(通常状態4)から文字(A|a)により遷移する状態nextを判定し、判定した状態(照合状態6)のフェイラ遷移先を状態1に設定する(図42の状態6参照)。
ACマシン構築処理部150aは、集合Xから文字(C|c)を取り出し、状態s(照合状態4)の文字(C|c)の通常遷移先となる状態7をキューの最後尾に追加する。ACマシン構築処理部150aは、状態sからフェイラ遷移した状態1に移行し、文字(C|c)に対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態2となる。ACマシン構築処理部150aは、状態sから文字(C|c)による遷移する状態nextを判定し、判定した状態(通常状態7)のフェイラ遷移先を状態2に設定する。
また、ACマシン構築処理部150aは、状態7のフェイラ遷移先が照合状態2となるため、状態2のパターンリストを状態7のパターンリストに追加することで、状態7を照合状態7に設定する(図42の状態7参照)。
ACマシン構築処理部150aは、キューの先頭の状態5を取り出し、取り出した状態5を状態sに設定する。ACマシン構築処理部150aは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する(図43参照)。
ACマシン構築処理部150aは、キューの先頭の状態6を取り出し、取り出した状態6を状態sに設定する。ACマシン構築処理部150aは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する(図44参照)。
ACマシン構築処理部150aは、キューの先頭の状態7を取り出し、取り出した状態7を状態sに設定する。ACマシン構築処理部150aは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。この場合、従来装置は、文字(D|d)を抽出し、集合Xに文字(D|d)を格納する。
ACマシン構築処理部150aは、集合Xから文字(D|d)を取り出し、状態s(照合状態7)の文字(D|d)の通常遷移先となる状態8をキューの最後尾に追加する。ACマシン構築処理部150aは、状態sからフェイラ遷移した状態2に移行する。状態2において、文字(D|d)に対する通常遷移先はNullであるため、再度フェイラ遷移し、初期状態0に移行する。
そして、初期状態0において、文字Dに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、初期状態0となる。ACマシン構築処理部150aは、状態s(照合状態7)から文字(D|d)により遷移する状態nextを判定し、判定した状態(照合状態8)のフェイラ遷移先を初期状態0に設定する(図45の状態8参照)。
ACマシン構築処理部150aは、キューの先頭の状態8を取り出し、取り出した状態8を状態sに設定する。ACマシン構築処理部150aは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する。そして、キューに状態が存在しなくなった場合に、パターン集合ΠのACマシンが完了する(図46参照)。
このように、ACマシン構築処理部150aは、図35〜図37に示したトライT構築処理、図38〜図46に示したフェイラ遷移追加処理を実行することにより、パターン集合140aからACマシン140cを作成する。
図31の説明に戻ると、照合処理部150bは、ACマシン140cを用いて、テキストデータを照合し、照合結果を出力する処理部である。また、照合処理部150bは、コスト管理テーブル140bを基にして、通常遷移を行なうたびに、文字に応じた点数をスコア配列140dに登録し、登録された点数を集計することで、照合されたキーワードの点数を算出する。また、照合処理部150bは、照合処理の途中で、フェイラ遷移が発生した場合には、フェイラ遷移元の状態のdistと、フェイラ遷移先の状態のdistとの差分を基にして、スコア配列140dの点数を前に詰める。
以下において、照合処理部150bの処理を具体的に説明する。図47〜図52は、本実施例にかかるパターン照合処理を説明するための図である。ここでは一例として、照合対象となるテキストデータを「CbaAC」として、パターン照合処理を説明する。
照合処理部150bは、テキストデータの1文字目(オフセット1)の文字Cを読み出し、状態sを初期状態0とする。そして、照合処理部150bは、状態sの文字Cによる遷移先を判定すると、状態sの文字Cによる通常遷移先は初期状態0なので、再び状態sを初期状態0に設定する(図47参照)。
照合処理部150bは、テキストデータの2文字目(オフセット2)の文字bを読み出し、状態s(初期状態0)の文字bによる遷移先を判定する。状態sの文字bによる通常遷移先は状態3なので、状態sを状態3に設定する。また、照合処理部150bは、通常遷移した場合に、コスト管理テーブル140bと、文字の種類と比較して点数を判定する。そして、照合処理部150bは、判定した点数と、通常遷移先の状態のdistに応じて、スコア配列140dに点数を登録する。
文字bのコストは「0」であり、通常遷移先の状態3のdistは「1」であるため、照合処理部150bは、スコア配列140dの「初期状態からの距離1」に対応する点数を0に設定する(図48参照)。
照合処理部150bは、テキストデータの3文字目(オフセット3)の文字aを読み出し、状態s(状態3)の文字aによる遷移先を判定する。状態sの文字aによる通常遷移先は状態4なので、状態sを状態4に設定する。また、文字aのコストは「0」であり、通常遷移先の状態4のdistは「2」であるため、照合処理部150bは、スコア配列140dの「初期状態からの距離2」に対応する点数を0に設定する。
また、状態4は、パターン(B|b)(A|a)の照合状態であるため、照合処理部150bは、パターン(B|b)(A|a)にヒットしたと判定する。そして、照合処理部150bは、パターン(B|b)(A|a)と、現在のオフセット3と、現在のスコア配列の点数の合計値「0」を対応付けて集合Rに登録する(図49参照)。
照合処理部150bは、テキストデータの4文字目(オフセット4)の文字Aを読み出し、状態s(状態4)の文字Aによる遷移先を判定する。状態sの文字Aによる通常遷移先は状態6なので、状態sを状態6に設定する。また、文字Aのコストは「1」であり、通常遷移先の状態6のdistは「3」であるため、照合処理部150bは、スコア配列140dの「初期状態からの距離3」に対応する点数を1に設定する。
また、状態6は、パターン(B|b)(A|a)(A|a)の照合状態であるため、照合処理部150bは、パターン(B|b)(A|a)(A|a)にヒットしたと判定する。そして、照合処理部150bは、パターン(B|b)(A|a)(A|a)と、現在のオフセット4と、現在のスコア配列の点数の合計値「1」を対応付けて集合Rに登録する(図50参照)。
照合処理部150bは、テキストデータの5文字目(オフセット5)の文字Cを読み出し、状態s(状態6)の文字Cによる遷移先を判定する。状態sの文字Cによる通常遷移先は存在しないので、フェイラ遷移となり、フェイラ遷移先となる状態1を状態sに設定する。
ここで、フェイラ遷移元となる状態6のdistは「3」であり、フェイラ遷移先となる状態1のdistは「1」であるため、各distの差は「2」となる。従って、照合処理部150bは、スコア配列140dの点数を2だけ前に詰めると共に、点数の存在していた「初期状態からの距離2、3」に対応する点数をNullに設定する(図51参照)。
そして、照合処理部150bは、状態s(状態1)の文字Cによる遷移先を判定する。状態sの文字Cによる通常遷移先は状態2なので、状態sを状態2に設定する。また、文字Cのコストは「1」であり、通常遷移先の状態2のdistは「2」であるため、照合処理部150bは、スコア配列140dの「初期状態からの距離2」に対応する点数を1に設定する。
また、状態2は、パターン(A|a)(C|c)の照合状態であるため、照合処理部150bは、パターン(A|a)(C|c)にヒットしたと判定する。そして、照合処理部150bは、パターン(A|a)(C|c)と、現在のオフセット5と、現在のスコア配列の点数の合計値2を対応付けて集合Rに登録する(図52参照)。テキストデータの最後の文字に対する遷移先を判定した後に、パターン照合処理を終了する。
このように、照合処理部150bが、フェイラ遷移先と遷移後のdistの差に基づいて、スコア配列140dの点数を詰めることで、初期状態0からフェイラ遷移した先の状態までに至る点数のみをスコア配列140dに残すので、各照合状態の点数を正確に算出することができる。
例えば、図51において、フェイラ遷移先(状態1)と遷移後(状態6)のdistの差は、2であるため、スコア配列140dを前に2だけ詰めており、初期状態0からフェイラ遷移した先の状態1(dist1)までの点数のみをスコア配列140dに残している(文字Aにより状態1に移行したことをスコア配列140dに残している)。従って、図51の場合では、状態1から照合状態2に通常遷移し、照合したパターン(A|a)(C|c)の点数が2であると正確に算出することができる。
図31の説明に戻ると、照合結果出力部150cは、照合処理部150bの照合結果を出力部120に出力する処理部である。例えば、図52等に示したACマシンを用いてテキストデータのパターン照合処理を実行した場合には、図53に示す照合結果を出力する。図53は、照合結果出力部150cが出力する照合結果の一例を示す図である。図53の照合結果を参照することにより、テキストデータに含まれるパターンの種類、テキストデータ中のパターンの存在位置、どの程度大文字が存在するのかを判定することが出来る。
次に、本実施例にかかる検索装置100の処理手順について説明する。図54は、本実施例にかかる検索装置100がACマシンを構築する処理手順を示すフローチャートである。図54に示すように、検索装置100は、パターン集合Πを取得し(ステップS101)、ACマシン構築処理部150aが、パターン集合ΠのトライTの構築処理を実行する(ステップS102)。そして、ACマシン構築処理部150aが、フェイラ遷移追加処理を実行し(ステップS103)、ACマシンを出力する(ステップS104)。
次に、図54のステップS102に示したパターン集合ΠのトライTの構築処理について説明する。かかるパターン集合ΠのトライTの構築処理をACマシン構築処理部150aが実行することにより、パターン集合140aから、トライTが生成される(例えば、図37参照)。
図55は、本実施例にかかるパターン集合ΠのトライTの構築処理の処理手順を示すフローチャートである。図55に示すように、ACマシン構築処理部150aは、初期状態(id=0)を作成し、トライT(Π)を初期状態のみで構成されるトライに設定する(ステップS201)。
ACマシン構築処理部150aは、初期状態のdistを0に設定し(ステップS202)、初期状態の通常遷移先を全て初期状態に設定し(ステップS203)、パターン集合Πにパターンが存在するか否かを判定する(ステップS204)。
パターン集合Πにパターンが存在しない場合には(ステップS205,No)、ACマシン構築処理部150aは、トライT(Π)を出力する(ステップS206)。一方、パターン集合Πにパターンが存在する場合には(ステップS205,Yes)、ACマシン構築処理部150aは、パターン集合Πから1つのパターンを取り出し、取り出したパターンをパターンpに設定し(ステップS207)、パターン登録処理を実行し(ステップS208)、ステップS204に移行する。
次に、図55のステップS208に示したパターン登録処理について説明する。図56は、本実施例にかかるパターン登録処理の処理手順を示すフローチャートである。図56に示すように、ACマシン構築処理部150aは、状態sをトライTの初期状態に設定し(ステップS301)、距離dを1に設定する(ステップS302)。
ACマシン構築処理部150aは、パターンpに次の文字が存在するか否かを判定し(ステップS303)、存在しない場合には(ステップS304,No)、状態sのパターンリストplistにパターンpを代入し(ステップS305)、トライTを出力する(ステップS306)。
一方、パターンpに次の文字が存在する場合には(ステップS304,Yes)、ACマシン構築処理部150aは、状態sのdistにdを登録し、d=d+1に設定する(ステップS307)。ACマシン構築処理部150aは、次の文字をaとし、文字aがあいまい文字であるか否かを判定する(ステップS206)。
次の文字があいまい文字の場合には(ステップS309,Yes)、ACマシン構築処理部150aは、aに含まれる全ての文字に対してasciiコードをcode(a)に設定し(ステップS310)、状態sの通常遷移g[code(a)]がNullであるか否かを判定する(ステップS311)。
状態sの通常遷移g[code(a)]がNullの場合には(ステップS312,Yes)、ACマシン構築処理部150aは、状態nを新規作成し、g[code(a)]=nに設定し(ステップS311)、状態sにg[code(a)]を代入する(状態nを状態sとする)(ステップS313)。一方、状態sの通常遷移g[code(a)]がNullではない場合には(ステップS312,No)、ステップS314に移行する。
ところで、ステップS309において、次の文字があいまい文字ではない場合には(ステップS309,No)、文字aのasciiコードをcode(a)に設定し(ステップS315)、状態sの通常遷移g[code(a)]がNullであるか否かを判定する(ステップS316)。
状態sの通常遷移g[code(a)]がNullの場合には(ステップS317,Yes)、ACマシン構築処理部150aは、状態nを新規作成し、g[code(a)]=nに設定し(ステップS318)、状態sにg[code(a)]を代入し(状態nを状態sとする)(ステップS319)、ステップS303に移行する。一方、状態sの通常遷移g[code(a)]がNullではない場合には(ステップS317,No)、ステップS319に移行する。
次に、図54のステップS103に示したフェイラ遷移追加処理について説明する。かかるフェイラ遷移追加処理を実行することにより、トライTの各状態にフェイラ遷移先が追加され、ACマシンが完成する。図57および図58は、本実施例にかかるフェイラ遷移追加処理の処理手順を示すフローチャートである。
図57に示すように、ACマシン構築処理部150aは、初期状態から通常遷移先となる状態を判定し、判定した状態をキュー(queue)に登録する(ステップS401)。ただし、ステップS401において、ACマシン構築処理部150aは、同一状態を2度以上キューに加えないこととする。
続いて、ACマシン構築処理部150aは、キューに登録された状態(状態構造体)のフェイラ遷移先に初期状態を登録し(ステップS402)、キューに状態が存在するか否かを判定する(ステップS403)。キューに状態が存在しない場合には(ステップS404,No)、トライTをACマシンαとして出力する(ステップS405)。
一方、キューに状態が存在する場合には(ステップS404,Yes)、ACマシン構築処理部150aは、キューの先頭の状態を取り出し、取り出した状態を状態sに設定し(ステップS406)、状態sの通常遷移先へのポインタが全てNullであるか否かを判定する(ステップS407)。状態sの通常遷移先へのポインタが全てNullの場合には(ステップS408,Yes)、ステップS403に移行する。
一方、状態sの通常遷移先へのポインタが全てNullではない場合には(ステップS408,No)、図58に示すように、ACマシン構築処理部150aは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、抽出した文字aを集合Xに格納する(ステップS409)。
ACマシン構築処理部150aは、集合Xに文字が存在するか否かを判定し(ステップS410)、集合Xに文字が存在しない場合には(ステップS411,No)、ステップS403に移行する。一方、集合Xに文字が存在する場合には(ステップS411,Yes)、集合Xから文字aを一つ取り出し、取り出した文字aに該当する文字を集合Xから削除する(ステップS412)。
ACマシン構築処理部150aは、状態sの通常遷移先をキューの最後尾に追加し(ステップS413)、フェイラ遷移を繰り返し、文字aに対する通常遷移先がNullにならない最初の状態を状態fに設定する(ステップS414)。ACマシン構築処理部150aは、フェイラ遷移先の状態から文字aの通常遷移先へのポインタfnext=g[code(a)]を判定する(ステップS415)。
ACマシン構築処理部150aは、状態sから文字aにより遷移する状態nextを判定し(ステップS416)、状態nextのフェイラ遷移先をfnext=g[code(a)]に設定し(ステップS418)、状態nextのフェイラ遷移先の状態にパターンリストが存在する場合に、かかるパターンリストを状態nextのパターンリストに追加し(ステップS417)、ステップS410に移行する。ただし、ステップS418において、ACマシン構築処理部150aは、パターンリスト中に同一パターンの重複登録は実行しないものとする。
次に、本実施例にかかる検索装置が実行する照合処理の処理手順について説明する。図59は、本実施例にかかる照合処理の処理手順を示すフローチャートである。図59に示すように、検索装置100は、照合処理部150bが状態sをACマシンαの初期状態に設定し(ステップS501)、オフセットd=0、集合Rを空集合、スコア配列を空配列に設定する(ステップS502)。
照合処理部150bは、テキストデータDに(d+1)文字目が存在するか否かを判定し(ステップS503)、テキストデータDに(d+1)文字目が存在しない場合には(ステップS504,No)、集合R(照合結果)を出力する(ステップS505)。
一方、テキストデータDに(d+1)文字目が存在する場合には(ステップS504,Yes)、照合処理部150bは、(d+1)文字目の文字をaに設定し(ステップS506)、d=d+1に設定する(ステップS507)。
照合処理部150bは、状態sの文字aの通常遷移先が存在するか否かを判定する(ステップS508)。状態sの文字aの通常遷移先が存在しない場合には(ステップS509,No)、状態sのフェイラ遷移先を状態sに設定する(ステップS510)。
照合処理部150bは、フェイラ遷移により距離差分(遷移元のdistと遷移先のdistとの差分)だけ、スコア配列140dの点数を前に詰め、詰めた後の後方余白をNullに設定する(ステップS511)。また、照合処理部150bは、フェイラ遷移先から文字aにより遷移し、状態sが照合状態の場合に、状態sのパターンリストと、オフセットdとスコアを対応付けて集合Rに登録し(ステップS512)、ステップS508に移行する。ステップS512において、照合処理部150bは、スコア配列140dの点数を合計することで、スコアを算出する。
ところで、ステップS509において、状態sに文字aの通常遷移先が存在する場合には(ステップS509,Yes)、照合処理部150bは、状態sのg[code]を状態sに代入する(状態sの文字aによる遷移先を新たに状態sとする)(ステップS513)。照合処理部150bは、状態sのdistに対応するコストに文字aのコストを登録し(ステップS514)、状態sが照合状態の場合に、状態sのパターンリストと、オフセットdと、スコアを対応づけて集合Rに登録し(ステップS515)、ステップS503に移行する。
上述してきたように、本実施例にかかる検索装置100は、照合処理部150bがテキストデータを取得した場合に、ACマシン140cとテキストデータの各文字とを順次比較し、通常遷移した際に、文字に対応する点数をスコア配列140dに登録し、フェイラ遷移した場合に、遷移先と遷移元の距離(dist)の差に基づいて、スコア配列140dの点数を前に詰める。そして、照合処理部150bは、状態が照合状態に遷移した場合に、スコア配列140dに含まれる点数(類似度)を合計することで、照合されたキーワードの点数を判定するので、ACマシンの状態数を増加させることなくあいまい検索を実現させ、照合結果となるキーワードの類似度を正確に判定することができる。
ところで、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
図60は、実施例に示した検索装置100に対応するコンピュータのハードウェア構成を示す図である。図60に示すように、このコンピュータ(検索装置)10は、入力装置11、モニタ12、RAM(Random Access Memory)13、ROM(Read Only Memory)14、ネットワークを介して他の装置とデータ通信を実行する通信制御装置15、媒体読取装置16、CPU(Central Processing Unit)17、HDD(Hard Disk Drive)18をバス19で接続している。
そして、HDD18には、上述した検索装置100の機能と同様の機能を発揮するACマシン構築プログラム18b、照合プログラム18cが記憶されている。CPU17が、ACマシン構築プログラム18b、照合プログラム18cを読み出して実行することにより、ACマシン構築プロセス17a、照合プロセス17bが起動される。
ここで、ACマシン構築プロセス17aは、図31に示したACマシン構築処理部150aに対応する。また、照合プロセス17bは、図31に示した照合処理部150b、照合結果出力部150cに対応する。
なお、HDD18は、図31で示した記憶部140に記憶されたデータに対応する各種データ18aを記憶している。CPU17は、HDD18に記憶された各種データ18aをRAM13に読み出し、RAM13に格納された各種データ13aを用いてACマシンの構築、テキストデータに対するパターン照合を実行する。