実施例1.
図1はこの発明の文字列照合装置を示す構成図である。
図1において、文字列照合装置1は、この発明における正規表現による文字列照合を行う装置であり、入力文書6の中に照合条件2を満たすものが含まれるかどうかを照合結果10として出力する。照合条件2は文字列照合の条件を記述した条件であり、文字列照合装置1の入力となる。状態遷移表生成部3は照合条件2から状態遷移11と出力記述12を生成し、それぞれ状態遷移表格納部4、出力表格納部5に渡す。状態遷移表格納部は状態遷移11の組を保持する。出力表格納部5は出力記述12を保持する。入力文書6は照合の対象となる文書である。入力文字読み取り部7は入力文書6に含まれる文字を1文字づつ取り出し、入力文字14としてSDFAオートマトン8に送る。SDFAオートマトン8は内部の状態記憶部9に現状態13を記憶し、入力文字読み取り部7から入力文字14を受け取り、状態遷移表格納部4、出力表格納部5を参照して状態記憶部9に格納された現状態13の更新と照合結果10の出力を行う。状態記憶部9はSDFAオートマトン8の内部に保持された状態を記憶する。10は照合結果である。11は状態遷移であり、現状態13、入力文字14、次状態15の組である。12は出力記述であり、現状態13と条件番号16の組である。13は現状態である、14は入力文字である。15は次状態である。16は条件番号である。
図2は、この発明における照合条件2の構成を示す図である。図において、条件式17は、照合条件2を構成する個別の条件であり、照合条件2の中に1または複数の条件式17が含まれる。
図3は、この発明における条件式17の構成を示す図である。条件式17は、条件番号16と条件記述18から構成され、条件番号16は条件式を一意に区別するための番号であり、条件記述18は正規表現によって記述された照合の条件である。
図4は、この発明における状態遷移表生成部3の構成を示す図である。図において、状態遷移表生成制御部21は、状態遷移生成表の生成の動作手順を制御する。NFA状態集合22、NFA状態遷移集合23、NFA出力記述集合24、状態集合25、出力遷移集合26、状態記述集合27は状態遷移表生成制御部21が参照するデータである。
図5は、この発明における状態遷移表格納部4の構成の一例を示す図である。図において、31はハッシュ値計算部であり、現状態13と入力文字14からハッシュ値32を計算する。ハッシュ値32はハッシュ値計算部31によって計算されたハッシュ値である。状態遷移ハッシュポインタ33は状態遷移ハッシュチェイン34のポインタを複数格納する表である。状態遷移ハッシュチェイン34は状態遷移ハッシュチェイン34へのポインタ、現状態13、入力文字14、次状態15の組である。状態遷移ハッシュ表35は状態遷移ハッシュポインタ33と状態遷移ハッシュチェイン34から成るデータ構造である。比較部36は外部から入力された現状態13aと入力文字14aの組と、状態遷移ハッシュ表35に格納された現状態13b、入力文字14bを比較し、次状態15を出力する。
図6は、この発明における出力表格納部5の構成を示す図である。条件番号インデックス41は条件番号チェインへのポインタを複数格納する。条件番号チェイン42は、条件番号チェイン42へのポインタと条件番号16の組である。
図7は、この発明における照合結果10の一例を示す図である。照合結果10には、入力文書6の照合に成功した条件番号16が含まれる。
次に、本発明の動作説明に先立ち、以下の説明で用いる用語および記号の説明を行う。
非特許文献1などに記載されているように、従来から知られている出力付き決定性有限オートマトンは、(Q, Σ, Δ, δ, λ, q0)の組によって与えられる。ただしQは状態集合である。Σは入力アルファベットであり、空文字εを含む。Δは出力アルファベット、δは遷移関数(Q×Σ→Q)、λは出力関数(Q→Δ)、q0は初期状態である。
本発明のSDFAオートマトン8は(Qs, Σs, Δs, δs, λs, q0)の組によって与えられる。
ここで、Qsは状態集合25であり、従来の出力つき有限オートマトンの状態集合Qに相当するものである。
Δsは出力アルファベットであり、本実施例では条件番号16の集合の集合となる。
δsは状態遷移表格納部4によって実現される状態遷移関数であり、以下、現状態13がqs、入力文字14がσsのとき次状態15がqdとなることを、
δs(qs, σs) = qd
と表記する。
q0は初期状態であり、その意味は従来から知られている出力つき決定性有限オートマトンと同じである。
Σsは従来の出力付き有限オートマトンの入力アルファベットΣに任意文字σany, 除外文字σotherを加えた拡張入力アルファベットである。すなわち、
Σs=Σ∪{σany, σother }
とする。
また、
δs (qs, σs) = qd
であるとき、状態遷移11をtとすると、
t=trans(qs, qd, σs)
と表記するものとする。
現状態13入力文字14の組に対して次状態15が存在する状態遷移11の集合を状態遷移集合26と呼び、Tと表記する。また、状態遷移t=trans(qs, qd, σs)に対して、qsを起点、qdを終点、σsを遷移文字と呼ぶ。更に、状態遷移tの起点を与える関数をSource、終点を与える関数をDestination、遷移文字を与える関数をCharと呼び、それぞれ
qs=Source(t)
qd=Destination(t)
σs=Char(t)
と表記する。
また、
λs(qs) = r
であるとき、出力記述18をdとすると
d=desc(qs, r)
と表記するものとする。
現状態13に対して出力アルファベットrが空でない出力記述12の集合を出力記述集合27と呼び、Dと表記する。出力記述d=desc(qs, r)に対して、qsを出力状態、rを出力結果と呼ぶ。更に、出力記述dの出力状態を与える関数をState、出力結果を与える関数をResultと呼び、それぞれ
qs =State(d)
r =Result(d)
と表記することにする。
本発明のSDFAオートマトン8を生成する過程でNFAが生成されるが、NFAは(Q(NFA), Σs, Δs, δs(NFA), λs(NFA), q0(NFA))の組によって表される。
ここで、Q(NFA)はNFA状態集合22を表す。状態集合25はNFA状態の集合の集合となる。すなわち状態集合25をQと表記するときQ=2Q(NFA)の関係にある。以下、NFAの状態をDFAの状態と区別するため、q(NFA)と表記し、NFAの初期状態をq0(NFA)と表記する。
δs(NFA)はNFAの状態遷移関数であり、現在のNFA状態13がq(NFA)、入力文字14がσsから次状態の集合への関数である。
λs(NFA)はNFAの出力関数であるり、現在のNFA状態13がq(NFA)のとき、出力アルファベットがr∈Δsとなることを
λs(NFA) (q(NFA)) = r
と表記する。
Δsは条件番号16の集合、Σsは拡張入力アルファベットであり、その意味は本発明のSDFAオートマトン8と同じである。
NFAの状態について、NFA状態遷移を以下のように定める。NFAの状態qd(NFA)が
q d(NFA)∈δ(qs(NFA), σs)
のとき、NFA状態遷移32を
t(NFA)=trans(qs(NFA), qd(NFA), σs)
と表記するものとする。NFA状態遷移の集合をNFA状態遷移集合とよび、T(NFA)と表記する。また、同様に状態遷移t(NFA)=trans(qs(NFA), qd(NFA), σs)に対して、qs(NFA)を起点、qd(NFA)を終点、σsを遷移文字と呼ぶ。更に、状態遷移t(NFA)の起点を与える関数をSource、終点を与える関数をDestination、遷移文字を与える関数をCharと呼び、それぞれ
qs(NFA)=Source(t(NFA))
qd(NFA)=Destination(t(NFA))
σs(NFA)=Char(t(NFA))
と表記することにする。
NFA状態q(NFA)と出力アルファベットrの組をNFA出力記述と呼ぶことにする。
λs(q(NFA)) = r
であるとき、NFA出力記述34をd(NFA)とすると
d(NFA)=desc(qs(NFA), r)
と表記するものとする。
NFA状態13に対して出力アルファベットpが空でないNFA出力記述の集合をNFA出力記述集合24と呼び、D(NFA)と表記する。出力記述d(NFA)=desc(q(NFA), r)に対して、q(NFA)を出力状態、rを出力結果と呼ぶ。更に、出力記述dの出力状態を与える関数をState、出力結果を与える関数をResultと呼び、それぞれ
q(NFA) =State(d(NFA))
r(NFA) =Result(d(NFA))
と表記することにする。
以上で用語および記号の説明を終わり、次に、動作について説明する。
図8に、本発明の文字列照合装置1の動作を示す。
本発明の文字列照合装置1は、まず、照合条件2を受け取り状態遷移表生成部3により状態遷移11と出力記述12を生成する過程、すなわち、照合条件のコンパイルの手続きを実行する(ステップS51)。
次いで、入力文書6を受け取り、入力文字読み取り部7およびSDFAオートマトン8によって、状態遷移11と出力記述12を参照しながら照合結果10を出力する手続きを順次実行する(ステップS52)。
なお、本実施の例では1回の「照合条件のコンパイル」に対して「入力文書の照合」を1回行うこととしているが、1回の「照合条件のコンパイル」の手続きで生成された、状態遷移11と出力記述12を用いて、複数個の入力文書に対して「入力文書の照合」を行っても良い。
次に、図9により、手続き「照合条件のコンパイル」について説明する。
まず「ε遷移を含むNFAの生成」の手続きにより、正規表現から、ε遷移を含むNFAを生成する(ステップS101)。
次いで、「ε遷移の除去」の手続きによりNFAに含まれるε遷移(空文字による遷移)の除去を行う(ステップS102)。
次いで、「初期状態への遷移の追加」の手続きにより、照合に失敗した際の初期状態への遷移を追加する(ステップS103)。
次いで、「非決定的遷移の除去」の手続きにより、非決定的な遷移を除去する(ステップS104)。
次いで、「未使用状態の除去」の手続きにより、これまでの手順で不要になった状態の除去を行う(ステップS105)。
次いで、「状態数の削減」の手続きにより、冗長な状態および冗長な状態遷移の除去を行う(ステップS106)。
次いで、「状態遷移表と出力表の生成」の手続きにより、状態集合から状態遷移表と出力表を生成する(ステップS107)。
以上の手順により手続き「照合条件のコンパイル」を実行することができる。
ステップS101の、「ε遷移を含むNFAの生成」の手順については、非特許文献1などに示されている公知の手順を使用することができる。
ただし、図24に示すように正規表現中に含まれる任意の文字を表すメタキャラクタ「.」はσanyに置き換える。なお、以下、図24〜図31では状態q(NFA)を単にqと表記している。
また、図25に示すように正規表現中に含まれる、特定文字集合以外を表すメタキャラクタ「^」はσotherに置き換え更に、該当する状態から初期状態q0(NFA)への状態遷移を追加するという手順を追加する。
ステップS102の、「ε遷移の除去」の手順についても、非特許文献1などに示されている公知の手順により、ε遷移(空文字による遷移)を遷移先集合への遷移で置き換えることにより、実現することができる。
次に、図10によってステップS103の「初期状態への失敗遷移の追加」の手続きを示す。
まず、ステップS102によって生成されたNFAの初期状態q0(NFA)からσanyによる遷移が存在しない場合はステップS202に進む。それ以外の場合は、ステップS203に進む(ステップS201)。
「初期状態への失敗遷移の追加(初期状態からσanyによる遷移先が存在しない場合)」の手続きを実行し、終了する(ステップS202)。
ステップS201でNFAの初期状態q0(NFA)からσanyによる遷移が存在する場合は「初期状態への失敗遷移の追加(初期状態からσanyによる遷移先が存在する場合)」の手続きを実行し、終了する(ステップS203)。
なお、本実施例ではNFAの初期状態q0(NFA)からσanyによる遷移先が存在するか否かにより処理を分けているが、ステップS202の処理はステップS203によって代行することも可能である。ステップS202の処理はステップS203と比較すると適用可能な範囲が「初期状態からσanyによる遷移先が存在する」場合に限定されるが、より状態遷移の数を削減することができる。初期状態からσanyによる遷移先が存在するとは、照合条件となる正規表現の先頭に任意文字「.」が指定されるということであるが、実用上はこのような指定がされることは少ないため、多くの場合はステップS202の処理を適用することによって状態遷移の数を削減できる。
以上の手順に従って、手続き「初期状態への失敗遷移の追加」を行うことができる。
次に、ステップS202の「初期状態への失敗遷移の追加(初期状態からσanyによる遷移先が存在しない場合)」の手続きについて説明する。
一般に、連続的な文字列照合を行うNFAまたはDFAでは、すべての状態から初期状態へのε遷移を追加することにより、任意の文字位置からの文字列照合を実現できる。図26に、正規表現(a|b|c(d|e))f に対応するNFAにε遷移を追加した例を示す。本発明のSDFAオートマトン8では、遷移に失敗した際に入力文字を進めずに初期状態q0に戻って再度状態遷移を行うため、初期状態q0へのε遷移を省略できる。すなわち、図27に示すNFAを構成すればよく、状態遷移の総数を大幅に削減することができる。しかし、初期状態q0(NFA)から遷移文字σにより状態q1(NFA)に遷移可能であるとき、状態q(NFA)からの遷移文字σによる遷移が存在するか、または、状態q(NFA)を起点とするいずれかの遷移文字σがσanyである場合は、σによる遷移が成功した場合にもσによりq1(NFA)にも遷移可能であるため、状態q(NFA)からσによる状態q1(NFA)への状態遷移を追加する。図28に、正規表現(a|b|c(d|e))f の場合の例を示す。図28の例では初期状態q0(NFA)から遷移文字aにより状態q1(NFA)に遷移可能であり、状態q3(NFA)から遷移文字aによる遷移が存在するため、図29のように遷移文字aによる状態q3(NFA)から状態q1(NFA)への遷移を追加する。状態q3(NFA)から遷移文字aによる遷移は非決定的な状態遷移となるが、後続の「非決定的遷移の除去」の手続きにより、この非決定的遷移は最終的に除去される。手続き「初期状態への失敗遷移の追加(初期状態からσanyによる遷移先が存在しない場合)」および「初期状態への失敗遷移の追加(初期状態からσanyによる遷移先が存在する場合)」はこの処理を行うためのものである。
図11により、ステップS202の「初期状態への失敗遷移の追加(初期状態からσanyによる遷移先が存在しない場合)」の手続きについて説明する。
まず、t0(NFA) をステップS102によって生成されたNFAの初期状態q0(NFA)を起点とする最初の状態遷移とし、ステップS302に進む(ステップS301)。
NFAの初期状態q0(NFA)を起点とするすべての状態遷移t0(NFA)の処理を終了したら手続きを終了する。それ以外の場合はステップS303に進む(ステップS302)。
σをChar(t0(NFA))とし、ステップS304に進む(ステップS303)。
q(NFA)をNFA状態集合Q(NFA)に含まれる最初のNFA状態とし、ステップS305に進む(ステップS304)。
NFA状態集合Q(NFA)に含まれるすべてのNFA状態q(NFA)の処理を終了したらステップS313に進む。それ以外の場合はステップS306に進む(ステップS305)。
NFA状態q(NFA)が初期状態q0(NFA)の場合は、ステップS312に進む。それ以外の場合はステップS307に進む(ステップS306)。
t(NFA)を、q(NFA)を起点とする最初のNFA状態遷移とし、ステップS308に進む(ステップS307)。
q(NFA)を起点とするすべてのNFA状態遷移t(NFA)の処理を終了したらステップS312に進む。それ以外の場合はステップS309に進む(ステップS308)。
Char(t(NFA))=σ 、Char(t(NFA))= σanyのいずれかの条件が成立する場合はステップS310に進む。いずれの条件も成立しない場合はステップS311に進む(ステップS309)。
NFA状態遷移 trans(q(NFA), Destination(t0(NFA)), σ)がNFA状態遷移集合T(NFA)に含まれていなければTに加え、ステップS311に進む(ステップS310)。
t(NFA)をNFA状態q(NFA)を起点とする次のNFA状態遷移とし、ステップS305に進む(ステップS311)。
ステップS306にてNFA状態q(NFA)がNFAの初期状態q0(NFA)の場合、またはステップS308にてq(NFA)を起点とするすべてのNFA状態遷移t(NFA)を処理した場合はNFA状態q(NFA)をNFA状態集合QNFAに含まれる次のNFA状態とし、ステップS305に進む(ステップS312)。
ステップS305にてすべてのNFA状態q(NFA)の処理を終了した場合は、t0(NFA) をNFAの初期状態q0(NFA)を起点とする次のNFA状態遷移とし、ステップS302に進む(ステップS313)。
以上の手順に従って、手続き「初期状態への失敗遷移の追加(初期状態からσanyによる遷移先が存在しない場合)」を行うことができる。
次に、ステップS203の「初期状態への失敗遷移の追加(初期状態からσanyによる遷移先が存在する場合)」の手続きについて説明する。この手続きの目的はステップS202と同じであるが、図30に示す正規表現(.|b|c(d|e))f のように、初期状態からσanyによる遷移先q1(NFA)が存在する場合は、すべての状態に対して、遷移が成功した場合にもq1(NFA)にも遷移可能となるため、図31に示すように、NFAの初期状態q0(NFA)を除くすべてのNFA状態q(NFA)とすべての遷移文字σに対して、q1(NFA)への遷移を追加する。
図12により、ステップS203の「初期状態への失敗遷移の追加(初期状態からσanyによる遷移先が存在する場合)」の手続きについて説明する。
まず、t0(NFA) をステップS102によって生成されたNFAの初期状態q0(NFA)を起点とする最初のNFA状態遷移とし、ステップS352に進む(ステップS351)。
NFAの初期状態q0(NFA)を起点とするすべてのNFA状態遷移t0(NFA)の処理を終了したら手続きを終了する。それ以外の場合はステップS353に進む(ステップS352)。
σをChar(t0(NFA))とし、ステップS354に進む(ステップS353)。
qをNFA状態集合Q(NFA)に含まれる最初のNFA状態とし、ステップS355に進む(ステップS354)。
NFA状態集合Q(NFA)に含まれるすべてのNFA状態qの処理を終了したらステップS359に進む。それ以外の場合はステップS356に進む(ステップS355)。
NFA状態q(NFA)が初期状態q0(NFA)の場合は、ステップS356に進む。それ以外の場合はステップS357に進む(ステップS306)。
NFA状態遷移trans (q(NFA), Destination(t0(NFA)), σ(NFA))がNFA状態遷移集合T(NFA)に含まれていなければT(NFA)に加え、ステップS355に進む(ステップS358)。
ステップS355にてすべてのNFA状態q(NFA)の処理を終了した場合は、t0(NFA) をNFAの初期状態q0(NFA)を起点とする次のNFA状態遷移とし、ステップS352に進む(ステップS359)。
以上の手順に従って、手続き「初期状態への失敗遷移の追加(初期状態からσanyによる遷移先が存在する場合)」を行うことができる。
次にステップS104の「非決定的遷移の除去」の手続きについて説明する。本手続きは、NFAに含まれる非決定的な遷移を除去し、決定的な遷移を生成するものである。図32に一例を示す。状態qsourceから遷移文字aによる状態遷移としてq1およびq2が存在する、すなわち非決定的であるため、遷移先の状態を併合する、すなわち図33に示すように遷移先のNFA状態集合q1およびq2の和集合qn =q1∪q2への状態遷移とする。この手順は基本的に非特許文献1などに示されているDFAの生成手順と同様であるが、本実施の例では、更に、図34のように、任意文字σanyによる状態遷移q2と遷移文字aによる状態遷移の終点q1を含む場合について、非決定的な遷移文字aに関する状態qn =q1∪q2への状態遷移の他に、除外文字σotherによる状態q1への遷移を生成する(図35)。
図13によって、ステップS104の「非決定的遷移の除去」の手続きについて説明する。本手続きおよび「σotherに関する非決定的遷移の除去」の手続きでは変数Retryを使用する。変数RetryはTRUEまたはFALSEのいずれかの値をとることができる。
まず「状態集合の初期化」の手続きを行い、ステップS402に進む(ステップS401)。
次いで、変数RetryをFALSEに初期化し、ステップS401に進む(ステップS402)。
次いで、「Σに関する非決定的遷移の除去」の手続きを行い。ステップS404に進む(ステップS403)。
次いで、「σotherに関する非決定的遷移の除去」の手続きを行い、ステップS405に進む(ステップS404)。
変数RetryがTRUEの場合はステップS403に進む。FALSEの場合は終了する(ステップS405)。
以上の手順に従って、手続き「非決定的遷移の除去」を行うことができる。
次にステップS401の「状態集合の初期化」の手続きについて説明する。本手続きは、DFAの状態を生成するため、必要な状態集合を初期化するためのものであり、すべてのNFAの状態q(NFA)に対して、DFAの状態{q(NFA)}を関連する状態遷移ととともに生成することを目的とする。
図14によって、ステップS401の「状態集合の初期化」の手続きについて説明する。
まず、状態集合Qを空に初期化しステップS502に進む(ステップS501)。
次に、q(NFA)をNFA状態集合Q(NFA)に含まれる最初のNFA状態とし、ステップS502に進む(ステップS502)。
NFA状態集合Q(NFA)に含まれるすべてのNFA状態q(NFA)を処理した場合はステップS506に進む。それ以外の場合は、ステップS504に進む(ステップS503)。
状態集合QにNFA状態集合(すなわちDFAの状態){q(NFA)}を加え、ステップS505に進む(ステップS504)。
q(NFA)をNFA状態集合Q(NFA)に含まれる次のNFA状態とし、ステップS503に進む(ステップS505)。
ステップS503においてNFA状態集合Q(NFA)に含まれるすべてのNFA状態(NFA)を処理した場合は、状態遷移集合Tを空にし、ステップS507に進む(ステップS506)。
次に、t(NFA)をNFA状態遷移集合T(NFA)に含まれる最初のNFA状態遷移とし、ステップS508に進む(ステップS507)。
NFA状態遷移集合T(NFA)に含まれるすべてのNFA状態遷移t(NFA)を処理したらステップS511に進む。それ以外の場合は、ステップS509に進む(ステップS508)。
状態遷移集合Tにtrans({Source(t(NFA))}, {Destination(t(NFA))}, Char(t(NFA)))を加え、ステップS510に進む(ステップS509)。
t(NFA)をNFA状態遷移集合T(NFA)に含まれる次のNFA状態遷移とし、ステップS508に進む(ステップS510)。
ステップS508においてT(NFA)に含まれるすべてのNFA状態遷移t(NFA)を処理した場合は、出力記述集合Dを空にし、ステップS512に進む(ステップS511)。
次に、d(NFA)をNFA出力記述集合D(NFA)に含まれる最初のNFA出力記述とし、ステップS508に進む(ステップS512)。
NFA出力記述集合D(NFA)に含まれるすべてのNFA出力記述d(NFA)を処理したら終了する。それ以外の場合は、ステップS509に進む(ステップS513)。
出力記述集合Dにdesc({State(d(NFA))}, Result(d(NFA)))を加え、ステップS510に進む(ステップS514)。
d(NFA)をNFA出力記述集合D(NFA)に含まれる次のNFA出力記述とし、ステップS508に進む(ステップS515)。
以上の手順によって、手続き「状態集合の初期化」を行うことができる。
次に、ステップS403の「Σに関する非決定的遷移の除去」の手続きについて説明する。本手続きでは、図32および図34に示した例のように、一つの遷移文字σ∈Σに対して複数の遷移先が存在するとき、新たな状態への遷移で置き換えることにより、各遷移文字σによる遷移先を一意に確定することを目的とする。
図15によって、ステップS403の「Σに関する非決定的遷移の除去」の手続きについて説明する。本手続きでは変数Foundを使用する。変数RetryはTRUEまたはFALSEのいずれかの値をとることができる。
まず、FoundをFALSEに初期化し、ステップS602に進む(ステップS601)。
次に、qを状態集合Q中の最初の状態遷移とし、ステップS603に進む(ステップS602)。
状態集合Q中のすべての状態qを処理した場合はステップS616に進む。それ以外の場合はステップS604に進む(ステップS603)。
σを入力アルファベットΣ中の最初のアルファベットとし、ステップS605に進む(ステップS604)。
入力アルファベットΣ中のすべてのアルファベットσを処理した場合はステップS610に進む。それ以外の場合はステップS606に進む(ステップS605)。
qを起点とし、σを遷移文字とする状態遷移tが複数存在するか、またはσを遷移文字とする状態遷移tとσanyを遷移文字とする状態遷移tが存在する、すなわち、σによる遷移が非決定的である場合は、ステップS607に進む。それ以外の場合はステップS609に進む(ステップS606)。
パラメータqsourceをq、σtをσに設定し手続き「新状態の生成」を行い、ステップS608に進む(ステップS607)。
変数FoundにTRUEを設定し、ステップS609に進む(ステップS608)。
σを入力アルファベットΣ中の次のアルファベットとし、ステップS605に進む(ステップS609)。
ステップS605で入力アルファベットΣ中のすべてのアルファベットσを処理した場合は、tを状態qを起点とする最初の状態遷移とし、ステップS611に進む(ステップS610)。
状態qを起点とするすべての状態遷移tを処理した場合はステップS615に進む。それ以外の場合はステップS612に進む(ステップS611)。
tの遷移文字Char(t)がσanyの場合はステップS613に進む。それ以外の場合はステップS614に進む(ステップS612)。
tの遷移文字をσotherで置き換える、すなわちtを (Source(t), Destination(t), σother)でおきかえ、ステップS614に進む(ステップS613)。
tを状態qを起点とする次の状態遷移とし、ステップS611に進む(ステップS614)。
ステップS611で状態qを起点とするすべての状態遷移tを処理した場合はqを状態集合Q中の次の状態遷移とし、ステップS603に進む(ステップS615)。
ステップS603で状態集合Q中のすべての状態qを処理した場合は、変数FoundがTRUEであればステップS601に進む。それ以外の場合は終了する(ステップS616)。
以上の手順により、手続き「Σに関する非決定的遷移の除去」を行うことができる。
次に、ステップS404の手続き「σotherに関する非決定的遷移の除去」について説明する。本手続きでは、図36に示すように、「Σに関する非決定的遷移の除去」によって生成された遷移文字σotherによる遷移について、状態qsourceから複数の状態q1およびq2への状態遷移が存在する場合、それらの和集合qn =q1∪q2の状態への遷移で置き換えることにより、図37に示すように、遷移文字σotherによる非決定的な遷移を除去する。
図16により、ステップS404の手続き「σotherに関する非決定的遷移の除去」について説明する。本手続きでは変数Foundを使用する。変数FoundはTRUEまたはFALSEのいずれかの値をとることができる。また本手続きでは変数Counterを使用する。変数Counterは0以上の整数値を取ることができる。
まず、変数FoundにFALSEを設定し、ステップS702に進む(ステップS701)。
qを状態集合Q中の最初の状態とし、ステップS703に進む(ステップS702)。
状態集合Q中のすべての状態qを処理した場合はステップS714に進む。それ以外の場合はステップS701に進む(ステップS703)。
変数Counterに0を設定し、ステップS705に進む(ステップS704)。
tにqを起点とする最初の状態遷移を設定しステップS706に進む(ステップS705)。
qを起点とするすべての状態遷移tを処理した場合はステップS710に進む。それ以外の場合はステップS707に進む(ステップS706)。
tの遷移文字Char(t)がσotherの場合はステップS708に進む。それ以外の場合はステップS709に進む(ステップS707)。
変数Counterに1を加え、ステップS709に進む(ステップS708)。
tに、qを起点とする次の状態遷移を設定し、ステップS705に進む(ステップS709)。
ステップS706においてqを起点とするすべての状態遷移tを処理した場合は、変数Counterの値が2以上であればステップS711に進む。それ以外の場合はステップS713に進む(ステップS710)。
パラメータqsourceをq、σtをσotherに設定し、手続き「新状態の生成」を呼び出し、ステップS712に進む(ステップS711)。
変数FoundにTRUEを設定し、また変数RetryにTRUEを設定し、ステップS713に進む(ステップS712)。
qを状態集合Q中の次の状態遷移とし、ステップS703に進む(ステップS713)。
ステップS703にて状態集合Q中のすべての状態qを処理した場合は、変数FoundがTRUEの場合はステップS701に進む。それ以外の場合は終了する(ステップS714)。
以上の手順により、手続き「σotherに関する非決定的遷移の除去」を行うことができる。
次に、ステップS607およびステップS711の手続き「新状態の生成」の手順について説明する。本手順は、状態qsourceから遷移文字σtに関する個々の非決定的な状態遷移を除去する手順である。
図17によって、ステップS607およびステップS711の手続き「新状態の生成」の手順について説明する。手続き「新状態の生成」ではqsourceおよびσtをパラメータとする。
まず、状態qsourceを起点とし、σtにより遷移可能な状態の集合を求め、それらのNFA状態に関する和集合を求め、状態qnとする。qnが状態遷移集合Tに含まれている場合はステップS817に進む。それ以外の場合はステップS802に進む(ステップS801)。
次に、状態qnを状態集合Qに追加し、ステップS803に進む(ステップS802)。
tをqsourceを起点とする最初の状態遷移とし、ステップS804に進む(ステップS803)。
qsourceを起点とするすべての状態遷移tを処理した場合はステップS817に進む。それ以外の場合はステップS805に進む(ステップS804)。
Char(t)=σtの場合、またはChar(t)=σanyの場合はステップS806に進む。それ以外の場合はステップS816に進む(ステップS805)。
t1を、Destination(t)を起点とする最初の状態遷移とし、ステップS807に進む(ステップS806)。
Destination(t)を起点とするすべての状態遷移t1を処理した場合はステップS812に進む。それ以外はステップS808に進む(ステップS807)。
状態遷移trans(qn, Destination(t1), Char(t1))∈TでなければTにtrans(qn, Destination(t1), Char(t1))を追加し、ステップS809に進む(ステップS808)。
Char(t1)=σotherであればステップS810に進む。それ以外であればステップS811に進む(ステップS809)。
手続き「σotherによる状態遷移の補正」を呼び出し、ステップS811に進む。このとき、パラメータとして(qsource, qn, t1)を与える(ステップS810)。
t1を、Destination(t)を起点とする次の状態遷移とし、ステップS807に進む(ステップS811)。
ステップS807でDestination(t)を起点とするすべての状態遷移t1を処理した場合は、dをDestination(t)を出力状態とする最初の出力記述とし、ステップS813に進む(ステップS812)。
Destination(t)を出力状態とするすべての出力記述dを処理した場合はステップS816に進む。それ以外の場合は、ステップS814に進む(ステップS813)。
出力記述desc(qn,Result(d))∈DでなければDにdesc(qn,Result(d))を加え、ステップS815に進む(ステップS814)。
dをDestination(t)を出力状態とする次の出力記述とし、ステップS813に進む(ステップS815)。
tをqsourceを起点とする次の状態遷移とし、ステップS804に進む(ステップS816)。
ステップS801でqnが状態遷移集合Tに含まれていない場合、およびステップS804でqsourceを起点とするすべての状態遷移tを処理した場合は、tをqsourceを起点とする最初の状態遷移とし、ステップS818に進む(ステップS817)。
qsourceを起点とするすべての状態遷移tを処理した場合はステップS822に進む。それ以外の場合はステップS819に進む(ステップS818)。
Char(t)=σtの場合はステップS820に進む。それ以外の場合はステップS821に進む(ステップS819)。
状態遷移tを状態遷移集合Tから削除し、ステップS821に進む(ステップS820)。
tをqsourceを起点とする次の状態遷移とし、ステップS818に進む(ステップS821)。
ステップS818でqsourceを起点とするすべての状態遷移tを処理した場合は、状態遷移trans(qsource, qn, σt) ∈TでなければTにtrans(qsource, qn, σt)を追加し、終了する(ステップS822)。
以上の手順により、手続き「新状態の生成」を行うことができる。
次にステップS811の手続き「σotherによる状態遷移の補正」について説明する。本手続きは、図38に示すように、非決定的遷移の除去の際に併合すべき状態q1, q2を起点とする状態遷移の中に遷移文字σotherによる状態遷移が含まれる場合の、状態q1, q2を起点とする状態遷移の終点となる状態の併合の手順を示すものである。図38の状態q1, q2を併合すると図39のようになり、状態qn =q1∪q2遷移文字bによる状態遷移の終点はq3∪q5となる。同様に、図40に示す状態q1, q2を併合すると、図41に示すように遷移文字b、c、σotherによる状態遷移の終点は、それぞれq3∪q6、q4∪q5、q4∪q6となる。
図18によって、ステップS811の手続き「σotherによる状態遷移の補正」について説明する。本手続きでは、拡張入力アルファベットσ∈Σsの集合、CharSetを用いる。
まずCharSetを空に初期化し、ステップS902に進む(ステップS901)。
次に、tをSource(tother)を起点とする最初の状態遷移とし、ステップS903に進む(ステップS902)。
Source(tother)を起点とするすべての状態遷移を処理した場合は、ステップS907に進む。それ以外の場合は、ステップS904に進む(ステップS903)。
Char(t)が入力アルファベットΣに含まれる、すなわち、Char(t)≠σanyかつChar(t)≠σotherの場合はステップS906に進む。それ以外の場合はステップS905に進む(ステップS904)。
CharSetにChar(t)を加え、ステップS906に進む(ステップS905)。
tをSource(tother)を起点とする次の状態遷移とし、ステップS903に進む(ステップS906)。
ステップS903でSource(tother)を起点とするすべての状態遷移を処理した場合は、t を状態qを起点とする最初の状態遷移とし、ステップS908に進む(ステップS907)。
状態qを起点とするすべての状態遷移qを処理した場合は終了する。それ以外の場合はステップS909に進む(ステップS908)。
Destination(t)≠Source(tother )の場合はステップS910に進む。それ以外の場合はステップS916に進む(ステップS909)。
t1 をDestination(t)を起点とする最初の状態遷移とし、ステップS911に進む(ステップS910)。
Destination(t)を起点とするすべての状態遷移t1 を処理した場合はステップS916に進む。それ以外の場合はステップS912に進む(ステップS911)。
Char(t1)が入力アルファベットΣに含まれる、すなわち、Char(t1)≠σanyかつChar(t1)≠σotherの場合はステップS913に進む。それ以外の場合はステップS915に進む(ステップS912)。
Char(t1)がCharSetに含まれる場合はステップS915に進む。それ以外の場合はステップS914に進む(ステップS913)。
状態遷移trans(qn, Destination(tother), Char(t1))∈TでなければTにtrans(qn, Destination(tother), Char(t1))を加え、ステップS915に進む(ステップS914)。
t1 をDestination(t)を起点とする次の状態遷移とし、ステップS911に進む(ステップS915)。
ステップS909にてDestination(t)≠Source(tother )でなかった場合、あるいはステップS911にてDestination(t)を起点とするすべての状態遷移t1 を処理した場合は、t を状態qを起点とする次の状態遷移とし、ステップS908に進む(ステップS916)。
以上の手順により、手続き「σotherによる状態遷移の補正」を行うことができる。
次に、ステップS105の「未使用状態の除去」の手続きについて説明する。本手続きでは、これまでの処理の結果発生した、状態遷移の終点とならない状態、すなわち、どのような入力に対しても決して到達しない状態を削除する。
図19によって、ステップS105の「未使用状態の除去」の手続きについて説明する。本手続きでは変数Foundを用いる。変数FoundはTRUEまたはFALSEのいずれかの値をとることができる。
まず、変数FoundをFALSEにし、ステップS1002に進む(ステップS1001)。
次に、qを状態集合Qに含まれる最初の状態とし、ステップS1003に進む(ステップS1002)。
状態集合Qに含まれるすべての状態qを処理した場合はステップS1017に進む。それ以外の場合はステップS1004に進む(ステップS1003)。
qが初期状態q0の場合はステップS1016に進む。それ以外の場合はステップS1005に進む(ステップS1004)。
qを終点とする状態遷移が存在する場合はステップS1016に進む。それ以外の場合はステップS1006に進む(ステップS1005)。
変数FoundをTRUEにし、ステップS1007に進む(ステップS1006)。
tをqを起点とする最初の状態遷移とし、ステップS1008に進む(ステップS1007)。
qを起点とするすべての状態遷移tを処理した場合はステップS1011に進む。それ以外の場合はステップS1009に進む(ステップS1008)。
状態遷移tを状態遷移集合Tから取り除き、ステップS1010に進む(ステップS1009)。
tをqを起点とする次の状態遷移とし、ステップS1008に進む(ステップS1010)。
ステップS1008でqを起点とするすべての状態遷移tを処理した場合は、dをqを出力状態とする最初の出力記述とし、ステップS1012に進む(ステップ1011)。
qを出力状態とするすべての出力記述dを処理した場合はステップS1015に進む。それ以外の場合はステップ1013に進む(ステップ1012)。
出力記述dを出力記述集合Dから削除し、ステップS1014に進む(ステップS1013)。
dをqを出力状態とする次の出力記述とし、ステップS1012に進む(ステップS1014)。
ステップS1012にてqを出力状態とするすべての出力記述dを処理した場合は、状態qを状態集合Qから削除し、ステップS1012に進む(ステップS1015)。
qを状態集合Qに含まれる次の状態とし、ステップS1003に進む(ステップS1016)。
ステップ1003にて状態集合Qに含まれるすべての状態qを処理した場合は、変数Foundを調べFoundがTRUEの場合はステップS1002に進む。それ以外の場合は終了する(ステップ1017)。
以上の手順により、手続き「未使用状態の除去」を行うことができる。
なお、手続き「未使用状態の除去」は、状態遷移表を格納するのに必要なメモリ容量を削減することを目的としている。従って、本手続きを省略しても手続き「入力文書の照合」を実行することは可能であり、省略することにより、「照合条件のコンパイル」に要する時間を短縮することができる。
次に、図20によって、ステップS106の「冗長状態の除去」の手続きについて説明する。本手続きでは、2種類の不要な状態を除去する。第1の場合は、σotherによる状態遷移と同一の終点の状態を持つ状態遷移である。図42に一例を示す。図42において、遷移文字bによるq3を終点とする状態遷移を削除してもSDFAオートマトンの動作は同じであり、この状態遷移を削除することにより、状態遷移の総数を削減し、状態遷移表を格納するのに必要なメモリ容量を削減することができる。第2の場合は、すべての遷移文字に対する状態遷移の終点が等しい複数の状態の併合である。図43に一例を示す。図43において、状態q1と状態q2ではすべての遷移文字に対する状態遷移の終点が等しいため、状態q1と状態q2を併合したqn=q1∪q2で置換することができる。これらの2種類の場合の一方によって状態または状態遷移が削除されると、それにより他方による状態または状態遷移の削除が可能になる場合があるため、新たに状態または状態遷移が削除されなくなるまでこれら2種類を繰り返す。
図20によって、ステップS106の「冗長状態の除去」の手続きについて説明する。本手続きでは変数StateRemovedおよびTransitionRemovedを用いる。変数StateRemovedおよびTransitionRemovedはTRUEまたはFALSEのいずれかの値をとることができる。
まず、StateRemovedにTRUEを設定し、ステップS1102に進む(ステップS1101)。
手続き「冗長な状態遷移の削除」を呼び出し、ステップS1103に進む。本手続きの中でTransitionRemovedが設定される(ステップS1102)。
TransitionRemoved=FALSEかつStateRemoved=FALSEの場合は終了する。それ以外の場合はステップS1104に進む(ステップS1103)
手続き「冗長な状態の併合」を呼び出し、ステップS1105に進む(ステップS1104)。
TransitionRemoved=FALSEかつStateRemoved=FALSEの場合は終了する。それ以外の場合はステップS1102に進む(ステップS1105)。
以上の手順により、手続き「冗長状態の除去」を行うことができる。
なお、手続き「冗長状態の除去」は、状態遷移表を格納するのに必要なメモリ容量を削減することを目的としている。従って、本手続きを省略しても手続き「入力文書の照合」を実行することは可能であり、省略することにより、「照合条件のコンパイル」に要する時間を短縮することができる。
次に、ステップS1102の手続き「冗長な状態遷移の削除」について説明する。本手続きは、「冗長状態の除去」の第1の場合に相当し、図42に示すような、σotherによる状態遷移と同一の終点の状態を持つ状態遷移を削除する。
図21によって、ステップS1102の手続き「冗長な状態遷移の削除」について説明する。
まず、変数TransitionRemovedをFALSEに設定し、ステップS1202に進む(ステップS1201)。
次に、tを状態遷移集合Tに含まれる最初の状態遷移とし、ステップS1203に進む(ステップS1202)。
状態遷移集合Tに含まれるすべての状態tを処理した場合は終了する。それ以外の場合は、ステップS1204に進む(ステップS1203)。
Char(t)がσotherである場合にはステップS1205に進む。それ以外の場合はステップS1210に進む(ステップS1204)。
次に、t1をSource(t)を起点とする最初の状態遷移とし、ステップS1206に進む(ステップS1205)。
Source(t)を起点とするすべての状態遷移t1を処理した場合はステップS1210に進む。それ以外の場合は、ステップS1207に進む(ステップS1206)。
t1≠tかつDestination(t1)=Destination(t)の場合はステップS1208に進む。それ以外の場合はステップS1209に進む(ステップS1207)。
状態遷移t1を状態遷移集合Tから削除し、ステップS1209に進む(ステップS1208)。
t1をSource(t)を起点とする次の状態遷移とし、ステップS1206に進む(ステップS1209)。
ステップS1204にてChar(t)がσotherでなかった場合、またはステップS1206にてSource(t)を起点とするすべての状態遷移t1を処理した場合は、tを状態遷移集合Tに含まれる次の状態遷移とし、ステップS1203に進む(ステップS1210)。
以上の手順により、手続き「冗長な状態遷移の削除」を行うことができる。
次に、ステップ1104の手続き「冗長な状態の併合」について説明する。本手続きは、「冗長状態の除去」の第2の場合、すなわち、図43に示すような、すべての遷移文字に対する状態遷移の終点が等しい複数の状態を併合する。
ステップ1104の手続き「冗長な状態の併合」は、例えば、非特許文献1などに記載されている公知の手順により実行可能である。この手順によって、1つ以上の状態が併合されたときは変数StateRemovedをTRUEに設定する。それ以外の場合は変数StateRemovedをFALSEに設定する。
次に、図22によりステップS107の「状態遷移表と出力表の生成」について説明する。本手続きでは、状態集合25、状態遷移集合26、および出力記述集合27から、状態遷移11と出力記述12を取り出し、それぞれ状態遷移表格納部4、出力表格納部12に格納する。
まず、状態集合Qに含まれている状態の総数をNとするとき、各状態qに0〜N-1の一意の状態番号StateId(q)を対応づける(ステップS1301)。
状態遷移集合Tから最初の状態遷移tを取り出す(ステップS1302)。
状態遷移集合Tに含まれるすべての状態遷移tを処理したらステップS1307に進む。それ以外の場合はステップS1304に進む(ステップS1303)。
現状態Source(t)、入力文字Char(t)の組に対してハッシュ値計算部31でハッシュ値32を計算し、ステップS1305に進む(ステップS1304)。
ハッシュ値32をオフセットとする状態遷移ハッシュポインタ33に現状態Source(t)、入力文字Char(t) 、次状態Destination(t)の組から成る状態遷移ハッシュチェイン34を追加し、ステップS1306に進む(ステップS1305)。
tを状態遷移集合Tに含まれる次の状態遷移とし、ステップS1303に進む(ステップS1306)。
ステップS1303にて状態遷移集合Tに含まれるすべての状態遷移を処理した場合は、出力記述集合から最初の出力記述dを取り出す(ステップS1307)。
出力記述集合Dに含まれるすべての出力記述dを処理したら終了する。それ以外の場合はステップS130に進む(ステップS1308)。
State(d)の状態番号StateId(State(d))に対応する条件番号インデックス41に条件番号チェイン42としてResult(d)を追加しステップS1310に進む(ステップS1309)。
dを出力記述集合Dに含まれる次の出力記述とし、ステップS1308に進む(ステップS1310)。
以上に示した手順により、手続き「状態遷移表と出力表の生成」を実行することができる。
次いで、図23によって、手続き「入力文書の照合」について説明する。
まず、状態qに初期状態q0を設定し、ステップS2002に進む(ステップS2001)。
出力表格納部5を探索し、qに関連する条件番号16を出力する。この手順は、条件番号インデックス41の現状態13の状態番号StateId(q)に対応する条件番号チェイン42へのポインタを順に探索することによって実現される。すべての条件番号チェイン42の探索が終わったらステップS2003に進む(ステップS2002)。
入力がすべて終了したら終了する。それ以外の場合はステップS2004に進む(ステップS2003)。
入力文字読み取り部7から次の入力文字14を受け取り、σとし、ステップS2005に進む(ステップS2004)。
状態遷移表格納部4を探索し、状態qから遷移文字σによる遷移先qdが存在するか否か、すなわち、trans(q, qd, σ)∈Tなるqdが存在するかどうか調べ、ステップS2006に進む(ステップS2005)。
遷移先qdが存在する場合はステップS2007に進む。それ以外の場合はステップS2008に進む(ステップS2006)。
qに qdを設定し、ステップS2002に進む(ステップS2007)。
ステップS2006でqdが存在しない場合は、状態qから遷移文字σotherによる遷移先qdが存在するか否か、すなわち、trans(q, qd, σother)∈Tなるqdが存在するかどうか調べ、ステップS2009に進む(ステップS2008)。
遷移先qdが存在する場合はステップS2007に進む。それ以外の場合はステップS2010に進む(ステップS2009)。
状態qにq0を設定し、ステップS2006に進む。
以上の手順により、手続き「入力文書の照合」を行うことができる。
以下、図44に示す照合条件2と図54に示す入力文字列の場合を例にとって、本実施の例の文字列照合装置の動作を説明する。図44の照合条件は特許文献3に示されていた図52の照合条件の表記を本実施の例の形式にあわせたものであり、図52と論理的に等価な照合条件である。
ステップS51に示した手続き「照合条件コンパイル」を実行することにより、図44の照合条件2から、図45に示す状態遷移表と、図46に示す出力表が生成される。なお、初期状態の状態番号を0とする。
図45の状態遷移表は状態遷移表格納部4に格納される現状態13、入力文字14に対する次状態15を表で表現したものであり、例えば、現状態の状態番号が6で入力文字「d」の時、次状態は10となることを示している。図中で「−」は、次状態15が存在しないことを示しており、このような組み合わせに対しては状態遷移表格納部4はメモリを消費することなく格納することができる。従来の出力つき有限状態オートマトンでは図53に示す通り、90個の組み合わせを必要とするのに対し、図45の例では、46個の状態遷移につき情報を格納すればよく、状態遷移表を格納するのに必要なメモリを削減するという効果が得られている。
図46の出力表は出力表格納部5に格納される現状態13に対応する条件番号16の集合を表で表現したものであり、例えば、現状態が4のとき、条件番号0を出力することを示している。
一例として入力文字列「aaca」を入力とした場合の動作を図47に示す。まず、状態qを初期状態(状態0)に設定する。次いで1文字目の文字「a」を読み、状態0における文字「a」の遷移先である状態2に遷移する。文字「a」による遷移先が定義されているのでσotherの参照は不要であり、このことを図47中では(不要)と表記している。次に、2文字目の文字「a」を読み、状態2における文字「a」の遷移先である状態5に遷移する。次に、3文字目の文字「c」を読み、状態5における文字「c」の遷移先である状態9に遷移する。次に、4文字目の文字「a」を読み、状態9における文字「a」の遷移先である状態12に遷移する。ここで入力が終了する。
特許文献3に記載された従来の技術では同等の条件に対して7回の状態遷移表の参照を必要としていたが、本実施の例では4回で済む。このように、本発明によれば、遷移の失敗による状態遷移表の参照回数を1文字当り2回以下とし、遷移の失敗が繰り返されることによる性能低下による性能低下を防止し、高速な文字列照合を可能にすることを目的とする。
なお、図44の照合条件は、特許文献3に記載の技術との比較のために記載したものであるが、初期状態からすべての文字による遷移が可能であると言う特殊な条件を持っている。図44の照合条件の目的とするところは照合対象文字列「abcd」のうち一文字が変化してもその文字列を検出できるようにすることであるが、その目的および照合条件の意味をほとんど変更せずに図48の照合条件に変換することができる。このような場合には、状態遷移に必要なメモリを更に削減し、本実施の例の効果をより発揮することができる。
ステップS51に示した手続き「照合条件コンパイル」を実行することにより、図48の照合条件2から、図49に示す状態遷移表と、図50に示す出力表が生成される。なお、初期状態の状態番号を0とする。
図49の状態遷移表の意味は図45と同様であり、状態遷移表格納部4に格納が必要な状態遷移の数は23個に削減され、更に必要なメモリを削減するという効果が得られている。
また、図48の照合条件2について、入力「xabxd」に対する動作を図51に示す。状態0において1文字目の「x」の遷移先は定義されていないので、σotherを参照するが、それでも遷移先が定義されていないので次状態は初期状態、すなわち状態0とする。このとき状態遷移表の参照は2回行われる。以下、2文字目の「a」で状態3、3文字目の「b」で状態6に遷移する。4文字目の「x」では、「x」の遷移先は定義されていないので、σotherを参照し、次状態1を得る。このとき状態遷移表の参照は2回である。更に、5文字目の「d」で状態2に遷移する。状態2は出力となる条件番号16として番号0が存在しているので、これを出力する。この場合、状態遷移表の参照回数は7回となる。
なお、非特許文献1など記述されているように、出力を持たない一般のDFAは、出力アルファベットとして「受理した」「受理しない」という2種類の情報を出力する特殊なMoore機械とみなすことができる。本実施の例でも、単に照合結果に条件番号が存在するか否かを判定することにより、「受理した」「受理しない」という2種類の情報を出力する文字列照合装置を構成できる。
なお、以上の実施の例では、入力および照合の対象は「文字」であるとしてきたが、「文字」は人間に可読な文字列に限定されず、任意の記号列、データ列に対して適用が可能である。例えば遺伝子配列やセンサなどにより計測されたデータの識別に適用しても良い。
なお、以上の実施の例では、状態遷移表格納部4に状態遷移ハッシュ表35を使用するものとしたが、配列、木構造、など2次元構造の表を論理的に表現可能ないかなるデータ構造によって実現しても良い。
また、初期状態など使用頻度の高い状態に対してはアクセス速度の高速な配列などのデータ構造を使用し、使用頻度の低い状態に対してはメモリ容量の効率の高いハッシュ表や木構造などのデータ構造を併用しても良い。
なお、以上の実施の例では、出力表格納部5に条件番号インデックス41を使用するものとしたが、木構造やハッシュ表など、1次元構造の表を論理的に表現可能ないかなるデータ構造によって実現してもよい。