以下に、本願の開示する照合装置、照合プログラムおよび照合方法の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
まず、本実施例を説明する前に、従来のACマシン(ACオートマトン)について説明する。図1は、従来のACマシンのデータ構造の一例を示す図である。図1に示すACマシンは、テキストデータが入力された場合に、キーワード「AC、BA、BB、BAA、BACD」の位置を算出するACマシンである。
図1に示すように、ACマシンは、複数の状態を有しており、各状態は、初期状態、通常状態、照合状態に分別される。初期状態は、初めにテキストデータと照合される状態であり、通常状態は、2番目以降にテキストデータと照合される状態である。照合状態は、テキストデータが特定のキーワードにヒットした場合に遷移する状態である。図1に示す例では、初期状態は状態256であり、通常状態は状態65、66であり、照合状態は状態257〜262である。
ACマシンは、テキストデータの文字を初期状態256から順次照合し、通常遷移とフェイラ(Failure)遷移を繰り返すことで、テキストデータに含まれるテキスト(例えば、図1の集合Πに含まれるテキスト)の出現位置を算出する。
ここで、通常遷移は、照合対象となる状態において、テキストデータの比較対象となる文字による遷移先が存在する場合の遷移を示す。例えば、状態65において、テキストデータの比較対象となる文字がCの場合には、通常遷移となる。テキストデータの文字がCの場合には、状態65から状態257に通常遷移する。
一方、通常遷移の条件に該当しない場合には、フェイラ遷移となる。例えば、状態65において、テキストデータの比較対象となる文字がC以外の場合には、フェイラ遷移となる。状態65においてフェイラ遷移した場合には、遷移先が状態256となる。ACマシンでは、各状態に一本ずつフェイラ遷移が存在する。図1で省略されているフェイラ遷移は、全て初期状態256に向かっているものとする。
ここで、図1に示したACマシンが有する状態(状態定義)のデータ構造について説明する。図2は、従来の状態定義のデータ構造の一例を示す図である。図2に示すように、この状態定義は、各状態を識別する状態IDと、パターンリストと、通常遷移先と、フェイラ遷移先とを有する。
パターンリストには、状態定義が照合状態の場合に、該当するキーワードが格納される。例えば、状態257(状態ID257)の状態定義に含まれるパターンリストは、ACとなる。通常遷移先は、通常遷移先の状態IDを示し、括弧内の文字コードが示す文字を読んだときの次の状態IDを表す。通常遷移先の数は、文字コードの数、ここでは256個のエントリ数分存在する。例えば、状態65(状態ID65)の状態定義に含まれるg[67]は状態257(状態ID257)を表す。括弧内の67は、文字「C」のアスキーコードを示す。フェイラ遷移先は、フェイラ遷移先の状態IDを示す。なお、状態定義が、ACマシンのトライ構造の一例に挙げられる。
次に、従来技術の装置(以下、従来装置;図示略)が、ACマシンを構築する処理手順について説明する。図3は、従来のACマシンを構築する処理手順を示すフローチャートである。図3に示すように、従来装置は、パターン集合Π(照合対象となるキーワードの集合)を取得し(ステップS10)、パターン集合ΠのトライT(Π)を構築する(ステップS11)。そして、従来装置は、トライT(Π)にフェイラ遷移を追加し、その結果をACマシンα(Π)とする(ステップS12)。そして、従来装置は、ACマシンα(Π)を出力する(ステップS13)。
次に、図3のステップS11に示したパターン集合ΠのトライT(Π)を構築する処理について説明する。図4は、従来のパターン集合ΠのトライT構築処理の処理手順を示すフローチャートである。図4に示すように、従来装置は、初期状態(id=N)を作成し、トライT(Π)を初期状態のみで構成されるトライに設定する(ステップS20)。なお、Nは、例えば256であり、文字コードの最大の値(255)より1だけ大きい値であれば良い。
従来装置は、初期状態における通常遷移先を全て初期状態(id=N)に設定し(ステップS21)、パターン集合Πにパターンが存在するか否かを判定する(ステップS22)。パターンが存在しない場合には(ステップS22;No)、トライT(Π)を出力する(ステップS23)。
一方、パターン集合Πにパターンが存在する場合には(ステップS22;Yes)、従来装置は、パターン集合Πから1つのパターンを取り出し、取り出したパターンをパターンpに設定する(ステップS24)。そして、従来装置は、設定したパターンpについて、パターン登録処理を行う(ステップS25)。すなわち、従来装置は、トライT(Π)にパターンpを登録し、登録済みのトライを新たなトライT(Π)に設定する。そして、従来装置は、ステップS22に移行する。
次に、図4のステップS25に示したパターン登録処理について説明する。図5は、従来のパターン登録処理の処理手順を示すフローチャートである。図5に示すように、従来装置は、状態sをトライTの初期状態に設定し、変数jを文字コード数N+1に設定する(ステップS30)。なお、Nは、例えば256であり、文字コードの最大の値(255)より1だけ大きい値であれば良い。そして、従来装置は、パターンpに次の文字が存在するか否かを判定する(ステップS31)。
パターンpに次の文字が存在しない場合には(ステップS31;No)、従来装置は、状態sのパターンリストPlistに、パターンpを代入し(ステップS32)、トライTを出力する(ステップS33)。
一方、パターンpに次の文字が存在する場合には(ステップS31;Yes)、従来装置は、次の文字をaとし、aのアスキーコードをcode(a)とする(ステップS34)。そして、従来装置は、状態sの通常遷移先g[code(a)]がNullであるか否かを判定する(ステップS35)。
通常遷移先g[code(a)]がNullではない場合には(ステップS35;No)、従来装置は、ステップS39に移行する。一方、通常遷移先g[code(a)]がNullの場合には(ステップS35;Yes)、従来装置は、状態sが初期状態であるか否かを判定する(ステップS36)。
状態sが初期状態である場合には(ステップS36;Yes)、従来装置は、状態を新規作成し、状態IDをcode(a)に設定し、状態sの通常遷移先g[code(a)]をcode(a)に設定し(ステップS37)、ステップS39に移行する。一方、状態sが初期状態でない場合には(ステップS36;No)、従来装置は、状態を新規作成し、状態IDを変数jの値に設定し、状態sの通常遷移先g[code(a)]を変数jの値に設定する。そして、従来装置は、変数jの値を1加算し(ステップS38)、ステップS39に移行する。
そして、従来装置は、状態sに文字aの通常遷移先g[code(a)]を代入し(ステップS39)、ステップS31に移行する。
次に、図3のステップS12に示したフェイラ遷移追加処理について説明する。図6および図7は、従来のフェイラ遷移追加処理の処理手順を示すフローチャートである。図6に示すように、従来装置は、初期状態から通常遷移先となる状態を判定し、判定した状態をキュー(queue)に登録する(ステップS40)。
そして、従来装置は、キューに登録された状態(状態定義)のフェイラ遷移先に初期状態を登録し(ステップS41)、キューに状態が存在するか否かを判定する(ステップS42)。キューに状態が存在しない場合には(ステップS42;No)、従来装置は、現在のトライTをACマシンαとして出力する(ステップS43)。
一方、キューに状態が存在する場合には(ステップS42;Yes)、従来装置は、キューの先頭の状態を取り出し、取り出した状態を状態sに設定する(ステップS44)。このとき、従来装置は、キューから、取り出した状態を除去する。そして、従来装置は、状態sの通常遷移先が全てNullであるか否かを判定する(ステップS45)。状態sの通常遷移先が全てNullの場合には(ステップS45;Yes)、従来装置は、ステップS42に移行する。
一方、状態sの通常遷移先が全てNullではない場合には(ステップS45;No)、従来装置は、状態sにおいて、g[code(a)]≠Nullとなるすべての文字aを抽出し、抽出した文字aを集合Aに格納する(ステップS46)。
続いて、従来装置は、集合Aに文字が存在するか否かを判定し(ステップS47)、集合Aに文字が存在しない場合には(ステップS47;No)、ステップS42に移行する。一方、集合Aに文字が存在する場合には(ステップS47;Yes)、集合Aから文字aを一つ取り出し、取り出した文字aに該当する文字を集合Aから削除する(ステップS48)。
そして、従来装置は、状態sに対する文字aの通常遷移先next=g[code(a)]を、キューの最後尾に追加する(ステップS49)。そして、従来装置は、状態sからフェイラ遷移を繰り返し、文字aに対する通常遷移先がNullにならない最初の状態を状態fに設定する(ステップS50)。そして、従来装置は、状態fに対する文字aの通常遷移先fnext=g[code(a)]を、状態nextのフェイラ遷移先に設定する(ステップS51)。
さらに、従来装置は、状態nextのフェイラ遷移先の状態にパターンリストが存在する場合に、このパターンリストを状態nextのパターンリストに追加し(ステップS52)、ステップS47に移行する。
次に、図3のステップS11で示したパターン集合ΠのトライT構築処理を、具体例を用いて説明する。図8〜図10は、従来のパターン集合Πのトライ構築処理を説明するための図である。ここでは一例として、パターン集合ΠをΠ={AC、BA、BB、BAA、BACD}とする。
まず、従来装置は、初期状態(id=256)を作成し、現在の状態を初期状態とする。そして、従来装置は、初期状態の状態定義における全ての通常遷移先を初期状態に設定する(図8、ステップS60)。そして、従来装置は、パターン集合Πからパターン「AC」を取り出す。従来装置は、文字Aを選択し、現在の状態が初期状態であるので、選択した文字Aのアスキーコード(65)を状態IDとする状態を新規作成する。そして、従来装置は、文字Aによる初期状態(id=256)の通常遷移先を通常状態(id=65)に設定し、現在の状態を通常状態(id=65)とする。次に、従来装置は、文字Cを選択し、現在の状態が初期状態でないので、「257」を状態IDとする状態を新規作成する。そして、従来装置は、文字Cによる現在の状態(id=65)の通常遷移先を照合状態(id=257)に設定し、照合状態のパターンリストを「AC」に設定する(図8、ステップS61)。文字Cは、パターン「AC」の最後尾の文字であるため、状態257は、照合状態となる。
従来装置は、初期状態(id=256)に戻り、現在の状態を初期状態とする。そして、従来装置は、パターン集合Πからパターン「BA」を取り出す。従来装置は、文字Bを選択し、現在の状態が初期状態であるので、選択した文字Bのアスキーコード(66)を状態IDとする状態を新規作成する。そして、従来装置は、文字Bによる初期状態(id=256)の通常遷移先を通常状態(id=66)に設定し、現在の状態を通常状態(id=66)とする。次に、従来装置は、文字Aを選択し、現在の状態が初期状態でないので、「258」を状態IDとする状態を新規作成する。そして、従来装置は、文字Aによる現在の状態(id=66)の通常遷移先を照合状態(id=258)に設定し、照合状態のパターンリストを「BA」に設定する(図8、ステップS62)。文字Aは、パターン「BA」の最後尾の文字であるため、状態258は、照合状態となる。
従来装置は、初期状態(id=256)に戻り、現在の状態を初期状態とする。そして、従来装置は、パターン集合Πからパターン「BB」を取り出し、文字Bを選択する。ここで、文字Bによる初期状態(id=256)の通常遷移先は通常状態(id=66)であり、既に作成済みであるため、現在の状態を通常状態(id=66)に遷移する。また、従来装置は、文字Bを選択し、文字Bによる通常状態(id=66)の通常遷移先を照合状態(id=259)に設定し、パターンリストを「BB」に設定する(図9、ステップS63)。文字Bは、パターン「BB」の最後尾の文字であるため、状態259は、照合状態となる。
従来装置は、初期状態(id=256)に戻り、現在の状態を初期状態とする。そして、従来装置は、パターン集合Πからパターン「BAA」を取り出し、文字Bを選択する。ここで、文字Bによる初期状態(id=256)の通常遷移先は、通常状態(id=66)であり、既に作成済みであるため、現在の状態を通常状態(id=66)に遷移する。また、従来装置は、文字Aを選択する。ここで、文字Aによる通常状態(id=66)の通常遷移先は、照合状態(id=258)であり、既に作成済みであるため、現在の状態を照合状態(id=258)に設定する。また、従来装置は、文字Aを選択する。文字Aによる照合状態(id=258)の通常遷移先を照合状態(id=260)に設定し、パターンリストを「BAA」に設定する(図9、ステップS64)。文字Aは、パターン「BAA」の最後尾の文字であるため、状態260は、照合状態となる。
従来装置は、初期状態(id=256)に戻り、現在の状態を初期状態とする。そして、従来装置は、パターン集合Πからパターン「BACD」を取り出し、文字Bを選択する。ここで、文字Bによる初期状態(id=256)の通常遷移先は、通常状態(id=66)であり、既に登録済みであるため、現在の状態を通常状態(id=66)に遷移する。また、従来装置は、文字Aを選択する。ここで、文字Aによる通常状態(id=66)の通常遷移先は、照合状態(id=258)であり、既に作成済みであるため、現在の状態を照合状態(id=258)に設定する。
また、従来装置は、文字Cを選択し、文字Cによる照合状態(id=258)の通常遷移先を通常状態(id=261)に設定する。また、従来装置は、文字Dを選択し、文字Dによる通常状態(id=261)の通常遷移先を照合状態(id=262)に設定し、パターンリストを「BACD」に設定する(図10、ステップS65)。文字Dは、パターン「BACD」の最後尾の文字であるため、状態262は、照合状態となる。ステップS65が終了した段階で、従来装置は、パターン集合Πに含まれる全てのパターンの登録を終了し、トライTの構築処理が終了する。
次に、図3のステップS12に示したフェイラ遷移追加処理を、具体例を用いて説明する。図11〜図19は、従来のフェイラ遷移追加処理を説明するための図である。
図11に示すように、従来装置は、初期状態(id=256)からの通常遷移先となる状態を判定し、判定した状態をキュー(Queue)に登録し、キューに登録された状態のフェイラ遷移先に初期状態256を登録する。ここで、初期状態の通常遷移先は、通常状態65、66となるので、キューに65、66を登録する。また、通常状態65、66のフェイラ遷移先を初期状態256に設定する。
次に、従来装置は、キューの先頭の状態65を取り出し、取り出した状態65を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Aに格納する。この場合は、従来装置は、文字Cを抽出し、集合Aに文字Cを格納する。
図12に示すように、従来装置は、集合Aから文字Cを取り出し、状態s(状態65)の通常遷移先となる状態257(状態next)をキューの最後尾に追加する。従来装置は、状態65からフェイラ遷移した初期状態256に移行し、文字Cに対する通常遷移先を判定することで、状態next(状態257)のフェイラ遷移先を判定すると、初期状態256となる。そして、従来装置は、状態next(状態257)のフェイラ遷移先を初期状態256に設定する。
図13に示すように、従来装置は、キューの先頭の状態66を取り出し、取り出した状態66を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Aに格納する。この場合は、従来装置は、文字A、Bを抽出し、集合Aに文字A、Bを格納する。
従来装置は、集合Aから文字Aを取り出し、状態s(状態66)の文字Aの通常遷移先となる状態258(状態next)をキューの最後尾に追加する。従来装置は、状態sからフェイラ遷移した初期状態(id=256)に移行し、文字Aに対する通常遷移先を判定することで、状態next(状態258)のフェイラ遷移先を判定すると、状態65となる。そして、従来装置は、状態next(状態258)のフェイラ遷移先を状態65に設定する。(図13の状態258参照)。
従来装置は、集合Aから文字Bを取り出し、状態s(通常状態66)の文字Bの通常遷移先となる状態259(状態next)をキューの最後尾に追加する。従来装置は、状態sからフェイラ遷移した初期状態256に移行し、文字Bに対する通常遷移先を判定することで、状態next(状態259)のフェイラ遷移先を判定すると、状態66となる。そして、従来装置は、状態next(状態259)のフェイラ遷移先を通常状態66に設定する。(図13の状態259参照)。
図14に示すように、従来装置は、キューの先頭の状態257を取り出し、取り出した状態257を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Aに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する。
図15に示すように、従来装置は、キューの先頭の状態258を取り出し、取り出した状態258を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Aに格納する。この場合は、従来装置は、文字A、Cを抽出し、集合Aに文字A、Cを格納する。
従来装置は、集合Aから文字Aを取り出し、状態s(照合状態258)の文字Aの通常遷移先となる状態260(状態next)をキューの最後尾に追加する。従来装置は、状態sからフェイラ遷移した状態65に移行する。状態65において、文字Aに対する通常遷移先はNullであるため、再度フェイラ遷移し、初期状態256に移行する。
そして、初期状態256において、文字Aに対する通常遷移先を判定することで、状態next(状態260)のフェイラ遷移先を判定すると、状態65となる。そして、従来装置は、状態next(状態260)のフェイラ遷移先を通常状態65に設定する(図15の状態260参照)。
従来装置は、集合Aから文字Cを取り出し、状態s(照合状態258)の文字Cの通常遷移先となる状態261(状態next)をキューの最後尾に追加する。従来装置は、状態sからフェイラ遷移した状態65に移行し、文字Cに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態257となる。そして、従来装置は、状態next(状態261)のフェイラ遷移先を照合状態257に設定する。
また、従来装置は、状態next(状態261)のフェイラ遷移先が照合状態257となるため、状態257のパターンリストを状態261のパターンリストに追加することで、状態261を照合状態261に設定する(図15の状態261参照)。
図16に示すように、従来装置は、キューの先頭の状態259を取り出し、取り出した状態259を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Aに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する。
図17に示すように、従来装置は、キューの先頭の状態260を取り出し、取り出した状態260を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Aに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する。
図18に示すように、従来装置は、キューの先頭の状態261を取り出し、取り出した状態261を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Aに格納する。この場合は、従来装置は、文字Dを抽出し、集合Aに文字Dを格納する。
従来装置は、集合Aから文字Dを取り出し、状態s(照合状態261)の文字Dの通常遷移先となる状態262(状態next)をキューの最後尾に追加する。従来装置は、状態sからフェイラ遷移した状態257に移行する。状態257において、文字Dに対する通常遷移先はNullであるため、再度フェイラ遷移し、初期状態256に移行する。
そして、初期状態256において、文字Dに対する通常遷移先を判定することで、状態next(状態262)のフェイラ遷移先を判定すると、初期状態256となる。そして、従来装置は、状態next(状態262)のフェイラ遷移先を初期状態256に設定する(図18の状態262参照)。
図19に示すように、従来装置は、キューの先頭の状態262を取り出し、取り出した状態262を状態sに設定する。従来装置は、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Aに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する。そして、従来装置は、キューに状態が存在しなくなった場合に、パターン集合ΠのACマシンの構築を完了する。
次に、従来のACマシンを用いたテキストデータのパターン照合処理について説明する。図20は、従来のパターン照合処理の処理手順を示すフローチャートである。図20に示すように、従来装置は、状態sをACマシンαの初期状態とし(ステップS70)、オフセットd=0に設定し、集合Rを空集合に設定する(ステップS71)。
従来装置は、テキストデータDに(d+1)文字目が存在するか否かを判定し(ステップS72)、(d+1)文字目が存在しない場合には(ステップS72;No)、集合Rを出力する(ステップS73)。
一方、テキストデータDに(d+1)文字目が存在する場合には(ステップS72;Yes)、従来装置は、(d+1)文字目の文字を文字aに設定し(ステップS74)、d=d+1とする(ステップS75)。
続いて、従来装置は、状態sに文字aの通常遷移先が存在するか否かを判定する(ステップS76)。通常遷移先が存在する場合には(ステップS76;Yes)、従来装置は、状態sのg[code(a)]を状態sに代入する(ステップS77)。そして、従来装置は、状態sが照合状態の場合に、状態sのパターンリストをオフセットdに対応付けて集合Rに登録し(ステップS78)、ステップS72に移行する。
通常遷移先が存在しない場合には(ステップS76;No)、従来装置は、状態sのフェイラ遷移先を状態sに代入し(ステップS79)。そして、従来装置は、状態sが照合状態の場合に、状態sのパターンリストをオフセットdに対応付けて集合Rに登録し(ステップS80)、さらに文字aの存在を判定すべく、ステップS76に移行する。
次に、図20に示したパターン照合処理を、具体例を用いて説明する。図21〜図26は、従来のパターン照合処理を説明するための図である。ここでは一例として、パターン集合ΠをΠ={AC、BA、BB、BAA、BACD}としたACマシンαを用い、テキストデータDを「CBAAC」として説明を行う。
図21に示すように、従来装置は、状態sをACマシンαの初期状態256に設定し、集合Rを空集合に設定する。
図22に示すように、従来装置は、テキストデータDから文字Cを読み出し、オフセットをd=1に設定する。状態sに文字Cによる通常遷移先が存在しないので、従来装置は、状態sをフェイラ遷移させ、状態sをフェイラ遷移先の初期状態256に設定する。
図23に示すように、従来装置は、テキストデータDから文字Bを読み出し、オフセットをd=2に設定する。状態s(初期状態256)において、文字Bによる通常遷移先は、状態66となるので、従来装置は、状態sを状態66に設定する。
図24に示すように、従来装置は、テキストデータDから文字Aを読み出し、オフセットをd=3に設定する。状態s(通常状態66)において、文字Aによる通常遷移先は、状態258となるので、従来装置は、状態sを状態258に設定する。状態sが照合状態となったので、従来装置は、状態sのパターンリスト「BA」をオフセット「3」に対応付けて集合Rに登録する。
図25に示すように、従来装置は、テキストデータDから文字Aを読み出し、オフセットをd=4に設定する。状態s(照合状態258)において、文字Aによる通常遷移先は、状態260となるので、従来装置は、状態sを状態260に設定する。状態sが照合状態となったので、従来装置は、状態sのパターンリスト「BAA」をオフセット「4」に対応付けて集合Rに登録する。
図26に示すように、従来装置は、テキストデータDから文字Cを読み出し、オフセットをd=5に設定する。状態s(照合状態260)において、文字Cによる通常遷移先は、存在しないので、フェイラ遷移し、状態sを状態65に設定する。状態sにおいて、文字Cによる通常遷移先は、状態257となるので、従来装置は、状態sを状態257に設定する。状態sが照合状態となったので、従来装置は、状態sのパターンリスト「AC」をオフセット「5」に対応付けて集合Rに登録する。
従来装置は、図26に示した集合Rを、照合結果として出力する。かかる照合結果を参照すると、テキストデータのオフセット3にキーワード「BA」が存在し、オフセット4にキーワード「BAA」が存在し、オフセット5にキーワード「AC」が存在することが分かる。
ところで、ACマシンを用いたパターン照合処理は、CPUの処理負荷を避けるために、例えばFPGA(Field-Programmable Gate Array)で実行されている。しかし、FPGAでは、処理性能がCPUに比べて低いことが多いので、パターン照合処理を効率化することが望まれている。そこで、FPGAでは、従来のACマシンを共有化し、テキストデータ(文字列)のパターン照合の処理を並列化している。
図27は、FPGAにおける従来のACマシンを共有した場合の回路構成の一例を示す図である。図27に示す例では、FPGAは、3つのチャネルと1つのACマシンとを有する。ACマシンは、3つのチャネルから入力されるそれぞれの入力文字列の入力文字を状態情報とともに取得する。そして、ACマシンは、各状態の状態定義に基づいて、それぞれの状態情報が示す状態に、取得されたそれぞれの入力文字の通常遷移先が存在するか否かを、並列して判定する。そして、ACマシンは、判定の結果、通常遷移先が存在する場合に、通常遷移先を次の状態として入力元のチャネルに出力し、通常遷移先が存在しない場合に、フェイラ遷移先を次の状態として入力元のチャネルに出力する。
しかし、図21に示すACマシンをそのまま適用すると、照合開始時の場合、ACマシンは、すべてのチャネルから状態情報として初期状態を取得するので、照合処理が競合してしまう。つまり、同じ状態定義へのアクセスは1チャネルずつしかできないところ、初期状態の状態定義へのアクセスで競合が発生してしまう。また、別の例では、ACマシンは、2つのチャネルからの照合処理でどちらともフェイラ遷移先が初期状態であった場合、次の照合時に2つのチャネルから状態情報として初期状態を取得するので、照合処理が競合してしまう。つまり、初期状態の状態定義へのアクセスで競合が発生してしまう。このように、照合開始時の場合や2つのチャネルからの照合処理でどちらともフェイラ遷移先が初期状態であった場合には、ACマシンは、並列処理を効率的に行うことができない。
そこで、かかる問題を解決するために、以下に実施例に係る照合装置について説明する。
[実施例に係る照合装置の概要]
まず、実施例に係る照合装置の概要について説明する。図28は、実施例に係る照合装置の概要を説明するための図である。図28に示すように、照合装置は、初期状態から遷移させる従来のACマシンを構築する。パターン集合Πは、図28の例では、Π={cell、ice}である。遷移の実線は、通常遷移であり、遷移の破線は、フェイラ遷移である。そして、フェイラ遷移が示されていない状態は、すべて初期状態へのフェイラ遷移を持っている。
照合装置は、従来のACマシンを構築した後、構築した結果生成されたトライ構造に、テキストデータの1文字目の文字として用いられる可能性のある全ての文字に対応する第一ノードを追加する。図28の例では、16進数の0x00(10進数の0)〜0xff(10進数の255)に対応する第一ノードn0を追加している。例えば、文字cは、16進数の0x43(10進数の67)に対応する。文字eは、16進数の0x45(10進数の69)に対応する。そして、照合装置は、追加した第一ノードのフェイラ遷移を初期状態に設定する。さらに、照合装置は、追加して得られた状態定義から初期状態を表す初期状態ノードを削除し、新たなトライ構造を生成する。
そして、照合装置は、パターン照合処理において、テキストデータの1文字目を読み出したとき、生成したトライ構造の中の、読み出した1文字目に対応する第一ノードへ遷移する。また、照合装置は、テキストデータの文字を読み出したとき、読み出した文字のトライ構造を用いた照合の結果、初期状態へのフェイラ遷移となる場合、読み出した文字に対応する第一ノードへ遷移する。例えば、照合装置は、テキストデータの1文字目が「e」である場合、照合装置は、テキストデータから読み出した「e」に対応する第一ノードj0に遷移する。また、状態j1においてテキストデータの文字「i」を読み出したとき、照合装置は、初期状態へのフェイラ遷移となるので、読み出した文字「i」に対応する第一ノードj3へ遷移する。
したがって、実施例に係る照合装置は、ACマシンを共有化してテキストデータのパターン照合の処理を並列化しても、トライ構造について、アクセス頻度が高い初期状態を削除し、アクセスを分散するようにしたので、並列処理を効率的に行うことができる。
[実施例に係る照合装置の構成]
次に、実施例に係る照合装置100の構成について説明する。図29は、実施例に係る照合装置の構成を示す図である。図29に示すように、照合装置100は、入力部110と出力部120と入出力制御部130と記憶部140と制御部150とを有する。
入力部110は、パターン集合、テキストデータなどを入力し、キーボードやマウス、マイクなどに対応する。出力部120は、ACマシンによる照合結果などを出力し、モニタ(もしくはディスプレイ、タッチパネル)に対応する。入出力制御部130は、入力部110、出力部120、記憶部140、制御部150によるデータの入出力を制御する。
記憶部140は、制御部150による各種処理に必要なデータおよびプログラムを記憶する。さらに、記憶部140は、パターン集合140aおよびACマシン140bを有する。
パターン集合140aは、テキストデータを照合するキーワードの集合である。実施例では一例として、パターン集合140aを、Π={AC、BA、BB、BAA、BACD}とする。
ACマシン140bは、パターン集合140aに基づいて生成されるオートマトンである。例えば、パターン集合Π={AC、BA、BB、BAA、BACD}に対応するACマシンは、図28の下図に示したACマシンとなる。ACマシン140bは、複数の状態定義から構成されている。状態定義は、状態定義表に格納される。なお、状態定義表は、例えば、RAM(Random Access Memory)、フラッシュメモリ(flash memory)等の半導体メモリ素子に対応する。
図30は、実施例に係る状態定義表のデータ構造の一例を示す図である。図30に示すように、状態定義表200は、複数の状態定義を記憶する。状態定義は、図2と同様に、各状態を識別する状態IDと、パターンリストと、通常遷移先と、フェイラ遷移先とを有する。状態定義の各内容は、図2と同様であるので、その説明は、省略する。
状態定義表200は、複数存在する。各状態定義表200は、状態定義を、所定のグループに分割したグループごとに作成される。1つの例では、状態定義表200は、10個の状態定義を1つのグループとして作成されても良いし、20個の状態定義を1つのグループとして作成されても良い。また、状態定義表200は、1個の状態定義を1つのグループとして作成されても良い。なお、ACマシン140bの生成は、ACマシン構築部150aによって行われる。
図29に戻ると、制御部150は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。さらに、制御部150は、ACマシン構築部150aと照合部150bと照合結果出力部150cとを有する。なお、例えば、制御部150は、FPGA(Field Programmable Gate Array)やASIC(Application Specific Integrated Circuit)などの集積回路である。
ACマシン構築部150aは、パターン集合140aに基づいて、初期状態がないACマシン140cを作成する。例えば、ACマシン構築部150aは、初期状態がないACマシン140cを作成する場合に、初めにトライ構築処理を行った後に、フェイラ遷移追加処理を実行する。かかるトライ構築処理およびフェイラ遷移追加処理は、図4〜図7で示した処理と同様であるので、その説明は省略する。また、ACマシン構築部150aは、生成したACマシンに対して、照合対象であるテキストデータの文字として用いられる可能性のある全ての文字に対応するノードを第一ノードとして追加する。また、ACマシン構築部150aは、追加した第一ノードのフェイラ遷移を、初期状態を表す初期状態ノードに設定する。さらに、ACマシン構築部150aは、第一ノードを追加して得られた状態定義表から初期状態ノードを削除する処理を行うことで、初期状態がないACマシン140cを作成する。ここで、第一ノードは、追加ノードの一例として挙げられる。初期状態ノードは、ルートノードの一例として挙げられる。
[第一ノード追加処理および初期状態ノード削除処理の具体例]
ここで、ACマシン構築部150aが実行する、第一ノードを追加し、初期状態ノードを削除する処理について、図31〜図34を参照して、具体的に説明する。図31〜図34は、実施例に係る第一ノード追加処理および初期状態ノード削除処理を説明するための図である。なお、パターン集合140aをΠ={AC、BA、BB、BAA、BACD}とするACマシンが、既に生成されているとする。
まず、図31に示すように、ACマシン構築部150aは、文字コード0に対応する状態がまだ存在していないので、状態を新規作成し、作成した状態の状態定義表における状態IDを0とし、フェイラ遷移先に初期状態(id=256)を代入する。すなわち、ACマシン構築部150aは、文字コード0に対応する状態を表す状態ノードを第一ノードとして追加する。
次に、図32に示すように、ACマシン構築部150aは、文字コード1に対応する状態が存在していないので、状態を新規作成し、作成した状態の状態定義における状態IDを1とし、フェイラ遷移先に初期状態(id=256)を代入する。すなわち、ACマシン構築部150aは、文字コード1に対応する状態を表す状態ノードを第一ノードとして追加する。
さらに、図33に示すように、ACマシン構築部150aは、文字コード2から255までについても、文字コード0や1の場合と同様に、文字コードに対応する状態を新規作成する。なお、文字コード65、66の場合は、各文字コードに対応する状態が既に存在しているので、ACマシン構築部150aは、次の文字コードの処理に移行するだけとなる。
そして、図34に示すように、ACマシン構築部150aは、文字コードが文字コードの最大の値(255)より1だけ大きい値を示す256と一致したので、初期状態を表す初期状態ノードを削除する。このように、ACマシン構築部150aは、初期状態がないACマシンを構築する。
図29に戻って、照合部150bは、照合対象であるテキストデータの最初の文字を読み出したとき、初期状態がないACマシン140bの中の、読み出した文字に対応する第一ノードへ遷移する。そして、照合部150bは、テキストデータの次に読み出した文字について、ACマシン140bの次の文字桁の文字と照合する。また、照合部150bは、テキストデータの読み出した文字を照合した結果、フェイラ遷移に基づいて初期状態へ遷移するときに、読み出した文字に対応する第一ノードへ遷移する。そして、照合部150bは、テキストデータの次に読み出した文字について、ACマシン140bの次の文字桁の文字と照合する。また、照合部150bは、照合結果を出力する。
[照合装置の具体例]
ここで、照合部150bが実行する照合処理を実現するための照合装置100の具体例を、図35を参照して説明する。図35は、実施例に係る照合装置の具体例を説明するための図である。図35に示すように、照合装置100は、3並列処理の場合の回路概要を示す。照合装置100は、3つのチャネルと初期状態なしのACマシンとを有する。各チャネルは、ビット(bit)、状態情報および入力文字のコードを記憶する。
かかる構成の下、例えば、照合部150bは、照合対象である入力文字列(テキストデータ)の最初の文字を読み出したとき、またはフェイラ遷移に基づいて初期状態のフェイラ遷移先へ遷移するとき、チャネルによって、bitを1に設定する。そして、照合部150bは、ビットが1のとき、チャネルによって、入力文字列から読み出した文字に対応した状態(第一ノード)を次の状態として状態情報に設定する。そして、照合部150bは、初期状態なしのACマシンによって、状態情報に設定された状態に、入力文字列の次に読み出した文字(入力文字)の通常遷移先が存在するか否かを判定することで照合処理を実行する。
一方、照合部150bは、通常遷移先へ遷移するとき、またはフェイラ遷移に基づいて初期状態以外のフェイラ遷移先へ遷移するとき、チャネルによって、bitを0に設定する。そして、照合部150bは、ビットが0のとき、チャネルによって、初期状態なしACマシンからの遷移結果である次の状態を状態情報に設定する。そして、照合処理部150は、初期状態なしのACマシンによって、状態情報に設定された状態に、入力文字列の次に読み出した文字(入力文字)の通常遷移先が存在するか否かを判定することで照合処理を実行する。
[照合処理の具体例]
ここで、照合部150bの処理をさらに具体的に説明する。図36〜図42は、実施例に係るパターン照合処理を説明するための図である。
ここでは、図36に示すように、パターン集合140aをΠ={AC、BA、BB、BAA、BACD}とする初期状態なしのACマシンが、既に生成されているとする。そして、照合対象となるテキストデータを「CBAAC」とする。さらに、入力文字のコードを示す入力コード、状態情報、bit、通常遷移先およびフェイラ遷移先は、まだ何も設定されていない状態である。また、集合Rは、空集合に設定されている。
図37に示すように、照合部150bは、テキストデータの1文字目(オフセット1)の文字Cを読み出し、文字Cの文字コード(67)を入力コードに書き込む。そして、照合部150bは、読み出しがテキストデータの1文字目であるのでbitを1に設定する。そして、照合部150bは、bitが1であるので、文字Cの文字コード(67)を状態情報に書き込む。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態67とする。
続いて、図38に示すように、照合部150bは、テキストデータの2文字目(オフセット2)の文字Bを読み出し、文字Bの文字コード(66)を入力コードに書き込む。そして、照合部150bは、状態情報および入力コードを用いて、現在の状態67の文字Bによる遷移先を判定すると、状態67の文字Bによる通常遷移先がNULLでありフェイラ遷移先が初期状態(256)であるので、bitを1に設定する。そして、照合部150bは、bitが1であるので、読み出した文字Bの文字コード(66)を状態情報に書き込む。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態66とする。
続いて、図39に示すように、照合部150bは、テキストデータの3文字目(オフセット3)の文字Aを読み出し、文字Aの文字コード(65)を入力コードに書き込む。そして、照合部150bは、状態情報および入力コードを用いて、現在の状態66の文字Aによる遷移先を判定すると、状態66の文字Aによる通常遷移先が状態258であるので、bitを0に設定する。そして、照合部150bは、bitが0であるので、遷移結果である状態258を状態情報に書き込む。そして、照合部150bは、状態258が照合状態であるので、状態258のパターンリスト(BA)をオフセット3に対応付けて集合Rに追加する。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態258とする。
続いて、図40に示すように、照合部150bは、テキストデータの4文字目(オフセット4)の文字Aを読み出し、文字Aの文字コード(65)を入力コードに書き込む。そして、照合部150bは、状態情報および入力コードを用いて、現在の状態258の文字Aによる遷移先を判定すると、状態258の文字Aによる通常遷移先が状態260であるので、bitを0に設定する。そして、照合部150bは、bitが0であるので、遷移結果である状態260を状態情報に書き込む。そして、照合部150bは、状態260が照合状態であるので、状態260のパターンリスト(BAA)をオフセット4に対応付けて集合Rに追加する。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態260とする。
続いて、図41に示すように、照合部150bは、テキストデータの5文字目(オフセット5)の文字Cを読み出し、文字Cの文字コード(67)を入力コードに書き込む。そして、照合部150bは、状態情報および入力コードを用いて、現在の状態260の文字Cによる遷移先を判定すると、状態260の文字Cによる通常遷移先がNULLでありフェイラ遷移先が状態65であるので、bitを0に設定する。そして、照合部150bは、bitが0であるので、遷移結果である状態65を状態情報に書き込む。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態65とする。
さらに、図42に示すように、照合部150bは、状態情報および入力コードを用いて、現在の状態65の文字Cによる遷移先を再度判定すると、状態65の文字Cによる通常遷移先が257であるので、bitを0に設定する。そして、照合部150bは、bitが0であるので、遷移結果である状態257を状態情報に書き込む。そして、照合部150bは、状態257が照合状態であるので、状態257のパターンリスト(AC)をオフセット5に対応付けて集合Rに追加する。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態257とする。照合部150bは、テキストデータの最後の文字に対する遷移先を判定した後に、パターン照合処理を終了する。
[ACマシンを構築する処理手順]
次に、実施例に係る照合装置100の処理手順について説明する。図43は、実施例に係る照合装置がACマシンを構築する処理手順を示すフローチャートである。図43に示すように、ACマシン構築部150aは、パターン集合Π(照合対象となるキーワードの集合)を取得し(ステップS101)、パターン集合ΠのトライT(Π)を構築する(ステップS102)。そして、ACマシン構築部150aは、トライT(Π)にフェイラ遷移を追加し、その結果をACマシンα(Π)とする(ステップS103)。そして、ACマシン構築部150aは、ACマシンα(Π)に存在しない第一ノードをACマシンα(Π)に追加し、ACマシンα(Π)から初期状態ノードを削除し、その結果をACマシンβ(Π)とする(ステップS104)。そして、ACマシン構築部150aは、ACマシンβ(Π)を、例えばRAMに書き込む(ステップS105)。
なお、図43のステップS102に示したパターン集合ΠのトライT(Π)を構築する処理は、図4に示した処理と同様であるので、その説明は、省略する。また、図43のステップS103に示したフェイラ遷移追加処理は、図6および図7に示した処理と同様であるので、その説明は、省略する。
[第一ノード追加処理および初期状態ノード削除処理の手順]
次に、図43のステップS104に示した第一ノードを追加し、初期状態ノードを削除する処理について説明する。図44は、実施例に係る第一ノード追加処理および初期状態ノード削除処理の処理手順を示すフローチャートである。図44に示すように、ACマシン構築部150aは、文字コードcに0を設定する(ステップS201)。
そして、ACマシン構築部150aは、文字コードcがあらかじめ定められた文字コードのサイズNと一致しているか否かを判定する(ステップS202)。ここで、Nは、文字コードの最大の値(255)より1だけ大きい値であれば良く、例えば256である。文字コードcがNと一致していないと判定した場合(ステップS202;No)、ACマシン構築部150aは、ACマシンαの初期状態の通常遷移先g[c]がNullであるか否かを判定する(ステップS203)。すなわち、ACマシン構築部150aは、初期状態の状態定義に基づいて、文字コードcに対応する状態が存在しないかどうかを判断する。
初期状態の通常遷移先g[c]がNullである場合には(ステップS203;Yes)、ACマシン構築部150aは、ACマシンαに文字コードcの状態が存在しないと判断し、第一ノードを生成する。すなわち、ACマシン構築部150aは、状態を新規作成し、作成した状態(状態定義)のフェイラ遷移先に初期状態を代入し、状態IDをcとする(ステップS204)。そして、ACマシン構築部150aは、ステップS205に移行する。一方、初期状態の通常遷移先g[c]がNullでない場合には(ステップS203;No)、ACマシン構築部150aは、ステップS205に移行する。
そして、ACマシン構築部150aは、文字コードcを1加算し(ステップS205)、ステップS202に移行する。
一方、文字コードcがNと一致していると判定した場合(ステップS202;Yes)、ACマシン構築部150aは、ACマシンαに文字コードcの状態がすべて存在したと判断し、初期状態を削除する(ステップS206)。そして、ACマシン構築部150aは、完成したACマシンβを出力する(ステップS207)。
[照合処理の処理手順]
次に、実施例に係る照合装置が実行する照合処理の処理手順について説明する。図45は、実施例に係る照合処理の処理手順を示すフローチャートである。図45に示すように、照合装置100では、照合部150bが、オフセットd=1に設定し、集合Rを空集合に設定する(ステップS301)。そして、照合部150bは、テキストデータDの1文字目の文字を読み出し、読み出した文字の文字コードを状態s(状態情報)に書き込む(ステップS302)。すなわち、照合部150bは、テキストデータDの1文字目の読み出し時に読み出した文字に対応する第一ノードへ遷移する。
照合部150bは、テキストデータDに(d+1)文字目が存在するか否かを判定し(ステップS303)、(d+1)文字目が存在しない場合には(ステップS303;No)、集合Rを出力する(ステップS304)。
一方、テキストデータDに(d+1)文字目が存在する場合には(ステップS303;Yes)、照合部150bは、テキストデータDの(d+1)文字目の文字を読み出し、文字aに設定し(ステップS305)、d=d+1とする(ステップS306)。
続いて、照合部150bは、状態sの状態定義に基づいて、状態sに文字aの通常遷移先が存在するか否かを判定する(ステップS307)。通常遷移先が存在する場合には(ステップS307;Yes)、照合部150bは、状態sの通常遷移先g[code(a)]を状態s(状態情報)に書き込む(ステップS308)。そして、照合部150bは、状態sが照合状態の場合に、状態sのパターンリストをオフセットdに対応付けて集合Rに追加し(ステップS309)、次の文字を読み出すべく、ステップS303に移行する。
通常遷移先が存在しない場合には(ステップS307;No)、照合部150bは、フェイラ遷移に遷移すると判断し、状態sの状態定義に基づいて、フェイラ遷移先が初期状態であるか否かを判定する(ステップS310)。フェイラ遷移先が初期状態でない場合には(ステップS310;No)、照合部150bは、状態sのフェイラ遷移先を状態s(状態情報)に書き込む(ステップS311)。そして、照合部150bは、状態sが照合状態の場合に、状態sのパターンリストをオフセットdに対応付けて集合Rに追加し(ステップS312)、再度同じ文字aの遷移を判定すべく、ステップS307に移行する。
フェイラ遷移先が初期状態である場合には(ステップS310;Yes)、照合部150bは、文字aの文字コードcode(a)を状態s(状態情報)に書き込む(ステップS313)。すなわち、照合部150bは、初期状態を表す初期状態ノードへのフェイラ遷移時に、読み出した文字aに対応する第一ノードへ遷移する。そして、照合部150bは、次の文字を読み出すべく、ステップS309を介してステップS303に移行する。
[並列して照合した場合の照合処理の具体例]
次に、照合部150bがチャネルごとに並列して照合した場合について、具体的に説明する。図46〜図52は、並列して照合した場合のパターン照合処理を説明するための図である。
ここでは、図46に示すように、パターン集合140aをΠ={AC、BA、BB、BAA、BACD}とする初期状態なしのACマシンが、既に生成されているとする。この初期状態なしのACマシンには、説明の便宜上、状態ごとに状態定義表が作成されているとする。また、チャネル1(Ch1)の照合対象となるテキストデータを「CBABC」とする。チャネル2(Ch2)の照合対象となるテキストデータを「BCAAC」とする。さらに、チャネル毎の入力文字のコードである入力コード、状態情報、bit、通常遷移先およびフェイラ遷移先は、それぞれまだ何も設定されていない状態である。また、チャネル1用の集合R1、チャネル2用の集合R2は、それぞれ空集合に設定されている。
図47に示すように、Ch1およびCh2では、照合部150bが、テキストデータの1文字目(オフセット1)の文字を読み出し、照合処理を実行する。Ch1では、照合部150bは、テキストデータの1文字目(オフセット1)の文字Cを読み出し、文字Cの文字コード(67)を入力コードに書き込む。そして、照合部150bは、読み出しがテキストデータの1文字目であるのでbitを1に設定する。そして、照合部150bは、bitが1であるので、文字Cの文字コード(67)を状態情報に書き込む。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態67とする。
一方、Ch2では、照合部150bは、テキストデータの1文字目(オフセット1)の文字Bを読み出し、文字Bの文字コード(66)を入力コードに書き込む。そして、照合部150bは、読み出しがテキストデータの1文字目であるのでbitを1に設定する。そして、照合部150bは、bitが1であるので、文字Bの文字コード(66)を状態情報に書き込む。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態66とする。
図48に示すように、Ch1およびCh2では、照合部150bが、テキストデータの2文字目(オフセット2)の文字を読み出し、照合処理を実行する。Ch1では、照合部150bは、テキストデータの2文字目(オフセット2)の文字Bを読み出し、文字Bの文字コード(66)を入力コードに書き込む。そして、照合部150bは、状態情報および入力コードを用いて、現在の状態67の文字Bによる遷移先を判定すると、状態67の文字Bによる通常遷移先がNULLでありフェイラ遷移先が初期状態(256)であるので、bitを1に設定する。そして、照合部150bは、bitが1であるので、読み出した文字Bの文字コード(66)を状態情報に書き込む。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態66とする。
一方、Ch2では、照合部150bは、テキストデータの2文字目(オフセット2)の文字Cを読み出し、文字Cの文字コード(67)を入力コードに書き込む。そして、照合部150bは、状態情報および入力コードを用いて、現在の状態66の文字Cによる遷移先を判定すると、状態66の文字Cによる通常遷移先がNULLでありフェイラ遷移先が初期状態(256)であるので、bitを1に設定する。そして、照合部150bは、bitが1であるので、読み出した文字Cの文字コード(67)を状態情報に書き込む。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態67とする。
図49に示すように、Ch1およびCh2では、照合部150bが、テキストデータの3文字目(オフセット3)の文字を読み出し、照合処理を実行する。Ch1では、照合部150bは、テキストデータの3文字目(オフセット3)の文字Aを読み出し、文字Aの文字コード(65)を入力コードに書き込む。そして、照合部150bは、状態情報および入力コードを用いて、現在の状態66の文字Aによる遷移先を判定すると、状態66の文字Aによる通常遷移先が状態258であるので、bitを0に設定する。そして、照合部150bは、bitが0であるので、遷移結果である状態258を状態情報に書き込む。そして、照合部150bは、状態258が照合状態であるので、状態258のパターンリスト(BA)をオフセット3に対応付けて集合R1に追加する。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態258とする。
一方、Ch2では、照合部150bは、テキストデータの3文字目(オフセット3)の文字Aを読み出し、文字Aの文字コード(65)を入力コードに書き込む。そして、照合部150bは、状態情報および入力コードを用いて、現在の状態67の文字Aによる遷移先を判定すると、状態67の文字Aによる通常遷移先がNULLでありフェイラ遷移先が初期状態(256)であるので、bitを1に設定する。そして、照合部150bは、bitが1であるので、読み出した文字Aの文字コード(65)を状態情報に書き込む。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態65とする。
図50に示すように、Ch1およびCh2では、照合部150bが、テキストデータの4文字目(オフセット4)の文字を読み出し、照合処理を実行する。Ch1では、照合部150bは、テキストデータの4文字目(オフセット4)の文字Bを読み出し、文字Bの文字コード(66)を入力コードに書き込む。そして、照合部150bは、状態情報および入力コードを用いて、現在の状態258の文字Bによる遷移先を判定すると、状態258の文字Bによる通常遷移先がNULLでありフェイラ遷移先が状態65であるので、bitを0に設定する。そして、照合部150bは、bitが0であるので、遷移結果である状態65を状態情報に書き込む。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態65とする。
一方、Ch2では、照合部150bは、テキストデータの4文字目(オフセット4)の文字Aを読み出し、文字Aの文字コード(65)を入力コードに書き込む。そして、照合部150bは、状態情報および入力コードを用いて、現在の状態65の文字Aによる遷移先を判定すると、状態65の文字Aによる通常遷移先がNULLでありフェイラ遷移先が初期状態(256)であるので、bitを1に設定する。そして、照合部150bは、bitが1であるので、読み出した文字Aの文字コード(65)を状態情報に書き込む。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態65とする。このとき、状態65の状態定義のアクセスで競合が発生する。
図51に示すように、Ch1では、照合部150bが、再度同じ4文字目の文字Bの照合処理を実行し、Ch2では、照合部150bが、テキストデータの5文字目(オフセット5)の文字を読み出し、照合処理を実行する。Ch1では、照合部150bは、状態情報および入力コードを用いて、現在の状態65の文字Bによる遷移先を再度判定すると、状態65の文字Bによる通常遷移先がNULLでありフェイラ遷移先が初期状態(256)であるので、bitを1に設定する。そして、照合部150bは、bitが1であるので、既に読み出した文字Bの文字コード(66)を状態情報に書き込む。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態66とする。
一方、Ch2では、照合部150bは、テキストデータの5文字目(オフセット5)の文字Cを読み出し、文字Cの文字コード(67)を入力コードに書き込む。ところが、照合部150bは、現在の状態65でCh1と競合しているので、Ch1の状態65の処理が終了するまで待つ。
図52に示すように、Ch1では、照合部150bが、テキストデータの5文字目(オフセット5)の文字を読み出し、照合処理を実行し、Ch2では、照合部150bが、状態65のCh1の処理が終了したので、既に読み出された文字Cの照合処理を実行する。Ch1では、照合部150bは、テキストデータの5文字目(オフセット5)の文字Cを読み出し、文字Cの文字コード(67)を入力コードに書き込む。そして、照合部150bは、状態情報および入力コードを用いて、現在の状態66の文字Cによる遷移先を判定すると、状態66の文字Cによる通常遷移先がNULLでありフェイラ遷移先が初期状態(256)であるので、bitを1に設定する。そして、照合部150bは、bitが1であるので、読み出した文字Cの文字コード(67)を状態情報に書き込む。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態67とする。
一方、Ch2では、照合部150bは、状態情報および入力コードを用いて、現在の状態65の文字Cによる遷移先を判定すると、状態65の文字Cによる通常遷移先が状態257であるので、bitを0に設定する。そして、照合部150bは、bitが0であるので、遷移結果である状態257を状態情報に書き込む。そして、照合部150bは、状態257が照合状態であるので、状態257のパターンリスト(AC)をオフセット5に対応付けて集合R2に追加する。そして、照合部150bは、状態情報を用いて、ACマシン上の現在の状態を状態257とする。テキストデータの最後の文字に対する遷移先を判定した後に、パターン照合処理を終了する。
このように、照合部150bは、パターン照合の処理の並列化で、テキストデータの1文字目を読み出した場合、読み出した文字に対応する状態へ遷移するので、その後の状態定義表へのアクセスを分散でき、競合を避けることができる。また、照合部150bは、パターン照合の処理の並列化で、初期状態へのフェイラ遷移時の場合、読み出した文字に対応する状態へ遷移するので、状態定義表へのアクセスを分散でき、競合を避けることができる。この結果、照合部150bは、並列処理を効率的に行うことができる。
例えば、図51において、Ch1では、状態65の文字Bによる通常遷移先がNULLでありフェイラ遷移先が初期状態(256)であるので、読み出した文字Bの文字コード(66)に対応する状態66に遷移する。図50において、Ch2では、状態65の文字Aによる通常遷移先がNULLでありフェイラ遷移先が初期状態(256)であるので、読み出した文字Aの文字コード(65)に対応する状態65に遷移する。フェイラ遷移先が初期状態(256)の場合であっても、遷移先がそれぞれ状態65と状態66とで異なるので、同じ文字Cを照合しても、状態定義表へのアクセスを分散でき、競合を避けることができる(図52参照)。
また、図47において、Ch1では、テキストデータの1文字目の文字Cを読み出したとき、文字Cの文字コード(67)に対応する状態67へ遷移する。Ch2では、テキストデータの1文字目の文字Bを読み出したとき、文字Bの文字コード(66)に対応する状態66へ遷移する。テキストデータの1文字目の文字を読み出した場合であっても、遷移先がそれぞれ状態67と状態66とで異なるので、文字の照合で、状態定義表へのアクセスを分散でき、競合を避けることができる。
図29に戻って、照合結果出力部150cは、照合部150bの照合結果を出力部120に出力する。例えば、図52に示したACマシンを用いてテキストデータのパターン照合処理を実行した場合、照合結果出力部150cは、集合R1、集合R2の情報を照合結果として出力する。集合Rの情報は、例えばテキストデータに含まれるパターンを、テキストデータ中のパターンの存在位置(オフセット)に対応付けた情報である。
ところで、状態定義表200は、状態定義を、所定のグループに分割したグループごとに作成されると説明した。例えば、状態定義表200は、4つのグループごとに作成されるとしても良い。図53は、4つの状態定義表に分割した場合のACマシンの回路構成の一例を示す図である。図53に示すように、ACマシン140bは、4つの状態定義表200−1〜4を有する。そして、ACマシン140bは、3つのチャネル1〜3からそれぞれ状態情報(状態ID)および入力コードを入力する。そして、ACマシン140bは、それぞれの状態IDの状態定義が記憶されている状態定義表200を参照し、それぞれの状態IDの、入力コードが示す文字による遷移先を判定する。そして、ACマシン140bは、遷移結果を、入力元のチャネルに出力する。これにより、同じ状態定義表へのアクセスは1チャネルずつしかできないところ、4つの状態定義表200−1〜4を有することにより、3つ以下の状態定義表を有していた場合と比べ、状態定義表へのアクセスの競合を少なくできる。
[実施例の効果]
上記実施例によれば、照合装置100は、初期状態ノードからOR条件のパターン文字列に対応するACマシンのトライ構造を生成する場合に、フェイラ遷移を設定したACマシンのトライ構造を生成する。そして、照合装置100は、生成されたトライ構造に対して、照合対象である対象文字列の文字として用いられる可能性のある全ての文字に対応するノードを第一ノードとして追加する。そして、照合装置100は、追加した第一ノードのフェイラ遷移を初期状態ノードに設定し、追加して得られたトライ構造から初期状態ノードを削除する処理を行うことで、ACマシンの新たなトライ構造を生成する。さらに、照合装置100は、照合対象である対象文字列の最初の文字を読み出したとき、トライ構造の中の、読み出した文字に対応する第一ノードへ遷移する。そして、照合装置100は、該対象文字列の次に読み出した文字について、該トライ構造の次の文字桁の文字と照合する。また、照合装置100は、該対象文字列の読み出した文字を照合した結果、フェイラ遷移に基づいて初期状態ノードへ遷移するときに、読み出した文字に対応する第一ノードへ遷移する。そして、照合装置100は、該対象文字列の次に読み出した文字について、該トライ構造の次の文字桁の文字と照合する。かかる構成によれば、照合装置100によれば、対象文字列の最初の文字の読み出し時に、トライ構造の中の、読み出した文字に対応する第一ノードへ遷移する。また、照合装置100によれば、初期状態ノードへのフェイラ遷移時に、トライ構造の中の、読み出した文字に対応する第一ノードへ遷移する。このため、照合装置100は、並列処理を行う場合、トライ構造へのアクセスが分散することになり、並列処理を効率的に行うことができる。
また、上記実施例によれば、並列処理を行う場合であっても、並列数分のACマシンとしないで1つのACマシンとすることで、ACマシンの大きさを小さくすることができるという効果がある。例えば、トライ構造の一例に挙げられる状態定義を格納するRAMの容量を小さくすることができる。ここで、状態定義を格納するRAMの容量を小さくすることができるという効果について説明する。ここでは、次の遷移先になり得るエントリの数について、上記実施例のようなACマシンが1つである場合と、ACマシンが並列数分ある場合とで比較する。
前提条件は、以下とする。ACマシンが1つである場合のACマシンは、1バイトごとに処理する方式を採用するとする。これに対し、ACマシンが並列数分ある場合のACマシンは、ACマシンの大きさを小さくする工夫として、ハーフバイト(4ビット)ごとに処理するハーフバイト方式を採用するとする。したがって、ACマシンが1つである場合のACマシンの並列数は16であるのに対し、ハーフバイト方式では32となる。また、キーワードの数は5000とし、1つのキーワード長は2バイトとする。さらに、1ハーフバイト目までのビットパターン(24種類)、2ハーフバイト目までのビットパターン(28種類)は、キーワードが5000個あるので、いずれかのキーワードに前方一致すると仮定する。3ハーフバイト目までのビットパターン(212種類)では、60%がいずれかのキーワードに前方一致すると仮定する。先頭から2バイト目までのビットパターン(216種類)は、どれも高々1つのキーワードと前方一致すると仮定する。
このような前提条件の下、上記実施例のようなACマシンが1つである場合、次の遷移先になり得るエントリの数は、1状態定義に対するエントリの数256と第一ノードの数256とキーワード数分のノードの数5000とを用いて、以下のように算出できる。
256(エントリ)×(256+5000)=1,345,536
これに対し、ACマシンが並列数分ある場合、次の遷移先になり得るエントリの数は、並列数32と1状態定義に対するエントリの数16(24)とノードの数とを用いて、算出できる。ノードの数は、初期状態ノードの数1と1ハーフバイト目のノードの数16(24)と2ハーフバイト目のノードの数256(28)と3ハーフバイト目のノードの数3000(212×0.6)とキーワード分のノードの数5000とを加算した値となる。
32(並列)×16(エントリ)×(1+16+256+3000+5000)=4,235,776
上記の算出結果から、ACマシンが1つである場合の、次の遷移先になり得るエントリ数は、ACマシンが並列数分ある場合のエントリ数を1とすると、約0.317となる。すなわち、ACマシンが1つである場合の方が、ACマシンが並列数分ある場合よりも、必要なエントリ数を約1/3にすることができる。したがって、上記実施例では、必要な状態定義を格納するRAMの容量を小さくすることができるという効果を得ることができる。
なお、ACマシン構築部150aは、FPGAを一例とする制御部150に含まれると説明した。しかしながら、ACマシン構築部150aは、これに限定されず、CPUを一例とする他の制御部に含まれるとしても良い。
[プログラムなど]
なお、照合装置100は、既知のパーソナルコンピュータ、ワークステーションなどの情報処理装置に、上記したACマシン構築部150a、照合部150bなどの各機能を搭載することによって実現することができる。
また、図示した各装置の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、照合部150bと照合結果出力部150cとを1個の部として統合しても良い。一方、ACマシン構築部150aを、トライを構築する処理部と、トライにフェイラ遷移を追加する処理部と、初期状態ノードを削除する処理部と、第一ノードを追加する処理部とに分散しても良い。また、ACマシン140bなどの記憶部を照合装置100の外部装置としてネットワーク経由で接続するようにしても良い。
また、上記実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。そこで、以下では、図29に示した照合装置100と同様の機能を実現する照合プログラムを実行するコンピュータの一例を説明する。図54は、照合プログラムを実行するコンピュータの一例を示す図である。
図54に示すように、コンピュータ200は、各種演算処理を実行するCPU201およびFPGA202と、ユーザからのデータの入力を受け付ける入力装置203と、ディスプレイ204を有する。また、コンピュータ200は、記憶媒体からプログラム等を読取る読み取り装置205と、ネットワークを介して他のコンピュータとの間でデータの授受を行うインタフェース装置206とを有する。また、コンピュータ200は、各種情報を一時記憶するRAM207と、ハードディスク装置208を有する。そして、各装置201〜208は、バス209に接続される。
ハードディスク装置208は、ACマシン構築プログラム208a、照合プログラム208bを記憶する。FPGA202は、各プログラム208a〜208bを読み出して、RAM207に展開する。ACマシン構築プログラム208aは、ACマシン構築プロセス207aとして機能する。照合プログラム208bは、照合プロセス207bとして機能する。
例えば、ACマシン構築プロセス207aは、ACマシン構築部150aに対応する。照合プロセス207bは、照合部150bに対応する。
なお、各プログラム208a〜208bについては、必ずしも最初からハードディスク装置208に記憶させておかなくてもよい。例えば、コンピュータ200に挿入されるフレキシブルディスク(FD)、CD−ROM、DVDディスク、光磁気ディスク、ICカードなどの「可搬用の物理媒体」に各プログラムを記憶させておく。そして、コンピュータ200がこれらから各プログラム208a〜208bを読み出して実行するようにしても良い。