(57)【特許請求の範囲】
【請求項１】
コンピュータを用いて文字列の照合を行う文字列照合方法において、
文字列の正規表現から非決定性有限状態オートマトンを作成し、メモリに格納するステップと、
前記メモリから前記非決定性有限状態オートマトンを読み出し、当該非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを作成し、メモリに格納するステップと、
前記メモリから前記決定性有限状態オートマトンを読み出し、当該決定性有限状態オートマトンを用いて文字列のマッチングを行うステップと、
前記非決定性有限状態オートマトンによる状態遷移を示す状態列をたどり、前記決定性有限状態オートマトンによる状態遷移を示す状態列を、当該非決定性有限状態オートマトンの終了状態へ到達可能な状態列に絞り込むステップと、
絞り込まれた前記状態列に基づいて、処理対象である文字列中のどの文字が前記正規表現のどの部分にマッチしたかを特定するステップと
を含むことを特徴とする文字列照合方法。
【請求項２】
前記非決定性有限状態オートマトンを作成するステップは、
文字列の正規表現に対し、当該正規表現中の一定の範囲を指定する要素を除く各要素に１つずつ対応させた非決定性有限状態オートマトンの状態を生成するステップと、
繰り返しを意味する要素及び選択を意味する要素に対応する前記非決定性有限状態オートマトンの状態の遷移をε遷移とし、その他の各要素に対応する当該非決定性有限状態オートマトンの状態の遷移を前記正規表現における当該要素の次に出現する要素に対応付けられた当該非決定性有限状態オートマトンの状態への遷移とするステップと
を含むことを特徴とする請求項１に記載の文字列照合方法。
【請求項３】
前記マッチ部分を特定するステップでは、絞り込まれた前記状態列のうち、先に出現する繰り返しが最も多くなる状態列を選択し、選択された当該状態列に基づいて、前記処理対象である文字列中の各文字が前記正規表現のどの部分にマッチしたかを判断することを特徴とする請求項１に記載の文字列照合方法。
【請求項４】
前記文字列のマッチングを行うステップでは、処理対象である文字列の各要素に対して、前記メモリから読み出した前記決定性有限状態オートマトンの状態遷移における遷移先の状態を動的に決定しながらマッチングを行うことを特徴とする請求項１に記載の文字列照合方法。
【請求項５】
前記文字列のマッチングを行うステップは、
処理対象である前記文字列を先読みして当該文字列中に複数文字照合要素に該当し得る文字列が含まれているか否かを判定するステップと、
前記文字列に複数文字照合要素に該当し得る文字列が含まれている場合に、当該文字列が複数文字照合要素である場合における状態遷移を反映させて前記遷移先の状態を動的に決定するステップと
を含むことを特徴とする請求項１に記載の文字列照合方法。
【請求項６】
前記文字列のマッチングを行うステップでは、処理対象である文字列を先読みして当該文字列中に複数文字照合要素に該当し得る文字列が含まれている場合に、当該文字列の各要素に対して、前記メモリから読み出した前記決定性有限状態オートマトンの状態遷移を生成し、当該複数文字照合要素に該当し得る文字列に対応する状態遷移を仮想的に生成し、当該状態遷移に基づいてマッチングを行うことを特徴とする請求項１に記載の文字列照合方法。
【請求項７】
正規表現を用いて文字列の検索を行う文書処理装置において、
文字列の正規表現から非決定性有限状態オートマトンを構築する非決定性有限状態オートマトン構築手段と、
前記非決定性有限状態オートマトン構築手段にて構築された前記非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを構築する決定性有限状態オートマトン構築手段と、
前記決定性有限状態オートマトン構築手段にて構築された前記決定性有限状態オートマトンを用いて文字列のマッチングを行う判定手段とを備え、
前記判定手段は、前記非決定性有限状態オートマトンによる状態遷移を示す状態列をたどり、前記決定性有限状態オートマトンによる状態遷移を示す状態列を、当該非決定性有限状態オートマトンの終了状態へ到達可能な状態列に絞り込み、かつ絞り込まれた前記状態列に基づいて、処理対象である文字列中のどの文字が前記正規表現のどの部分にマッチしたかを特定することを特徴とする文書処理装置。
【請求項８】
前記非決定性有限状態オートマトン構築手段は、文字列の正規表現に対し、当該正規表現中の一定の範囲を指定する要素を除く各要素に１つずつ対応させた非決定性有限状態オートマトンの状態を生成し、かつ繰り返しを意味する要素及び選択を意味する要素に対応する前記非決定性有限状態オートマトンの状態の遷移をε遷移とし、その他の各要素に対応する当該非決定性有限状態オートマトンの状態の遷移を前記正規表現における当該要素の次に出現する要素に対応付けられた当該非決定性有限状態オートマトンの状態への遷移とすることを特徴とする請求項７に記載の文書処理装置。
【請求項９】
前記判定手段は、絞り込まれた前記状態列のうち、先に出現する繰り返しが最も多くなる状態列を選択し、選択された当該状態列に基づいて、前記処理対象である文字列中の各文字が前記正規表現のどの部分にマッチしたかを判断することを特徴とする請求項７に記載の文書処理装置。
【請求項１０】
前記判定手段は、前記決定性有限状態オートマトン構築手段にて構築された前記決定性有限状態オートマトンを用い、前記処理対象である文字列の各要素に対して、前記決定性有限状態オートマトンの状態遷移における遷移先の状態を動的に決定しながらマッチングを行うことを特徴とする請求項７に記載の文書処理装置。
【請求項１１】
前記判定手段は、処理対象である前記文字列を先読みして当該文字列中に複数文字照合要素に該当し得る文字列が含まれているか否かを判定し、複数文字照合要素に該当し得る文字列が含まれていると判断した場合に、当該文字列が複数文字照合要素である場合における状態遷移を反映させて前記遷移先の状態を動的に決定することを特徴とする請求項７に記載の文書処理装置。
【請求項１２】
前記判定手段は、処理対象である文字列を先読みして当該文字列中に複数文字照合要素に該当し得る文字列が含まれている場合に、当該文字列の各要素に対して、前記メモリから読み出した前記決定性有限状態オートマトンの状態遷移を生成し、当該複数文字照合要素に該当し得る文字列に対応する状態遷移を仮想的に生成し、当該状態遷移に基づいてマッチングを行うことを特徴とする請求項７に記載の文書処理装置。
【請求項１３】
コンピュータを制御して、文字列の照合を行うプログラムであって、
文字列の正規表現から非決定性有限状態オートマトンを作成し、メモリに格納する処理と、
前記メモリから前記非決定性有限状態オートマトンを読み出し、当該非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを作成し、メモリに格納する処理と、
前記メモリから前記決定性有限状態オートマトンを読み出し、当該決定性有限状態オートマトンを用いて文字列のマッチングを行う処理と、
前記非決定性有限状態オートマトンによる状態遷移を示す状態列をたどり、前記決定性有限状態オートマトンによる状態遷移を示す状態列を、当該非決定性有限状態オートマトンの終了状態へ到達可能な状態列に絞り込む処理と、
絞り込まれた前記状態列に基づいて、処理対象である文字列中のどの文字が前記正規表現のどの部分にマッチしたかを特定する処理と
を前記コンピュータに実行させることを特徴とするプログラム。
【請求項１４】
前記非決定性有限状態オートマトンを作成する処理は、
文字列の正規表現に対し、当該正規表現中の一定の範囲を指定する要素を除く各要素に１つずつ対応させた非決定性有限状態オートマトンの状態を生成する処理と、
繰り返しを意味する要素及び選択を意味する要素に対応する前記非決定性有限状態オートマトンの状態の遷移をε遷移とし、その他の各要素に対応する当該非決定性有限状態オートマトンの状態の遷移を前記正規表現における当該要素の次に出現する要素に対応付けられた当該非決定性有限状態オートマトンの状態への遷移とする処理と
を含むことを特徴とする請求項１３に記載のプログラム。
【請求項１５】
前記マッチ部分を特定する処理では、絞り込まれた前記状態列のうち、先に出現する繰り返しが最も多くなる状態列を選択し、選択された当該状態列に基づいて、前記処理対象である文字列中の各文字と前記正規表現のどの部分にマッチしたかを判断することを特徴とする請求項１３に記載のプログラム。
【請求項１６】
前記文字列のマッチング処理では、処理対象である文字列の各要素に対して、前記メモリから読み出した前記決定性有限状態オートマトンの状態遷移における遷移先の状態を動的に決定しながらマッチングを行うことを特徴とする請求項１３に記載のプログラム。
【請求項１７】
前記文字列のマッチング処理は、
処理対象である前記文字列を先読みして当該文字列中に複数文字照合要素に該当し得る文字列が含まれているか否かを判定する処理と、
前記文字列に複数文字照合要素に該当し得る文字列が含まれている場合に、当該文字列が複数文字照合要素である場合における状態遷移を反映させて前記遷移先の状態を動的に決定する処理と
を含むことを特徴とする請求項１３に記載のプログラム。
【請求項１８】
前記文字列のマッチング処理では、処理対象である文字列を先読みして当該文字列中に複数文字照合要素に該当し得る文字列が含まれている場合に、当該文字列の各要素に対して、前記メモリから読み出した前記決定性有限状態オートマトンの状態遷移を生成し、当該複数文字照合要素に該当し得る文字列に対応する状態遷移を仮想的に生成し、当該状態遷移に基づいてマッチングを行うことを特徴とする請求項１３に記載のプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、有限状態オートマトンを用いてパターンマッチング（文字列の照合）を行う技術に関し、特に文字列の正規表現を用いたパターンマッチングを決定性有限状態オートマトンにて実行するための技術に関する。
【０００２】
【従来の技術】
コンピュータを用いたテキスト処理ツールでは、文字列検索などに用いられるパターンマッチング、すなわち文字列中のパターンを発見し操作するための機構として正規表現が広く利用されている。例えば、正規表現“(ab)*”は“ab”の０回以上の繰り返し（“”、“ab”、“abab”、...）にマッチし、“[acd]”は“a”、“c”または“d”にマッチする。また、“．”は任意の１文字にマッチし、“ab|cd”は“ab”または“cd”のいずれかにマッチする。
【０００３】
文字列検索などの処理を行う場合には、この正規表現から、正規表現によるパターンマッチングの評価器である有限状態オートマトン（Finite State Automaton）を作成し、検索の対象である文字列に関してこの有限状態オートマトンを処理する。
ここで、有限状態オートマトンには、非決定性有限状態オートマトン（Non deterministic Finite state Automaton：ＮＦＡ）と、決定性有限状態オートマトン（Deterministic Finite state Automaton：ＤＦＡ）とがあり、ＤＦＡはＮＦＡから作成することができる。
【０００４】
図３４は、正規表現“([ab]c)*ac”にマッチングするＮＦＡの例である。また、図３５は、図３４のＮＦＡと等価のＤＦＡである。
これらの有限状態オートマトンは、例えば入力が“acac”や“ac”である場合は正規表現“([ab]c)*ac”にマッチするので受理する。また、入力が“aa”である場合は正規表現“([ab]c)*ac”にマッチしないので受理しない。なお、一般に所定の正規表現に対応するＮＦＡは複数存在するが、ＤＦＡは一意に決まる。
実際の処理では、処理速度に優れるＤＦＡを用いることが好ましい。したがって、例えば文字列検索の場合、検索条件を正規表現で記述し、この正規表現からＮＦＡを作成し、さらにこのＮＦＡからＤＦＡを作成し、このＤＦＡを処理することにより検索処理を行う。
正規表現および有限状態オートマトンを用いたパターンマッチングに関しては、例えば下記の文献に詳細に記載されている。
文献：V.J.Rayward-Smith.言語理論入門.共立出版, 1986.井上謙蔵監訳.
【０００５】
【発明が解決しようとする課題】
ところで、ＵＮＩＸシステムでは、オペレーティングシステム間の互換性を確保するため、標準的なＡＰＩ（Application Program Interface）であるＰＯＳＩＸ（Portable Operating System Interface for UNIX）が、ＩＥＥＥによって定められている。このＰＯＳＩＸに準拠する正規表現（以下、ＰＯＳＩＸ正規表現）は、部分正規表現や最長一致など、本来の正規表現の範疇を越えた機能を持つ。そのため、文字列検索などに用いるパターンマッチング機能をＤＦＡで実装するには困難な場合があった。
ＰＯＳＩＸでは、与えられた文字列中の最も左にある部分文字列にマッチし、さらに各正規表現の要素は可能な限り長い（最長の）文字列にマッチするという最長最左規則が存在する。このため、例えば、ＰＯＳＩＸ正規表現による“([ab]c)*ac”に、入力“acac”を与えると、“([ab]c)*”が最長一致し、部分正規表現“([ab]c)”がマッチした部分（入力の先頭“ac”）に関する情報を取得できる。これらの情報はＰＯＳＩＸに準拠した関数を用いる場合などに必要となる場合がある。
しかし、これらの情報はＮＦＡからＤＦＡへ変換した際に失われ、正規表現のどの要素がどの文字にマッチしたかが識別できなくなっているため、ＤＦＡで処理することができず、処理速度の遅いＮＦＡを用いてパターンマッチングを行わなければならなかった。
【０００６】
また、テキスト処理ツールには、正規表現“[a-b]”で、要素‘a’、‘b’、‘aa’にマッチするというように、可変長の照合要素（以下、複数文字照合要素）を扱うことが可能なものがある。
図３６は、複数文字照合要素を含む正規表現に対応するＮＦＡの例を示す図である。
この場合、図３６において最初の状態０から状態１に遷移する場合と状態２に遷移する場合とでは、受理する文字の長さが違ってしまうため、そのままではＤＦＡを構築してパターンマッチングを行うことができない。これに対し、複数文字照合要素の可能な文字列（上記の正規表現“[a-b]”では要素‘a’、‘b’、‘aa’のそれぞれ）を列挙して個別に状態を遷移させるＤＦＡを構築して対応することが考えられる。
しかしながら、複数文字照合要素がマッチする文字列全てを列挙するＡＰＩ（Application Program Interface）がＰＯＳＩＸで提供されていないため、そのようなＤＦＡを構築することはできない。したがって、このような場合には処理速度の遅いＮＦＡを用いてパターンマッチングを行わなければならなかった。
【０００７】
そこで本発明は、部分正規表現や最長一致を含むＰＯＳＩＸ正規表現をＤＦＡ（決定性有限状態オートマトン）にて処理できるようにすること、またそのような処理装置（コンピュータ装置）を実現することを目的とする。
また、複数文字照合要素を含む正規表現をＤＦＡ（決定性有限状態オートマトン）にて処理できるようにすること、またそのような処理装置（コンピュータ装置）を実現することを他の目的とする。
【０００８】
【課題を解決するための手段】
上記の目的を達成するため、本発明は、コンピュータを用いて文字列の照合を行う文字列照合方法として実現される。すなわち、この文字列照合方法は、文字列の正規表現から非決定性有限状態オートマトンを作成するステップと、この非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを作成するステップと、この決定性有限状態オートマトンを用いて文字列のマッチングを行うステップと、マッチした前記文字列に関し、これらの非決定性有限状態オートマトンと決定性有限状態オートマトンとを用いて、この文字列のマッチ範囲を特定するステップとを含むことを特徴とする。
【０００９】
ここで、この非決定性有限状態オートマトンを作成するステップは、詳しくは、文字列の正規表現に対し、この正規表現中の一定の範囲を指定する要素を除く各要素に１つずつ対応させた非決定性有限状態オートマトンの状態を生成するステップと、繰り返しを意味する要素及び選択を意味する要素に対してε遷移を対応させると共に、その他の要素に対して次の要素に対応付けられた状態への遷移を対応させるステップとを含む。
また、マッチ範囲を特定するステップは、詳しくは、決定性有限状態オートマトンによる状態遷移を示す状態列のうちで、終了状態へ到達しない不要な状態列を削除するステップと、残った前記状態列に基づいて文字列のマッチ範囲を特定するステップとを含む。
さらに、より好ましくは、このマッチ範囲を特定するステップは、決定性有限状態オートマトンによる状態遷移を示す状態列のうち、最長最左規則を満足する状態列に基づいて文字列のマッチ範囲を特定するステップを含む。
【００１０】
また、本発明は、次のような他の文字列照合方法として実現される。すなわち、この文字列照合方法は、所定の文字列の正規表現に基づいて作成された決定性有限状態オートマトンをメモリから読み込み、この決定性有限状態オートマトンを用いて文字列のマッチングを行い、処理結果をメモリに格納する第１のステップと、この決定性有限状態オートマトンによる状態遷移を示す状態列を、終了状態へ到達可能な状態列に絞り込む第２のステップと、絞り込まれた状態列に基づいて、処理対象である文字列中のどの文字が正規表現のどの部分にマッチしたかを特定する第３のステップとを含むことを特徴とする。
ここで、この第３のステップは、より好ましくは、絞り込まれた状態列のうち、先に出現する繰り返しが最も多くなる状態列を選択し、この状態列に基づいて処理対象である文字列中の各文字と正規表現のどの部分にマッチしたかを判断するステップを含む。
【００１１】
さらに本発明は、次のような他の文字列照合方法として実現される。すなわち、この文字列照合方法は、所定の文字列の正規表現に基づいて作成された決定性有限状態オートマトンをメモリから読み込み、この決定性有限状態オートマトンを用いて文字列のマッチングを行い、処理結果をメモリに格納する第１のステップと、この決定性有限状態オートマトンによる状態遷移を示す第１の状態列に基づいて、非決定性有限状態オートマトンにおける状態遷移を示す第２の状態列を復元する第２のステップと、復元された第２の状態列に基づいて、文字列中のどの文字が正規表現のどの部分にマッチしたかに関する情報を取得する第３のステップとを含むことを特徴とする。
ここで、この第２のステップは、より好ましくは、第２の状態列として、最長最左規則を満足する状態列を復元するステップを含む。
【００１２】
さらにまた、本発明は、次のような他の文字列照合方法として実現される。すなわち、この文字列照合方法は、文字列の正規表現から非決定性有限状態オートマトンを作成するステップと、この非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを作成するステップと、処理対象である文字列の各要素に対して、この決定性有限状態オートマトンの状態遷移における遷移先の状態を動的に決定しながらマッチングを行うステップとを含むことを特徴とする。
【００１３】
ここで、さらに詳しくは、このマッチングを行うステップは、処理対象である文字列を先読みしてこの文字列中に複数文字照合要素に該当し得る文字列が含まれているか否かを判定するステップと、この文字列に複数文字照合要素に該当し得る文字列が含まれている場合に、この文字列が複数文字照合要素である場合における状態遷移を反映させて遷移先の状態を動的に決定するステップとを含む。また、より好ましくは、この文字列照合方法は、マッチングを行った後、マッチした文字列に関し、非決定性有限状態オートマトンと決定性有限状態オートマトンとを用いて、この文字列のマッチ範囲に関する情報を得るステップをさらに含む構成とする。
【００１４】
さらに、本発明は、次のような他の文字列照合方法として実現される。すなわち、この文字列照合方法は、文字列の正規表現から非決定性有限状態オートマトンを作成するステップと、この非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを作成するステップと、処理対象である文字列を先読みしてこの文字列中に複数文字照合要素に該当し得る文字列が含まれている場合に、文字列の各要素に対して、決定性有限状態オートマトンの状態遷移を生成すると共に、この複数文字照合要素に該当し得る文字列に対応する状態遷移を仮想的に生成し、これらの状態遷移に基づいてマッチングを行うステップとを含むことを特徴とする。
【００１５】
また、上記の目的を達成する他の本発明は、正規表現を用いて文字列の検索を行う文書処理装置において、文字列の正規表現から非決定性有限状態オートマトンを構築する非決定性有限状態オートマトン構築手段と、この非決定性有限状態オートマトン構築手段にて構築された非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを構築する決定性有限状態オートマトン構築手段と、この決定性有限状態オートマトン構築手段にて構築された決定性有限状態オートマトンを用いて文字列のマッチングを行う判定手段とを備える。この判定手段は、マッチした文字列に関し、さらに非決定性有限状態オートマトンと決定性有限状態オートマトンとを用いて、文字列のマッチ範囲を特定することを特徴とする。
【００１６】
ここで、この非決定性有限状態オートマトン構築手段は、文字列の正規表現に対し、この正規表現中の一定の範囲を指定する要素を除く各要素に１つずつ対応させた非決定性有限状態オートマトンの状態を生成し、かつ繰り返しを意味する要素及び選択を意味する要素に対してε遷移を対応させると共に、その他の要素に対して次の要素に対応付けられた状態への遷移を対応させることを特徴とする。
また好ましくは、この判定手段は、決定性有限状態オートマトンによる状態遷移を示す状態列のうちで、終了状態へ到達しない不要な状態列を削除して絞り込む状態列絞り込み手段と、この状態列絞り込み手段により絞り込まれた状態列に基づいて文字列のマッチ範囲を特定するマッチ範囲判定手段とする。
【００１７】
また、本発明は、次のような他の文書処理装置としても実現される。すなわち、正規表現を用いて文字列の検索を行う文書処理装置において、文字列の正規表現から非決定性有限状態オートマトンを構築する非決定性有限状態オートマトン構築手段と、この非決定性有限状態オートマトン構築手段にて構築された非決定性有限状態オートマトンに基づいて決定性有限状態オートマトンを構築する決定性有限状態オートマトン構築手段と、この決定性有限状態オートマトン構築手段にて構築された決定性有限状態オートマトンを用い、処理対象である文字列の各要素に対して、決定性有限状態オートマトンの状態遷移における遷移先の状態を動的に決定しながらマッチングを行う判定手段とを備えることを特徴とする。
【００１８】
ここで、さらに好ましくは、この判定手段は、処理対象である文字列を先読みして文字列中に複数文字照合要素に該当し得る文字列が含まれているか否かを判定し、複数文字照合要素に該当し得る文字列が含まれていると判断した場合に、この文字列が複数文字照合要素である場合における状態遷移を反映させて遷移先の状態を動的に決定する。
また、この判定手段は、決定性有限状態オートマトンによる状態遷移を示す状態列のうちで、終了状態へ到達しない不要な状態列を削除して絞り込む状態列絞り込み手段と、この状態列絞り込み手段により絞り込まれた状態列に基づいて文字列のマッチ範囲を特定するマッチ範囲判定手段とを備える構成とすることができる。
【００１９】
さらに本発明は、コンピュータを制御して上述した文字列照合方法を実行するプログラムとして、あるいはコンピュータを上記の文書処理装置として機能させるプログラムとして実現することができる。かかるプログラムは、磁気ディスクや光ディスク、半導体メモリ、その他の記録媒体に格納して配布したり、ネットワークを介して配信したりすることにより、提供することができる。
【００２０】
【発明の実施の形態】
以下、添付図面に示す第１、第２の実施の形態に基づいて、この発明を詳細に説明する。なお、以下の実施の形態の説明において、正規表現は、ＰＯＳＩＸ正規表現（ＰＯＳＩＸに準拠した正規表現）を意味する。
［第１の実施の形態］
第１の実施の形態では、正規表現で表現された検索条件に基づき、ＤＦＡ（決定性有限状態オートマトン）を用いて文字列検索を行う文書処理システムをコンピュータにて実現する。このシステムは、ＤＦＡを作成した際にＤＦＡが遷移した状態を記録しておく。そして、記録された状態の列から、対応するＮＦＡ（非決定性有限状態オートマトン）を用いた場合にたどる状態の列を得ることで、ＤＦＡへの変換で失われた必要な情報を取得する。これにより、正規表現で用いられる部分正規表現や最長一致に対しても、ＤＦＡによる高速なパターンマッチングを行うことが可能となる。
【００２１】
図１は、第１の実施の形態による文書処理システムを実現するのに好適なコンピュータ装置のハードウェア構成の例を模式的に示した図である。
図１に示すコンピュータ装置は、演算手段であるＣＰＵ（Central Processing Unit：中央処理装置）１０１と、Ｍ／Ｂ（マザーボード）チップセット１０２及びＣＰＵバスを介してＣＰＵ１０１に接続されたメインメモリ１０３と、同じくＭ／Ｂチップセット１０２及びＡＧＰ（Accelerated Graphics Port）を介してＣＰＵ１０１に接続されたビデオカード１０４と、ＰＣＩ（Peripheral Component Interconnect）バスを介してＭ／Ｂチップセット１０２に接続されたハードディスク１０５及びネットワークインターフェイス１０６と、さらにこのＰＣＩバスからブリッジ回路１０７及びＩＳＡ（Industry Standard Architecture）バスなどの低速なバスを介してＭ／Ｂチップセット１０２に接続されたフロッピーディスクドライブ１０８及びキーボード／マウス１０９とを備える。また、図１には記載していないが、このコンピュータ装置は、後述するようにＣＰＵ１０１の動作性能（動作クロック）を制御する手段として、クロック発信器及びそのコントローラを備える。
なお、図１は本実施の形態を実現するコンピュータ装置のハードウェア構成を例示するに過ぎず、本実施の形態を適用可能であれば、他の種々の構成を取ることができる。例えば、ビデオカード１０４を設ける代わりに、ビデオメモリのみを搭載し、ＣＰＵ１０１にてイメージデータを処理する構成としても良いし、音声による入出力を行うためのサウンド機構を設けたり、ＡＴＡ（AT Attachment）などのインターフェイスを介してＣＤ−ＲＯＭ（Compact Disc Read Only Memory）やＤＶＤ−ＲＯＭ（Digital Versatile Disc Read Only Memory）のドライブを設けたりしても良い。
【００２２】
図２は、第１の実施の形態による文書処理システムの構成を説明するブロック図である。
図２を参照すると、本実施の形態の文書処理システム２００は、文字列のパターンマッチングを行うＤＦＡを作成するオートマトン構築部２１０と、作成されたＤＦＡを保持するオートマトン保持部２２０と、検索対象である文書データを保持する文書保持部２３０と、ＤＦＡを用いて文字列検索におけるパターンマッチングを実行するオートマトン判定部２４０とを備える。また、本実施の形態による文字列検索以外の処理を実行するための文書処理部２５０と、コンピュータ装置にてこれらの機能を実現する処理プログラムを保持する処理プログラム保持部２６０とを備える。
また図示のように、文書処理システム２００は、ユーザ（文書利用者）が検索キーあるいは検索対象である文書データや各種の処理を行うためのコマンドを入力すると共に、処理結果を出力するための入出力装置３００に接続されている。
【００２３】
図２において、オートマトン保持部２２０、文書保持部２３０及び処理プログラム保持部２６０は、メインメモリ１０３にて実現される。なお、メインメモリ１０３に保持されるデータは、必要に応じてハードディスク１０５などの記憶装置に退避させることができる。
また、オートマトン構築部２１０、オートマトン判定部２４０及び文書処理部２５０は、処理プログラム保持部２６０に格納された処理プログラムにより制御されたＣＰＵ１０１にて実現されるソフトウェアブロックである。ＣＰＵ１０１を制御してこれらの機能を実現する処理プログラムは、磁気ディスクや光ディスク、半導体メモリ、その他の記録媒体に格納して配布したり、ネットワークを介して配信したりすることにより提供される。
【００２４】
図３は、オートマトン構築部２１０によるＤＦＡ構築処理の概略的な流れを示すフローチャートである。
図３に示すように、オートマトン構築部２１０は、検索キーとなる文字列の正規表現の入力を受理すると（ステップ３０１）、まず、当該正規表現から構文木を構築する（ステップ３０２）。構築された構文木は、メインメモリ１０３やＣＰＵ１０１の図示しないキャッシュメモリに格納される。
次に、オートマトン構築部２１０は、メインメモリ１０３等から構文木を読み出し、当該構文木に基づいてＮＦＡを構築する（ステップ３０３）。構築されたＮＦＡは、メインメモリ１０３やＣＰＵ１０１の図示しないキャッシュメモリに格納される。
さらにオートマトン構築部２１０は、メインメモリ１０３等からＮＦＡを読み出し、当該ＮＦＡに基づいてＤＦＡを構築する（ステップ３０４）。構築されたＤＦＡは、メインメモリ１０３やＣＰＵ１０１の図示しないキャッシュメモリに格納される。
すなわちオートマトン構築部２１０は、本実施の形態で用いるＤＦＡを作成するため、構文木構築手段、ＮＦＡ構築手段およびＤＦＡ構築手段として機能する。なお、構築されたＮＦＡおよびＤＦＡは、メインメモリ１０３にて実現されたオートマトン保持部２２０に格納される。
【００２５】
ステップ３０１で正規表現から構築される構文木（二分木）は、後述する適切なＮＦＡを作成するための情報を含んでいればどのような構成であっても良いが、例えば、ノードが次に示す４つのうちのいずれかであるような構文木とすることができる。
１．正規表現中の一定の範囲（部分正規表現）を指定する要素‘(’、‘)’を除く演算子（１つの演算子は正規表現の１要素に対応する）
このノードでは、‘[abc]’は１つの演算子とみなし、対応するノードも１つである。また、‘*’は子を１つ持つ（“<re>*”の<re>に対応する部分木。なお部分木は、構文木中のあるノード及びその子孫（子、孫、・・・）の全てを含む木であり、正規表現の一部分に対応する）。さらに、‘|(<ALT>)’は子を２つ持つ（“<re1>|<re2>”の<re1>、<re2>に対応する部分木）。その他の演算子（“a”、“[a-c]”など）は子を持たない。
２．<TERM> 正規表現の末尾を示す仮想的な演算子（正規表現“abc”の場合、‘c’の後ろに仮想的な終端の文字があると考え、これを<TERM>とする）
このノードは子を持たない。
３．<CONCAT> 正規表現の連結を表す仮想的なノード（対応するＮＦＡ状態および演算子はない）
例えば、正規表現“abc”は、要素‘a’と‘b’との連結、及び当該連結と要素‘c’との連結であり、この「連結」を１つのノードとする。また、このノードは子を２つ持つ（連結する２つの部分正規表現に対応する部分木）。
４．<SUBEXP> 括弧で囲われた部分正規表現を表す（対応するＮＦＡ状態はない。正規表現中の‘(’、‘)’の組に対応）
このノードは子を１つ持つ（‘(’、‘)’の内の部分正規表現に対応する部分木）。
【００２６】
図４は、正規表現“ab|c(de)*”から構築される構文木を示す図である。
図４において、正規表現“[ab]|c(de)*”に対し、“[ab]”、“|”、“c”、“d”、“e”、“*”がそれぞれ演算子であり、対応するノードが生成されている。また、ノード<C> はCONCAT、ノード | はALT、ノード<S> はSUBEXP、ノード<T> はTERMである。
この構文木を構築する処理は公知の技術を用いることができる。図５は、構文木を構築する処理を実行するためのプログラムの例である。
【００２７】
ステップ３０２で構文木から構築されるＮＦＡは、本実施の形態に用いるための条件を具備する。すなわち、ＤＦＡの状態列から復元可能であること、正規表現の最長最左規則に従うことである。
上述したように、所定の正規表現からは複数のＮＦＡを作成し得る。しかしながら、本実施の形態では、ＤＦＡによるパターンマッチングにおいて、ＮＦＡを用いた場合にたどる状態の列の情報を利用するため、この目的に適した、すなわち上記の条件を具備したＮＦＡを構築することが必要である（以下、このＮＦＡを適切なＮＦＡと称す）。この適切なＮＦＡは、次の特徴を持つ。
１．“(”、“)”を除く全ての要素（“a”、“[a-c]”、“*”など）にＮＦＡの状態を１つ対応させる。
２．ε遷移（文字を受理せずに行う遷移）を、繰り返し（*、+、?など）と選択（|）にのみ許す。
３．（ε遷移を除いて）遷移先はただ１つ。
【００２８】
かかる適切なＮＦＡを作成するため、本実施の形態では、first、epsdest、nextという３種類の関数を定義する。以下、各関数について説明する。
first：構文木中の所定の部分木（＝引数のノードを根とする部分木）が対応する部分正規表現において、最初に「出現」する演算子に対応するＮＦＡ状態を返す。
ここで、最初に「出現」する演算子とは、最初に処理しなければならない演算子であることを意味する。また、ＮＦＡ状態は、ＮＦＡにおける１つの丸（ノード）で示される。本実施の形態では、ＮＦＡ状態は演算子に対応し、全てのＮＦＡ状態は対応するノードを１つ持つ（逆は真ではなく、対応するＮＦＡ状態を持たないノードも存在する）。なお、従来技術においてＮＦＡ／ＤＦＡを構築するために定義される関数firstでは演算子の集合が返されるのに対し、本実施の形態では演算子１つ（＝ＮＦＡ状態１つ）のみが返される。
以上の定義から、次のことが成り立つ。
first(<char>)＝<char>            （文字）
first(<re1><re2>)＝first(<re1>)  （連結）
first(<re1>|<re2>)＝ |           （選択）
first(<re1>*)＝ *                （繰り返し）
first((<re>))＝first(<re>)       （括弧で囲われた部分正規表現）
図６は、関数firstの定義コードを例示する図である。
【００２９】
epsdest：引数のノードに対応するＮＦＡ状態からε遷移可能なＮＦＡ状態の集合を返す。
ここで、epsdestが空でない集合を返す、すなわちε遷移を許すのは、“繰り返しの演算子”と“選択の演算子”のみである。
この定義から、次のことが成り立つ。
epsdest(*)＝first(<re>)∪next(<re>)
（ただし、* の周りを“<re>*”とする）
epsdest(|)＝first(<re1>)∪first(<re2>)
（ただし、| の周りを“<re1>|<re2>”とする）
epsdest(<op>)＝φ
（ただし、<op> は、*、| 以外の演算子“a”、“[ab]”など）
図７は、関数epsdestの定義コードを例示する図である。
【００３０】
next：引数のノードを根とする部分木が対応する部分正規表現の次に出現する演算子に対応するＮＦＡ状態を返す。
すなわち、関数nextは、引数のノードが対応するＮＦＡ状態の遷移先を示す。また、関数firstと同様に、返す値が演算子の集合ではなく演算子１つのみであるため、“*”及び“|”を除く各ＮＦＡ状態の遷移先は一意に定まる。このとき受理する文字は、当該ノードが対応する演算子がマッチする文字である。
以上の定義から、次のことが成り立つ。なお、next(<re1>)は、正規表現中の<re1>の周囲に応じて定義される。
<re1>の周囲が<re1><re2>であるとき、
next(<re1>)＝first(<re2>)       （連結）
<re1>の周囲が<re1>|<re2>であるとき、
next(<re1>)＝next(<re1>|<re2>)  （選択）
<re1>の周囲が<re1>*であるとき、
next(<re1>)＝ *                 （繰り返し）
<re1>の周囲が(<re1>)であるとき、
next(<re1>)＝next((<re1>))      （括弧で囲われた部分正規表現）
<re1>が正規表現全体を表す、すなわち<re1>の周囲が<re1>であるとき、
next(<re1>)＝<TERM>             （一番外側の正規表現）
図８は、関数nextの定義コードを例示する図である。
【００３１】
図９は、上述した関数を用いて適切なＮＦＡを構築する処理を説明するフローチャートである。
なお、以下の動作において、ＮＦＡの開始状態とは、構文木のfirst（＝正規表現で最初に処理すべき演算子）である。また、ＮＦＡの状態には、正規表現の‘(’、‘)’を除く演算子と<TERM>にＮＦＡの状態が１つずつ割り当てられる。また、所定のＮＦＡ状態のε遷移先は、そのＮＦＡ状態に対応するノードのepsdest（定義より）である。ここで、epsdestが空でないのは、‘*’または‘|’の場合のみであり、ε遷移可能な状態も‘*’及び‘|’のみである。さらにまた、所定のあるＮＦＡ状態の遷移先は、そのＮＦＡ状態がε遷移先を持つ場合は、通常の遷移先はない。これに対しε遷移先を持たない場合は、そのＮＦＡ状態に対応するノードのnextである。このとき、受理する文字は、そのＮＦＡ状態が対応する演算子がマッチする文字である。例えば、演算子“a”は、文字“a”にマッチし、演算子“[abc]”は、文字“a”、“b”、“c”のいずれかにマッチする。また、ＮＦＡの終了状態とは、<TERM>である（<TERM>を除く全てのＮＦＡ状態は「ε遷移先を２つ」または「通常の遷移先を１つ」持つ）。
【００３２】
図９を参照すると、オートマトン構築部２１０は、まず〔nfa_st_num〕個のＮＦＡ状態を生成する（ステップ９０１）。ここで、nfa_st_numは、正規表現から本手法で生成するＮＦＡ状態の個数であり、正規表現中の‘(’、‘)’を除く要素の個数＋１（<TERM>の分）である。
次に、ＮＦＡの開始状態（nfa_init）を構文木の最初のノード（first(tree)）、すなわち正規表現で最初に処理すべき演算子とする。また、ＮＦＡの停止状態（nfa_halt）をＮＦＡの状態数（nfa_st_num−１）とする（ステップ９０２）。
【００３３】
次に、変数ｉを初期化（ｉ＝０）して、ｉ番目のＮＦＡ状態（状態ｉ）に対応する構文木上のノードへの参照（state_trees[i]）を調べる（ステップ９０３、９０４）。このノードへの参照である演算子が‘*’または‘|’である場合は、関数epsdestで得られるepsdest(state_trees[i])を状態ｉのε遷移先とする（ステップ９０５）。一方、状態ｉに対応する構文木上のノードへの参照である演算子が‘*’及び‘|’以外のものである場合は、当該ノードへの参照（state_trees[i]）が表す当該要素に対する状態ｉの遷移先を、関数nextで得られるnext(state_trees[i])とする（ステップ９０６）。
【００３４】
この後、変数ｉの値を１加算し（ステップ９０７）、得られた新たな変数ｉがＮＦＡの状態数に達したか否かを調べる（ステップ９０８）。そして、当該新たな変数ｉの値がＮＦＡの状態数未満であれば、当該新たな変数ｉを用いてステップ９０４移行の処理を実行する。一方、当該新たな変数ｉの値がＮＦＡの状態数に達したならば、ＮＦＡの停止状態に達し、適切なＮＦＡが作成されたので、処理を終了する。作成された適切なＮＦＡは、後でオートマトン判定部２４０による処理に用いられるため、オートマトン保持部２２０に格納される。
【００３５】
ステップ３０３で適切なＮＦＡからＤＦＡを構築する処理は、公知の手法を用いることができる。すなわち、元のＮＦＡの各状態で１文字受け取った際にどのように状態が遷移するかという情報を集めて１個の新しい状態を作る作業を、開始状態から最終状態まで順に繰り返す処理である。
以上のようにして作成されたＤＦＡは、メインメモリ１０３等で実現されるオートマトン保持部２２０に格納され、オートマトン判定部２４０による処理に使用される。
【００３６】
図１０は、オートマトン判定部２４０によるパターンマッチング処理の概略的な流れを示すフローチャートである。
図１０に示すように、オートマトン判定部２４０は、オートマトン保持部２２０に格納されているＤＦＡと、文書保持部２３０に格納されている検索対象の文字列（文書データ）とを読み出して入力すると（ステップ１００１）、まず、ＤＦＡにより入力文字列の判定（マッチング）を行う（ステップ１００２）。判定結果は、メインメモリ１０３やＣＰＵ１０１の図示しないキャッシュメモリに格納される。
次に、オートマトン判定部２４０は、当該入力文字列が受理されたならば、オートマトン保持部２２０から読み出されたＮＦＡ及びＤＦＡを用いて、ＤＦＡ状態列の絞り込み処理およびマッチ範囲（正規表現の所定の部分（部分正規表現）にマッチしている文字列の部分（部分文字列）の範囲）の判定処理を行う（ステップ１００３〜１００５）。この処理結果は、メインメモリ１０３やＣＰＵ１０１の図示しないキャッシュメモリに格納される。
最後に、オートマトン判定部２４０は、ステップ１００２の判定結果及びステップ１００４、１００５の処理結果をメインメモリ１０３等から読み出し、ディスプレイ装置等の出力デバイスを介して出力する（ステップ１００６）。また、当該入力文字列がＤＦＡにより受理されなかったならば、不受理の結果を出力する（ステップ１００３、１００６）。
以上の処理を全ての入力文字列に対して実行する（ステップ１００７）。すなわち、オートマトン判定部２４０は、入力文字列判定手段、ＤＦＡ状態列絞り込み手段およびマッチ範囲判定手段として機能する。
【００３７】
ステップ１００２における文字列のマッチング処理は、公知の手法を用いることができる。ここで、入力文字列がＤＦＡにマッチし、受理された場合であっても、それだけでは当該入力文字列中の部分正規表現がマッチした部分に関する情報を得られない。すなわち、ＤＦＡの状態列には入力に対してたどり得る全てのＮＦＡの状態列が含まれているため、正規表現のどの要素がどの文字にマッチしたかが識別できず、ＰＯＳＩＸにおける最長最左規則に適合する状態遷移がわからない。そこで、本実施の形態のオートマトン判定部２４０は、ＤＦＡの絞り込みで最長のＮＦＡ状態列の候補を取得し、最左なＮＦＡ状態列を復元することによりマッチ範囲を判定することにより、かかる情報を取得する。
【００３８】
ステップ１００４におけるＤＦＡ状態列の絞り込みでは、入力に対して到達し得る全てのＮＦＡの状態が含まれているＤＦＡ状態列のうちから、終了状態に到達し得ない不要なＮＦＡの状態列を削除する。このＤＦＡ状態列の絞り込みは、ＤＦＡを構成したＮＦＡ（適切なＮＦＡ）に基づいてＤＦＡの状態列を後ろからたどることによって行う。
図１１は、ＤＦＡ状態列の絞り込みにおける動作を説明するフローチャートである。
図１１に示すように、オートマトン判定部２４０は、まずステップ１００２で判定されたＤＦＡの状態列（state_log）と入力文字列のインデックス（idx）とを初期化する。具体的には、最後の停止状態に対するＤＦＡの状態（state_log[last]）を、ＮＦＡの停止状態（nfa_halt）のみを含むＤＦＡ状態とする。また、現在処理中（絞り込みの最中）の入力文字列のインデックス（idx）を、ＤＦＡの状態列における最後の停止状態（last）の直前の状態（last-1）とする（ステップ１１０１）。
例えば、ＤＦＡの状態列（state_log）が｛｛０，１，３｝，｛２，３，４｝，｛３，５｝，｛４｝｝であり、ＮＦＡの停止状態が５のとき、ＤＦＡの状態列中の停止状態は｛３，５｝のみである。このとき、最後の停止状態（last）の値は２（０から数えるため）である。すなわち、state_log[last]＝[nfa_st_num]は、この例ではstate_log[2]＝[5]であり、この結果ＤＦＡの状態列が、｛｛０，１，３｝，｛２，３，４｝，｛５｝，｛４｝｝となることを意味する。
【００３９】
次に、オートマトン判定部２４０は、現在処理中の入力文字列に対するＤＦＡの状態列（state_log[idx]）を更新する（ステップ１１０２）。そして、処理対象となる入力文字列のインデックスを、現在処理中の入力文字列のインデックスの１つ前の状態（idx=idx-1）とし（ステップ１１０３）、未処理の入力文字列が存在すればステップ１１０２に戻って処理を実行し、全ての入力文字列に対して処理が行われたならば、ＤＦＡの状態列の絞り込み処理を終了する（ステップ１１０４）。
【００４０】
図１２は、ステップ１１０２のＤＦＡの状態列（state_log[idx]）を更新する処理の詳細を説明するフローチャートである。
図１２を参照すると、オートマトン判定部２４０は、まず本処理で使用するメモリ領域（state_buf）を初期化し、本処理において参照するＮＦＡ状態へのインデックス（nfa_idx）の値を０とする（ステップ１２０１）。
次に、nfa_idxとstate_log[idx]との要素数を比較する（ステップ１２０２）。そして、state_log[idx]の要素数の方が大きい場合、参照しているＮＦＡ状態（nfa_st）をstate_log[idx][nfa_idx]とし、メモリ領域において当該ＮＦＡ状態が対応する構文木上のノードへのポインタ（node）をstate_trees[nfa_st]とする（ステップ１２０３）。そして、構文木におけるノードの文字列表現（node.label）が‘*’または‘|’かどうかを調べる。‘*’または‘|’のいずれかであった場合は、nfa_idxの値を１加算してステップ１２０２へ戻る（ステップ１２０４、１２０８）。
【００４１】
ノードの文字列表現（node.label）が‘*’または‘|’のいずれでもない場合、オートマトン判定部２４０は、次に、関数値next(node)について、next(node)∈state_log[idx+1]が成り立つかどうかを調べる（ステップ１２０４、１２０５）。これが成り立たないならば、nfa_idxの値を１加算してステップ１２０２へ戻る（ステップ１２０８）。
一方、next(node)∈state_log[idx+1]が成り立つ場合、オートマトン判定部２４０は、次に、当該ノードの文字列表現が現在処理中のインデックスに対応する入力文字（input(idx)）を受理するかどうかを調べる（ステップ１２０６）。そして、受理しないならば、nfa_idxの値を１加算してステップ１２０２へ戻る（ステップ１２０８）。
さらに、ノードの文字列表現が文字列input(idx)を受理する場合、オートマトン判定部２４０は、次に、メモリ領域state_bufにnfa_stを追加する（ステップ１２０７）。そして、nfa_idxの値を１加算してステップ１２０２へ戻る（ステップ１２０８）。
【００４２】
ステップ１２０２〜１２０８の処理を繰り返してstate_bufに格納されるＮＦＡ状態を追加していき、nfa_idxの値がstate_log[idx]の要素数に達したならば、次に、オートマトン判定部２４０は、ε遷移元の追加処理を行う（ステップ１２０９）。ε遷移元の追加処理については後述する。
この後、オートマトン判定部２４０は、state_log[idx]をstate_bufに蓄積された処理結果に更新する（ステップ１２１０）。
【００４３】
図１３は、ε遷移元の追加処理の詳細を説明するフローチャートである。
図１３を参照すると、オートマトン判定部２４０は、まず本処理において参照するＮＦＡ状態へのインデックス（nfa_idx）の値を０とする（ステップ１３０１）。
次に、nfa_idxとstate_log[idx]との要素数を比較する（ステップ１３０２）。そして、state_log[idx]の要素数の方が大きい場合、参照しているＮＦＡ状態（nfa_st）をstate_log[idx][nfa_idx]とし、メモリ領域において当該ＮＦＡ状態が対応する構文木上のノードへのポインタ（node）をstate_trees[nfa_st]とする（ステップ１３０３）。そして、構文木におけるノードの文字列表現（node.label）が‘*’または‘|’かどうかを調べる。‘*’または‘|’のいずれでもない場合は、nfa_idxの値を１加算してステップ１３０２へ戻る（ステップ１３０４、１３０７）。
【００４４】
ノードの文字列表現（node.label）が‘*’または‘|’であった場合、オートマトン判定部２４０は、次に、関数値epsdest(node)について、epsdest(node)∈state_bufが成り立つかどうかを調べる（ステップ１３０４、１３０５）。これが成り立たないならば、nfa_idxの値を１加算してステップ１３０２へ戻る（ステップ１３０７）。
一方、epsdest(node)∈state_bufが成り立つ場合、オートマトン判定部２４０は、次に、メモリ領域state_bufにnfa_stを追加し、ステップ１３０１へ戻る（ステップ１３０６）。
【００４５】
以上の処理を繰り返してstate_bufに格納されるＮＦＡ状態を追加していき、nfa_idxの値がstate_log[idx]の要素数に達したならば、ε遷移元の追加処理を終了する。
これにより、現在処理中の入力文字列に対するＤＦＡの状態列（state_log[idx]）が更新され、ＤＦＡ状態列の絞り込み処理が完了する。
【００４６】
次に、上述したＤＦＡ状態列の絞り込み処理の具体的な動作例を説明する。
ここでは、正規表現“((a*)a)*a”に対して、入力文字列“aaaa”のマッチングを調べる場合を例とする。
図１４は、正規表現“((a*)a)*a”の適切なＮＦＡを示す図である。
図１４に示すＮＦＡは、０、１、２、３、４、５という６つの状態を有する。
図１５は、図１４に示したＮＦＡのＤＦＡ及び文字列“aaaa”に対する状態遷移を示す図である。
図１５のＤＦＡを参照すると、入力文字列“aaaa”は受理され、ＤＦＡにおける状態遷移は、開始状態が｛０，１，２，３，４｝であり、最初の文字以降の入力文字列に対するＤＦＡの状態は全て｛０，１，２，３，４，５｝である。したがって、最長最左規則に従えば、入力文字列“aaaa”のうちの初めの２つの‘a’が正規表現“((a*)a)*a”における‘a*’に部分的にマッチングしているのであるが、ＤＦＡからかかる情報を得ることはできない。
【００４７】
図１６は、入力文字列“aaaa”に対するＮＦＡ状態の遷移の様子を示す図である。図１６（Ａ）には、各ＮＦＡ状態からの、ε遷移先および当該ＮＦＡ状態の文字と当該文字に対する遷移先のＮＦＡ状態が一覧表示されている。また、図１６（Ｂ）には、図１６（Ａ）に基づいて絞り込まれたＤＦＡの状態列による状態遷移の経路が示されている。
【００４８】
図１４のＮＦＡ及び図１６（Ａ）の遷移表を参照して、ＤＦＡの状態列の絞り込みを考える。
まず、図１６（Ａ）における最右の列は、ＮＦＡの終了状態であるので、図１４のＮＦＡに基づいてＮＦＡ状態５でなければならない。次に、文字‘a’を１つ入力することでＮＦＡ状態５に到達し得るＮＦＡ状態は、ＮＦＡ状態４と、ＮＦＡ状態４にε遷移するＮＦＡ状態３のみである。次に、文字‘a’を１つ入力することでＮＦＡ状態４またはＮＦＡ状態３に到達し得るＮＦＡ状態は、ＮＦＡ状態２と、ＮＦＡ状態にε遷移するＮＦＡ状態１と、ＮＦＡ状態１にε遷移するＮＦＡ状態３のみである。同様にして、文字‘a’を１つ入力することでＮＦＡ状態１、２または３に遷移するＮＦＡ状態は、ＮＦＡ状態０、１、２または３であることがわかる。さらに、文字‘a’を１つ入力することでＮＦＡ状態１、２または３に遷移するＮＦＡ状態（これが開始状態に相当する）は、ＮＦＡ状態０、１、２または３であることがわかる。図１６（Ａ）では、このようにして抽出される、すなわち絞り込まれたＤＦＡの状態列が斜体字で示されている。
【００４９】
図１６（Ｂ）は、上記のようにして絞り込まれたＤＦＡの状態列に関して、開始状態のＮＦＡ状態３から終了状態のＮＦＡ状態５までの可能な経路を示している。同図において、ε遷移は縦方向の経路で、文字‘a’に対する遷移は横方向の経路で示している。また、ＮＦＡ状態０へ向かう（１）の表記は、ＮＦＡ状態０がＮＦＡ状態２と同様にＮＦＡ状態１から遷移することを意味している。
【００５０】
次に、オートマトン判定部２４０による処理（図１０参照）におけるステップ１００５のマッチ範囲の判定処理について説明する。
この処理では、ステップ１００４で絞り込まれたＤＦＡの状態列に基づき、適切なＮＦＡにて得られる状態遷移に関する情報を用いて、文字列のマッチ範囲を判定する。これにより、ＰＯＳＩＸの最長最左規則に応じた部分正規表現のマッチングや最長一致といった情報が得られることとなる。
【００５１】
図１７は、マッチ範囲の判定処理における動作を説明するフローチャートである。
図１７に示すように、オートマトン判定部２４０は、まずレジスタに格納される各種のパラメータを初期化する（ステップ１７０１）。具体的には、現在参照しているＮＦＡ状態（nfa_state）をオートマトン保持部２２０から入力した適切なＮＦＡの開始状態（nfa_init）とし、部分正規表現がマッチした部分を示すデータmatches[i]＝（−１，−１）（０≦ｉ≦ＭＡＸ）を設定して、処理対象の文字列中で現在参照しているインデックス（idx）をidx＝matches[0].first＝０とする。
【００５２】
そして、オートマトン判定部２４０は、レジスタの更新処理（ステップ１７０２）、現在参照しているＮＦＡ状態の次のＮＦＡ状態への遷移処理（ステップ１７０３）を行う。これらの処理については後述する。
次に、オートマトン判定部２４０は、ＮＦＡ状態（nfa_state）が停止状態（nfa_halt）かどうかを判断する（ステップ１７０４）。そして、nfa_state＝nfa_haltでなければ、ステップ１７０２に戻って処理を繰り返し、nfa_state＝nfa_haltであれば、マッチ範囲の判定処理を終了する。
【００５３】
図１８は、レジスタの更新処理の詳細を説明するフローチャートである。
図１８を参照すると、オートマトン判定部２４０は、まず変数ｉを初期化（ｉ＝０）して（ステップ１８０１）、ＮＦＡ状態（nfa_state）が部分正規表現の範囲に含まれるかどうか（subexps[i].first≦nfa_state＜subexps[i].last）を判断する（ステップ１８０２）。ＮＦＡ状態がこの範囲に含まれていない場合は、データmatches[i].lastをインデックス（idx）の値（初期的にはｉ＝０であるので、図１７のステップ１７０１からmatches[0].last＝matches[0].first＝０となる）とする（ステップ１８０３）。そして、変数ｉの値を１加算し（ステップ１８０６）、変数ｉの値が図１７のステップ１７０１で設定したＭＡＸに達していなければステップ１８０２に戻る（ステップ１８０７）。
【００５４】
ステップ１８０２において、ＮＦＡ状態が部分正規表現の範囲に含まれている場合、オートマトン判定部２４０は、次に、matches[i].first＝−１またはmuches[i].last≠−１が成り立つかどうかを調べる（ステップ１８０４）。この関係が成り立つならば、データmatches[i].firstをインデックス（idx）の値とし、データmatches[i].lastの値を−１とする（ステップ１８０５）。そして、変数ｉの値を１加算し（ステップ１８０６）、変数ｉの値が図１７のステップ１７０１で設定したＭＡＸに達していなければステップ１８０２に戻る（ステップ１８０７）。
また、ステップ１８０４でmatches[i].first＝−１またはmuches[i].last≠−１が成り立たない場合は、データに対しては何らの処理も行わず、変数ｉの値を１加算し（ステップ１８０６）、変数ｉの値が図１７のステップ１７０１で設定したＭＡＸに達していなければステップ１８０２に戻る（ステップ１８０７）。
以上のようにしてステップ１８０２〜１８０７の処理を繰り返し、変数ｉの値がＭＡＸに達したならば、レジスタの更新処理を終了する。
【００５５】
図１９は、次のＮＦＡ状態への遷移処理の詳細を説明するフローチャートである。
図１９を参照すると、オートマトン判定部２４０は、まず、現在参照しているＮＦＡ状態が対応するメモリ領域における構文木上のノードへのポインタ（node）をstate_trees[nfa_state]とする（ステップ１９０１）。そして、構文木におけるノードの文字列表現（node.label）が‘*’または‘|’かどうかを調べる。‘*’または‘|’であった場合は、集合epsdest(node)のうちの最も番号の小さい状態をＮＦＡ状態（nfa_state）とする（ステップ１９０２、１９０３）。
一方、構文木におけるノードの文字列表現（node.label）が‘*’または‘|’のいずれでもない場合は、ＮＦＡ状態（nfa_state）を次のノード（next(node)）として処理を終了する（ステップ１９０２、１９０４）。
【００５６】
次に、上述したマッチ範囲の判定処理の具体的な動作例を説明する。
ここでは、図１４乃至図１６を参照して説明した、正規表現“((a*)a)*a”に対して、入力文字列“aaaa”のマッチングを調べる場合を例として説明する。
図１６に示したように、図１０のステップ１００４におけるＤＦＡ状態列の絞り込み処理により、適切なＮＦＡの開始状態から終了状態へ至る、可能な状態列が抽出されている。
図２０は、図１６に示された遷移表（図１６（Ａ））及び絞り込まれたＤＦＡ状態列による状態遷移の経路（図１６（Ｂ））に基づいて、マッチ範囲を判定する様子を示す図である。なお、図２０（Ａ）の遷移表では、ＤＦＡ状態列の絞り込みにより削除されたＮＦＡ状態を括弧付きの数字で記述してある。
【００５７】
図２０（Ａ）（Ｂ）を参照して可能なＤＦＡ状態列をたどると、まずＮＦＡの開始状態３からＮＦＡ状態１へ遷移し、次にＮＦＡ状態０またはＮＦＡ状態２へ遷移が可能である。しかし、ＰＯＳＩＸの最長最左規則に従って、先に出現する繰り返しを可能な限り多く選択するため、遷移先はＮＦＡ状態０となる。続いて、ＮＦＡ状態０からＮＦＡ状態１へ遷移し、次にＮＦＡ状態０またはＮＦＡ状態２へ遷移が可能となる。ここでも最長最左規則に従って、遷移先としてＮＦＡ状態０が選択される。この後、ＮＦＡ状態０からＮＦＡ状態１、ＮＦＡ状態２、ＮＦＡ状態３、ＮＦＡ状態４、ＮＦＡ状態５と遷移して終了状態に至る。図２０（Ａ）（Ｂ）では、このようにして選択されたＤＦＡ状態列が斜体字で示されている。
【００５８】
以上のようにして、正規表現“((a*)a)*a”に対して、入力文字列“aaaa”がマッチングした際にたどるべきＮＦＡ状態列が復元された。
図２１は、復元されたＮＦＡ状態列を示す図である。
図２１において、状態遷移を示す矢印に文字‘a’が付されているものが文字に対する遷移であり、文字‘a’が付されていないものがε遷移である。図２１から、入力文字列“aaaa”のうち、初めの２つの文字‘a’がＮＦＡ状態０からＮＦＡ状態１への遷移に対応しており、正規表現“((a*)a)*a”における２重括弧の内側の‘a*’にマッチングしていることがわかる。同様にして、３番目の文字‘a’が正規表現における外側の括弧内の‘a’にマッチングし、最後の文字‘a’が正規表現における最も外側の‘a’にマッチングしていることがわかる。
【００５９】
このようにして、入力文字列のどの文字が正規表現におけるどの部分にマッチングしているかという情報が得られることとなる。
以上のようなパターンマッチングを、ＮＦＡを用いて行う場合、処理に要する時間はＯ(２n)程度であり、入力ｎに対して２のｎ乗に比例した時間を要する。これに対し、本実施の形態では、ＤＦＡを用いたパターンマッチングに要する時間がＯ(n)程度であり、ＤＦＡ状態の絞り込み処理及びマッチ範囲の判定処理に要する時間がＯ(n)程度であって、いずれも入力ｎに対してｎに比例した時間で完了する。したがって、本実施の形態は、ＮＦＡを用いた処理と比して、処理に要する時間を大幅に短縮することができる。
【００６０】
ここで、本実施の形態を具体的なテキストファイルにおける文字列検索に用いた例について説明する。
住所録が入ったテキストファイルがあるとする。このテキストファイルにおいて、名前などの各項目は‘,’で区切られており、最初の項目は名前である。しかし、１つのエントリにどのような項目があるかは統一されていないとする。
今、この住所録のテキストファイルに次のようなエントリが並んでいるものとする。
日本太郎,taro@yamato.ibm.com,046-xxx-xxxx,神奈川県大和市大和東X-X-X
大和次郎,Yamato Jiro,jiro@jp.ibm.com,神奈川県大和市下鶴間X-X-X
このテキストファイルから、住所が「神奈川県大和市」で電子メールアドレスにibm.comという文字列が含まれる人の名前と電子メールアドレスを列挙する作業を考える。
このような場合、正規表現を用いると容易に検索することができる。例えば、次の正規表現で検索可能である。
([^,]*),([^,]*,)*([^,]*@[^,]*ibm.com),([^,]*,)*神奈川県大和市
この正規表現において、[^,] は、‘,’以外の任意の文字にマッチし、*は0回以上の繰り返しである。よって、[^,]*は、上記テキストファイルのエントリにおける項目１つ分にマッチする。例えば、最初の ([^,]*), は名前と直後の‘,’にマッチし、括弧で括られた部分が名前にマッチすることとなる。
また、([^,]*,)*は、所定の項目と‘,’の０回以上の繰り返し、すなわちに名前とメールアドレスの間にある任意個の項目にマッチする。さらに、文字＠及び文字列ibm.comを含む([^,]*@[^,]*ibm.com) は、メールアドレスにマッチする。そして、これ以降、０個以上の項目にマッチし、最後に“神奈川県大和市”にマッチする。
【００６１】
これを従来のＤＦＡで処理すると、正規表現中の括弧‘(’‘)’で囲われた部分が元の文章のどこにマッチしたか分からないため、名前やメールアドレスといった特定の項目を抜き出すことができない。一方、ＮＦＡでは実行に入力の長さの指数関数時間かかってしまう。
しかしながら、上記第１の実施の形態においては、ＤＦＡを用いたパターンマッチングにより短時間で文字列の照合を行うことができ、さらにマッチした文字列に対してＤＦＡ状態列の絞り込み及びＮＦＡ状態列の復元によるマッチ範囲の判定を行うことによって、どの項目が正規表現のどの部分にマッチしたかという情報が得られるため、所望の項目を取り出すことが可能となる。
【００６２】
［第２の実施の形態］
第２の実施の形態は、上述した第１の実施形態と同様に、正規表現で表現された検索条件に基づき、ＤＦＡ（決定性有限状態オートマトン）を用いて文字列検索を行う文書処理システムをコンピュータにて実現する。そして、検索キーとなる文字列に対して、複数文字照合要素を許容する。このシステムは、ＤＦＡを用いて文字列のパターンマッチングを行う際に、入力文字列を先読みすることにより、複数文字照合要素が含まれているか否かを判定する。また、入力文字列がマッチするかどうか（ＤＦＡに受理されるかどうか）を判定する際に、ＤＦＡの状態遷移における遷移先の状態を動的に決定し、かつ動的に生成しながら評価を行う。
【００６３】
第２の実施の形態による文書処理システムは、図１に例示された第１の実施の形態による文書処理システムと同様のコンピュータ装置にて実現される。また、図２に示された第１の実施の形態による文書処理システムと同様のシステム構成を備える。そこで、本実施の形態では、各構成要素を図１及び図２で用いた符号を付して説明することとし、文書処理システムを実現するコンピュータ装置のハードウェア構成及びシステムの機能構成については説明を省略する。
【００６４】
また、第２の実施の形態において、オートマトン構築部２１０の動作は、図３乃至図９を参照して説明した、第１の実施の形態におけるオートマトン構築部２１０の動作と同様である。そこで、本実施の形態においては、オートマトン構築部２１０の動作についての説明を省略する。
【００６５】
第２の実施の形態におけるオートマトン判定部２４０は、概略的に、第１の実施の形態におけるオートマトン判定部２４０と同様に動作する。すなわち、図１０に示すように、オートマトン保持部２２０に格納されているＤＦＡと、文書保持部２３０に格納されている検索対象の文字列（文書データ）とを入力し（ステップ１００１）、ＤＦＡにより入力文字列のマッチングを行い（ステップ１００２）、ＤＦＡ状態列の絞り込み処理およびマッチ範囲の判定処理を行って（ステップ１００３〜１００５）、処理結果を出力する（ステップ１００６、１００７）。
【００６６】
ここで、第１の実施の形態では、ステップ１００２における文字列のマッチング処理に公知の手法を用いることとした。これに対し、第２の実施の形態では、複数文字照合要素に対応するため、ＤＦＡの状態遷移を動的に決定し生成しながら評価を行う。
図２２、２３は、第２の実施の形態におけるＤＦＡによる入力文字列の判定処理を説明するフローチャートである。
図２２、２３を参照すると、オートマトン判定部２４０は、まず、処理対象である入力文字列のインデックス（idx）を初期化（idx＝０）し、ＤＦＡの状態列（state_log[0]）をＮＦＡの開始状態（nfa_init）におけるeclosure(nfa_init)とする（ステップ２２０１）。ここで、eclosure(state：ＮＦＡ状態)は、
epsdest(state)∪epsdest(state)の各要素をstate'としてepsdest(state')...
と拡張した最大の集合である。
また、本処理において参照するＮＦＡ状態へのインデックス（nfa_idx）の値を０とする（ステップ２２０２）。
【００６７】
次に、nfa_idxとstate_log[idx]との要素数を比較する（ステップ２２０３）。そして、state_log[idx]の要素数の方が大きい場合、参照しているＮＦＡ状態（nfa_st）をstate_log[idx][nfa_idx]とし、メモリ領域において当該ＮＦＡ状態が対応する構文木上のノードへのポインタ（node）をstate_trees[nfa_st]とする（ステップ２２０４）。そして、構文木におけるノードの文字列表現（node.label）が‘*’または‘|’かどうかを調べる。‘*’または‘|’であった場合は、nfa_idxの値を１加算してステップ２２０３へ戻る（ステップ２２０５、２２１２）。
【００６８】
ステップ２２０５において、ノードの文字列表現（node.label）が‘*’または‘|’のいずれでもない場合、オートマトン判定部２４０は、次に、入力文字列が現在処理中のインデックス（idx）を先頭とする複数文字照合要素を持つかどうかを調べる（ステップ２２０６）。
複数文字照合要素がある場合、データmblenを、
mblen＝入力文字列のインデックス（idx）から始まる複数文字照合要素の長さ
のように定義し（ステップ２２０７）、次に、当該ＮＦＡ状態が対応する構文木上のノードが当該複数文字照合要素を受理可能かどうかを調べる（ステップ２２０８）。そして、受理可能であれば、ＤＦＡの状態列state_log[idx+mblen]にeclosure(next(node))を追加する（ステップ２２０９）。
【００６９】
ステップ２２０６で入力文字列が複数文字照合要素を持たないと判断された場合、またはステップ２２０８でノードが複数文字照合要素を受理不可能と判断された場合、またはノードが複数文字照合要素を受理可能と判断されてステップ２２０９の処理が行われた後、オートマトン判定部２４０は、処理中のノードに対応する正規表現の文字列表現（node.label）が当該インデックスの入力（input(idx)）を受理したかどうかを調べる（ステップ２２１０）。そして、受理したならば、ＤＦＡの状態列state_log[idx+1]にeclosure(next(node))を追加する（ステップ２２１１）。
ステップ２２１０で処理中のノードに対応する正規表現の文字列表現（node.label）が当該インデックスの入力（input(idx)）を受理しなかった場合、または、ステップ２２１１の処理の後、nfa_idxの値を１加算してステップ２２０３へ戻る（ステップ２２１２）。
【００７０】
ステップ２２０３〜２２１２の処理を繰り返し、nfa_idxの値がstate_log[idx]の要素数に達したならば、次に、オートマトン判定部２４０は、入力文字列のインデックス（idx）を１つ進め（ステップ２２１３）、入力文字列のインデックスが当該入力文字列の最後の文字に達したか、またはstate_log[i]＝０（ｉ≧idx）が成り立つかどうかを調べる（ステップ２２１４）。これがいずれも成り立たない場合は、ステップ２２０２に戻って処理を繰り返し、いずれかが成り立つ場合は、ＤＦＡによる入力文字列の判定処理を終了する。
【００７１】
次に、オートマトン判定部２４０は、図１０に示すように、ＤＦＡ状態列の絞り込み処理（ステップ１００４）を行う。
第２の実施の形態におけるＤＦＡ状態列の絞り込み処理は、図１１に示した第１の実施の形態における処理と概ね同様であるが、state_log[idx]の更新処理（ステップ１１０２）において、複数文字照合要素に対応する点が異なっている。
図２４、２５は、本実施の形態におけるＤＦＡ状態列の絞り込み処理を説明するフローチャートである。
図２４、２５において、ステップ２４０１からステップ２４０４までの処理は、図１２のステップ１２０１からステップ１２０４までの処理と同様であり、ステップ２４１２からステップ２４１４までの処理は、図１２のステップ１２０８からステップ１２１０までの処理と同様である。
【００７２】
ステップ２４０４で、ノードの文字列表現（node.label）が‘*’または‘|’のいずれでもない場合、オートマトン判定部２４０は、次に、入力文字列が現在処理中のインデックス（idx）を先頭とする複数文字照合要素を持つかどうかを調べる（ステップ２４０５）。
複数文字照合要素がある場合、データmblenを、
mblen＝入力文字列のインデックス（idx）から始まる複数文字照合要素の長さ
のように定義し（ステップ２４０６）、次に、当該ＮＦＡ状態が対応する構文木上のノードが当該複数文字照合要素を受理可能かどうかを調べる（ステップ２４０７）。そして、受理可能であれば、さらに関数値next(node)について、next(node)∈state_log[idx+mblen]が成り立つかどうかを調べる（ステップ２４０８）。
【００７３】
ステップ２４０５で入力文字列が複数文字照合要素を持たないと判断された場合、またはステップ２４０７でノードが複数文字照合要素を受理不可能と判断された場合、またはステップ２４０８でnext(node)∈state_log[idx+mblen]が成り立たないと判断された場合、オートマトン判定部２４０は、次に、関数値next(node)について、next(node)∈state_log[idx+1]が成り立つかどうかを調べる（ステップ２４０９）。これが成り立たないならば、nfa_idxの値を１加算してステップ２４０２へ戻る（ステップ２４１２）。
一方、ステップ２４０９でnext(node)∈state_log[idx+1]が成り立つ場合、オートマトン判定部２４０は、次に、当該ノードの文字列表現が現在処理中のインデックスに対応する入力文字（input(idx)）を受理するかどうかを調べる（ステップ２４１０）。そして、受理しないならば、nfa_idxの値を１加算してステップ２４０２へ戻る（ステップ２４１２）。
さらに、ステップ２４１０でノードの文字列表現が入力文字input(idx)を受理する場合、またはステップ２４０８でnext(node)∈state_log[idx+idx]が成り立つ場合、オートマトン判定部２４０は、次に、メモリ領域state_bufにnfa_stを追加する（ステップ２４１１）。そして、nfa_idxの値を１加算してステップ２４０２へ戻る（ステップ２４１２）。
上述したように、これ以降の動作は図１２に示した第１の実施の形態における動作と同様である。
【００７４】
次に、オートマトン判定部２４０は、図１０に示すように、マッチ範囲の判定処理（ステップ１００５）を行う。
第２の実施の形態におけるマッチ範囲の判定処理は、図１１に示した第１の実施の形態における処理と概ね同様であるが、次のＮＦＡ状態への遷移処理（ステップ１７０３）において、複数文字照合要素に対応する点が異なっている。
図２６は、本実施の形態におけるマッチ範囲の判定処理を説明するフローチャートである。
図２６において、ステップ２６０１からステップ２６０３までの動作は、図１９のステップ１９０１からステップ１９０３までの動作と同様である。
【００７５】
ステップ２６０２で、構文木におけるノードの文字列表現（node.label）が‘*’または‘|’のいずれでもない場合、オートマトン判定部２４０は、次に、入力文字列が現在処理中のインデックス（idx）を先頭とする複数文字照合要素を持つかどうかを調べる（ステップ２６０４）。そして、複数文字照合要素を持たないならば、現在処理中のインデックス（idx）を１つ進め（ステップ２６０８）、ＮＦＡ状態（nfa_state）を次のノード（next(node)）として処理を終了する（ステップ２６０９）。
【００７６】
ステップ２６０４で入力文字列が複数文字照合要素を持つと判断された場合、データmblenを、
mblen＝入力文字列のインデックス（idx）から始まる複数文字照合要素の長さ
と定義し（ステップ２６０５）、次に、当該ＮＦＡ状態が対応する構文木上のノードが当該複数文字照合要素を受理可能かどうかを調べる（ステップ２６０６）。そして、受理可能であれば、state_log[idx+mblen]にeclosure(next(node))を追加して（ステップ２６０７）、ＮＦＡ状態（nfa_state）を次のノード（next(node)）として処理を終了する（ステップ２６０９）。
また、ステップ２６０６でノードが複数文字照合要素を受理不可能と判断された場合、現在処理中のインデックス（idx）を１つ進め（ステップ２６０８）、ＮＦＡ状態（nfa_state）を次のノード（next(node)）として処理を終了する（ステップ２６０９）。
【００７７】
次に、第２の実施の形態におけるＤＦＡによる入力文字列の判定処理の具体的な動作例を説明する。
ここでは、正規表現“[a-b]c|aab”に対して、入力文字列“aac”のマッチングを調べる場合を例とする。なお、“aa”は有効な複数文字照合要素であり、すなわち“aa”∈“[a-b]”である。
図２７は、オートマトン構築部２１０にて作成された正規表現“[a-b]c|aab”の適切なＮＦＡを示す図である。
図２７に示すＮＦＡは０、１、２、３、４、５、６という７つの状態を有する。
図２８乃至図３３は、オートマトン判定部２４０において、ＤＦＡの状態遷移における遷移先の状態を動的に決定し生成する様子を示す図である。
【００７８】
図２７及び図２８を参照すると、まず、ＮＦＡの開始状態であるＮＦＡ状態２に対応するＤＦＡの開始状態｛０，２，３｝が生成される。なお、この例では、入力文字列“aac”の各文字に対して対応するＤＦＡの各状態が生成されていくこととなる。
【００７９】
次に、入力文字列“aac”の最初の文字‘a’に対する処理が行われる。図２７に示すＮＦＡを参照すると、入力文字‘a’に対してＮＦＡ状態０からＮＦＡ状態１またはＮＦＡ状態３からＮＦＡ状態４へ遷移可能であるため、図２９に示すように状態｛１，４｝が生成される。
ここで、入力文字列の先読みが行われ、１番目の文字が‘a’であることから、１番目と２番目の文字列がが複数文字照合要素“aa”である可能性がある。そこで、図２７のＮＦＡに基づき、この文字列が複数文字照合要素“aa”であった場合の遷移先として、図３０に示すように状態｛１｝が仮に生成される。なお、この状態｛１｝は先読みによる不完全な状態なので、図３０では破線で示してある。
【００８０】
次に、入力文字列の２番目の文字‘a’に対する処理が行われる。図２７に示すＮＦＡを参照すると、ＮＦＡ状態１から文字‘a’に対する遷移はなく、ＮＦＡ状態４からＮＦＡ状態５へ遷移するのみであるため、図３１に示すように状態｛５｝が生成される。
ここで、入力文字列の１番目と２番目の複数文字照合要素“aa”が“[a-b]”に該当してＮＦＡ状態０からＮＦＡ状態１へ遷移するか、または各文字‘a’に対してＮＦＡ状態３→ＮＦＡ状態４→ＮＦＡ状態５と遷移するかのいずれかであることがわかった。そこで、図３２に示すように、状態｛１｝と状態｛５｝とを融合した状態｛１，５｝を生成する。
【００８１】
次に、図２７のＮＦＡより、入力文字‘c’に対してＮＦＡ状態１からＮＦＡ状態６に遷移し、入力文字‘b’に対してＮＦＡ状態５からＮＦＡ状態６に遷移することがわかる。そこで、図３３に示すように、状態｛６｝が生成される。これらはＮＦＡの終了状態であるため、以上で入力文字列“aac”に対するＤＦＡの状態遷移における遷移先の状態を動的な生成が完了する。なお、入力文字列“aac”の最後の文字は‘c’であるから、終了状態｛６｝へ到達し、当該入力文字列“aac”はこのＤＦＡにマッチすることがわかる。
【００８２】
このようにして、複数文字照合要素を含む正規表現に対しても、ＤＦＡを用いて高速なパターンマッチングを行うことが可能となる。
以上のようなパターンマッチングを、ＮＦＡを用いて行う場合、処理に要する時間はＯ(２n)程度であり、入力ｎに対して２のｎ乗に比例した時間を要する。これに対し、本実施の形態では、ＤＦＡを用いたパターンマッチングに要する時間がＯ(n)程度であり、入力ｎに対してｎに比例した時間で完了する。したがって、本実施の形態は、ＮＦＡを用いた処理と比して、処理に要する時間を大幅に短縮することができる。
また、照合要素の文字数を可変とすることができるため、日本語の文字のようなマルチバイトキャラクタに対する文字検索にも、ＤＦＡを用いた高速なパターンマッチングを適用することが可能となる。
【００８３】
なお、第２の実施の形態は、第１の実施の形態に加えて、入力文字列の判定時にＤＦＡの状態遷移における遷移先の状態を動的に決定し生成することとしたが、かかる手法を、第１の実施の形態による手法（すなわち、ＤＦＡの絞り込み及びＮＦＡ状態の復元により、入力文字列中の部分正規表現がマッチした部分に関する情報を得る手法）とは独立して用いることも可能である。この場合も、上述したように複数文字照合要素を含む正規表現に対して、ＤＦＡを用いて高速なパターンマッチングを行うことが可能である。しかしながら、上記のように第１の実施の形態と組み合わせて用いることにより、backreferenceにも応用することが可能である。
ここで、backreferenceとは、「指定した部分正規表現がマッチした文字列に待ちする演算子」をいう。例えば、正規表現“(ab(cd))\1\2”は、“abcdabcdcd”にマッチするが、この場合の\1及び\2がbackreferenceである。
\1、\2の１、２が部分正規表現の出現順を示しており、例えば正規表現“(ab(cd))”の場合、外側の（最初に出現している）括弧に囲われた“(ab(cd))”が\1に対応し、次に出現する内側の括弧内の“(cd)”が\2に対応する。そして、それぞれのマッチした文字列“abcd”、“cd”に、\1、\2がマッチする。同様に、正規表現“(ab)(cd)\2\1”は、“abcdcdab”にマッチし、“(a+)\1”は、“aa”、“aaaa”、“aaaaaa”、・・・、すなわち偶数個のaの文字列にマッチする。このとき、文字列のうちの前半分が(a+)にマッチし、後ろ半分が\1にマッチする。
このように、backreferenceは、「\1が出現するまでの部分正規表現が何にマッチしたか」という情報が必要であり、さらにbackreference自身は、「１つの演算子で複数の文字にマッチ」する。この２つの条件のうち、前者に第１の実施の形態で対応し、後者に第２の実施の形態で対応することにより、backreferenceを用いた文字列の照合、検索を行うことが可能となる。
【００８４】
【発明の効果】
以上説明したように、本発明によれば、部分正規表現や最長一致を含むＰＯＳＩＸ正規表現をＤＦＡ（決定性有限状態オートマトン）にて処理することが可能となる。
また、本発明によれば、複数文字照合要素を含む正規表現をＤＦＡ（決定性有限状態オートマトン）にて処理することが可能となる。
【図面の簡単な説明】
【図１】  第１の実施の形態による文書処理システムを実現するのに好適なコンピュータ装置のハードウェア構成の例を模式的に示す図である。
【図２】  第１の実施の形態による文書処理システムの構成を説明する図である。
【図３】  第１の実施の形態のオートマトン構築部によるＤＦＡ構築処理の概略的な流れを示すフローチャートである。
【図４】  正規表現“ab|c(de)*”から構築される構文木を示す図である。
【図５】  構文木を構築する処理を実行するためのプログラムの例を示す図である。
【図６】  第１の実施の形態による適切なＮＦＡの構築に用いられる関数firstの定義コードを例示する図である。
【図７】  第１の実施の形態による適切なＮＦＡの構築に用いられる関数epsdestの定義コードを例示する図である。
【図８】  第１の実施の形態による適切なＮＦＡの構築に用いられる関数nextの定義コードを例示する図である。
【図９】  第１の実施の形態において適切なＮＦＡを構築する処理を説明するフローチャートである。
【図１０】  第１の実施の形態のオートマトン判定部によるパターンマッチング処理の概略的な流れを示すフローチャートである。
【図１１】  第１の実施の形態におけるＤＦＡ状態列の絞り込みにおける動作を説明するフローチャートである。
【図１２】  図１１におけるＤＦＡの状態列（state_log[idx]）を更新する処理の詳細を説明するフローチャートである。
【図１３】  図１２におけるε遷移元の追加処理の詳細を説明するフローチャートである。
【図１４】  正規表現“((a*)a)*a”の適切なＮＦＡを示す図である。
【図１５】  図１４に示したＮＦＡのＤＦＡ及び文字列“aaaa”に対する状態遷移を示す図である。
【図１６】  入力文字列“aaaa”に対するＮＦＡ状態の遷移の様子を示す図である。
【図１７】  第１の実施の形態におけるマッチ範囲の判定処理における動作を説明するフローチャートである。
【図１８】  図１７におけるレジスタの更新処理の詳細を説明するフローチャートである。
【図１９】  図１７における次のＮＦＡ状態への遷移処理の詳細を説明するフローチャートである。
【図２０】  図１６に示された遷移の様子を示す図及び絞り込まれたＤＦＡ状態列による状態遷移の経路に基づいて、マッチ範囲を判定する様子を示す図である。
【図２１】  復元されたＮＦＡ状態列を示す図である。
【図２２】  第２の実施の形態におけるＤＦＡによる入力文字列の判定処理を説明するフローチャートである。
【図２３】  第２の実施の形態におけるＤＦＡによる入力文字列の判定処理を説明するフローチャートである。
【図２４】  第２の実施の形態におけるＤＦＡ状態列の絞り込み処理を説明するフローチャートである。
【図２５】  第２の実施の形態におけるＤＦＡ状態列の絞り込み処理を説明するフローチャートである。
【図２６】  第２の実施の形態におけるマッチ範囲の判定処理を説明するフローチャートである。
【図２７】  第２の実施の形態のオートマトン構築部にて作成された正規表現“[a-b]c|aab”の適切なＮＦＡを示す図である。
【図２８】  第２の実施の形態によりＤＦＡの状態遷移における遷移先の状態を動的に決定し生成する様子を示す図であり、状態｛０｝までを生成した様子を示す図である。
【図２９】  第２の実施の形態によりＤＦＡの状態遷移における遷移先の状態を動的に決定し生成する様子を示す図であり、状態｛１，２｝までを生成した様子を示す図である。
【図３０】  第２の実施の形態によりＤＦＡの状態遷移における遷移先の状態を動的に決定し生成する様子を示す図であり、状態｛１｝を仮に生成した様子を示す図である。
【図３１】  第２の実施の形態によりＤＦＡの状態遷移における遷移先の状態を動的に決定し生成する様子を示す図であり、状態｛３｝までを生成した様子を示す図である。
【図３２】  第２の実施の形態によりＤＦＡの状態遷移における遷移先の状態を動的に決定し生成する様子を示す図であり、状態｛１，３｝までを生成した様子を示す図である。
【図３３】  第２の実施の形態によりＤＦＡの状態遷移における遷移先の状態を動的に決定し生成する様子を示す図であり、終了状態である状態｛４｝及び状態｛５｝までを生成した様子を示す図である。
【図３４】  正規表現“([ab]c)*ac”にマッチングするＮＦＡの例を示す図である。
【図３５】  図３４のＮＦＡと等価のＤＦＡを示す図である。
【図３６】  複数文字照合要素を含む正規表現に対応するＮＦＡの例を示す図である。
【符号の説明】
１０１…ＣＰＵ（中央処理装置）、１０２…Ｍ／Ｂ（マザーボード）チップセット、１０３…メインメモリ、１０５…ハードディスク、２００…文書処理システム、２１０…オートマトン構築部、２２０…オートマトン保持部、２３０…文書保持部、２４０…オートマトン判定部、２５０…文書処理部、２６０…処理プログラム保持部、３００…入出力装置
【図１】
0003852757.tif 000002
【図２】
0003852757.tif 000003
【図３】
0003852757.tif 000004
【図４】
0003852757.tif 000005
【図５】
0003852757.tif 000006
【図６】
0003852757.tif 000007
【図７】
0003852757.tif 000008
【図８】
0003852757.tif 000009
【図９】
0003852757.tif 000010
【図１０】
0003852757.tif 000011
【図１１】
0003852757.tif 000012
【図１２】
0003852757.tif 000013
【図１３】
0003852757.tif 000014
【図１４】
0003852757.tif 000015
【図１５】
0003852757.tif 000016
【図１６】
0003852757.tif 000017
【図１７】
0003852757.tif 000018
【図１８】
0003852757.tif 000019
【図１９】
0003852757.tif 000020
【図２０】
0003852757.tif 000021
【図２１】
0003852757.tif 000022
【図２２】
0003852757.tif 000023
【図２３】
0003852757.tif 000024
【図２４】
0003852757.tif 000025
【図２５】
0003852757.tif 000026
【図２６】
0003852757.tif 000027
【図２７】
0003852757.tif 000028
【図２８】
0003852757.tif 000029
【図２９】
0003852757.tif 000030
【図３０】
0003852757.tif 000031
【図３１】
0003852757.tif 000032
【図３２】
0003852757.tif 000033
【図３３】
0003852757.tif 000034
【図３４】
0003852757.tif 000035
【図３５】
0003852757.tif 000036
【図３６】
0003852757.tif 000037