(57)【要約】【課題】テキストから検索文字列に一致する文字列を検索するためのスキップテーブルを簡単な方法で作成して、高速マッチングを行う。【解決手段】テキストに使用される文字セットを決める。使用文字セットの各文字のうちテキストと検索文字列とにある文字に対応するシフト量を検索文字列逆順番号数とする。検索文字列に無い文字に対応するシフト量を（検索文字数＋１）とする。こうしてスキップテーブル作成部５で作成したスキップテーブルをスキップテーブル記憶部６に格納する。文字列検索部７で、検索文字列と比較するテキスト中の部分文字列の直近右側の文字を引数としてスキップテーブルを引いてシフト量を求めて、検索文字列と比較するテキスト中の次の部分文字列を決定する。その部分文字列を検索文字列と比較する。これをテキストが終わるまで繰り返す。【選択図】図１
2005190032.tif 000002
【特許請求の範囲】
【請求項１】
使用文字セットの各文字のうちテキストと検索文字列とにある文字に対応するシフト量を検索文字列逆順番号数とし、テキストに無い文字と検索文字列に無い文字に対応するシフト量を（検索文字数＋１）としてスキップテーブルを作成し、検索文字列と比較するテキスト中の部分文字列の直近右側の文字を引数としてスキップテーブルを引いてシフト量を求め、検索文字列と比較するテキスト中の次の部分文字列を決定し、部分文字列を検索文字列と比較することを特徴とする高速マッチング法。
【請求項２】
使用文字セットの各文字のうち検索文字列にある文字に対応するシフト量を検索文字列逆順番号数とし、検索文字列に無い文字に対応するシフト量を（検索文字数＋１）としてスキップテーブルを作成し、検索文字列と比較するテキスト中の部分文字列の直近右側の文字を引数としてスキップテーブルを引いてシフト量を求め、検索文字列と比較するテキスト中の次の部分文字列を決定し、部分文字列を検索文字列と比較することを特徴とする高速マッチング法。
【請求項３】
検索文字列のうち最も右のワイルドカードより右にある文字に対応するシフト量を検索文字列逆順番号数とし、最も右のワイルドカードを含めてそれより左にある文字に対応するシフト量を、最も右のワイルドカードの検索文字列逆順番号数としてスキップテーブルを作成し、検索文字列と比較するテキスト中の部分文字列の直近右側の文字を引数としてスキップテーブルを引いてシフト量を求め、検索文字列と比較するテキスト中の次の部分文字列を決定し、部分文字列を検索文字列と比較することを特徴とする高速マッチング法。
【請求項４】
検索文字列のうち最も右のワイルドカードより右にある文字に対応するシフト量を検索文字列逆順番号数とし、最も右のワイルドカードを含めてそれより左にある文字に対応するシフト量を、最も右のワイルドカードの検索文字列逆順番号数としてスキップテーブルを作成し、検索文字列と比較するテキスト中の部分文字列の直近右側の文字を引数としてスキップテーブルを引いてシフト量を求め、検索文字列と比較するテキスト中の次の部分文字列を決定し、ワイルドカードをスキップしながら部分文字列を検索文字列と比較することを特徴とする高速マッチング法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、高速マッチング法に関し、特に、テキストから検索文字列に一致する文字列を検索するための高速マッチング法に関する。
【背景技術】
【０００２】
従来の文字列検索方法としては、単純法、KMP(Knuth-Morris-Pratt)法、BM(Boyer-Moore)法、BMH(Boyer-Moore-Horspool)法などがある。単純法は、図10（ａ）に示すように、テキストと検索文字列を１文字ずつ比較して、不一致なら、検索文字列を１文字右にずらす方法である。単純法でも、実用的に見てそれほどの問題点はないが、最悪の場合の計算量は（検索文字列長ｍ×テキスト文字列長ｎ）に比例する。文字列照合の速度を上げるには、一致または不一致がわかっている無駄な比較をできるだけ避けることが望ましい。
【０００３】
KMP法は、文字列パターン照合問題が線形時間で解けることを最初に示したアルゴリズムである。テキストと検索文字列の一致文字数に応じたシフト量を求めてスキップテーブルにし、スキップテーブルを参照しながらシフトする方法である。テキストを走査する前に、前処理として、検索文字列からスキップテーブルを構成する。検索文字列のうちｋ文字だけ一致した後で不一致が見つかったときに、テキストのどの文字と検索文字列のどの文字の比較から照合を続ければよいかをあらかじめ調べておく。不一致となった位置から左側ｋ文字がわかっていることを利用して、無駄な比較を避けるように設定するのである。図10（ｂ）に示すように、これをスキップテーブルの形で記録する。このスキップテーブルを求める計算においては、調べる対象は検索文字列のみである。スキップテーブルは、検索文字列長をｍとするとサイズ（ｍ＋１）×３の配列により表現できる。スキップテーブルの構成に要する時間は、Ｏ(ｍ)時間である。テキスト長をｎとするとき、文字比較の回数は高々２ｎ回である。したがって、テキスト走査時間はＯ(ｎ)時間である。しかし、BM法による文字列照合アルゴリズムに比べると、実用上の性能で劣る。
【０００４】
BM法は、KMP法よりもさらに高速な照合アルゴリズムである。スキップテーブル１とスキップテーブル２を設けて、シフト量の多い方を選択する方法である。検索文字列がある程度以上（普通５文字以上くらい）の長さをもつ場合には、最も速い文字列照合アルゴリズムだといわれている。KMP法と同様、計算量は最悪の場合でもＯ(ｎ)である。KMP法と同様に、照合を進めるにあたっては、それ以前に行った比較の結果として得られた情報をできるだけ活用して、比較の回数を減らす。BM法の長所は、テキスト中の文字の大部分を調べずにすむ可能性があることである。単純法やKMP法では、テキストの中の文字をそれぞれ１回は調べなければならない。比較は最低でもｎ回になる。これに対して、BM法ではｎ／ｍ個（ｎはテキストの長さ、ｍは検索文字列の長さを表す）の文字とだけ比較すればよいことがある。これによって、特に検索文字列が長いときに、計算時間の大幅な短縮が期待できる。この特徴から、BM法は、実用上きわめて重要なアルゴリズムと見なされている。
【０００５】
BM法ではテキストを走査する前に、検索文字列の中の文字成分と文字の配列を調べ、スキップテーブル１とスキップテーブル２を用意する。スキップテーブル１の作成においては、検索文字列の最後の位置からの部分文字列が、検索文字列の前のほうに含まれていないかを調べ、繰返しのある部分文字列に対するシフト量を計算しておく。スキップテーブル１は、KMP法の場合と同じように計算され、検索文字列に一致しないテキスト文字を全く考慮しない。スキップテーブル１は、検索文字列の中の文字構成だけから計算される。検索文字列に部分マッチしたテキスト文字列が、検索文字列の他の位置に含まれたかどうかでシフト量が決まる。スキップテーブル１の構成に要する時間は、検索文字列長をｍとし、使用文字数をｑとするとき、Ｏ(ｑ＋ｍ)時間である。
【０００６】
スキップテーブル２は、検索文字列に一致しないテキスト文字が検索文字列に含まれるか否かを考慮する。スキップテーブル２の作成においては、検索文字列の成分文字を求め、各成分文字の検索文字列内での最後部位置からの最短文字数を、シフト量として計算しておく。スキップテーブル２では、検索文字列との文字比較でマッチしなかったテキスト側の文字によって、シフト量を決める。スキップテーブル２を作成するためには、テキストの中に含まれる可能性のあるすべての文字に対して、シフト量を計算しておく必要がある。したがって、BM法では、スキップテーブル作成が複雑になる。スキップテーブル２の構成に要する時間はＯ(ｍ)時間である。スキップテーブルの例を、図11（ａ）に示す。
【０００７】
BM法も単純法と同様、テキストを左から順に調べていく。しかし、いったんテキスト上の位置がきまったら、検索文字列については、逆に右から左に向かって調べる。検索文字列を逆向きに調べることがBM法の要点である。検索文字列の右端から文字比較を行うアイデアによって、多くの場合、テキストの文字のいくつかを読み飛ばすことができ、最も高速なアルゴリズムとして知られている。テキストの文字の参照回数で効率を評価するとき、平均時の参照回数はテキスト長より小さい。最悪時には、Ｏ(ｍ×ｎ)回の参照を行う。
【０００８】
文字列照合の際に、検索文字列に対面したテキスト文字列を、検索文字列の最後部から比較する。不一致があると、テキスト側の不一致文字からスキップテーブル２のシフト量を得る。一致する部分文字列の長さまたは不一致文字位置から、スキップテーブル１のシフト量を得る。大きいほうを選んで、テキスト文字列をシフトする。図11（ａ）に示す例では、最初は０文字一致で、不一致文字がａである。スキップテーブル１のシフト量は１であり、スキップテーブル２のシフト量は２であるので、２文字シフトする。２番目の照合においては、４文字一致で、不一致文字がｂである。スキップテーブル１のシフト量は５であり、スキップテーブル２のシフト量は１であるので、５文字シフトする。その後は、同じように、文字比較を検索文字列の最後部から繰り返す。文字列照合に必要な文字比較回数が、ほとんどのケースで、比較回数がＯ(ｎ＋ｍ)回より少なくなる。
【０００９】
BMH法は、スキップテーブル２のみを使うように単純化したものである。図11（ｂ）に示すように、部分文字列の右端の文字でスキップテーブルを引いて、シフト量を求める。図11（ｂ）に示す例では、最初は右端の文字がｈであるので、シフト量は６である。２番目の照合においては、右端の文字がｇであるので、シフト量は６である。
【００１０】
上記従来の文字列検索方法のうち、高速なBM法ではスキップテーブルの作成方法が複雑である。簡単な方法では検索速度が遅い。より単純で高速な方法を、本発明者は非特許文献１で提案した。この方法は、BMH法を改良したものである。これをBK法とよぶことにし、簡単に説明する。図12のフローチャートに示すように、テキストの文字が検索文字列にあれば、検索文字の先頭文字のシフト量を（検索文字数ｍ）とする。その次の文字のシフト量を（検索文字数ｍ−１）とする。検索文字の末尾文字のシフト量を１とする。検索文字列に無いテキスト文字については、シフト量を（検索文字数ｍ＋１）とする。
【００１１】
文字列検索は、図13のフローチャートに示すように実行する。検索文字列と比較するテキストの部分文字列の次を指すように、ポインタを設定する。検索文字列と部分文字列を比較して不一致の場合、ポインタの指すテキストの文字を引数として、スキップテーブルを引き、シフト量を求め、検索文字列と比較する部分文字列の位置をシフトして検索を繰り返す。スキップテーブルと検索の例を図14に示す。
【非特許文献１】Yuebin Bai, Hidetsune Kobayashi: "New String Matching Technology for Network Security", Proceedings of 17th International Conference on Advanced Information Networking and Applications(AINA'03), Mrch 27-29, 2003, Xi'an, China, pp.198-201.
【発明の開示】
【発明が解決しようとする課題】
【００１２】
しかし、従来の高速マッチング法（BK法）では、テキスト文字数の回数に比例して、スキップテーブル作成の時間がかかり、十分高速ではないという問題があった。テキスト中に同じ文字があった場合、同じことを繰り返しており、むだがある。本発明は、上記従来の問題を解決して、簡単な方法でスキップテーブルを作成できる高速マッチング法を実現することを目的とする。
【課題を解決するための手段】
【００１３】
上記の課題を解決するために、本発明では、高速マッチング法を以下のように構成した。使用文字セットの各文字のうちテキストと検索文字列とにある文字に対応するシフト量を検索文字列逆順番号数とし、テキストに無い文字と検索文字列に無い文字に対応するシフト量を（検索文字数＋１）としてスキップテーブルを作成し、検索文字列と比較するテキスト中の部分文字列の直近右側の文字を引数としてスキップテーブルを引いてシフト量を求め、検索文字列と比較するテキスト中の次の部分文字列を決定し、部分文字列を検索文字列と比較する。
【００１４】
また、高速マッチング法を以下のように構成した。検索文字列のうち最も右のワイルドカードより右にある文字に対応するシフト量を検索文字列逆順番号数とし、最も右のワイルドカードを含めてそれより左にある文字に対応するシフト量を、最も右のワイルドカードの検索文字列逆順番号数としてスキップテーブルを作成し、検索文字列と比較するテキスト中の部分文字列の直近右側の文字を引数としてスキップテーブルを引いてシフト量を求め、検索文字列と比較するテキスト中の次の部分文字列を決定し、部分文字列を検索文字列と比較する。
【発明の効果】
【００１５】
本発明では、上記のように構成したことにより、テキスト中の同じ文字について繰り返し同じ操作をする必要がなくなるので、スキップテーブルの作成が短時間ででき、検索に要する時間が短縮される。検索文字列さえ決まればシフト量を計算でき、スキップテーブルを作成することができるので、リアルタイム性を要求されるネットワークのプロトコル等をリアルタイムに検索でき、検索文字列毎の解析が可能となる。ネットワーク上を流れる信号の中から特定のウィルスパターンをリアルタイムに検索したり、特定の検索文字列で与えられる不法なパケットをリアルタイムに検索することができる。また、特定IPを発見したときには、ただちにそのパケットを削除し、通過させないこともできる。あいまい性を考慮して類似の画像（動画、静止画）を検出できる。
【発明を実施するための最良の形態】
【００１６】
以下、本発明を実施するための最良の形態について、図１〜図９を参照しながら詳細に説明する。
【実施例１】
【００１７】
本発明の実施例１は、使用文字セットの各文字のうちテキストと検索文字列とにある文字に対応するシフト量を検索文字列逆順番号数とし、テキストに無い文字と検索文字列に無い文字に対応するシフト量を（検索文字数＋１）としてスキップテーブルを作成し、検索文字列と比較するテキスト中の部分文字列の直近右側の文字を引数としてスキップテーブルを引いてシフト量を求め、検索文字列と比較するテキスト中の次の部分文字列を決定し、部分文字列を検索文字列と比較する高速マッチング法である。
【００１８】
本発明の実施例１における高速マッチング法を実行する装置の構成を説明する。図１は、本発明の実施例１における高速マッチング法を実行する装置の概念図である。図１において、入力装置１は、各種データとコマンドなどを入力する手段であり、キーボードやマウスなどの入力手段と、モデムやCDROM装置などの大量のデータを取り込むことができる入力手段である。使用文字セット記憶部２は、使用文字セットを格納しておくメモリである。テキスト記憶部３は、検索対象テキストを格納しておくメモリである。検索文字列記憶部４は、検索文字列を格納しておくメモリである。スキップテーブル作成部５は、使用文字セットとテキストと検索文字列を参照しながらスキップテーブルを作成する演算部である。スキップテーブル記憶部６は、スキップテーブルを格納しておくメモリである。文字列検索部７は、スキップテーブルを参照しながらテキストから検索文字列をサーチする演算部である。検索結果記憶部８は、検索文字列に一致するテキストの部分文字列の位置を格納しておくメモリである。出力装置９は、検索結果を出力する表示装置などである。
【００１９】
本発明の実施例１における高速マッチング法の動作手順を説明する。図２は、高速マッチング法のスキップテーブル作成手順を示すフローチャートである。図３は、高速マッチング法の検索手順を示すフローチャートである。図４は、本発明の実施例１における高速マッチング法のスキップテーブルと検索例を示す図である。図５は、高速マッチング法の実験結果を示す表である。
【００２０】
動作手順の概略を説明する。最初に使用文字セットを決める。例えば、ASCII半角英小文字の26字とする。「a」から１文字ずつ調べる。その文字がテキスト中と検索文字列中との両方にあれば、スキップテーブルにシフト量を登録する。シフト量は検索文字列逆順番号数とする。すなわち、検索文字数がｍであれば、検索文字の先頭文字に対応するシフト量はｍであり、次の文字に対応するシフト量は（ｍ−１）であり、最後の文字に対応するシフト量は１である。テキスト中にあって検索文字列中になければ、スキップテーブルにその他の文字として登録する。シフト量は（検索文字数＋１）とする。その文字がテキスト中になければ無視して、スキップテーブルには何も登録しない。スキップテーブル中に、シフト量が登録されていない検索文字があれば、テキスト中に検索文字列は存在しないことが、サーチをしなくてもわかる。このスキップテーブルを使って、従来のBK法と同様にサーチする。
【００２１】
図２を参照しながら、高速マッチング法のスキップテーブル作成手順を説明する。ステップ１で、テキストの長さと検索文字列の長さを比較して、検索文字列が長ければマッチすることはありえないので終了とする。ステップ２で、使用文字セットから１文字ずつ取り出し、ステップ３で、テキスト中にあるかどうか調べる。テキスト中になければ何もしなし。ステップ４で、検索文字列中にあるかどうか調べ、あればステップ５でスキップテーブルに登録する。なければ、ステップ６でその他の文字として登録する。ステップ７でテキスト終了かどうか調べ、終了でなければステップ２に戻り、次の使用文字について処理を行う。
【００２２】
使用文字セットの文字がテキスト中にあるか否かの検査を省略してもよい。使用文字セットの文字が検索文字列中にあれば、スキップテーブルに登録する。検索文字列中になければ、スキップテーブルにその他の文字として登録する。使用文字セットの文字がテキスト中にない場合でも、スキップテーブルに登録されるが、サーチ段階ではマッチングしないので、エラーにはならない。処理時間は条件により大差ない場合もあるが、短縮される場合もある。この方法であれば、テキストが無くてもスキップテーブルを作成できるので、テキストを受信しながら検索文字をサーチすることもできる。
【００２３】
図３を参照しながら、高速マッチング法の検索手順を説明する。ステップ11で、検索文字列をテキストの先頭に合わせ、ポインタをその次の文字にセットする。ステップ12で、検索文字列とテキストの部分文字列を比較する。ステップ13で一致すれば、ステップ14で一致結果を出力する。ステップ15でテキストが終わりでなければ、ステップ16で、ポインタの指す文字を引数として、スキップテーブルを引き、シフト量を求める。ステップ17で、検索文字列をシフトして、ポインタも移動する。これをテキストが終わるまで繰り返す。
【００２４】
図４を参照しながら、高速マッチング法のスキップテーブルと検索例を説明する。図４（ａ）に示すように、使用文字セットをASCII英小文字の「a〜z」26文字とする。検索文字列を「string」とする。スキップテーブルは、図示のようになる。最初の比較の時には、ポインタが「s」を指しているので、シフト量は６となる。次には、ポインタが「f」を指しているので、シフト量は７となる。図４（ｂ）に示すように、検索文字列が「strong」であって、テキスト中に「o」がないとすると、スキップテーブルに「o」は登録されない。サーチの前にスキップテーブルと検索文字列を比較すれば、マッチしないことがわかる。図４（ｃ）に示すように、検索文字列が「start」であり同じ文字を２つ以上含んでいる場合は、シフト量が小さい方の数が１つだけ登録される。実際のスキップテーブルにおける「t」の欄は１つだけである。
【００２５】
図５を参照しながら、高速マッチング法の実験結果を説明する。この実験は、乱数を発生してテキストと検索文字列を生成し、スキップテーブルの作成とテキスト検索を繰り返したものである。表（ａ）は、最大テキスト長と最大検索文字列長を変えて実験したものである。本発明１は、スキップテーブルの作成において、テキストを参照したものであり、本発明２は、テキストを参照しないで作成したものである。テキストが長い場合には、BK法と比較してはるかに高速になっている。表（ｂ）は、最大検索文字列長のみを変えて実験したものである。検索文字列が長い場合には、BK法と比較してはるかに高速になっている。表（ｃ）は、最大テキスト長を短い一定値にして最大検索文字列長を短い範囲で変えて実験したものである。BK法と比較するとかえって低速になっている。本発明は、テキストと検索文字列が長い場合に有効であることがわかる。
【００２６】
上記のように、本発明の実施例１では、高速マッチング法を、使用文字セットの各文字のうちテキストと検索文字列とにある文字に対応するシフト量を検索文字列逆順番号数とし、テキストに無い文字と検索文字列に無い文字に対応するシフト量を（検索文字数＋１）としてスキップテーブルを作成し、検索文字列と比較するテキスト中の部分文字列の直近右側の文字を引数としてスキップテーブルを引いてシフト量を求め、検索文字列と比較するテキスト中の次の部分文字列を決定し、部分文字列を検索文字列と比較する構成としたので、テキスト中の同じ文字について繰り返し同じ操作をする必要がなくなり、スキップテーブルの作成が短時間ででき、前処理時間が短縮されて検索時間との合計時間が短くなる。
【実施例２】
【００２７】
本発明の実施例２は、検索文字列のうち、最も右のワイルドカードより右にある文字に対応するシフト量を検索文字列逆順番号数とし、最も右のワイルドカードを含めてそれより左の文字に対応するシフト量を、最も右のワイルドカードの検索文字列逆順番号数としてスキップテーブルを作成し、検索文字列と比較するテキスト中の部分文字列の右側直近の文字を引数としてスキップテーブルを引いてシフト量を求め、検索文字列と比較するテキスト中の次の部分文字列を決定し、部分文字列を検索文字列と比較することにより、ワイルドカードを用いてあいまい検索ができる高速マッチング法である。
【００２８】
図６は、本発明の実施例２における高速マッチング法を実行する装置の概念図である。文字列検索部10は、スキップテーブルを参照して減分幅を変えながらテキストから検索文字列をサーチする演算部である。実施例２における高速マッチング法を実行する装置の構成は、図１に示した実施例１の装置と同じである。異なるところは、スキップテーブルと検索文字列に関する部分である。図７は、本発明の実施例２における高速マッチング法のスキップテーブル作成手順を示すフローチャートである。図８は、高速マッチング法の検索手順を示すフローチャートである。図９は、高速マッチング法のスキップテーブルと検索例を示す図である。
【００２９】
実施例２における高速マッチング法の処理手順を説明する。検索文字列の一部の文字を、すべての文字に一致するワイルドカードとする。検索文字列中でワイルドカードの右側にある文字のシフト量は、検索文字列逆順番号数とする。最も右の文字のシフト量は１であり、次の文字のシフト量は２である。ワイルドカードがなければ、先頭の文字のシフト量は検索文字列数である。検索文字列中の最も右のワイルドカードが、右から数えて３番目にあるとすると、そのワイルドカードのシフト量は３である。最も右のワイルドカードより左にある文字とワイルドカードのシフト量は、最も右のワイルドカードのシフト量と同じである。
【００３０】
さらに、テキストと検索文字列を順番に比較するときの減分幅を変える。テキストと検索文字列の添字を減少させる幅は、通常は１であるが、ワイルドカードを含む場合は、ワイルドカードを比較しないて飛び越すので、その場合は２以上となる。検索文字列のある文字の左にワイルドカードが１つあれば、その文字に対応する減分幅は２である。連続して２つあれば３である。検索文字列が（*tring）ならば、各文字に対応する減分幅は（121111）である。以下同様に、
(s*ring,112111), (st*ing,111211), (str*ng,111121), (stri*g,111112), 
(strin*,111111), (**ring,113111), (s**ing,111311), (st**ng,111131), 
(str**g,111113), (stri**,111111), (s*r*ng,112121), (s*r**g,112113)
となる。
【００３１】
実施例２における高速マッチング法のアルゴリズムを説明する。テキストと検索文字列を与え、テキストの中に検索文字列が現れるかどうか調べ、現れれば、その位置をすべて求めるアルゴリズムである。最初に、使用文字セットを定義し、配列に格納し、使用文字の個数を求める。使用文字セットとは、テキストを構成する個個の文字のことであり、例えばアルファベットの小文字から構成されているテキストならば，'a'から'z'までの26個の文字となる。テキストや検索文字列が不明でも、通常、テキストを構成する文字を限定することは可能である。検索文字列入力時は、ワイルドカードに目印をつける。例えば、ワイルドカードを「＊」とする。検索文字列からワイルドカードが最後に現れる位置を求め、減分幅を求めて配列に格納する。入力したテキストと検索文字列の長さを求め、検索文字列長がテキスト長より長ければ、テキストの中に検索文字列は現れないので、この場合は何もせずに終了する。
【００３２】
前処理では、スキップテーブルを作成する。使用文字セットから１文字ずつ取り出し、文字が尽きるまで、以下の操作を行う。取り出した文字が検索文字列に含まれるか調べる。検索文字列に含まれていれば、その文字に対応するシフト量を配列に格納する。シフト量は、その文字（２文字以上あれば最も右の文字）の検索文字列逆順番号数か、最も右のワイルドカードの検索文字列逆順番号数か、いずれか小さい方とする。検索文字列に含まれていなければ、シフト量は最も右のワイルドカードの検索文字列逆順番号数とする。配列の添字は、取り出した文字の内部コードを利用する。すなわち、文字コードでスキップテーブルを引いて、シフト量を求めることができるようにする。
【００３３】
図７を参照しながら、スキップテーブル作成手順を説明する。ステップ21で、使用文字セットから１文字ずつ取り出し、ステップ22で、検索文字列中にあるかどうか調べる。なければステップ25で、ワイルドカードシフト量を登録する。
あればステップ23で、最右のワイルドカードより右かどうか調べる。最右のワイルドカードより左ならば、ステップ25で、ワイルドカードシフト量を登録する。最右のワイルドカードより右ならば、スキップテーブルにシフト量を登録する。ステップ26で、使用文字セット終了かどうか調べ、終了でなければステップ21に戻り、次の使用文字について処理を行う。
【００３４】
後処理では、検索を行う。実際の検索では、テキスト中の検索開始位置を決める。テキスト中のこの位置から前方へ向かって１文字ずつ取り出し、検索文字列の最後部の文字から前方へ向かって１文字ずつ取り出し、１文字ずつ比較をして行く。すなわち、テキスト中及び検索文字列中の添字は減少して行く。このため、テキスト中の先頭の検索文字列文字数未満の部分に検索文字列が存在することはないので、検索開始位置の初期値を（検索文字列文字数−１）とする。ただし、先頭位置を０とする。
【００３５】
テキスト中を移動する検索初期値を表す添字ｋがテキスト長より短い間、以下の操作を繰り返す。検索文字列中を移動する添字jが最後部の文字を指すように初期化する。テキスト中を移動するための添字iの初期値を検索初期値ｋとする。スキップテーブルを引く文字を指すポインタは、（ｋ＋１）の位置にある。添字ｊが検索文字列中を移動でき、かつテキストのi番目と検索文字列のj番目が等しい間、それぞれの添字を減分幅だけ減少させる。このループを抜けたとき、検索文字列の添字ｊが負であれば、検索文字列を構成する全ての文字と一致したことになり、文字列が発見されたことになる。文字列発見後のテキスト中の検索初期値ｋがテキスト長より短いか調べる。短かければ、次の検索初期値の候補を計算する。短くなければ、一連の検索処理を終了する。
【００３６】
図８を参照しながら、高速マッチング法の検索手順を説明する。基本的な手順は、図３に示した実施例１の手順と同じである。ステップ31で、検索文字列をテキストの先頭に合わせ、ポインタをその次の文字にセットする。ステップ32で、ワイルドカードをスキップしながら、検索文字列とテキストの部分文字列を比較する。ステップ33で一致すれば、ステップ34で一致結果を出力する。ステップ35でテキストが終わりでなければ、ステップ36で、ポインタの指す文字を引数として、スキップテーブルを引き、ワイルドカードを考慮したシフト量を求める。ステップ37で、検索文字列をシフトして、ポインタも移動する。これをテキストが終わるまで繰り返す。
【００３７】
図９に示す例題を使って、あいまい検索の例を説明する。テキスト
"stringstryzgsearchstringsfindstrings"
の中から検索文字列"str**gs"をすべて検索する場合を考える。使用文字セットはアルファベット小文字とする。スキップテーブルnext[]は、
next['a']←3 next['b']←3 next['c']←3 next['d']←3 next['e']←3 
next['f']←3 next['g']←2 next['h']←3 next['i']←3 next['j']←3 
next['k']←3 next['l']←3 next['m']←3 next['n']←3 next['o']←3 
next['p']←3 next['q']←3 next['r']←3 next['s']←1 next['t']←3 
next['u']←3 next['v']←3 next['w']←3 next['x']←3 next['y']←3 
next['z']←3
となる。
【００３８】
テキストの先頭の７文字と検索文字列を比較すると、テキストは「strings」であるので、一致したことを出力する。このときのポインタ先の文字は「ｔ」であるので、スキップテーブルを引くと、シフト量は３となる。検索文字列を３文字右にシフトしてテキストと比較する。テキストは「ingstry」で不一致であるので、ポインタ先の文字「ｚ」のシフト量３文字だけ右にシフトしてテキストと比較する。テキストは「stryzgs」であるので、一致したことを出力する。ポインタ先の文字「ｅ」のシフト量３文字だけ右にシフトしてテキストと比較する。テキストは「yzgsear」で不一致であるので、ポインタ先の文字「ｃ」のシフト量３文字だけ右にシフトしてテキストと比較する。テキストは「searchs」で不一致であるので、ポインタ先の文字「ｔ」のシフト量３文字だけ右にシフトしてテキストと比較する。
【００３９】
テキストは「rchstri」で不一致であるので、ポインタ先の文字「ｎ」のシフト量３文字だけ右にシフトしてテキストと比較する。テキストは「strings」であるので、一致したことを出力する。ポインタ先の文字「ｆ」のシフト量３文字だけ右にシフトしてテキストと比較する。テキストは「ingsfin」で不一致であるので、ポインタ先の文字「ｄ」のシフト量３文字だけ右にシフトしてテキストと比較する。テキストは「sfindst」で不一致であるので、ポインタ先の文字「ｒ」のシフト量３文字だけ右にシフトしてテキストと比較する。テキストは「ndstrin」で不一致であるので、ポインタ先の文字「ｇ」のシフト量２文字だけ右にシフトしてテキストと比較する。テキストは「strings」であるので、一致したことを出力する。
【００４０】
上記のように、本発明の実施例２では、高速マッチング法を、検索文字列のうち、最も右のワイルドカードより右にある文字に対応するシフト量を検索文字列逆順番号数とし、最も右のワイルドカードを含めてそれより左の文字に対応するシフト量を、最も右のワイルドカードの検索文字列逆順番号数としてスキップテーブルを作成し、検索文字列と比較するテキスト中の部分文字列の右側直近の文字を引数としてスキップテーブルを引いてシフト量を求め、検索文字列と比較するテキスト中の次の部分文字列を決定し、部分文字列を検索文字列と比較する構成としたので、ワイルドカードを用いて高速にあいまい検索ができる。
【産業上の利用可能性】
【００４１】
本発明の高速マッチング法は、データから特定のパターンを検索する方法として最適である。さらに、ネットワーク上でのウィルスパターンや不法パケットのリアルタイム検索や、人物特定や形状特定や場面特定や動作特定など画像処理への応用も可能である。
【図面の簡単な説明】
【００４２】
【図１】本発明の実施例１における高速マッチング法を実行する装置の概念図、
【図２】本発明の実施例１における高速マッチング法のスキップテーブル作成手順を示すフローチャート、
【図３】本発明の実施例１における高速マッチング法の検索手順を示すフローチャート、
【図４】本発明の実施例１における高速マッチング法のスキップテーブルと検索例の説明図、
【図５】本発明の実施例１における高速マッチング法の実験結果表、
【図６】本発明の実施例２における高速マッチング法を実行する装置の概念図、
【図７】本発明の実施例２における高速マッチング法のスキップテーブル作成手順を示すフローチャート、
【図８】本発明の実施例２における高速マッチング法の検索手順を示すフローチャート、
【図９】本発明の実施例２における高速マッチング法のスキップテーブルと検索例を示す図、
【図１０】従来の文字列検索方法の説明図、
【図１１】従来の文字列検索方法の説明図、
【図１２】従来の高速マッチング法のスキップテーブル作成手順を示すフローチャート、
【図１３】従来の高速マッチング法の検索手順を示すフローチャート、
【図１４】従来の高速マッチング法による検索例の説明図である。
【符号の説明】
【００４３】
１  入力装置
２  使用文字セット記憶部
３  テキスト記憶部
４  検索文字列記憶部
５  スキップテーブル作成部
６  スキップテーブル記憶部
７  文字列検索部
８  検索結果記憶部
９  出力装置
10  文字列検索部
【図１】
2005190032.tif 000003
【図２】
2005190032.tif 000004
【図３】
2005190032.tif 000005
【図４】
2005190032.tif 000006
【図５】
2005190032.tif 000007
【図６】
2005190032.tif 000008
【図７】
2005190032.tif 000009
【図８】
2005190032.tif 000010
【図９】
2005190032.tif 000011
【図１０】
2005190032.tif 000012
【図１１】
2005190032.tif 000013
【図１２】
2005190032.tif 000014
【図１３】
2005190032.tif 000015
【図１４】
2005190032.tif 000016