(57)【要約】【課題】　複数の記号列を照合キーとして、現実的な記憶容量で高速な照合を行う。【解決手段】　キーの照合操作を定義した有限状態機械の状態遷移表から、ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減して、スパースな状態遷移表を作成し、その状態遷移表を圧縮された配列形式で格納する。ファイル中の記号列をキーと照合する際に、入力記号に対する操作が状態遷移表に格納されていなければ、上記シフト操作を行って照合を続行する。【選択図】　　　図４０
2004103034.tif 000002
【特許請求の範囲】
【請求項１】
　与えられた記号列をキーとし、ファイル中に該キーが存在するか否かを、有限状態機械を用いて判定する照合装置であって、
　少なくとも１つ以上のキーに関する照合操作を定義した前記有限状態機械の状態遷移表であって、前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな該状態遷移表を、圧縮された配列形式で記憶する状態遷移記憶手段と、
　前記スパースな状態遷移表を参照しながら、前記ファイルに含まれる各記号に対応する操作を行い、該ファイル中の記号列を前記１つ以上のキーと照合する照合手段とを備え、
　前記状態遷移記憶手段は、前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とを記憶し、
　前記照合手段は、前記確認ラベル配列内の前記ラベルを確認することで前記スパースな状態遷移表に前記入力記号に対する操作が定義されているか否かをチェックし、該入力記号に対する遷移先が前記対応する位置に格納されているとき、該遷移先への遷移操作を行い、該入力記号に対する操作が該対応する位置に格納されていないとき、前記シフト操作を行うことを特徴とする照合装置。
【請求項２】
　前記照合手段は、前記入力記号に対する特定のシフト操作を表すデータが前記対応する位置に格納されているとき、前記ファイル内の照合位置を該特定のシフト操作によりシフトさせることを特徴とする請求項１記載の照合装置。
【請求項３】
　請求項１記載の照合装置と、前記１つ以上のキーに含まれる入力記号に対応してキーを特定するデータを格納する出力記号配列を記憶する記憶手段と、該出力記号配列内のデータに基づいて前記入力記号に対応するキーを出力する出力手段とを備えることを特徴とする検索装置。
【請求項４】
　請求項１記載の照合装置と、前記１つ以上のキーに含まれる入力記号に対応して、キーの代わりに出力される置換記号列を特定するデータを格納する置換記号配列を記憶する記憶手段と、該置換記号配列内のデータに基づいて前記入力記号に対応する置換記号列を出力する出力手段とを備えることを特徴とする置換装置。
【請求項５】
　請求項１記載の照合装置を備え、該照合装置を用いた記号列検索機能と記号列置換機能のうち少なくとも一方の機能を行うことを特徴とするワードプロセッサ装置。
【請求項６】
　請求項１記載の照合装置を備え、該照合装置を用いた記号列検索機能と記号列置換機能のうち少なくとも一方の機能を行うことを特徴とするデータベースシステム。
【請求項７】
　請求項１記載の照合装置を備え、該照合装置を用いた記号列検索機能と記号列置換機能のうち少なくとも一方の機能を行うことを特徴とする全文検索装置。
【請求項８】
　与えられた記号列をキーとし、ファイル中に該キーが存在するか否かを判定するための有限状態機械を作成する照合装置であって、
　少なくとも１つ以上のキーを表現する２進木データを作成し、前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな状態遷移表に対応する中間構造の有限状態機械を、該２進木データに基づいて作成するスパース有限状態機械作成手段と、
　前記中間構造の有限状態機械を、前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とからなる、圧縮された配列形式に変換する状態遷移機械圧縮手段とを備え、
　前記配列形式に変換された前記スパースな状態遷移表を参照して前記確認ラベル配列内の前記ラベルを確認することで、該スパースな状態遷移表に前記入力記号に対する操作が定義されているか否かがチェックされ、該入力記号に対する遷移先が前記対応する位置に格納されているとき、該遷移先への遷移操作が行われ、該入力記号に対する操作が該対応する位置に格納されていないとき、前記シフト操作が行われることを特徴とする照合装置。
【請求項９】
　前記スパース有限状態機械作成手段は、前記１つ以上のキーを表現する２進木データ作成手段と、ｆａｉｌｕｒｅ遷移先、デフォルトシフト、および特定の記号による特定のシフトを計算して、該２進木データに加えるシフト量計算手段とを含み、前記状態遷移機械圧縮手段は、該シフト量計算手段から受け取る該２進木データに基づいて、複数の要素が互いに重複しないように圧縮された前記遷移先配列を作成することを特徴とする請求項８記載の照合装置。
【請求項１０】
　与えられた記号列をキーとし、ファイル中に該キーが存在するか否かを、有限状態機械を用いて判定する照合装置であって、
　少なくとも１つ以上のキーを表現する２進木データを作成し、前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな状態遷移表に対応する中間構造の有限状態機械を、該２進木データに基づいて作成するスパース有限状態機械作成手段と、
　前記中間構造の有限状態機械を、前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とからなる、圧縮された配列形式に変換する状態遷移機械圧縮手段と、
　前記配列形式に変換された前記スパースな状態遷移表を記憶する状態遷移記憶手段と、
　前記スパースな状態遷移表を参照しながら、前記ファイルに含まれる各記号に対応する操作を行い、該ファイル中の記号列を前記１つ以上のキーと照合する照合手段とを備え、
　前記照合手段は、前記確認ラベル配列内の前記ラベルを確認することで前記スパースな状態遷移表に前記入力記号に対する操作が定義されているか否かをチェックし、該入力記号に対する遷移先が前記対応する位置に格納されているとき、該遷移先への遷移操作を行い、該入力記号に対する操作が該対応する位置に格納されていないとき、前記シフト操作を行うことを特徴とする照合装置。
【請求項１１】
　与えられた記号列をキーとし、ファイル中に該キーが存在するか否かを、有限状態機械を用いて判定するコンピュータのためのプログラムを記録した記録媒体であって、
　少なくとも１つ以上のキーに関する照合操作を定義した前記有限状態機械の状態遷移表であって、前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな該状態遷移表を参照しながら、前記ファイルに含まれる各記号に対応する操作を行い、該ファイル中の記号列を前記１つ以上のキーと照合する際に、
　前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とからなる、圧縮された配列形式で格納された前記スパースな状態遷移表を参照して該確認ラベル配列内の該ラベルを確認することで、該入力記号に対する操作が該スパースな状態遷移表に定義されているか否かをチェックする機能と、
　前記入力記号に対する遷移先が前記対応する位置に格納されているとき、該遷移先への遷移操作を行う機能と、
　前記入力記号に対する操作が前記対応する位置に格納されていないとき、前記シフト操作を行う機能と
を前記コンピュータに実現させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項１２】
　与えられた記号列をキーとし、ファイル中に該キーが存在するか否かを判定するための有限状態機械を作成するコンピュータのためのプログラムを記録した記録媒体であって、
　少なくとも１つ以上のキーを表現する２進木データを作成する機能と、
　前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな状態遷移表に対応する中間構造の有限状態機械を、該２進木データに基づいて作成する機能と、
　前記中間構造の有限状態機械を、前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とからなる、圧縮された配列形式に変換する際に、該確認ラベル配列内の該ラベルを確認することで前記スパースな状態遷移表に該入力記号に対する操作が定義されているか否かがチェックされ、該入力記号に対する遷移先が該対応する位置に格納されているとき、該遷移先への遷移操作が行われ、該入力記号に対する操作が該対応する位置に格納されていないとき、前記シフト操作が行われるように、該中間構造の有限状態機械を該圧縮された配列形式に変換する機能と
を前記コンピュータに実現させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項１３】
　与えられた記号列をキーとし、ファイル中に該キーが存在するか否かを、有限状態機械を用いて判定する方法において、
　少なくとも１つ以上のキーに関する照合操作を定義した前記有限状態機械の状態遷移表であって、前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな該状態遷移表を参照しながら、前記ファイルに含まれる各記号に対応する操作を行い、該ファイル中の記号列を前記１つ以上のキーと照合する際に、
　前記スパースな該状態遷移表を、前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とからなる、圧縮された配列形式で格納し、
　前記確認ラベル配列内の前記ラベルを確認することで前記入力記号に対する操作が前記スパースな状態遷移表に定義されているか否かをチェックし、
　前記入力記号に対する遷移先が前記対応する位置に格納されているとき、該遷移先への遷移操作を行い、
　前記入力記号に対する操作が前記対応する位置に格納されていないとき、前記シフト操作を行う
ことを特徴とする照合方法。
【請求項１４】
　与えられた記号列をキーとし、ファイル中に該キーが存在するか否かを判定するための有限状態機械を作成する方法において、
　少なくとも１つ以上のキーを表現する２進木データを作成し、
　前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな状態遷移表に対応する中間構造の有限状態機械を、該２進木データに基づいて作成し、
　前記中間構造の有限状態機械を、前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とからなる、圧縮された配列形式に変換する際に、該確認ラベル配列内の該ラベルを確認することで前記スパースな状態遷移表に該入力記号に対する操作が定義されているか否かがチェックされ、該入力記号に対する遷移先が該対応する位置に格納されているとき、該遷移先への遷移操作が行われ、該入力記号に対する操作が該対応する位置に格納されていないとき、前記シフト操作が行われるように、該中間構造の有限状態機械を該圧縮された配列形式に変換する
ことを特徴とする有限状態機械作成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
　本発明は、文字列検索装置等において、与えられたテキスト等のデータ中に、少なくとも１つ以上の記号列が存在するか否かを一括して判定する照合装置とその方法に関する。
【背景技術】
【０００２】
　今日、ワードプロセッサ等の文書処理装置において、テキスト中に、検索タームとして複数の記号列の集合が存在するか否かを一括して判定することが求められている。ここで、記号列とは文字やその他の記号の並びを意味し、文字列も１種の記号列である。このような判定機能は、しばしば、複数文字列照合または複数文字列検索と呼ばれる。
【０００３】
　従来の複数文字列検索装置において効率のよいものとしては、Aho らの提案しているＡＣ（Aho Corasick）法（例えば、非特許文献１参照）、これに対して決定的有限状態機械（Deterministic Finite Automaton：ＤＦＡ）を構成した方法、ならびに浦谷の提案しているＦＡＳＴ（Flying Algorithm for Searching Terms）法（例えば、非特許文献２および特許文献１参照）がある。
【０００４】
　以下では、まず、ＡＣ法とＡＣ法をＤＦＡ化した複数文字列照合アルゴリズムの説明を行い、次いで、ＦＡＳＴ法の複数文字列照合アルゴリズムの説明を行う。
　ＡＣ法は、入力キー集合に対してＰＭＭ（Pattern Matching Machine）と呼ばれる有限状態機械を構成することにより、文字列の照合を行う方法である。
【０００５】
　ＡＣ法における照合動作は次の通りである。まず、初期設定として状態番号を“１”にセットする。次に、入力されたテキストより１文字づつ記号を読み出し、この入力記号により、現状態からどの状態に遷移するかを決定する。現状態に対して入力記号による遷移が定義されていない場合には、照合が失敗（fail）したものとして、現状態のｆａｉｌ先に遷移する。そして、ｆａｉｌ先の状態に対してこの入力記号による遷移が定義されていない場合には、ｆａｉｌ先に遷移することを繰り返す。
【０００６】
　初期状態“１”に対してはすべての記号に対して遷移が定義されているため、ｆａｉｌによる遷移は最悪でも初期状態で停止する。このようにテキストの入力記号に対して遷移を繰り返す。また、状態に対して受理する記号列が定義されていた場合には、この記号列とそのテキスト中の位置を出力する。
【０００７】
　図６４は、３つの記号列｛ａｂ，ｂｃ，ｂｄ｝を検索キーとする、ＡＣ法のＰＭＭを示している。図６４のＰＭＭは、６つの状態“１”、“２”、“３”、“４”、“５”、“６”から成り、実線の矢印は通常の遷移先を指し、破線の矢印はｆａｉｌ先を指している。また、“＾ａ，ｂ”はａとｂ以外の入力記号を表し、状態“４”、“５”、“６”（ｓ４、ｓ５、ｓ６）には、出力キーワードとして、それぞれ記号列“ａｂ”、“ｂｃ”、“ｂｄ”が定義されている。
【０００８】
　入力記号列‘ｃａｂｃｚ’に対するこのＰＭＭの動作は、図６５に示すようになる。初期状態は“１”である。まず、記号“ｃ”が入力されると、これはａとｂ以外の入力記号に相当するので、次状態は同じ状態“１”で、出力は生成されない。次に、記号“ａ”が入力されると次状態“２”に遷移し、記号“ｂ”が入力されると次状態“４”に遷移する。ここで、状態“４”に定義されている記号列“ａｂ”が出力される。
【０００９】
　ところが、状態“４”には遷移先が定義されていないので、次に記号“ｃ”が入力されると、一旦ｆａｉｌ先の状態“３”に遷移し、そこで遷移先が探索される。すると、記号“ｃ”による遷移先として状態“５”が定義されているので、その状態に遷移して、記号列“ｂｃ”が出力される。次に、記号“ｚ”が入力されると状態“１”に遷移し、動作を終了する。
【００１０】
　このように、ＡＣ法では、遷移先が定義されていない入力記号によるｆａｉｌｕｒｅ遷移が起こる度に、遷移回数が１回増える。このため、ｎ個の入力記号に対しては最大２ｎ未満の有限状態機械の遷移が行われることになる。一般には、キー数の増加に伴いキーの先頭文字がヒットする確率が増加するが、これに伴って、ｆａｉｌｕｒｅ遷移も増加するため、ＡＣ法の照合速度はキー数が増えるにつれて段々低下していく。
【００１１】
　ＡＣ法の速度を低下させるのは、遷移先の定義されていないｆａｉｌｕｒｅ遷移であるが、ＤＦＡでは入力記号に対して一意に遷移先の状態が決まる。このため、ｎ個の入力記号に対して常にｎ回の有限状態機械の遷移が行われ、照合速度は高速である。Aho らはＡＣ法の状態遷移機械をＤＦＡに変換する方法を示している。
【００１２】
　図６６は、記号列｛ａｂ，ｂｃ，ｂｄ｝に対するＡＣ法の状態遷移機械に対応する有限状態機械を示している。図６６において、“ｓｔａｔｅ”は現状態を表し、“ｎｅｘｔ”は“ｉｎｐｕｔ”に記された記号が入力されたときの遷移先の状態を表す。状態ｓ１、ｓ２、ｓ３、ｓ４、ｓ５、ｓ６は、それぞれ状態“１”、“２”、“３”、“４”、“５”、“６”に対応している。また、例えば“¬ａ，ｂ”といった表記はａとｂ以外の記号を表す。
【００１３】
　この有限状態機械の入力記号列‘ｃａｂｃｚ’に対する動作は、図６７に示すようになる。初期状態は１である。図６７に示された状態遷移の中には、図６５に現れるようなｆａｉｌｕｒｅ遷移がなく、状態遷移の回数は入力記号‘ｃａｂｃｚ’に含まれる記号の数５に一致している。
【００１４】
　また、高速な照合法として知られるＦＡＳＴ法においても、ＡＣ法と同様に、入力キー集合に対してＰＭＭを構成することにより文字列の照合を行う。
　ＦＡＳＴ法における照合動作は次の通りである。まず、初期状態として状態番号を“０”にセットする。また、入力キー集合における最も短いキーの長さを最短キー長とし、入力テキストにおける照合開始位置を、テキストの先頭から最短キー長だけ離れた位置にセットする。
【００１５】
　次に、照合開始位置よりテキストの左に向かって１文字ずつ記号を読み出し、その入力記号により、現状態からどの状態に遷移するかを決定する。遷移が定義されていない場合には、入力記号に応じた規定量だけ照合開始位置を右方向にずらして、照合を再開する。
【００１６】
　このように、入力記号に対して状態遷移が可能な限り、テキストを右から左へ向かって走査し、文字列のパターンを抽出する。遷移が不可能な場合には、入力記号に対して定義されたシフト量だけ、照合開始位置をテキスト中で右方向にシフトする。
【００１７】
　図６８は、３つの記号列｛ｓｔａｔｅ，ｅａｓｔ，ｓｍａｒｔ｝を検索キーとする、ＦＡＳＴ法のＰＭＭを示している。図６８のＰＭＭは、１４個の状態“０”、“１”、“２”、“３”、“４”、“５”、“６”、“７”、“８”、“９”、“１０”、“１１”、“１２”、“１３”から成り、実線の矢印は遷移先を指し、破線の矢印はシフト先を指している。
【００１８】
　状態遷移は、各検索キーに含まれる記号の並びの逆順に定義されており、“Ｄｅｐｔｈ”はＰＭＭ内における各状態の深さを表す。また、状態“５”、“９”、“１３”（ｓ５、ｓ９、ｓ１３）には、出力キーワードとして、それぞれ記号列“ｓｔａｔｅ”、“ｅａｓｔ”、“ｓｍａｒｔ”が定義されている。
【００１９】
　このＰＭＭの各状態に対する、記号入力時の遷移先およびシフト量を表にすると、図６９のようになる。図６９において、１行目の数字は状態番号を表し、１列目の記号は入力記号を表す。ここで、“（Ｏｔｈｅｒ）”は、“ａ”、“ｅ”、“ｍ”、“ｒ”、“ｓ”、“ｔ”以外の入力記号を表す。この表において、正の値の要素は、対応する入力記号による遷移先の状態番号を表し、負の値の要素は、対応する入力記号によるシフト量を表す。
【００２０】
　入力記号列‘ａａｓｅａｓｔａｔｅ’に対するこのＰＭＭの動作は、図７０に示すようになる。初期状態は“０”である。この場合、記号列“ｓｔａｔｅ”、“ｅａｓｔ”、“ｓｍａｒｔ”のうち最も短いものは“ｅａｓｔ”で、その長さは４であるから、最短キー長は４となる。そこで、入力記号列の右端から最短キー長４だけ離れた位置“ｔ”を照合開始位置として、右から左へと照合が行われる。
【００２１】
　照合が失敗した場合には、その入力記号に対して定義されたシフト量に−１を乗じてシフト量の大きさを求め、その分だけ照合開始位置を右にずらす。そして、状態番号を“０”にして、照合を再開する。
【００２２】
　図７０の入力記号列内の記号“ｔ”の位置に記された初期状態“０”において、記号“ｔ”が入力されると、図６９の表に従って状態“６”に遷移する。次に、記号“ｓ”が入力されると状態“７”に遷移し、次に、記号“ａ”が入力されると状態“８”に遷移する。次に、記号“ｅ”が入力されると状態“９”に遷移し、状態“９”に定義されている記号列“ｅａｓｔ”が出力される。
【００２３】
　次に、記号“ｓ”が入力されると、この記号に対して状態“９”では、遷移先ではなくシフト量−７が定義されているので、その大きさ７だけ照合開始位置を右にずらす。そして、初期状態“０”に戻り、シフト先の記号“ｅ”の位置を新たな照合開始位置として照合を再開する。以下同様にして照合が続行され、状態“５”に遷移したときに、記号列“ｓｔａｔｅ”が出力される。
【００２４】
　上述のような複数文字列の検索処理は、データベース、ワードプロセッサ、全文検索装置などの各装置において用いられる。
　全文検索装置とは、全文検索インデックスによる検索において、検索結果が正しいかどうかを確かめるために文字列検索を行う装置を指す。ここで、全文検索インデックスとは、シグニチャファイル（signature file）や、文書中での単語の出現位置を持たないファイル（inverted file ）のように、インデックスそのものが入力されたキーワードに対して、必ずしも正解だけを返すとは限らない検索用のインデックスを意味する。
【００２５】
　例えば、英語のインデックスに対して、キーワード‘John Smith’を検索する場合を考える。インデックスの単位は、通常、スペースとスペースの間の単語であるので、‘John Smith’は‘John AND Smith’と同じになる。ところが、‘John AND Smith’という検索条件で文書を検索すると、‘John’と‘Smith ’が離れて出現している場合も検索結果に含まれ、過剰な結果が得られる。このような場合、結果が正しいかどうかが文字列検索により確かめられる。
【特許文献１】特開昭６４−０７４６１９号公報
【非特許文献１】A. V. Aho and M. J. Corasick，“EfficientString Matching: An Aid to Bibliographic Search”，CACM Vol.18 No.6，1975
【非特許文献２】“高速な文字列照合アルゴリズムＦＡＳＴ”，情報処理学会論文誌 Vol.30  No.9，1989
【発明の開示】
【発明が解決しようとする課題】
【００２６】
　以上説明した従来の文字列照合方法において問題となるのは、ＰＭＭの状態遷移に相当する部分の速度と記憶容量の関係である。
　ＡＣ法では、状態遷移部分を表すのにリスト構造を使用することで、記憶容量を減らすことが可能である。しかし、リスト構造ではポインタを順にたどらなければならず、アクセス処理が低速であるため、照合動作は一層低速になってしまう。
【００２７】
　ＤＦＡ化されたＡＣ法の照合速度は高速であるが、すべての入力記号に対して定義されたすべての状態遷移を表すために、図６６のような表構造を使用せざるを得ない。しかし、これは記憶容量に多大の負担となる。
【００２８】
　例えば、入力記号の種類を２５６個（８ｂｉｔ符号）とし、状態数をＮとし、ポインタを４ｂｙｔｅとする。表形式では、１つの状態に対して、次状態へのポインタ２５６個、ｆａｉｌ先へのポインタ１個、および出力記号列へのポインタ１個が必要である。このため、Ｎ＊（２５６＋１＋１）＊４ｂｙｔｅの記憶容量が必要になる。
【００２９】
　一般に、検索キーの数が増大するにつれて状態数Ｎも増大するので、キー数が多い場合には、必要な記憶容量は膨大になる。したがって、ＤＦＡ化されたＡＣ法に基づいて文字列照合装置を構成するのは現実的ではない。
【００３０】
　また、ＦＡＳＴ法においても同様に、すべての入力記号に対して状態遷移またはシフトが定義されているため、図６９のような表構造を使用せざるを得ない。したがって、ＦＡＳＴ法に基づいて文字列照合装置を構成すると、やはり、膨大な記憶容量が必要となる。
【００３１】
　本発明の課題は、現実的な記憶容量で高速な照合を行うことのできる複数記号列の照合装置およびその方法を提供することである。
【課題を解決するための手段】
【００３２】
　図１は、本発明の照合装置の原理図である。図１の照合装置は、与えられた記号列をキーとし、ファイル中にそのキーが存在するか否かを、有限状態機械を用いて判定する情報処理装置における照合装置であって、状態遷移記憶手段１と照合手段２を備える。
【００３３】
　状態遷移記憶手段１は、少なくとも１つ以上のキーに関する照合操作を定義した状態遷移表であって、あらかじめ決められた操作を表すデータを削減したスパースな状態遷移表を、圧縮された配列形式で記憶する。
【００３４】
　照合手段２は、上記スパースな状態遷移表を参照しながら、上記ファイルに含まれる各記号に対応する操作を行い、そのファイル中の記号列を上記１つ以上のキーと照合する。このとき、照合手段２は、スパースな状態遷移表に、ファイルから入力される入力記号に対する操作が定義されているか否かをチェックし、その入力記号に対する操作が定義されていないとき、上記あらかじめ決められた操作を行う。
【００３５】
　例えば、ＤＦＡ化されたＡＣ法に基づく状態遷移表を作成する場合は、現状態から初期状態への遷移操作を表すデータと、現状態から初期状態の次の状態への遷移操作を表すデータのうち、少なくとも一方のデータを従来の状態遷移表から除いて、状態遷移表の情報量を削減する。
【００３６】
　また、ＦＡＳＴ法に基づく状態遷移表を作成する場合は、上記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを、従来の状態遷移表から可能な限り除いて、状態遷移表の情報量を削減する。
【００３７】
　これにより、状態遷移表内でデータが除かれた部分は空要素となり、要素がまばらに散在するスパースな状態遷移表が生成される。このようなスパースな状態遷移表を圧縮して配列に格納することで、コンパクトな有限状態機械を構成することが可能になり、記憶容量が大幅に削減される。
【００３８】
　また、圧縮された配列形式の状態遷移表は、基本的にＤＦＡの状態遷移表に基づいて作成されているので、遷移等が定義されているかどうかのチェックは必要であるが、ファイルから入力される１つの記号毎に１回の遷移操作を行えばよく、ＤＦＡの高速性は保たれる。
【００３９】
　照合対象となるファイルとしては、テキストで記述された文書ファイルや音声データをデジタルコードに変換したファイル等、任意の記号列を含むファイルを用いることができる。
【００４０】
　また、本発明の別の局面における照合装置は、与えられた記号列をキーとし、ファイル中に該キーが存在するか否かを、有限状態機械を用いて判定する照合装置であって、状態遷移記憶手段１と照合手段２を備える。
【００４１】
　状態遷移記憶手段１は、少なくとも１つ以上のキーに関する照合操作を定義した有限状態機械の状態遷移表であって、ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな状態遷移表を、圧縮された配列形式で記憶する。このとき、状態遷移記憶手段１は、上記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、入力記号に対する操作が遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とを記憶する。
【００４２】
　照合手段２は、上記スパースな状態遷移表を参照しながら、上記ファイルに含まれる各記号に対応する操作を行い、そのファイル中の記号列を上記１つ以上のキーと照合する。このとき、照合手段２は、確認ラベル配列内のラベルを確認することでスパースな状態遷移表に入力記号に対する操作が定義されているか否かをチェックし、入力記号に対する遷移先が上記対応する位置に格納されているとき、その遷移先への遷移操作を行い、入力記号に対する操作が上記対応する位置に格納されていないとき、上記シフト操作を行う。
【００４３】
　例えば、図１の状態遷移記憶手段１は、実施形態の図５における状態遷移部１２２に対応し、照合手段２は状態遷移判定部１２１に対応する。
【発明の効果】
【００４４】
　本発明によれば、与えられたキーワード群に対して、速度と記憶容量の両側面において効率の良い照合表を作成することができる。また、その表を用いて、電子化文書に対して指定された複数のキーワードを、効率よく照合／検索することができる。
【００４５】
　また、このような文字列照合処理により、文字列検索や文字列置換などのワードプロセッサの機能を、より効率化することが可能となる。また、全文検索装置における全文検索インデックスの文字列検索、表示段階における括弧付け処理のような文字列置換などの機能や、データベースにおける文字列検索、表示段階における文字列置換などの機能も効率化することができる。
【発明を実施するための最良の形態】
【００４６】
　以下、図面を参照しながら、本発明を実施するための最良の形態を詳細に説明する。
　図２は、本発明に基づく照合システムの構成図である。図２の照合システムは圧縮装置１０１と照合装置１０２から成る。圧縮装置１０１は、キーワード入力部１０３、スパース配列有限状態機械作成部１０４、および状態遷移機械圧縮部１０５を備え、照合装置１０２は、照合用状態遷移機械部１０６およびテキスト入力部１０７を備える。
【００４７】
　キーワード入力部１０３は、検索対象となる入力されたキーワード群を受理し、スパース配列有限状態機械作成部１０４は、入力されたキーワード群に対して、配列形式ではスパースとなる、文字列照合のための有限状態機械を中間構造として２進木上に構築する。ここで、スパース配列とは、ほとんど要素が入っていない配列を意味する。状態遷移機械圧縮部１０５は、スパース配列有限状態機械作成部１０４が作成した中間構造を、照合が高速な圧縮された配列形式に変換する。
【００４８】
　照合用状態遷移機械部１０６は、圧縮された配列形式の有限状態機械を用いて、テキスト入力部１０７から入力されたテキストとキーワード群との照合を行う。
　図３は、図２の照合システムの動作のフローチャートである。図３において処理が開始されると、まず、キーワード入力部１０３が検索対象となるキーワード群を受理する（ステップＳＴ１）。
【００４９】
　次に、スパース配列有限状態機械作成部１０４は、入力されたキーワードに対して、照合速度がＤＦＡと同じオーダーであり、かつ配列形式ではスパースとなる中間構造の文字列照合機械を２進木の上に構築する（ステップＳＴ２）。２進木上の文字列照合機械は、照合速度は低速であるが、要素の追加、挿入が容易な構造になっている。
【００５０】
　次に、状態遷移機械圧縮部１０５は、この２進木上の文字列照合機械を、照合が高速な圧縮された配列形式に変換する（ステップＳＴ３）。このとき、配列内で要素の存在する部分に、確認用の文字ラベルを付け、複数の配列の要素の存在する部分が互いに重複しないように、それぞれの配列を重ね合わせることにより、１つの照合用配列を作成する。
【００５１】
　そして、照合用状態遷移機械部１０６は、入力されたテキストに対して、配列形式の有限状態機械を用いて照合を行う。
　検索対象となる入力されたキーワード群に対して、ＤＦＡ化されたＡＣ法や配列実装によるＦＡＳＴ法と、照合速度のオーダーは同じであるが、配列形式ではスパースとなり圧縮が可能である有限状態機械を構築することにより、照合速度が高速であり、記憶容量の節減が可能な文字列照合装置が構築される。
【００５２】
　構築方法をまとめると次のようになる。
　要素の挿入、追加などが容易であり記憶容量の問題がない２進木上に文字列照合機械を中間構造として構築し、この中間構造を照合が高速でコンパクトな、圧縮された配列形式に変換する。このとき、要素の確認用のラベルをその要素に付与し、互いに要素の重複がないように重ね合わせることにより、配列を圧縮する。
【００５３】
　図４は、図２の照合システムを実現する情報処理装置（コンピュータ）の構成図である。図４の情報処理装置は、ＣＰＵ（中央処理装置）１１１、メモリ１１２、入力装置１１３、出力装置１１４、外部記憶装置１１５、媒体駆動装置１１６、ネットワーク接続装置１１７を備え、それらの各装置はバス１１８により互いに結合されている。
【００５４】
　ＣＰＵ１１１は、メモリ１１２に格納されたプログラムを実行して、圧縮装置１０１と照合装置１０２の各処理を実現する。メモリ１１２には、上述のプログラムの他に、処理に用いられるデータが格納されている。メモリ１１２としては、例えばＲＯＭ（read only memory）、ＲＡＭ（random access memory）等が用いられる。
【００５５】
　入力装置１１３は、例えばキーボード、ポインティングデバイス等に相当し、ユーザからの要求や指示の入力に用いられる。また、出力装置１１４は、表示装置やプリンタ等に相当し、状態遷移機械や照合結果等の出力に用いられる。
【００５６】
　外部記憶装置１１５は、例えば、磁気ディスク装置、光ディスク装置、光磁気ディスク装置等である。この外部記憶装置１１５に、上述のプログラムとデータを保存しておき、必要に応じて、それらをメモリ１１２にロードして使用することができる。また、外部記憶装置１１５は、キーワードやテキストを保存するデータベースとしても使用される。
【００５７】
　媒体駆動装置１１６は、可搬記録媒体１１９を駆動し、その記憶内容にアクセスする。可搬記録媒体１１９としては、メモリカード、フレキシブルディスク、ＣＤ−ＲＯＭ（compact disk read only memory ）、光ディスク、光磁気ディスク等、任意のコンピュータ読み取り可能な記録媒体が使用される。この可搬記録媒体１１９に、上述のプログラムとデータを格納しておき、必要に応じて、それらをメモリ１１２にロードして使用することができる。
【００５８】
　ネットワーク接続装置１１７は、ＬＡＮ（local area network）等の任意の通信ネットワークに接続され、通信に伴うデータ変換等を行う。照合システムは、ネットワーク接続装置１１７を介して、外部の情報提供者の装置１２０（データベース等）と通信する。これにより、必要に応じて、上述のプログラムとデータを装置１２０からネットワークを介して受け取り、それらをメモリ１１２にロードして使用することができる。
【００５９】
　次に、図５から図３７までを参照しながら、ＤＦＡ化されたＡＣ法に基づく第１の実施形態について説明する。
　第１の実施形態では、ＤＦＡ化されたＡＣ法の表構造に対して、初期状態への遷移と初期状態の次状態への遷移とを定義せずに、これらに対する照合が失敗した場合には、初期状態からの遷移として定義し直すような状態遷移機械を構成する。
【００６０】
　このように、遷移が定義されていない場合に自動的に初期状態へ遷移するようにすれば、初期状態への遷移を記憶する必要がなくなる。また、初期状態の次状態へは、初期状態経由で必ず遷移することができるので、この遷移についても記憶する必要がない。これらの遷移の定義を省略することで、ＤＦＡの状態遷移表の要素を大幅に削除して、スパースな状態遷移表を得ることができる。
【００６１】
　次に、この状態遷移機械を配列形式にし、遷移が定義されている部分が重複しないように複数の配列を重ね合わせる。また、同時に、要素がその配列に含まれているかどうか確認を行うために、遷移が定義されている文字に対してはその文字をラベルとして付与する。
【００６２】
　また、圧縮された状態遷移表を作成する際に、２進木の中間形式を経由することにより、実際に使用される記憶容量を節減する。
　図５は、図２の照合装置１０２の構成図である。図５において、状態遷移判定部１２１および状態遷移部１２２は、照合用状態遷移機械部１０６に対応する。テキスト入力部１０７は、対象テキストより１文字ずつ記号を抽出し、状態遷移判定部１２１は、入力記号に対してどの状態に遷移するかを決定する。
【００６３】
　状態遷移部１２２は、例えばメモリ１１２に対応し、圧縮状態遷移部１２３、確認ラベル部１２４、出力記号部１２５を含む。圧縮状態遷移部１２３は、状態遷移表を圧縮した配列形式で格納し、確認ラベル部１２４は、圧縮に伴い遷移が定義されているかどうかを確認するためのラベルを格納する。出力記号部１２５は、ある状態に到達した段階で出力される記号列を定義する。
【００６４】
　図６は、３つの記号列｛ａｂ，ｂｃ，ｂｄ｝を入力キーワードとした場合の圧縮前の第１の状態遷移表を示している。この表を図６６の表と比較すると、状態ｓ２、ｓ３、ｓ４、ｓ５、ｓ６における遷移のうち、初期状態ｓ１への遷移と初期状態ｓ１の次状態ｓ２、ｓ３への遷移が除かれている。
【００６５】
　図６の状態遷移表に定義された各入力記号に対する遷移を図示すると、図７のようになる。図７において、“〜ａ，ｂ”はａとｂ以外の入力記号を表す。
　図８は、図６の状態遷移表を圧縮して得られる照合用の配列を示している。図８において、ｉｎｄｅｘは配列の添え字を表し、ＧＯＴＯは、圧縮状態遷移部１２３に格納される重ね合わせられた状態遷移表を表し、ＣＨＥＣＫは、確認ラベル部１２４に格納される確認用のラベルを表し、ＯＵＴＰＵＴは、出力記号部１２５に格納されるポインタの配列を表す。これらのポインタは、状態遷移部１２２内に格納された出力用の文字列を指している。
【００６６】
　配列ＣＨＥＣＫの要素“＃”は終端記号を表す。また、図８の配列の下方に記されている状態ｓ１〜ｓ６は、図６の各状態がどのように重なっているかを表しており、記号ａ、ｂ等は、図６の入力記号に対応する遷移先の格納位置を表している。
【００６７】
　図９は、第１の実施形態の説明のために用いる第１の文字コード変換表を示している。この文字コード変換表に従って、文字コードが内部コードに変換される。ここでは、簡単のため、文字コードの範囲をアルファベットのａからｚまでとしているが、これら以外にも数字等の任意の記号を用いることができる。
【００６８】
　次に、図１０および図１１を参照しながら、第１の実施形態における照合処理について説明する。
　図１０は、ＡＣ法に基づく文字列照合処理のフローチャートである。図１０において処理が開始されると、状態遷移判定部１２１は、まず入力されたテキストを指すテキストポインタをその先頭部にセットし、状態遷移部１２２内の状態遷移配列を指す遷移ポインタを初期状態にセットする（ステップＳＴ１１）。次に、テキストポインタがテキストの最後を指すかどうかのチェックを行う（ステップＳＴ１２）。テキストポインタがテキストの終わりを指せば照合は終了する。　テキストポインタがテキストの終わりを指していなければ、そのポインタの指す文字を取り出し（ステップＳＴ１３）、その文字に対応する内部コードの値を遷移ポインタの値に加算し、その加算値をｉｎｄｅｘとする位置に格納された文字ラベルがこの文字と同じかどうかのチェックを行う（ステップＳＴ１４）。
【００６９】
　これらの文字が一致しなければ、その入力文字に対する遷移が定義されていないことになる。そこで、初期状態へのポインタに入力文字の内部コードを加算し、その加算値をｉｎｄｅｘとする位置に定義された遷移先を、新たな遷移ポインタとする（ステップＳＴ１５）。
【００７０】
　ステップＳＴ１４においてラベルと入力文字が同じであれば、次に、出力文字列が状態に対して定義されているかどうかの確認を行う（ステップＳＴ１６）。　出力文字列が定義されていなければ、現在の遷移ポインタに入力文字の内部コードを加算し、その加算値をｉｎｄｅｘとする位置に定義された遷移先を、新たな遷移ポインタとする（ステップＳＴ１８）。そして、テキストポインタを１文字進め（ステップＳＴ１９）、ステップＳＴ１２以降の処理を繰り返す。
【００７１】
　出力文字列が定義されているのであれば、その文字列を照合結果として出力し（ステップＳＴ１７）、ステップＳＴ１８以降の処理を行う。ステップＳＴ１７において、現在のテキストポインタの値を、照合された文字列の位置として出力することもできる。
【００７２】
　図１１は、図８の状態遷移配列を用いた場合の入力テキスト‘ｃａｂｃｚ’に対する照合動作を示している。図１１において、“’ｃ”等は、文字ｃ等に対応する内部コードの値を表す。また、ＧＯＴＯ［ｘ］は、ｉｎｄｅｘ“ｘ”の位置に定義されている遷移先の番号を表し、ＣＨＥＣＫ［ｘ］は、ｉｎｄｅｘ“ｘ”の位置に格納されているラベルを表し、ＯＵＴＰＵＴ［ｘ］は、ｉｎｄｅｘ“ｘ”の位置に格納されている出力用ポインタを表す。この場合の照合は次のように行われる。
【００７３】
　図８において、初期状態はｉｎｄｅｘ＝１の位置に対応する。最初の入力記号は“ｃ”である（ステップＳＴ１３）。初期状態においてはすべての入力記号に対する遷移先が定義されているので、図１１に“＊１”で示されるように、ステップＳＴ１４のチェックは省略され、ステップＳＴ１６の処理に移る。ここでは、出力は定義されていないので、ステップＳＴ１７の処理は行われない。
【００７４】
　次に、入力記号“ｃ”に対して図９の変換表を引くと’ｃ＝３を得る。そこで、ＧＯＴＯ［１＋３］＝ＧＯＴＯ［４］の結果を、次に進むべき遷移先とする。図８において、ｉｎｄｅｘ“４”の位置に定義されている遷移先は“１”であるので、ＧＯＴＯ［４］＝１となる。したがって、遷移先は、再びｉｎｄｅｘ“１”に対応する初期状態となる（ステップＳＴ１８）。
【００７５】
　次に、同様にして、入力記号“ａ”に対して照合動作を行うと、ＧＯＴＯ［１＋’ａ］＝２６となり、ｉｎｄｅｘ“２６”から始まる状態に移る（ステップＳＴ１８）。
　次に、入力記号“ｂ”に対しては、配列ＣＨＥＣＫにアクセスして、遷移が定義されているかいないかを確かめる必要がある（ステップＳＴ１４）。そこで、現在の遷移ポインタの値２６に’ｂ＝２を加算すると、ｉｎｄｅｘ“２８”を得る。ｉｎｄｅｘ“２８”の位置に格納されたラベルは“ｂ”であるから、ＣＨＥＣＫ［２８＋’ｂ］＝ｂとなり、この入力記号に対する遷移が定義されていることが分かる。
【００７６】
　このとき、ＯＵＴＰＵＴ［２６＋’ｂ］には出力記号列“ａｂ”が定義されているので、これを出力する（ステップＳＴ１７）。また、次の遷移先は、ＧＯＴＯ［２６＋’ｂ］＝２９となる。
【００７７】
　次に、入力記号“ｃ”に対して同様の処理を行い、記号列“ｂｃ”を出力して、ＧＯＴＯ［２９＋’ｃ］＝５の位置に遷移する。
　次に、最後の入力記号“ｚ”に対して同様の処理を行うと、ＣＨＥＣＫ［５＋’ｚ］はｚではないため、ｉｎｄｅｘ“５”の状態からの遷移は失敗し、記号“ｚ”に対する遷移は初期状態からの遷移として定義される。この結果、遷移ポインタはＧＯＴＯ［１＋’ｚ］＝１となり（ステップＳＴ１５）、テキストが終了したので照合動作を終了する。
【００７８】
　こうして、入力テキストに含まれていた記号列“ａｂ”と“ｂｃ”が、照合結果として出力される。
　次に、照合に用いる状態遷移配列の作成方法を説明する。図１２は、図２の圧縮装置の第１の構成図である。図１２において、２進木変換部１３１および遷移追加部１３２は、スパース配列有限状態機械作成部１０４に対応し、変換部１３３は状態遷移機械圧縮部１０５に対応する。
【００７９】
　キーワード入力部１０３は、指定されたキーワード群を受理する。２進木変換部１３１は、この受理されたキーワード群を、各キーの左から右に向かう方向に、２進木構造に変換する。遷移追加部１３２は、作成された２進木構造に対して、照合失敗時における初期状態とその次状態以外への遷移を追加する。変換部１３３は、遷移追加部１３２が出力する２進木構造を、圧縮された配列形式に変換する。
【００８０】
　このような照合用の配列の作成手順は、入力されたキーワード群からの２進木の作成、その結果得られた２進木のノードに対するｆａｉｌ先ノードの追加、ｆａｉｌｕｒｅ遷移の中で直接遷移可能なものを定義するｇｏｔｏｉｎ／ｇｏｔｏｏｕｔ先ノードリストの追加、最終的に得られた２進木の配列形式への変換の各処理より成る。
【００８１】
　図１３は、２進木作成処理のフローチャートである。図１３において処理が開始されると、２進木変換部１３１は、まず入力キーに対して２進木を作成する（ステップＳＴ２１）。次に、キーを受理したノードに対して、対応する入力キーを出力記号列として付加し（ステップＳＴ２２）、処理を終了する。
【００８２】
　例えば、図７の状態遷移図に対応するキーワード群｛ａｂ，ｂｃ，ｂｄ｝に対して２進木を作成すると、図１４のようになる。図１４において、矩形のボックスが１つのノードを表し、各ノードに付加された文字ラベルはキーワード中に現れる記号に対応している。また、横へのポインタは、２進木上で同じ深さのノードへのポインタを表し、下へのポインタはより深いノードへのポインタを表す。ここでは、ノード“４”、“５”、“６”に対して、出力記号列“ａｂ”、“ｂｃ”、“ｂｄ”がそれぞれのｏｕｔｐｕｔとして付加されている。
【００８３】
　図１５は、作成された２進木のノードに対してｆａｉｌｕｒｅ遷移の遷移先を付与する処理のフローチャートである。図１５において処理が開始されると、遷移追加部１３２は、まず処理対象となるノードを格納するノードキューＱを初期化する（ステップＳＴ３１）。
【００８４】
　次に、２進木のルートノードから遷移可能なノード（ルートノードに対して次ノードになるノードおよびそのノードと深さが同じノード）をキューＱに入れる（ステップＳＴ３２）。
【００８５】
　次に、キューに入っているノードのｆａｉｌ先をルートノードに設定し（ステップＳＴ３３）、Ｑが空かどうかの判定を行う（ステップＳＴ３４）。Ｑが空ならば処理は終了する。Ｑが空でなければ、次にキューＱから１つノードを取り出し、これをｒに設定し（ステップＳＴ３５）、取り出したノードをキューＱから除く（ステップＳＴ３６）。
【００８６】
　次に、ノードキューＪを初期化し（ステップＳＴ３７）、ｒから遷移可能なノード（ノードｒに対して次ノードになるノードおよびそのノードと深さが同じノード）をキューＪに入れる（ステップＳＴ３８）。そして、Ｊが空かどうかを判定する（ステップＳＴ３９）。
【００８７】
　Ｊが空であるならばステップＳＴ３４以降の処理を繰り返す。Ｊが空でないならば、次にノードキューＪより１つノードを取り出し、これをｓにセットして（ステップＳＴ４０）、取り出したノードをキューＪより除く（ステップＳＴ４１）。次に、ｓをキューＱに入れて（ステップＳＴ４２）、ノードｒのｆａｉｌ先をｔにセットし（ステップＳＴ４３）、ノードｓについている文字ラベルによるノードｔからの遷移が定義されているかどうかの判定を行う（ステップＳＴ４４）。
【００８８】
　そのような遷移が定義されていなければｔにｔのｆａｉｌ先をセットし（ステップＳＴ４５）、再びステップＳＴ４４の判定を行い、判定結果がＹＥＳになるまでループする。最終的には、初期状態でループを抜けることができる。
【００８９】
　ステップＳＴ４４で遷移が定義されていれば、次に、ｔからｓのラベルで遷移する先をｓのｆａｉｌ先とする（ステップＳＴ４６）。そして、ｓのｏｕｔｐｕｔ（出力文字列）として、ｓのｆａｉｌ先の出力文字列を加え（ステップＳＴ４７）、ステップＳＴ３９以降の処理を繰り返す。
【００９０】
　例えば、図１４の２進木のｆａｉｌｕｒｅ遷移を計算し、これを２進木の各ノードに付与すると、図１６のようになる。この場合のｆａｉｌｕｒｅ計算の手順を、図１５のフローに沿って説明する。
【００９１】
　まず、ルートノード“１”から遷移可能なノード“２”、“３”をキューＱに入れ（ステップＳＴ３２）、それらのノードのｆａｉｌ先をルートノードとする。その後の処理は、図１７に示すようになる。図１７において、例えばｇｏｔｏ（１，ｂ）の表記は、記号“ｂ”に対して定義されたノード“１”からの遷移を表す。このような手順は、一般のＡＣ法におけるｆａｉｌｕｒｅ関数の作成手順と同様である。
【００９２】
　図１８は、付加されたｆａｉｌｕｒｅ遷移に対して、初期状態とその次状態以外の状態への遷移を、ｇｏｔｏｉｎ／ｇｏｔｏｏｕｔノードリストとして２進木のノードに追加する処理のフローチャートである。図１８において処理が開始されると、遷移追加部１３２は、まずノードキューＱを初期化する（ステップＳＴ５１）。
【００９３】
　次に、２進木のルートノードから遷移可能なノードをキューＱに入れ（ステップＳＴ５２）、キューＱが空かどうかの判定を行う（ステップＳＴ５３）。キューＱが空であるならば処理は終了する。
【００９４】
　キューＱが空でないならば、キューＱより１つノードを取り出し、これをｒにセットし（ステップＳＴ５４）、そのノードをキューＱより取り除く（ステップＳＴ５５）。次に、キューＸにすべての可能な入力記号を入れて（ステップＳＴ５６）、キューＸが空かどうかの判定を行う（ステップＳＴ５７）。キューＸが空であればステップＳＴ５３以降の処理を繰り返す。
【００９５】
　例えば８ｂｉｔ符号を用いた場合、ステップＳＴ５６においてキューＸに入れられる記号のコードは、０〜２５５までの２５６個となる。
　キューＸが空でなければ、キューＸより１文字取り出し、これをｓにセットし（ステップＳＴ５８）、同時にこの文字をキューＸより取り除く（ステップＳＴ５９）。そして、記号ｓによりｒから次状態に遷移可能かどうかを判定する（ステップＳＴ６０）。遷移可能であれば、記号ｓによるｒの遷移先をキューＱに追加し（ステップＳＴ６５）、ステップＳＴ５７以降の処理を繰り返す。
【００９６】
　ステップＳＴ６０において遷移不可能であれば、次に、ノードｒのｆａｉｌ先がルートノードかどうかの判定を行う（ステップＳＴ６１）。それがルートノードであれば、そのままステップＳＴ５７以降の処理を繰り返す。
【００９７】
　ステップＳＴ６１においてノードｒのｆａｉｌ先がルートノードでなければ、次に、ｒのｆａｉｌ先から記号ｓによる遷移が可能かどうかの判定を行う（ステップＳＴ６２）。遷移が不可能であればステップＳＴ５７以降の処理を繰り返す。　遷移が可能であれば、次に、ｒのｆａｉｌ先から記号ｓで遷移可能なノードを、ｒのｇｏｔｏｏｕｔに追加し（ステップＳＴ６３）、そのノードのｇｏｔｏｉｎにノードｒを追加して（ステップＳＴ６４）、ステップＳＴ５７以降の処理を繰り返す。
【００９８】
　今、処理対象ノードｒをｒ＝Ａとし、記号ｓによるノードＡのｆａｉｌ先のノードをＢとし、ノードＢから遷移可能なノードの集合をＣとする。このとき、図１８のステップＳＴ５７からＳＴ６５までのループ処理では、まずノードＡから記号ｓで直接遷移可能なノードを集合Ｃから除く。そして、集合Ｃ中のノードのリストをｇｏｔｏｏｕｔとしてノードＡに付加し、集合Ｃ中の各ノードに対してはノードＡをｇｏｔｏｉｎとして付加している。
【００９９】
　図１６の２進木の場合に対してｇｏｔｏｏｕｔとｇｏｔｏｉｎを求めると、図１９のようになる。図１９の２進木は、遷移追加部１３２が最終的に出力する中間構造の有限状態機械に相当する。
【０１００】
　上述のｇｏｔｏｏｕｔリストおよびｇｏｔｏｉｎリストの計算において、実際に遷移が定義され得るのは、ｆａｉｌ先が初期状態以外のノードになった場合だけである。図１６では、この条件を満たすのは明らかにノード“４”だけであるので、このノードについての処理を説明する。
【０１０１】
　図１６において、ノード“４”のｆａｉｌ先はノード“３”である。ノード“３”からは、文字“ｃ”によりノード“５”へ遷移可能であり、文字“ｄ”によりノード“６”へ遷移可能である。したがって、ノード“４”のｇｏｔｏｏｕｔはノード“５”とノード“６”となる。また、ノード“５”、“６”のｇｏｔｏｉｎは、ともにノード“４”となる。図１９では、これらのｇｏｔｏｏｕｔおよびｇｏｔｏｉｎが、ラベルの付いたノードの形式で表されている。
【０１０２】
　従来のＤＦＡの場合は、２進木のすべてのノードに対してｇｏｔｏｏｕｔが定義されているが、本発明では、ルートノード以外へのｆａｉｌｕｒｅ遷移が定義されているノードに対してのみ、ｇｏｔｏｏｕｔが定義される。この場合、ｇｏｔｏｉｎを付加的に定義する必要があるが、ルートノードをｆａｉｌ先とする多くのノードのｆａｉｌｕｒｅ遷移が削除されるため、記憶容量の削減に寄与する。
【０１０３】
　図２０および図２１は、遷移追加部１３２が出力する２進木を、圧縮された配列形式の状態遷移機械に変換する処理のフローチャートである。図２０において処理が開始されると、変換部１３３は、まず配列ＧＯＴＯ、ＣＨＥＣＫ、ＯＵＴＰＵＴを０に初期化し（ステップＳＴ７１）、２進木のノードのメンバｉｎｄｅｘを０に初期化する（ステップＳＴ７２）。
【０１０４】
　このｉｎｄｅｘは、２進木の各ノードと、図８に示されるような状態遷移配列のｉｎｄｅｘとの対応関係を記憶するために、状態遷移配列のｉｎｄｅｘとは独立に設けられる。
　次に、可能な入力記号のうち、ルートノードから他のノードにその記号で遷移できないようなものをキューＲに入れ（ステップＳＴ７３）、キューＲが空かどうかの判定を行う（ステップＳＴ７４）。キューＲが空でなければ、キューＲより１文字取り出し、これをｓにセットし（ステップＳＴ７５）、これをキューＲより除く（ステップＳＴ７６）。
【０１０５】
　次に、ＧＯＴＯ［１＋’ｓ］を１とし（ステップＳＴ７７）、ＣＨＥＣＫ［１＋’ｓ］をｓの文字ラベルとして（ステップＳＴ７８）、ステップＳＴ７４以降の処理を繰り返す。“’ｓ”は、ｓに対する配列中での内部コードを表すが、これは文字コードそのままでも構わない。
【０１０６】
　そして、キューＲが空になると、次にキューＱを初期化し（ステップＳＴ７９）、Ｐn ＝ルートノード、Ｃn ＝ルートノードの次ノード、Ｐp ＝１とする（ステップＳＴ８０）。
【０１０７】
　ここで、ルートノードの次ノードとは、ルートノードから遷移可能な複数のノード（ノード列）において、最小の文字ラベルを持つノードを意味する。図１９のような２進木の場合、Ｃn に入れられるノードは、ルートノードから下へのポインタで指されるノードに一致する。
【０１０８】
　次に、［Ｐn ，Ｃn ，Ｐp ］の３つ組をキューＱに追加して（ステップＳＴ８１）、キューＱが空かどうかの判定を行う（ステップＳＴ８２）。キューＱが空であれば処理は終わりとなる。
【０１０９】
　キューＱが空でなければ、次にキューＱの先頭より３つ組を取り出し、これをｓにセットして（ステップＳＴ８３）、その３つ組をキューＱより取り除く（ステップＳＴ８４）。次に、ｓ内のノードＰn のｇｏｔｏｏｕｔに繋がるノードと、ｓ内のノードＣn に連なる、Ｃn と深さが同じノードとを挿入可能な、配列ＧＯＴＯ、ＣＨＥＣＫ、ＯＵＴＰＵＴ上の位置を求め、これをｐｏｉｎｔにセットする（ステップＳＴ８５）。
【０１１０】
　このとき、既に挿入されたノードのｐｏｉｎｔの位置と、新たに挿入するノードのｐｏｉｎｔの位置が重複しないようにする。もし、新たな挿入可能位置が既にｐｏｉｎｔとして用いられている場合は、例えばそれを１つずらしてｐｏｉｎｔに設定する。
【０１１１】
　次に、ＧＯＴＯ［ｓのＰp ］＝ｐｏｉｎｔとし（ステップＳＴ８６）、ｓのＰn のｇｏｔｏｏｕｔに繋がるノードをキューｔｍｐに入れて（ステップＳＴ８７）、キューｔｍｐが空かどうかの判定を行う（ステップＳＴ８８）。
【０１１２】
　キューｔｍｐが空でなければ、次に、キューｔｍｐよりノードを１つ取り出しこれをｉにセットし（ステップＳＴ８９）、そのノードをキューｔｍｐより除く（ステップＳＴ９０）。そして、ＧＯＴＯ［ｉのｉｎｄｅｘ］が０かどうかの判定を行う（ステップＳＴ９１）。
【０１１３】
　ここで、２進木のノードｉのｉｎｄｅｘには、ノードｉが格納された状態遷移配列上の位置のｉｎｄｅｘ、または０が格納されている。これが０であれば、２進木のノードｉはまだ状態遷移配列上に移されていない。
【０１１４】
　ＧＯＴＯ［ｉのｉｎｄｅｘ］が０であれば、ステップＳＴ８８の処理を繰り返す。それが０でなければ、ｇｏｔｏｏｕｔ先への遷移は配列上に移されているので、ｇｏｔｏｏｕｔによる遷移を配列上にマッピングし（ステップＳＴ９２）、ステップＳＴ８８以降の処理を繰り返す。
【０１１５】
　ステップＳＴ９２では、ＧＯＴＯ［ｐｏｉｎｔ＋’ｉのラベル］＝ＧＯＴＯ［ｉのｉｎｄｅｘ］、ＯＵＴＰＵＴ［ｐｏｉｎｔ＋’ｉのラベル］＝ｉのｏｕｔｐｕｔとすることにより、遷移をマッピングする。ここで、“’ｉのラベル”とは、ノードｉの文字ラベルの内部コードを表し、ｉのｏｕｔｐｕｔとは、ノードｉに定義された出力記号列を表す。こうして、ノードｉのｏｕｔｐｕｔが配列上に複写される。
【０１１６】
　ステップＳＴ８８においてキューｔｍｐが空になると、次に、ｓ内のＰn のｇｏｔｏｉｎに繋がるノードをキューｔｍｐに入れ（図２１、ステップＳＴ９３）、キューｔｍｐが空かどうかの判定を行う（ステップＳＴ９４）。
【０１１７】
　キューｔｍｐが空でなければ、キューｔｍｐよりノードを１つ取り出し、これをｉにセットし（ステップＳＴ９５）、ｉをキューより除く（ステップＳＴ９６）。そして、ＧＯＴＯ［ｉのｉｎｄｅｘ］が０かどうかの判定を行う（ステップＳＴ９７）。
【０１１８】
　ＧＯＴＯ［ｉのｉｎｄｅｘ］が０であれば、ステップＳＴ９７の処理を繰り返す。それが０でなければ、ｇｏｔｏｉｎ経由でｇｏｔｏｏｕｔの遷移を配列上にマッピングし（ステップＳＴ９８）、ステップＳＴ９７以降の処理を繰り返す。　ステップＳＴ９８では、ＧＯＴＯ［ＧＯＴＯ［ｉのｉｎｄｅｘ］＋’ｉのラベル］＝ｐｏｉｎｔとすることにより、マッピングを行う。また、ｓ内のノードＰn にｏｕｔｐｕｔが定義されているのであれば、ＯＵＴＰＵＴ［ＧＯＴＯ［ｉのｉｎｄｅｘ］＋’ｉのラベル］＝Ｐn のｏｕｔｐｕｔとして、Ｐn のｏｕｔｐｕｔを配列上に複写する。
【０１１９】
　ステップＳＴ９４においてキューｔｍｐが空になると、次に、Ｐn のｇｏｔｏｏｕｔに繋がるノードの文字ラベルと、Ｃn に同じ深さで繋がるノードの文字ラベルとをキューｃｈｔｍｐに入れる（ステップＳＴ９９）。そして、キューｃｈｔｍｐが空かどうかの判定を行う（ステップＳＴ１００）。
【０１２０】
　ｃｈｔｍｐが空でなければ、次に、キューｃｈｔｍｐより１つ文字ラベルを取り出し、これをｊにセットし（ステップＳＴ１０１）、そのラベルをキューｃｈｔｍｐより除く（ステップＳＴ１０２）。そして、ＣＨＥＣＫ［ｐｏｉｎｔ＋’ｊ］＝ｊとして、ノードの挿入先のラベルをセットし（ステップＳＴ１０３）、ステップＳＴ１００以降の処理を繰り返す。
【０１２１】
　ステップＳＴ１００においてｃｈｔｍｐが空になると、次に、ｓ内のＣn およびそれと同じ深さのノードをキューｔｍｐに入れ（ステップＳＴ１０４）、キューｔｍｐが空かどうかの判定を行う（ステップＳＴ１０５）。
【０１２２】
　キューｔｍｐが空でなければ、キューｔｍｐよりノードを取り出し、これをｉにセットし（ステップＳＴ１０６）、そのノードをキューより取り除く（ステップＳＴ１０７）。次に、ノードｉのｉｎｄｅｘに、（ｐｏｉｎｔ＋’ｉのラベル）の値をセットして（ステップＳＴ１０８）、ノードｉにｏｕｔｐｕｔが定義されているかどうかをチェックする（ステップＳＴ１０９）。
【０１２３】
　ノードｉにｏｕｔｐｕｔがなければ、ステップＳＴ１０５以降の処理を繰り返す。ｏｕｔｐｕｔがあれば、ノードｉのｏｕｔｐｕｔを配列ＯＵＴＰＵＴにコピーして（ステップＳＴ１１０）、ステップＳＴ１０５以降の処理を繰り返す。ステップＳＴ１１０においては、ＯＵＴＰＵＴ［ｐｏｉｎｔ＋’ｉのラベル］＝ｉのｏｕｔｐｕｔとする。
【０１２４】
　ステップＳＴ１０５においてｔｍｐが空になると、次に、Ｃn と同じ深さのノードをキューｔｍｐに入れ（ステップＳＴ１１１）、ｔｍｐが空かどうかの判定を行う（ステップＳＴ１１２）。
【０１２５】
　キューｔｍｐが空でなければ、キューｔｍｐより１つノードを取り出し、これをｉにセットし（ステップＳＴ１１３）、そのノードをキューｔｍｐから取り除く（ステップＳＴ１１４）。そして、ノードｉより何らかの記号で次状態に遷移可能かどうかの判定を行う（ステップＳＴ１１５）。
【０１２６】
　遷移不可能であれば、ステップＳＴ１１２以降の処理を繰り返す。遷移可能であれば、Ｐn ＝ｉ、Ｃn ＝ｉの遷移先の先頭ノード、Ｐp ＝ｉのｉｎｄｅｘとして、この３つ組みをキューＱに追加し（ステップＳＴ１１６）、ステップＳＴ１１２以降の処理を繰り返す。ここで、ｉの遷移先の先頭ノードとは、ノードｉから遷移可能なノード列において、最小の文字ラベルを持つノードを意味する。
【０１２７】
　ステップＳＴ１１５においてｔｍｐが空になると、図２０のステップＳＴ８２に戻り、それ以降の処理を繰り返す。
　次に、図１９の２進木を図８のような配列形式に変換する手順を、図２０および図２１のフローに沿って説明する。
【０１２８】
　まず、初期状態に対してはすべての遷移が定義されるので、これを定義する。この処理は、図２０のステップＳＴ７４〜ＳＴ７８のループに相当する。これにより図２２のような配列形式を得る。
【０１２９】
　この後、２進木のルートノードから順に、２進木上のノードを配列に挿入していくが、この処理が図２０のステップＳＴ７９から図２１のステップＳＴ１１６のループに相当する。この挿入処理において、変換部１３３は、２進木のノードに対する３つ組のデータ［Ｐn ，Ｃn ，Ｐp ］をキューに積み、これを１つずつ配列に挿入していく。
【０１３０】
　まず、ルートノードより挿入するが、図２０では、ステップＳＴ７９、ＳＴ８０、ＳＴ８１でキューＱに３つ組を積み、これをステップＳＴ１３、ＳＴ１４で取り出している。ここでは、Ｐn ＝ルートノード“１”、Ｃn ＝ノード“２”、Ｐp ＝１となる。ステップＳＴ８５では挿入可能な場所を捜すが、この処理はルートノード“１”に対しては次のようになる。
【０１３１】
　この場合、Ｐn のｇｏｔｏｏｕｔは空である。Ｃn と深さが同じノードはノード“２”とノード“３”となる。これらのノードの文字ラベルは、それぞれ“ａ”、“ｂ”である。このノード列が挿入可能な配列上の場所を捜す操作は、図２３のようなパターンに対応する場所を、配列ＧＯＴＯ、ＣＨＥＣＫ、ＯＵＴＰＵＴ上で捜すことに相当する。
【０１３２】
　図２３のパターンにおいて、上の行は、現在の配列ＣＨＥＣＫ上のパターンを表し、下の行は、挿入されるパターンを表す。また、“０”は、その領域が空であることを表し、“＊”は、その領域が空であっても要素が入っていてもどちらでもよいことを表す。
【０１３３】
　このようなパターンが挿入可能な位置を図２２の配列上で捜すと、図２３のパターンは図２４に示すように重ねることが可能であるので、ノードの挿入位置を表すｐｏｉｎｔの値は１となる。この位置は、ノード“２”のラベル“ａ”の挿入位置の１つ前の位置に対応している。
【０１３４】
　また、ステップＳＴ８６では、ＧＯＴＯ［Ｐp ］＝ｐｏｉｎｔとなるので、ＧＯＴＯ［１］＝１となる。これにより、２進木のノード“１”からノード“２”、“３”への遷移が配列上に移される。ただし、ルートノード“１”に対応するｉｎｄｅｘ＝１の位置に対しては、あらかじめＧＯＴＯ［１］＝１となっているため、変化はない。
【０１３５】
　図２０のステップＳＴ８７から図２１のステップＳＴ９８までの処理は、ノードＰp がｇｏｔｏｏｕｔ／ｇｏｔｏｉｎを持っている場合の処理であるので、ルートノードには関係がない。
【０１３６】
　図２１のステップＳＴ９９からＳＴ１０３までの処理は、配列に文字ラベルを挿入する処理である。これは、それぞれのノードの持つ文字ラベルを、先に確保された配列上の場所のＣＨＥＣＫの部分にセットすることに相当する。この操作により、図２５のような配列形式を得る。図２５において、下線を付加したラベル“ａ”、“ｂ”が、挿入されたラベルに相当する。
【０１３７】
　図２１のステップＳＴ１０４からＳＴ１１０までの処理は、配列上の位置を２進木のノードに対してセットする処理と、ノードのｏｕｔｐｕｔを配列上に複写する処理である。これにより、ノード“２”のｉｎｄｅｘには２がセットされ、ノード“３”のｉｎｄｅｘには３がセットされる。
【０１３８】
　また、ステップＳＴ１１１からＳＴ１１６までのループ処理は、Ｐp から遷移可能なノードをキューＱに積む処理である。ここでは、ルートノードより遷移可能なのは、ノード“２”とノード“３”であるので、［Ｐn ＝ノード“２”，Ｃn ＝ノード“４”，Ｐp ＝２］と［Ｐn ＝ノード“３”，Ｃn ＝ノード“５”，Ｐp ＝３］の２つがキューに積まれる。そして、処理は図２０のステップＳＴ８２に戻る。
【０１３９】
　今度は、Ｐn ＝ノード“２”、Ｃn ＝ノード“４”、Ｐp ＝２として同様の処理を行い、ノードの挿入可能な位置を捜すと、ｐｏｉｎｔ＝２６の位置が見つかる。そこで、図２０のステップＳＴ８５から図２１のステップＳＴ１１１までの処理を同様にして行うと、図２６のような配列形式が得られる。
【０１４０】
　図２６において、ノード“４”のラベル“ｂ”はｉｎｄｅｘ＝２８の位置に挿入されているが、図９の変換表を用いた場合、ラベル“ｂ”は内部コード２に変換される。そこで、２８から２を引いた値２６をｐｏｉｎｔとする。これにより、図１０の照合処理のステップＳＴ１８において、ｉｎｄｅｘ＝２６の位置から入力記号“ｂ”によりｉｎｄｅｘ＝２８の位置に移動し、その要素が表す遷移先に遷移することができるようになる。
【０１４１】
　また、ＯＵＴＰＵＴ［２８］にはノード“４”のｏｕｔｐｕｔである“ａｂ”が複写される。
　次に、ノード“４”に後続するノードはノード“７”であるので、［Ｐn ＝ノード“４”，Ｃn ＝ノード“７”，Ｐp ＝２８］がキューＱに積まれる。そして、処理は図２０のステップＳＴ８２に戻る。
【０１４２】
　次にキューＱより取り出されるのは、［Ｐn ＝ノード“３”，Ｃn ＝ノード“５”，Ｐp ＝３］である。これに対しては、図２７のようなパターンを満たす挿入場所を見つければよいが、ノード“５”のラベル“ｃ”をｉｎｄｅｘ＝２９の位置に合わせると、その内部コードは３であるから、ｐｏｉｎｔ＝２６となる。この値は既に１度ｐｏｉｎｔに設定されているので、重複を避けるために、１つずらしてｐｏｉｎｔ＝２７とする。
【０１４３】
　こうして、図２０のステップＳＴ８５から図２１のステップＳＴ１１１までの処理を同様にして行うと、図２８のような配列形式が得られる。この場合には、ＯＵＴＰＵＴ［３０］にはノード“５”のｏｕｔｐｕｔである“ｂｃ”が複写され、ＯＵＴＰＵＴ［３１］にはノード“６”のｏｕｔｐｕｔである“ｂｄ”が複写される。
【０１４４】
　次に、ノード“５”、“６”に後続するのは、それぞれノード“８”、“９”である。そこで、［Ｐn ＝ノード“５”，Ｃn ＝ノード“８”，Ｐp ＝３０］、［Ｐn ＝ノード“６”，Ｃn ＝ノード“９”、Ｐp ＝３１］がキューＱに積まれる。そして、処理は図２０のステップＳＴ８２に戻る。
【０１４５】
　今度は、［Ｐn ＝ノード“４”，Ｃn ＝ノード“７”，Ｐp ＝２８］として同様の処理を行う。ノードの挿入可能位置を捜すが、ノード“４”には、ｇｏｔｏｏｕｔとして文字“ｃ”、“ｄ”による遷移が定義されているため、挿入可能な場所は、図２９のようなパターンを満たす場所となる。この場所に対応するｐｏｉｎｔの値は２９となる。
【０１４６】
　このとき、図２０のステップＳＴ８５から図２１のステップＳＴ１１１までの処理を同様にして行うが、この場合には、Ｐn となるノード“４”にはｇｏｔｏｏｕｔが定義されているため、図２０のステップＳＴ８７からＳＴ９２までのループ処理に入る。しかし、ＧＯＴＯ［ノード“５”のｉｎｄｅｘ］とＧＯＴＯ［ノード“６”のｉｎｄｅｘ］がともに未定義となるため、ステップＳＴ９２の処理は行われない。結局、得られる配列は図３０のようになる。
【０１４７】
　ノード“７”から遷移可能なノードはないので、キューＱにはこれ以上ノードが積まれず、処理は図２０のステップＳＴ８２に戻る。
　次に、キューＱより、［Ｐn ＝ノード“５”，Ｃn ＝ノード“８”，Ｐp ＝３０］が取り出される。挿入可能な場所は、図３１のようなパターンを満たす場所となる。この場所に対応するｐｏｉｎｔの値は５となる。
【０１４８】
　このとき、図２０のステップＳＴ８５から図２１のステップＳＴ１１１までの処理を同様にして行うが、この場合には、Ｐn となるノード“５”にはｇｏｔｏｉｎとしてノード“４”が定義されているため、図２１のステップＳＴ９３からＳＴ９８までのループ処理に入る。
【０１４９】
　ステップＳＴ９７の条件判定では、ＧＯＴＯ［ノード“４”のｉｎｄｅｘ］＝２９となるので、ステップＳＴ９８では、ＧＯＴＯ［２９＋’ｃ］＝ＧＯＴＯ［３２］＝５となる。また、Ｐn となるノード“５”にはｏｕｔｐｕｔとして“ｂｃ”が定義されているので、これもコピーされ、ＯＵＴＰＵＴ［３２］＝ｂｃとなる。この結果、図３２のような配列が得られる。
【０１５０】
　また、最後にノード“９”をノード“８”と同様に処理すると、図８のような結果を得る。
　なお、この例においては、状態遷移配列の圧縮率を高めるため、許される最小の値をｐｏｉｎｔとして用いているが、その値より大きいｉｎｄｅｘをｐｏｉｎｔとして用いても構わない。
【０１５１】
　次に、この第１の実施形態の照合装置に文字列置換機能を加えた文字列置換装置の実施形態を説明する。ここでは、入力キーワード｛ａｂ，ｂｃ，ｂｄ｝を、それぞれ｛ａａａ，ｂｂｂ，ｃｃｃ｝に置換する例を示す。
【０１５２】
　この文字列置換機能は、入力されたテキスト中より検出されたキーワードを出力する代わりに、このキーワードが検出された場所を記憶し、テキストの処理後にキーワードを置換する機能である。
【０１５３】
　図３３は、入力キーに対する文字列置換用の状態遷移配列を示している。図３３において、配列ＧＯＴＯは重ねられた状態遷移表を格納し、配列ＣＨＥＣＫは確認用のラベルを格納し、配列ＳＵＢＳＴは置換用の文字列へのポインタを格納し、配列ＬＥＮＧＴＨは照合された置換前の文字列の長さを格納している。
【０１５４】
　また、図３４は、置換処理に用いるテキストオフセット格納配列の初期状態を示している。この配列には、置換対象となる文字列のテキスト中の位置を表すテキストオフセットと、対応する置換用文字列を指すＳＵＢＳＴのポインタと、置換対象文字列の長さとが格納される。
【０１５５】
　入力テキスト‘ｃａｂｃｚ’内の各記号に対するテキストオフセットは、図３５に示すようになる。また、この入力テキストに対してパターン照合を行った後には、テキストオフセット格納配列は図３６のようになる。このときの照合処理は、図１０と同様である。照合の結果、キーワード“ａｂ”、“ｂｃ”のテキスト内の位置が、それぞれテキストオフセット“１”、“２”として格納されている。
【０１５６】
　置換処理においては、文字列置換装置は、テキストとテキストオフセット格納配列にそれぞれポインタを設定する。そして、テキストオフセット配列に格納されたテキストオフセットの位置から始まる、置換対象文字列長に対応する長さの区間内に、テキストへのポインタがない限り、テキスト文字を出力する。また、テキストへのポインタが、テキストオフセット配列内のテキストオフセットの位置にあった場合には、対応する置換用文字列を出力する。
【０１５７】
　図３７は、この置換処理のフローチャートである。図３７において処理が開始されると、文字列置換装置は、まずテキストポインタｔをテキストの先頭にセットし（ステップＳＴ１２１）、置換ポインタｐをテキストオフセット格納配列の先頭にセットする（ステップＳＴ１２２）。そして、ポインタｔがテキストの最後を指しているかどうかを判定する（ステップＳＴ１２３）。ポインタｔがテキストの最後を指していれば、処理を終了する。
【０１５８】
　ポインタｔがテキストの最後を指していなければ、次に、ポインタｐの指す位置に格納されたテキストオフセットの値を、ポインタｔと比較する（ステップＳＴ１２４）。これらが一致しなければ、ポインタｔの指すテキスト内の文字を出力し（ステップＳＴ１２５）、ポインタｔを１文字分進めて（ステップＳＴ１２６）、ステップＳＴ１２３以降の処理を繰り返す。
【０１５９】
　ステップＳＴ１２４において両者が一致すれば、次に、ポインタｐの指す位置に格納されたＳＵＢＳＴのポインタを取り出し、それが指す置換用文字列を出力する（ステップＳＴ１２７）。次に、ポインタｔを、ポインタｐの指す位置に格納された置換対象文字列長分だけ進め（ステップＳＴ１２８）、ポインタｐを１つ進める（ステップＳＴ１２９）。
【０１６０】
　そして、ポインタｔの値がポインタｐの指す位置のテキストオフセットより大きく、かつ、ポインタｐの指す位置がテキストオフセット格納配列の最後でないかどうかを判定する（ステップＳＴ１３０）。判定結果がＹＥＳであればステップＳＴ１２９以降の処理を繰り返し、ＮＯであればステップＳＴ１２３以降の処理を繰り返す。
【０１６１】
　このような置換処理の結果、テキスト‘ｃａｂｃｚ’は‘ｃａａａｃｚ’に変換される。
　次に、図３８から図６０までを参照しながら、ＦＡＳＴ法に基づく第２の実施形態について説明する。
【０１６２】
　ＦＡＳＴ法の状態遷移表において、各状態の入力記号に対する操作を定義するデータは、デフォルトシフトと遷移の２つに簡単に分離できそうであるが、必ずしもそうではない。例えば図６９の状態遷移表では、状態“６”における入力記号“ａ”に対するシフト量は−２（大きさ２）であるが、その他の入力記号に対するデフォルトのシフト量は−５（大きさ５）である。前者の小さなシフト量は、ＦＡＳＴ法のシフト量を計算中に決まる。このため、このままでは、表形式をデフォルトのシフト量と次状態への遷移とに分離し、コンパクトにするのは不可能である。
【０１６３】
　そこで、第２の実施形態では、まずＦＡＳＴ法の入力記号による操作を３種類に分ける。最初の操作は、一般の入力記号に対する状態のデフォルトシフトである。次の操作は、特定の入力記号に対するシフトである。最後の操作は、入力記号による次状態への遷移である。
【０１６４】
　照合動作においては、まず入力記号に対して遷移またはシフトが定義されているかどうかを判定する。シフトも遷移も定義されていない場合には、デフォルトシフトに従い、右方向へポインタをシフトさせる。入力記号が受理されるが、遷移ではなくシフトが定義されている場合には、そのシフトに従い右方向へポインタをシフトさせる。遷移が定義されている場合には、次状態へ遷移する。
【０１６５】
　このような操作を各状態ごとに配列形式で表し、遷移／シフトが定義されている部分が重複しないように配列を重ね合わせる。また、同時に要素がその配列に含まれているかどうかの確認を行うために、遷移／シフトが定義されている文字に対しては、その文字をラベルとして付与する。
【０１６６】
　また、圧縮された表形式を作成する際に、２進木の中間構造を経由することにより、実際に使用される記憶容量を節減する。
　第２の実施形態における照合装置の構成は、図５と同様である。この場合、状態遷移判定部１２１は、入力記号に対してどの状態に遷移するか、もしくはどの程度テキスト中でシフトするかを決定する。
【０１６７】
　図３８は、３つの記号列｛ｓｍａｒｔ，ｅａｓｔ，ｓｔａｔｅ｝を入力キーワードとした場合の圧縮前の第２の状態遷移表を示している。この表を図６９の表と比較すると、各状態で多用されている典型的なシフト量がデフォルトシフト（ｄｅｆａｕｌｔ　ｓｈｉｆｔ）として１つにまとめられ、特定の入力記号に対する特定のシフト量または遷移先のみが入力記号毎に定義されていることが分かる。
【０１６８】
　図３８の状態遷移表に定義された各入力記号に対する遷移を図示すると、図３９のようになる。図３９の状態遷移図は、ノード“０”〜“１３”の１４個のノードから成る。各ノードに付与されたデータａ１、ａ２、ａ３、ａ４は、それぞれ、状態番号（ノード番号）、デフォルトシフトの大きさ、特定の文字とそれに対する特定のシフトの大きさ、出力文字列を表している。
【０１６９】
　図４０は、図３８の状態遷移表を圧縮して得られる照合用の配列を示している。図４０において、ｉｎｄｅｘは配列の添え字を表し、ＧＯＴＯは、圧縮状態遷移部１２３に格納される重ね合わせられた状態遷移表を表し、ＣＨＥＣＫは、確認ラベル部１２４に格納される確認用のラベルを表し、ＯＵＴＰＵＴは、出力記号部１２５に格納されるポインタの配列を表す。これらのポインタは、状態遷移部１２２内に格納された出力文字列を指している。
【０１７０】
　配列ＧＯＴＯの要素が０未満の場合はシフト量を表し、それ以外の場合は次状態への遷移を表す。
　また、図４０の配列の下方に記されている状態ｓ０〜ｓ１３は、図３８の状態“０”〜“１３”がどのように重なっているかを表している。また、記号ａ、ｅ等は、図３８の各入力記号に対応するアクセス先のデータの格納位置を表し、記号Ｄは、デフォルトシフトに対応するアクセス先のデータの格納位置を表している。
【０１７１】
　図４１は、第２の実施形態の説明のために用いる第２の文字コード変換表を示している。この文字コード変換表に従って、文字コードが内部コードに変換される。図４１の変換表では、重ね合わせられた各配列の先頭部にデフォルトシフトコードを設定するために、第１列目にその内部コードとして“１”が設定されている。このため、各入力記号に対する内部コードは２以上となり、第２列目以降に設定されている。
【０１７２】
　また、入力記号の文字コード値に１を加えた結果を内部コードとして用いてもよい。
　次に、図４２および図４３を参照しながら、第２の実施形態における照合処理について説明する。
【０１７３】
　図４２は、ＦＡＳＴ法に基づく文字列照合処理のフローチャートである。図４２において処理が開始されると、状態遷移判定部１２１は、まず入力されたテキストを指すテキストポインタを、その先頭に最短キー長を加えた位置にセットし、状態遷移部１２２内の状態遷移配列を指す遷移ポインタを初期状態にセットする（ステップＳＴ１３１）。次に、テキストポインタがテキストの最後を指すかどうかのチェックを行う（ステップＳＴ１３２）。テキストポインタがテキストの終わりを指せば照合は終了する。
【０１７４】
　テキストポインタがテキストの終わりを指していなければ、そのポインタの指す文字を取り出し（ステップＳＴ１３３）、その文字に対応する内部コードの値を遷移ポインタの値に加算し、その加算値をｉｎｄｅｘとする位置に格納された文字ラベルがこの文字と同じかどうかのチェックを行う（ステップＳＴ１３４）。
【０１７５】
　これらの文字が一致しなければ、その入力文字に対する遷移またはシフトが定義されていないことになる。そこで、テキストポインタをその状態に対するデフォルトシフト分だけ進めて（ステップＳＴ１３５）、遷移ポインタを初期状態にセットし（ステップＳＴ１３６）、ステップＳＴ１３２以降の処理を繰り返す。　ステップＳＴ１３４においてラベルと入力文字が同じであれば、次に、入力文字によるシフトが定義されているかどうかを確かめる（ステップＳＴ１３７）。入力文字でシフトするのであれば、現在の状態において、その入力文字に対して定義されたシフト量の大きさだけテキストポインタを進め（ステップＳＴ１３８）、遷移ポインタを初期状態にセットして（ステップＳＴ１３９）、ステップＳＴ１３２以降の処理を繰り返す。
【０１７６】
　ステップＳＴ１３７において、シフトではなく入力文字による遷移が定義されている場合は、次に、出力文字列が状態に対して定義されているかどうかの確認を行う（ステップＳＴ１４０）。
【０１７７】
　出力文字列が定義されていなければ、現在の遷移ポインタに入力文字の内部コードを加算し、その加算値をｉｎｄｅｘとする位置に定義された遷移先を、新たな遷移ポインタとする（ステップＳＴ１４２）。そして、テキストポインタを１文字戻し（ステップＳＴ１４３）、ステップＳＴ１３２以降の処理を繰り返す。　出力文字列が定義されているのであれば、その文字列を照合結果として出力すし（ステップＳＴ１４１）、ステップＳＴ１４２以降の処理を行う。ステップＳＴ１４１において、現在のテキストポインタの値を、照合された文字列の位置として出力することもできる。
【０１７８】
　図４３は、図４０の状態遷移配列を用いた場合の入力テキスト‘ａａｓｅａｓｔａｔｅｒｒｒ’に対する照合動作を示している。まず、テキストポインタは、テキストの先頭から最短キーワード長４だけ離れた位置にセットされ、遷移ポインタは、初期状態に対応するｉｎｄｅｘの値“１”にセットされる。
【０１７９】
　最初の入力記号“ｅ”に対しては、ＣＨＥＣＫ［１＋’ｅ］＝ｅであり、ＧＯＴＯ［１＋’ｅ］＝３＞０であるため、遷移ポインタ＝３として（ステップＳＴ１４２）、次状態に遷移する。
【０１８０】
　以下、同様にして、図４３のような照合動作が行われる。ここでは、まず入力記号による遷移先またはシフト量が定義されているかどうかを、配列ＣＨＥＣＫにアクセスして確認し、遷移が定義されていない場合には、デフォルトシフトによりシフトしている。
【０１８１】
　また、特定の入力記号に対してデフォルトシフトより小さいシフトが定義されている場合には、そのシフト量に応じてシフトしている。図４３では、最後の初期状態“１”において記号“ｒ”が入力されたときに、このような特定のシフトが発生している。そして、記号“ｒ”に対しては、デフォルトシフト量４より小さい値のシフト量１だけ、右方向にテキストポインタがシフトされるが、これによりテキストの最後に移動するので、処理を終了している。
【０１８２】
　こうして、入力テキストに含まれていた記号列“ｅａｓｔ”と“ｓｔａｔｅ”が、照合結果として出力される。
　次に、照合に用いる状態遷移配列の作成方法を説明する。図４４は、図２の圧縮装置の第２の構成図である。図４４において、２進木変換部１４１、前処理部１４２、およびシフト量計算部１４３は、スパース配列有限状態機械作成部１０４に対応し、変換部１４４は状態遷移機械圧縮部１０５に対応する。
【０１８３】
　キーワード入力部１０３は、指定されたキーワード群を受理する。２進木変換部１４１は、この受理されたキーワード群を、各キーの左から右に向かう方向に、２進木構造に変換する。前処理部１４２は、入力されたキーワードの最も長さの短いものの長さと、それぞれのノードの深さと、各キーワードに対する終端ノードとを設定する。シフト量計算部１４３は、各状態に対するシフト量を計算する。また、変換部１４４は、シフト量計算部１４３が出力する２進木構造を、圧縮された配列形式に変換する。
【０１８４】
　このような照合用の配列の作成手順は、入力されたキーワード群からの２進木の作成、その結果得られた２進木のノードに対するノードの深さの追加、キーワードに対する最後尾ノードのセット、シフト量の計算と中間構造の２進木の作成、中間構造から配列形式への変換の各処理より成る。
【０１８５】
　図４５は、２進木作成処理のフローチャートである。図４５において処理が開始されると、２進木変換部１４１は、まず入力キーに対してキーの並びの逆順に２進木を作成する（ステップＳＴ１５１）。次に、キーを受理したノードに対して、対応する入力キーを出力記号列として付加し（ステップＳＴ１５２）、処理を終了する。
【０１８６】
　図４６は、２進木に対してシフト量計算を行うための前処理のフローチャートである。図４６において処理が開始されると、前処理部１４２は、まず各ノードに対してルートノードからの距離（深さ）をセットする（ステップＳＴ１６１）。次に、最短の入力キーワード長を求め（ステップＳＴ１６２）、各キーワードに対する最後尾のノードを求めて（ステップＳＴ１６３）、処理を終了する。
【０１８７】
　例えば、図３９の状態遷移図に対応するキーワード群｛ｓｍａｒｔ，ｅａｓｔ，ｓｔａｔｅ｝に対して２進木を作成し、前処理を行うと、図４７のような２進木が得られる。図４７において、下へのポインタと横へのポインタの意味は、図１４と同様である。
【０１８８】
　各ノードに付与されたデータｄはノードの深さを表し、ｏｕｔｐｕｔは出力文字列を表す。ここでは、ノード“５”、“９”、“１３”に対して、出力記号列“ｓｔａｔｅ”、“ｅａｓｔ”、“ｓｍａｒｔ”がそれぞれのｏｕｔｐｕｔとして付加されている。
【０１８９】
　また、これらの出力記号列（キーワード）の最短パターン長として４が設定され、各キーワード“ｓｔａｔｅ”、“ｅａｓｔ”、“ｓｍａｒｔ”に対する終端ノードとして、それぞれノード“５”、“９”、“１３”が設定されている。
【０１９０】
　図４８、図４９、および図５０は、２進木に対してシフト量を求める計算処理のフローチャートである。
　図４８は、各ノードに、特定文字によるシフトとｆａｉｌｕｒｅ遷移を設定する処理を示している。図４８において処理が開始されると、シフト量計算部１４３は、まず処理対象となるノードを格納するノードキューＱを初期化する（ステップＳＴ１７１）。次に、２進木のルートノードから遷移可能なノードをキューＱに入れる（ステップＳＴ１７２）。
【０１９１】
　次に、キューに入っているノードのｆａｉｌ先をルートノードに設定し（ステップＳＴ１７３）、Ｑが空かどうかの判定を行う（ステップＳＴ１７４）。Ｑが空ならば処理は終了する。Ｑが空でなければ、次にキューＱから１つノードを取り出し、これをｒに設定し（ステップＳＴ１７５）、取り出したノードをキューＱから除く（ステップＳＴ１７６）。
【０１９２】
　次に、ノードキューＪを初期化し（ステップＳＴ１７７）、ｒから遷移可能なノードをキューＪに入れる（ステップＳＴ１７８）。そして、Ｊが空かどうかを判定する（ステップＳＴ１７９）。
【０１９３】
　Ｊが空であるならばステップＳＴ１７４以降の処理を繰り返す。Ｊが空でないならば、次にノードキューＪより１つノードを取り出し、これをｓにセットして（ステップＳＴ１８０）、取り出したノードをキューＪより除く（ステップＳＴ１８１）。次に、ｓをキューＱに入れて（ステップＳＴ１８２）、ノードｒのｆａｉｌ先をｔにセットし（ステップＳＴ１８３）、ノードｓについている文字ラベルによるノードｔからの遷移が定義されているかどうかの判定を行う（ステップＳＴ１８４）。
【０１９４】
　そのような遷移が定義されていれば、次に、ｔからｓのラベルで遷移する先をｓのｆａｉｌ先とし（ステップＳＴ１８８）、ステップＳＴ１７９以降の処理を繰り返す。
　ステップＳＴ１８４で遷移が定義されていなければ、次に、ノードｔにおいてｓのラベルでのシフト量が定義されていないか、もしくは、既に定義されているシフト量が現在のｓの深さより大きいかどうかを判定する（ステップＳＴ１８５）。
【０１９５】
　シフト量が未定義、もしくは定義されている値が現在のｓの深さより大きければ、次に、ノードｔに対するノードｓのラベルでのシフト量をｓの深さとする（ステップＳＴ１８６）。このような特定のラベルに対するシフト量は、２進木の各ノードに付加されるｓｐｅｃｉｆｉｃリストとして表される。次に、ｔにｔのｆａｉｌ先をセットし（ステップＳＴ１８７）、ステップＳＴ１８４以降の処理を繰り返す。
【０１９６】
　ステップＳＴ１８５で、現在のｓの深さ以下のシフト量がｓのラベルに対して定義されていれば、ステップＳＴ１８７以降の処理を行う。
　図４９は、各ノードに、最大のシフト量であるデフォルトシフト量を付加する処理のフローチャートである。図４９において処理が開始されると、シフト量計算部１４３は、各ノードに対するデフォルトシフト量として、ノードの深さに最短キー長を加算した値を設定して（ステップＳＴ１９１）、処理を終了する。
【０１９７】
　例えば、図４７の２進木の場合、まず図４８のステップＳＴ１７２の処理により、シフト量計算部１４３はルートノード“０”から遷移可能なノード“１”、“６”をキューＱに入れる。次に、ステップＳＴ１７３の処理により、ノード“１”、“６”のｆａｉｌｕｒｅ遷移先を、ルートノードに設定する。
【０１９８】
　次に、キューＱからノード“１”が取り出されて、これがｒにセットされ、ステップＳＴ１７５〜ＳＴ１７８の処理により、ノードキューＪにノード“２”が積まれる。Ｊに積まれるノードはノード“２”のみであるので、処理は一度だけステップＳＴ１７９〜ＳＴ１８３のループを通る。
【０１９９】
　ここでは、ステップＳＴ１８０の処理により、ｓにノード“２”が設定され、ステップＳＴ１８３の処理により、ｔにノードｒ（ノード“１”）のｆａｉｌ先、すなわちルートノードが設定される。
【０２００】
　ルートノードからはｓのラベル（ノード“２”のラベル“ｔ”）で遷移可能であるので、処理はステップＳＴ１８８に進み、ｓのｆａｉｌ先は、ルートノードからノード“２”のラベル“ｔ”で遷移可能なノード“６”となる。
【０２０１】
　次に、キューＱから取り出されるのはノード“６”である。ノード“６”から遷移可能なノード“７”に対して、同様な処理を行う。この場合には、ｒ＝ノード“６”、ｓ＝ノード“７”、ｔ＝ノード“１”（ノード“６”のｆａｉｌ先）となる。しかし、ｔからノード“７”のラベル“ｓ”で遷移は不可能である。
【０２０２】
　そこで、ノード“１”では、入力記号“ｓ”に対する特定のシフト量として、ノード“６”の深さ、すなわち１が設定される。この記号“ｓ”と対応するシフト量“１”は、ｓｐｅｃｉｆｉｃリストとしてリスト構造で表される。
【０２０３】
　このような処理を同様にして繰り返すと、すべてのノードにｆａｉｌｕｒｅ遷移と暫定的なシフト量とが付与される。この後、図４９の処理に従って、各ノードにおける最大のシフト量であるデフォルトシフト量を、各ノードに割り当てる。こうして、図５１のような２進木が得られる。
【０２０４】
　図５１において、破線の矢印はｆａｉｌｕｒｅ遷移を表し、ｆａｉｌｕｒｅ遷移の表示されていないノードのｆａｉｌ先はルートノード“０”になっている。また、各ノードに付加されたデータＤはデフォルトシフト量を表す。さらに、ノード“０”、“６”に繋がるｓｐｅｃｉｆｉｃリストには、特定の文字ラベルとそれに対応する特定のシフト量とが設定されている。
【０２０５】
　図５０は、各ノードのシフト量を必要に応じて削減して、最終的なシフト量を割り付ける処理のフローチャートである。図５０において処理が開始されると、シフト量計算部１４３は、まず入力キーワードをキューＱに積み（ステップＳＴ２０１）、キューＱが空かどうかの判定を行う（ステップＳＴ２０２）。
【０２０６】
　キューＱが空でなければ、キューＱからポップしたキーワードをｊに入れる（ステップＳＴ２０３）。次に、キーワードｊに対応する最後尾のノードをｊｓｔにセットし（ステップＳＴ２０４）、ｊｓｔのｆａｉｌ先をｂｓｔにセットし（ステップＳＴ２０５）、ｊｌｅｎ＝ｊｓｔの深さとする（ステップＳＴ２０６）。そして、ｂｓｔがルートノードかどうかを判定する（ステップＳＴ２０７）。ｂｓｔがルートノードであれば、ステップＳＴ２０２以降の処理を繰り返す。
【０２０７】
　ｂｓｔがルートノードでなければ、次に、ｊｌｅｎからｂｓｔの深さを減算し、その結果をｓｌｅｎに設定する（ステップＳＴ２０８）。次に、キューＮにｂｓｔを入れて（ステップＳＴ２０９）、キューＮが空であるかどうかの判定を行う（ステップＳＴ２１０）。キューＮが空であれば、ｂｓｔ＝ｂｓｔのｆａｉｌ先として（ステップＳＴ２１１）、ステップＳＴ２０７以降の処理を繰り返す。　キューＮが空でなければ、次に、キューＮからポップしたノードをｒに入れ（ステップＳＴ２１２）、ｒのデフォルトシフトが（ｓｌｅｎ＋ｒの深さ）より大きいかどうかを判定する（ステップＳＴ２１３）。ｒのデフォルトシフトが（ｓｌｅｎ＋ｒの深さ）以下であれば、ステップＳＴ２１０以降の処理を繰り返す。　ｒのデフォルトシフト＞（ｓｌｅｎ＋ｒの深さ）であれば、ｒのデフォルトシフト＝ｓｌｅｎ＋ｒの深さとし（ステップＳＴ２１４）、ｒから遷移可能なノードをキューＮに積んで（ステップＳＴ２１５）、ステップＳＴ２１０以降の処理を繰り返す。
【０２０８】
　ステップＳＴ２０２においてキューＱが空であれば、ステップＳＴ２１６からＳＴ２２０までのループ処理を行う。この処理は、ノードに対して定義されている特定の文字によるシフトの大きさが、デフォルトシフトの大きさより大きい場合に、これを削って、デフォルトシフトと同じ大きさにする処理である。
【０２０９】
　ここでは、まずすべてのノードをキューＱに入れ（ステップＳＴ２１６）、キューＱが空かどうかの判定を行う（ステップＳＴ２１７）。キューＱが空であれば処理は終了する。
【０２１０】
　キューＱが空でなければ、次に、キューＱからポップしたノードをｊに入れ（ステップＳＴ２１８）、ｊにおいて定義されている特定の文字に対するシフトの大きさが、デフォルトシフトの大きさより大きいかどうかを判定する（ステップＳＴ２１９）。
【０２１１】
　判定結果がＮＯの場合はステップＳＴ２１７以降の処理を繰り返す。判定結果がＹＥＳの場合は、その特定の文字に対するシフトの大きさ＝デフォルトシフトの大きさとして（ステップＳＴ２２０）、ステップＳＴ２１７以降の処理を繰り返す。
【０２１２】
　図５１の２進木に設定されたシフト量を、図５０の処理に従って整形すると、次のようになる。まず、ステップＳＴ２０１〜ＳＴ２０３の処理により、照合用のキーワードセット｛ｓｍａｒｔ，ｅａｓｔ，ｓｔａｔｅ｝をキューＱに積み、キューからポップしたキーワードをｊにセットする。
【０２１３】
　今、これを仮に“ｓｔａｔｅ”とすると、ステップＳＴ２０４〜ＳＴ２０６の処理により、ｊｓｔ＝ノード“５”、ｂｓｔ＝ノード“７”、ｊｌｅｎ＝５となる。このとき、ｂｓｔはルートノードではないので、処理はステップＳＴ２０８に移る。ステップＳＴ２０８では、ｓｌｅｎ＝ｊｌｅｎ−ｂｓｔの深さ＝５−２＝３となる。また、ステップＳＴ２０９では、キューＮにノード“７”が入れられ、ステップＳＴ２１２では、これがキューＮよりポップされてｒにセットされる。
【０２１４】
　ステップＳＴ２１３の条件判定では、ｒのデフォルトシフト（ノード“７”のデフォルトシフト）は６で、ｓｌｅｎより大きい。そこで、処理はステップＳＴ２１４に移り、ｒのデフォルトシフト＝ｓｌｅｎ＋ｒの深さ＝３＋２＝５となる。
【０２１５】
　この後、ステップＳＴ２１５の処理により、キューＮにはノード“８”が積まれて、同様の処理が行われる。これにより、ノード“８”より下の枝が順に処理されて、各ノードのデフォルトシフトの大きさが変更される。
【０２１６】
　このように、キーワードの終端ノードのｆａｉｌ先となっているノードと、そのノードに繋がるより深い位置のノードにおいては、ステップＳＴ２１３およびＳＴ２１４の処理により、デフォルトシフトの大きさが（ｓｌｅｎ＋ｒの深さ）以下に抑えられる。
【０２１７】
　最終的にすべてのノードに対して処理が終了すると、図５２のような２進木が得られる。図５２において、キーワードの終端ノード“５”、“９”のｆａｉｌ先となっているノード“７”、“１”のデフォルトシフトは、図５１と比べて１だけ小さくなっていることが分かる。また、ノード“７”、“１”の下方に繋がる各ノードのデフォルトシフトもそれぞれ１ずつ小さくなっている。
【０２１８】
　図５３および図５４は、シフト量計算部１４３が出力する２進木を、圧縮された配列形式の状態遷移機械に変換する処理のフローチャートである。図５３において処理が開始されると、変換部１４４は、まず配列ＧＯＴＯ、ＣＨＥＣＫ、ＯＵＴＰＵＴを０に初期化し（ステップＳＴ２２１）、２進木のノードのメンバｉｎｄｅｘを０に初期化する（ステップＳＴ２２２）。
【０２１９】
　このｉｎｄｅｘは、２進木の各ノードと、図４０に示されるような状態遷移配列のｉｎｄｅｘとの対応関係を記憶するために、状態遷移配列のｉｎｄｅｘとは独立に設けられる。
【０２２０】
　次に、キューＱを初期化し（ステップＳＴ２２３）、Ｐn ＝ルートノード、Ｃn ＝ルートノードの次ノード、Ｐp ＝１とする（ステップＳＴ２２４）。
　ここで、ルートノードの次ノードとは、ルートノードから遷移可能な複数のノード（ノード列）において、最小の文字ラベルを持つノードを意味する。図５２のような２進木の場合、Ｃn に入れられるノードは、ルートノードから下へのポインタで指されるノードに一致する。
【０２２１】
　次に、［Ｐn ，Ｃn ，Ｐp ］の３つ組をキューＱに追加して（ステップＳＴ２２５）、キューＱが空かどうかの判定を行う（ステップＳＴ２２６）。キューＱが空であれば処理は終わりとなる。
【０２２２】
　キューＱが空でなければ、次にキューＱの先頭より３つ組をポップしてｓにセットする（ステップＳＴ２２７）。そして、ｓ内のノードＰn のｓｐｅｃｉｆｉｃリストに繋がるノードと、ｓ内のノードＣn に連なる、Ｃn と深さが同じノードと、ｓに対するデフォルトシフトのシフト量とを挿入可能な、配列ＧＯＴＯ、ＣＨＥＣＫ、ＯＵＴＰＵＴ上の位置を求め、これをｐｏｉｎｔにセットする（ステップＳＴ２２８）。
【０２２３】
　このとき、既に挿入されたノードのｐｏｉｎｔの位置と、新たに挿入するノードのｐｏｉｎｔの位置が重複しないようにする。もし、新たな挿入可能位置が既にｐｏｉｎｔとして用いられている場合は、例えばそれを１つずらしてｐｏｉｎｔに設定する。
【０２２４】
　次に、ＧＯＴＯ［ｓのＰp ］＝ｐｏｉｎｔとし（ステップＳＴ２２９）、ＣＨＥＣＫ［ｐｏｉｎｔ＋１］＝１とする（ステップＳＴ２３０）。また、ｓ内のノードＰn のデフォルトシフトの大きさに−１を乗じて負の値にし、それをＧＯＴＯ［ｐｏｉｎｔ＋１］に入れる（ステップＳＴ２３１）。これにより、配列内のｉｎｄｅｘ＝ｐｏｉｎｔ＋１の位置に、デフォルトシフトの値が設定される。
【０２２５】
　次に、ｓのＰn のｓｐｅｃｉｆｉｃリストに連なるノードを、キューｔｍｐに入れて（ステップＳＴ２３２）、キューｔｍｐが空かどうかの判定を行う（ステップＳＴ２３３）。キューｔｍｐが空でなければ、次に、キューｔｍｐからポップしたノードをｊに設定する（ステップＳＴ２３４）。
【０２２６】
　そして、ノードｊの文字ラベルに対するシフト量として、対応するシフトの大きさに−１を乗じた値を、ＧＯＴＯ［ｐｏｉｎｔ＋’ｊのラベル］に設定する（ステップＳＴ２３５）。ここで、“’ラベル”は、その文字ラベルに対応する配列上での内部コードであり、図４１の変換表を用いた場合は’ラベル≧２である。
【０２２７】
　次に、ＣＨＥＣＫ［ｐｏｉｎｔ＋’ｊのラベル］に、確認用のラベルとしてｊの文字ラベルを設定し（ステップＳＴ２３６）、ステップＳＴ２３３以降の処理を繰り返す。
　ステップＳＴ２３３においてキューｔｍｐが空になると、次に、ｓ内のＣn およびそれと同じ深さのノードをキューｔｍｐに入れて（図５４、ステップＳＴ２３７）、キューｔｍｐが空かどうかの判定を行う（ステップＳＴ２３８）。
【０２２８】
　キューｔｍｐが空でなければ、次に、キューｔｍｐからポップしたノードをｉにセットし（ステップＳＴ２３９）、ノードｉのｉｎｄｅｘに、（ｐｏｉｎｔ＋’ｉのラベル）の値をセットして（ステップＳＴ２４０）、ノードｉにｏｕｔｐｕｔが定義されているかどうかをチェックする（ステップＳＴ２４１）。
【０２２９】
　ノードｉにｏｕｔｐｕｔがあれば、ノードｉのｏｕｔｐｕｔを配列ＯＵＴＰＵＴにコピーする（ステップＳＴ２４２）。ここでは、ＯＵＴＰＵＴ［ｐｏｉｎｔ＋’ｉのラベル］＝ｉのｏｕｔｐｕｔとなる。次に、ＣＨＥＣＫ［ｐｏｉｎｔ＋’ｉのラベル］＝ｉのラベルとして（ステップＳＴ２４３）、ステップＳＴ２３８以降の処理を繰り返す。ノードｉにｏｕｔｐｕｔがなければ、ステップＳＴ２４３以降の処理を行う。
【０２３０】
　ステップＳＴ２３８においてｔｍｐが空になると、次に、Ｃn と同じ深さのノードをキューｔｍｐに入れ（ステップＳＴ２４４）、ｔｍｐが空かどうかの判定を行う（ステップＳＴ２４５）。
【０２３１】
　キューｔｍｐが空でなければ、キューｔｍｐからポップしたノードをｉにセットし（ステップＳＴ２４６）、ノードｉより何らかの記号で次状態に遷移可能かどうかの判定を行う（ステップＳＴ２４７）。遷移不可能であれば、ステップＳＴ２４５以降の処理を繰り返す。
【０２３２】
　遷移可能であれば、Ｐn ＝ｉ、Ｃn ＝ｉの遷移先の先頭ノード、Ｐp ＝ｉのｉｎｄｅｘとして、この３つ組みをキューＱに追加し（ステップＳＴ２４８）、ステップＳＴ２４５以降の処理を繰り返す。ここで、ｉの遷移先の先頭ノードとは、ノードｉから遷移可能なノード列において、最小の文字ラベルを持つノードを意味する。
【０２３３】
　ステップＳＴ２４５においてｔｍｐが空になると、図５３のステップＳＴ２２６に戻り、それ以降の処理を繰り返す。
　次に、図５２の２進木を図４０のような配列形式に変換する手順を、図５３および図５４のフローに従って説明する。この変換処理では、先行するノードと、それから遷移可能なノードあるいはシフト可能なノードとの関係が、２進木から配列形式にマップされる。
【０２３４】
　図５２の各ノードに対する入力記号による遷移、入力記号による特定のシフト、およびデフォルトシフトをまとめると、図５５のようになる。図５５において、例えば第１行第２列の“ｅ：１”は、ノード“０”に対する入力記号“ｅ”による遷移先がノード“１”であることを表し、第１行第４列の“ａ：２”は、ノード“０”に対する入力記号“ａ”によるシフトの大きさが２であることを表す。
【０２３５】
　図５３のステップＳＴ２２７から図５４のステップＳＴ２４８までの処理では、変換部１４４は、先行する状態に対して、次の遷移／シフトの記号を定義できる配列上の空き場所を捜し出し、それらのデータを挿入して、遷移関係をマップする。このデータ挿入の方法は、基本的には第１の実施形態で述べた方法と同様である。
【０２３６】
　ここで、ルートノード“０”を例としてマッピングの操作を説明する。ルートノードに関して挿入すべきデータのパターンは、図５６のようになる。図５６は、ルートノードに対してデフォルトシフト以外に遷移等が定義され得る入力記号は、｛ａ，ｅ，ｍ，ｒ，ｓ，ｔ｝の６つであることを示している。
【０２３７】
　最初は、状態遷移配列の要素がすべて空であるので、図５６のパターンが挿入可能な場所を配列上で捜すと、可能な最小の配列のｉｎｄｅｘは“１”となる。そこで、図５３のステップＳＴ２２９からＳＴ２３６までの処理により、ｐｏｉｎｔを“１”に設定し、文字ラベルを書き込み、デフォルトシフトや特定のシフトのシフト量を設定すると、図４０のｓ０の行に示すパターンがマップされる。この段階では、ラベル“ｅ”と“ｔ”に相当する部分は未定義のままである。
【０２３８】
　ラベル“ｅ”と“ｔ”の部分は、ルートノード“０”の次ノードに対応するため、図５４のステップＳＴ２３７からＳＴ２４８までの処理により、それらのノードが配列上に挿入された段階で設定される。ここで、ルートノードの次に処理される次ノードは、ノード“１”である。
【０２３９】
　ノード“１”から遷移できる文字は“ｔ”のみであるので、ノード“１”の挿入場所は、図５７のようなパターンに対応する場所となる。図５７において、上の行は、現在の配列ＣＨＥＣＫ上のパターンを表し、下の行は、挿入されるパターンを表す。
【０２４０】
　このようなパターンが挿入可能な場所を配列上で捜すと、ｐｏｉｎｔに設定可能な最小の配列のｉｎｄｅｘは“３”となる。そこで、まずノード“１”がノード“０”からの遷移先であることを定義するために、このｐｏｉｎｔの値３をＧＯＴＯ［７］に設定し、ノード“０”から記号“ｅ”で遷移する先のデータは、ｉｎｄｅｘ＝３の位置より始まるということを定義する。
【０２４１】
　そして、このノード“１”をｉｎｄｅｘ＝３の位置に挿入し、ステップＳＴ２２９からＳＴ２３６までの処理により、文字ラベルやデフォルトシフト量等の設定を行う。この結果、図４０のｓ１の行に示すパターンがマップされる。
【０２４２】
　このような処理を、キューにノードが積まれる順に、すなわちノード“０”、“１”、“６”、“２”、“７”、“１０”、“３”、“８”、“１１”、“４”、“９”、“１２”、“５”、“１３”の順に行うことで、最終的に図４０のような状態遷移配列が得られる。
【０２４３】
　図５２のノード“１４”、“１５”、“１６”もキューに積まれて同様の処理が施され、厳密には、終端記号“＃”による遷移が定義される。しかし、終端記号は出力文字列には含まれないため、ここでは、これらのノードの処理を省略し、図４０においてもこれらのノードへの遷移は省略されている。また、配列内での終端記号のラベルの値を０とすることにより、終端ノードに対する遷移を定義しないようにすることも可能である。
【０２４４】
　次に、この第２の実施形態の照合装置に文字列置換機能を加えた文字列置換装置の実施形態を説明する。ここでは、入力キーワード｛ｓｍａｒｔ，ｅａｓｔ，ｓｔａｔｅ｝を、それぞれ｛ＳＭＡＲＴ，ＥＡＳＴ，ＳＴＡＴＥ｝に置換する例を示す。
【０２４５】
　図５８は、入力キーに対する文字列置換用の状態遷移配列を示している。図５８において、配列ＧＯＴＯは重ねられた状態遷移表を格納し、配列ＣＨＥＣＫは確認用のラベルを格納し、配列ＳＵＢＳＴは置換用の文字列へのポインタを格納し、配列ＬＥＮＧＴＨは置換前の文字列の長さを格納している。また、置換処理に用いるテキストオフセット格納配列の初期状態は、図３４と同様である。
【０２４６】
　入力テキスト‘ａａｓｅａｓｔ’内の各記号に対するテキストオフセットは、図５９に示すようになる。また、この入力テキストに対してパターン照合を行った後には、テキストオフセット格納配列は図６０のようになる。このときの照合処理は、図４２と同様である。照合の結果、キーワード“ｅａｓｔ”のテキスト内の位置が、テキストオフセット“３”として格納されている。
【０２４７】
　また、置換処理は、図３７と同様にして行われる。この置換処理の結果、テキスト‘ａａｓｅａｓｔ’は‘ａａｓＥＡＳＴ’に変換される。
　以上説明した第１および第２の実施形態では、基本的に表構造のＤＦＡを圧縮した状態遷移配列を用いているため、入力記号の数と同じ回数の遷移操作で照合を終了することができ、ＤＦＡの高速性が保たれる。しかし、状態遷移配列を格納するために必要な記憶容量は、従来の状態遷移表に比べてはるかに少なくて済む。
【０２４８】
　ところで、上述の例では英文字のテキストを入力としているが、日本語のような２ｂｙｔｅ文字コードで書かれたテキストに対しては、次の２つの方法で本発明を適用できる。
　第１の方法では、まずキーワード群に対して１ｂｙｔｅ毎に状態遷移配列を作成する。そして、テキスト中でいずれかのキーワードのパターンを検出した段階で、そのパターンの前にある改行記号まで戻る。次に、その改行記号の次の位置から始まる文において、検出されたパターンが１ｂｙｔｅずれていないかどうかを確認する。
【０２４９】
　第２の方法では、入力された２ｂｙｔｅ文字コードを１つの単位として状態遷移配列を作成し、照合処理を行う。
　ＡＳＣＩＩ（American Standard Code for Information Interchange）のような１ｂｙｔｅ文字と日本語ＥＵＣ（Extended UNIX Code）のような２ｂｙｔｅ文字とが混在するテキストでは、第２の実施形態においてシフトした際に、２ｂｙｔｅ文字が１ｂｙｔｅ分ずれて照合される可能性がある。
【０２５０】
　このため、このようなテキストに対しては、パターンを受理した段階でそのパターンを含む文の先頭まで戻り、その先頭位置を基準として、検出されたパターンがずれていないかどうかを確認する必要がある。
【実施例】
【０２５１】
　以下では、文字列検索時の記憶容量と検索速度を、従来の照合装置と本発明の照合装置について比較した結果を説明する。
　まず、ＡＣ法に基づくキーワード検索の場合について比較してみる。図６１は、従来法と本発明の方法におけるメモリ使用量の変化を示している。図６１において、グラフの縦軸はメモリ使用量を表し、横軸はキーワード数を表す。また、“ＡＣ＋ｏｕｒｓ”は、ＤＦＡ化されたＡＣ法に基づく本発明の第１の実施形態の照合装置に対応し、“ＤＦＡ　ｏｆ　ＡＣ”は、従来の状態遷移表を用いた照合装置に対応する。
【０２５２】
　図６１を見ると、キーワードの数が増加するにつれて、従来法ではメモリ使用量が激増するが、本発明の第１の実施形態の方法ではそれほど増加しないことが分かる。
　また、図６２は、７５Ｍｂｙｔｅのテキストに対してキーワード検索を行った場合の、それぞれの照合装置の検索速度の変化を示している。図６２において、縦軸は検索に要した時間（秒）、横軸はキーワード数を表す。ここでは、比較のために、従来のＡＣ法の検索速度を“ＡＣ”として追加している。
【０２５３】
　図６２を見ると、キーワードの数が増加するにつれて、従来のＡＣ法では検索速度が低下するが、従来のＤＦＡ化されたＡＣ法と第１の実施形態の方法では、検索速度が高速に保たれることが分かる。さらに、“ＡＣ＋ｏｕｒｓ”と“ＤＦＡ　ｏｆ　ＡＣ”の検索時間の差は僅かなものである。
【０２５４】
　次に、ＦＡＳＴ法に基づくキーワード検索の場合について比較してみる。本発明の第２の実施形態の照合装置において必要な記憶領域は、２進木領域、特定の文字に対するシフト量のリスト領域、および圧縮された状態遷移配列の領域である。また、従来のＦＡＳＴ法の照合装置において必要な記憶領域は、可能な入力記号の数と状態数とに基づいて決まる数だけのポインタ領域である。
【０２５５】
　図６３は、従来法と本発明の方法におけるメモリ使用量の変化を示している。図６３において、グラフの縦軸はメモリ使用量を表し、横軸はキーワード数を表す。また、“ＮＯＲＭＡＬ”は、従来のＦＡＳＴ法を用いた照合装置に対応し、“ＣＯＭＰＲＥＳＳ”は、本発明の第２の実施形態の照合装置に対応する。
【０２５６】
　図６３を見ると、キーワードの数が増加するにつれて、従来法ではメモリ使用量が激増するが、本発明の第２の実施形態の方法ではほとんど増加しないことが分かる。
【図面の簡単な説明】
【０２５７】
【図１】本発明の照合装置の原理図である。
【図２】照合システムの構成図である。
【図３】照合システムの動作のフローチャートである。
【図４】情報処理装置の構成図である。
【図５】照合装置の構成図である。
【図６】圧縮前の第１の状態遷移表を示す図である。
【図７】第１の状態遷移を示す図である。
【図８】圧縮された第１の状態遷移表を示す図である。
【図９】第１の文字コード変換表を示す図である。
【図１０】第１の照合処理のフローチャートである。
【図１１】第１の照合動作を示す図である。
【図１２】第１の圧縮装置の構成図である。
【図１３】第１の２進木作成処理のフローチャートである。
【図１４】第１の２進木を示す図である。
【図１５】２進木にｆａｉｌｕｒｅを追加する処理のフローチャートである。
【図１６】ｆａｉｌｕｒｅを付けた第１の２進木を示す図である。
【図１７】ｆａｉｌｕｒｅ計算の例を示す図である。
【図１８】２進木にｇｏｔｏｉｎ，ｇｏｔｏｏｕｔを追加する処理のフローチャートである。
【図１９】ｇｏｔｏｉｎ，ｇｏｔｏｏｕｔを付けた第１の２進木を示す図である。
【図２０】第１の変換処理のフローチャート（その１）である。
【図２１】第１の変換処理のフローチャート（その２）である。
【図２２】第１の配列を示す図である。
【図２３】第１のパターンを示す図である。
【図２４】第２の配列を示す図である。
【図２５】第３の配列を示す図である。
【図２６】第４の配列を示す図である。
【図２７】第２のパターンを示す図である。
【図２８】第５の配列を示す図である。
【図２９】第３のパターンを示す図である。
【図３０】第６の配列を示す図である。
【図３１】第４のパターンを示す図である。
【図３２】第７の配列を示す図である。
【図３３】文字列置換用の第１の状態遷移表を示す図である。
【図３４】テキストオフセット格納配列を示す図である。
【図３５】第１のテキストのテキストオフセットを示す図である。
【図３６】パターン照合後の第１のテキストオフセット格納配列を示す図である。
【図３７】置換処理のフローチャートである。
【図３８】圧縮前の第２の状態遷移表を示す図である。
【図３９】第２の状態遷移を示す図である。
【図４０】圧縮された第２の状態遷移表を示す図である。
【図４１】第２の文字コード変換表を示す図である。
【図４２】第２の照合処理のフローチャートである。
【図４３】第２の照合動作を示す図である。
【図４４】第２の圧縮装置の構成図である。
【図４５】第２の２進木作成処理のフローチャートである。
【図４６】シフト計算の前処理のフローチャートである。
【図４７】第２の２進木を示す図である。
【図４８】第１のシフト量計算処理のフローチャートである。
【図４９】第２のシフト量計算処理のフローチャートである。
【図５０】第３のシフト量計算処理のフローチャートである。
【図５１】ｆａｉｌｕｒｅとシフトを付けた第２の２進木を示す図である。
【図５２】最終的な第２の２進木を示す図である。
【図５３】第２の変換処理のフローチャート（その１）である。
【図５４】第２の変換処理のフローチャート（その２）である。
【図５５】２進木上の情報を示す図である。
【図５６】第５のパターンを示す図である。
【図５７】第６のパターンを示す図である。
【図５８】文字列置換用の第２の状態遷移表を示す図である。
【図５９】第２のテキストのテキストオフセットを示す図である。
【図６０】パターン照合後の第２のテキストオフセット格納配列を示す図である。
【図６１】ＡＣ法におけるメモリ使用量の変化を示す図である。
【図６２】ＡＣ法における速度の変化を示す図である。
【図６３】ＦＡＳＴ法におけるメモリ使用量の変化を示す図である。
【図６４】ＡＣ法のパターンマッチングマシンの例を示す図である。
【図６５】ＡＣ法の動作例を示す図である。
【図６６】ＡＣ法のＤＦＡを示す図である。
【図６７】ＡＣ法のＤＦＡの動作例を示す図である。
【図６８】ＦＡＳＴ法のパターンマッチングマシンの例を示す図である。
【図６９】ＦＡＳＴ法の遷移とシフトを示す図である。
【図７０】ＦＡＳＴ法による照合の例を示す図である。
【符号の説明】
【０２５８】
　１　状態遷移記憶手段
　２　照合手段
　１０１　圧縮装置
　１０２　照合装置
　１０３　キーワード入力部
　１０４　スパース配列有限状態機械作成部
　１０５　状態遷移機械圧縮部
　１０６　照合用状態遷移機械部
　１０７　テキスト入力部
　１１１　ＣＰＵ
　１１２　メモリ
　１１３　入力装置
　１１４　出力装置
　１１５　外部記憶装置
　１１６　媒体駆動装置
　１１７　ネットワーク接続装置
　１１８　バス
　１１９　可搬記録媒体
　１２０　情報提供者の装置
　１２１　状態遷移判定部
　１２２　状態遷移部
　１２３　圧縮状態遷移部
　１２４　確認ラベル部
　１２５　出力記号部
　１３１、１４１　２進木変換部
　１３２　遷移追加部
　１３３、１４４　変換部
　１４２　前処理部
　１４３　シフト量計算部
【図１】
2004103034.tif 000003
【図２】
2004103034.tif 000004
【図３】
2004103034.tif 000005
【図４】
2004103034.tif 000006
【図５】
2004103034.tif 000007
【図６】
2004103034.tif 000008
【図７】
2004103034.tif 000009
【図８】
2004103034.tif 000010
【図９】
2004103034.tif 000011
【図１０】
2004103034.tif 000012
【図１１】
2004103034.tif 000013
【図１２】
2004103034.tif 000014
【図１３】
2004103034.tif 000015
【図１４】
2004103034.tif 000016
【図１５】
2004103034.tif 000017
【図１６】
2004103034.tif 000018
【図１７】
2004103034.tif 000019
【図１８】
2004103034.tif 000020
【図１９】
2004103034.tif 000021
【図２０】
2004103034.tif 000022
【図２１】
2004103034.tif 000023
【図２２】
2004103034.tif 000024
【図２３】
2004103034.tif 000025
【図２４】
2004103034.tif 000026
【図２５】
2004103034.tif 000027
【図２６】
2004103034.tif 000028
【図２７】
2004103034.tif 000029
【図２８】
2004103034.tif 000030
【図２９】
2004103034.tif 000031
【図３０】
2004103034.tif 000032
【図３１】
2004103034.tif 000033
【図３２】
2004103034.tif 000034
【図３３】
2004103034.tif 000035
【図３４】
2004103034.tif 000036
【図３５】
2004103034.tif 000037
【図３６】
2004103034.tif 000038
【図３７】
2004103034.tif 000039
【図３８】
2004103034.tif 000040
【図３９】
2004103034.tif 000041
【図４０】
2004103034.tif 000042
【図４１】
2004103034.tif 000043
【図４２】
2004103034.tif 000044
【図４３】
2004103034.tif 000045
【図４４】
2004103034.tif 000046
【図４５】
2004103034.tif 000047
【図４６】
2004103034.tif 000048
【図４７】
2004103034.tif 000049
【図４８】
2004103034.tif 000050
【図４９】
2004103034.tif 000051
【図５０】
2004103034.tif 000052
【図５１】
2004103034.tif 000053
【図５２】
2004103034.tif 000054
【図５３】
2004103034.tif 000055
【図５４】
2004103034.tif 000056
【図５５】
2004103034.tif 000057
【図５６】
2004103034.tif 000058
【図５７】
2004103034.tif 000059
【図５８】
2004103034.tif 000060
【図５９】
2004103034.tif 000061
【図６０】
2004103034.tif 000062
【図６１】
2004103034.tif 000063
【図６２】
2004103034.tif 000064
【図６３】
2004103034.tif 000065
【図６４】
2004103034.tif 000066
【図６５】
2004103034.tif 000067
【図６６】
2004103034.tif 000068
【図６７】
2004103034.tif 000069
【図６８】
2004103034.tif 000070
【図６９】
2004103034.tif 000071
【図７０】
2004103034.tif 000072