JP4021832B2 - スパースな状態遷移表に基づく複数記号列の照合装置および方法 - Google Patents

スパースな状態遷移表に基づく複数記号列の照合装置および方法 Download PDF

Info

Publication number
JP4021832B2
JP4021832B2 JP2003358561A JP2003358561A JP4021832B2 JP 4021832 B2 JP4021832 B2 JP 4021832B2 JP 2003358561 A JP2003358561 A JP 2003358561A JP 2003358561 A JP2003358561 A JP 2003358561A JP 4021832 B2 JP4021832 B2 JP 4021832B2
Authority
JP
Japan
Prior art keywords
transition
collation
array
symbol
node
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2003358561A
Other languages
English (en)
Other versions
JP2004103034A (ja
Inventor
功 難波
伸之 井形
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2003358561A priority Critical patent/JP4021832B2/ja
Publication of JP2004103034A publication Critical patent/JP2004103034A/ja
Application granted granted Critical
Publication of JP4021832B2 publication Critical patent/JP4021832B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Description

本発明は、文字列検索装置等において、与えられたテキスト等のデータ中に、少なくとも1つ以上の記号列が存在するか否かを一括して判定する照合装置とその方法に関する。
今日、ワードプロセッサ等の文書処理装置において、テキスト中に、検索タームとして複数の記号列の集合が存在するか否かを一括して判定することが求められている。ここで、記号列とは文字やその他の記号の並びを意味し、文字列も1種の記号列である。このような判定機能は、しばしば、複数文字列照合または複数文字列検索と呼ばれる。
従来の複数文字列検索装置において効率のよいものとしては、Aho らの提案しているAC(Aho Corasick)法(例えば、非特許文献1参照)、これに対して決定的有限状態機械(Deterministic Finite Automaton:DFA)を構成した方法、ならびに浦谷の提案しているFAST(Flying Algorithm for Searching Terms)法(例えば、非特許文献2および特許文献1参照)がある。
以下では、まず、AC法とAC法をDFA化した複数文字列照合アルゴリズムの説明を行い、次いで、FAST法の複数文字列照合アルゴリズムの説明を行う。
AC法は、入力キー集合に対してPMM(Pattern Matching Machine)と呼ばれる有限状態機械を構成することにより、文字列の照合を行う方法である。
AC法における照合動作は次の通りである。まず、初期設定として状態番号を“1”にセットする。次に、入力されたテキストより1文字づつ記号を読み出し、この入力記号により、現状態からどの状態に遷移するかを決定する。現状態に対して入力記号による遷移が定義されていない場合には、照合が失敗(fail)したものとして、現状態のfail先に遷移する。そして、fail先の状態に対してこの入力記号による遷移が定義されていない場合には、fail先に遷移することを繰り返す。
初期状態“1”に対してはすべての記号に対して遷移が定義されているため、failによる遷移は最悪でも初期状態で停止する。このようにテキストの入力記号に対して遷移を繰り返す。また、状態に対して受理する記号列が定義されていた場合には、この記号列とそのテキスト中の位置を出力する。
図64は、3つの記号列{ab,bc,bd}を検索キーとする、AC法のPMMを示している。図64のPMMは、6つの状態“1”、“2”、“3”、“4”、“5”、“6”から成り、実線の矢印は通常の遷移先を指し、破線の矢印はfail先を指している。また、“^a,b”はaとb以外の入力記号を表し、状態“4”、“5”、“6”(s4、s5、s6)には、出力キーワードとして、それぞれ記号列“ab”、“bc”、“bd”が定義されている。
入力記号列‘cabcz’に対するこのPMMの動作は、図65に示すようになる。初期状態は“1”である。まず、記号“c”が入力されると、これはaとb以外の入力記号に相当するので、次状態は同じ状態“1”で、出力は生成されない。次に、記号“a”が入力されると次状態“2”に遷移し、記号“b”が入力されると次状態“4”に遷移する。ここで、状態“4”に定義されている記号列“ab”が出力される。
ところが、状態“4”には遷移先が定義されていないので、次に記号“c”が入力されると、一旦fail先の状態“3”に遷移し、そこで遷移先が探索される。すると、記号“c”による遷移先として状態“5”が定義されているので、その状態に遷移して、記号列“bc”が出力される。次に、記号“z”が入力されると状態“1”に遷移し、動作を終了する。
このように、AC法では、遷移先が定義されていない入力記号によるfailure遷移が起こる度に、遷移回数が1回増える。このため、n個の入力記号に対しては最大2n未満の有限状態機械の遷移が行われることになる。一般には、キー数の増加に伴いキーの先頭文字がヒットする確率が増加するが、これに伴って、failure遷移も増加するため、AC法の照合速度はキー数が増えるにつれて段々低下していく。
AC法の速度を低下させるのは、遷移先の定義されていないfailure遷移であるが、DFAでは入力記号に対して一意に遷移先の状態が決まる。このため、n個の入力記号に対して常にn回の有限状態機械の遷移が行われ、照合速度は高速である。Aho らはAC法の状態遷移機械をDFAに変換する方法を示している。
図66は、記号列{ab,bc,bd}に対するAC法の状態遷移機械に対応する有限状態機械を示している。図66において、“state”は現状態を表し、“next”は“input”に記された記号が入力されたときの遷移先の状態を表す。状態s1、s2、s3、s4、s5、s6は、それぞれ状態“1”、“2”、“3”、“4”、“5”、“6”に対応している。また、例えば“¬a,b”といった表記はaとb以外の記号を表す。
この有限状態機械の入力記号列‘cabcz’に対する動作は、図67に示すようになる。初期状態は1である。図67に示された状態遷移の中には、図65に現れるようなfailure遷移がなく、状態遷移の回数は入力記号‘cabcz’に含まれる記号の数5に一致している。
また、高速な照合法として知られるFAST法においても、AC法と同様に、入力キー集合に対してPMMを構成することにより文字列の照合を行う。
FAST法における照合動作は次の通りである。まず、初期状態として状態番号を“0”にセットする。また、入力キー集合における最も短いキーの長さを最短キー長とし、入力テキストにおける照合開始位置を、テキストの先頭から最短キー長だけ離れた位置にセットする。
次に、照合開始位置よりテキストの左に向かって1文字ずつ記号を読み出し、その入力記号により、現状態からどの状態に遷移するかを決定する。遷移が定義されていない場合には、入力記号に応じた規定量だけ照合開始位置を右方向にずらして、照合を再開する。
このように、入力記号に対して状態遷移が可能な限り、テキストを右から左へ向かって走査し、文字列のパターンを抽出する。遷移が不可能な場合には、入力記号に対して定義されたシフト量だけ、照合開始位置をテキスト中で右方向にシフトする。
図68は、3つの記号列{state,east,smart}を検索キーとする、FAST法のPMMを示している。図68のPMMは、14個の状態“0”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”、“11”、“12”、“13”から成り、実線の矢印は遷移先を指し、破線の矢印はシフト先を指している。
状態遷移は、各検索キーに含まれる記号の並びの逆順に定義されており、“Depth”はPMM内における各状態の深さを表す。また、状態“5”、“9”、“13”(s5、s9、s13)には、出力キーワードとして、それぞれ記号列“state”、“east”、“smart”が定義されている。
このPMMの各状態に対する、記号入力時の遷移先およびシフト量を表にすると、図69のようになる。図69において、1行目の数字は状態番号を表し、1列目の記号は入力記号を表す。ここで、“(Other)”は、“a”、“e”、“m”、“r”、“s”、“t”以外の入力記号を表す。この表において、正の値の要素は、対応する入力記号による遷移先の状態番号を表し、負の値の要素は、対応する入力記号によるシフト量を表す。
入力記号列‘aaseastate’に対するこのPMMの動作は、図70に示すようになる。初期状態は“0”である。この場合、記号列“state”、“east”、“smart”のうち最も短いものは“east”で、その長さは4であるから、最短キー長は4となる。そこで、入力記号列の右端から最短キー長4だけ離れた位置“t”を照合開始位置として、右から左へと照合が行われる。
照合が失敗した場合には、その入力記号に対して定義されたシフト量に−1を乗じてシフト量の大きさを求め、その分だけ照合開始位置を右にずらす。そして、状態番号を“0”にして、照合を再開する。
図70の入力記号列内の記号“t”の位置に記された初期状態“0”において、記号“t”が入力されると、図69の表に従って状態“6”に遷移する。次に、記号“s”が入力されると状態“7”に遷移し、次に、記号“a”が入力されると状態“8”に遷移する。次に、記号“e”が入力されると状態“9”に遷移し、状態“9”に定義されている記号列“east”が出力される。
次に、記号“s”が入力されると、この記号に対して状態“9”では、遷移先ではなくシフト量−7が定義されているので、その大きさ7だけ照合開始位置を右にずらす。そして、初期状態“0”に戻り、シフト先の記号“e”の位置を新たな照合開始位置として照合を再開する。以下同様にして照合が続行され、状態“5”に遷移したときに、記号列“state”が出力される。
上述のような複数文字列の検索処理は、データベース、ワードプロセッサ、全文検索装置などの各装置において用いられる。
全文検索装置とは、全文検索インデックスによる検索において、検索結果が正しいかどうかを確かめるために文字列検索を行う装置を指す。ここで、全文検索インデックスとは、シグニチャファイル(signature file)や、文書中での単語の出現位置を持たないファイル(inverted file )のように、インデックスそのものが入力されたキーワードに対して、必ずしも正解だけを返すとは限らない検索用のインデックスを意味する。
例えば、英語のインデックスに対して、キーワード‘John Smith’を検索する場合を考える。インデックスの単位は、通常、スペースとスペースの間の単語であるので、‘John Smith’は‘John AND Smith’と同じになる。ところが、‘John AND Smith’という検索条件で文書を検索すると、‘John’と‘Smith ’が離れて出現している場合も検索結果に含まれ、過剰な結果が得られる。このような場合、結果が正しいかどうかが文字列検索により確かめられる。
特開昭64−074619号公報 A. V. Aho and M. J. Corasick,"EfficientString Matching: An Aid to Bibliographic Search",CACM Vol.18 No.6,1975 "高速な文字列照合アルゴリズムFAST",情報処理学会論文誌 Vol.30 No.9,1989
以上説明した従来の文字列照合方法において問題となるのは、PMMの状態遷移に相当する部分の速度と記憶容量の関係である。
AC法では、状態遷移部分を表すのにリスト構造を使用することで、記憶容量を減らすことが可能である。しかし、リスト構造ではポインタを順にたどらなければならず、アクセス処理が低速であるため、照合動作は一層低速になってしまう。
DFA化されたAC法の照合速度は高速であるが、すべての入力記号に対して定義されたすべての状態遷移を表すために、図66のような表構造を使用せざるを得ない。しかし、これは記憶容量に多大の負担となる。
例えば、入力記号の種類を256個(8bit符号)とし、状態数をNとし、ポインタを4byteとする。表形式では、1つの状態に対して、次状態へのポインタ256個、fail先へのポインタ1個、および出力記号列へのポインタ1個が必要である。このため、N*(256+1+1)*4byteの記憶容量が必要になる。
一般に、検索キーの数が増大するにつれて状態数Nも増大するので、キー数が多い場合には、必要な記憶容量は膨大になる。したがって、DFA化されたAC法に基づいて文字列照合装置を構成するのは現実的ではない。
また、FAST法においても同様に、すべての入力記号に対して状態遷移またはシフトが定義されているため、図69のような表構造を使用せざるを得ない。したがって、FAST法に基づいて文字列照合装置を構成すると、やはり、膨大な記憶容量が必要となる。
本発明の課題は、現実的な記憶容量で高速な照合を行うことのできる複数記号列の照合装置およびその方法を提供することである。
図1は、本発明の照合装置の原理図である。図1の照合装置は、与えられた記号列をキーとし、ファイル中にそのキーが存在するか否かを、有限状態機械を用いて判定する情報処理装置における照合装置であって、状態遷移記憶手段1と照合手段2を備える。
状態遷移記憶手段1は、少なくとも1つ以上のキーに関する照合操作を定義した状態遷移表であって、あらかじめ決められた操作を表すデータを削減したスパースな状態遷移表を、圧縮された配列形式で記憶する。
照合手段2は、上記スパースな状態遷移表を参照しながら、上記ファイルに含まれる各記号に対応する操作を行い、そのファイル中の記号列を上記1つ以上のキーと照合する。このとき、照合手段2は、スパースな状態遷移表に、ファイルから入力される入力記号に対する操作が定義されているか否かをチェックし、その入力記号に対する操作が定義されていないとき、上記あらかじめ決められた操作を行う。
例えば、DFA化されたAC法に基づく状態遷移表を作成する場合は、現状態から初期状態への遷移操作を表すデータと、現状態から初期状態の次の状態への遷移操作を表すデータのうち、少なくとも一方のデータを従来の状態遷移表から除いて、状態遷移表の情報量を削減する。
また、FAST法に基づく状態遷移表を作成する場合は、上記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを、従来の状態遷移表から可能な限り除いて、状態遷移表の情報量を削減する。
これにより、状態遷移表内でデータが除かれた部分は空要素となり、要素がまばらに散在するスパースな状態遷移表が生成される。このようなスパースな状態遷移表を圧縮して配列に格納することで、コンパクトな有限状態機械を構成することが可能になり、記憶容量が大幅に削減される。
また、圧縮された配列形式の状態遷移表は、基本的にDFAの状態遷移表に基づいて作成されているので、遷移等が定義されているかどうかのチェックは必要であるが、ファイルから入力される1つの記号毎に1回の遷移操作を行えばよく、DFAの高速性は保たれる。
照合対象となるファイルとしては、テキストで記述された文書ファイルや音声データをデジタルコードに変換したファイル等、任意の記号列を含むファイルを用いることができる。
また、本発明の別の局面における照合装置は、与えられた記号列をキーとし、ファイル中に該キーが存在するか否かを、有限状態機械を用いて判定する照合装置であって、状態遷移記憶手段1と照合手段2を備える。
状態遷移記憶手段1は、少なくとも1つ以上のキーに関する照合操作を定義した有限状態機械の状態遷移表であって、ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな状態遷移表を、圧縮された配列形式で記憶する。このとき、状態遷移記憶手段1は、上記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、入力記号に対する操作が遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とを記憶する。
照合手段2は、上記スパースな状態遷移表を参照しながら、上記ファイルに含まれる各記号に対応する操作を行い、そのファイル中の記号列を上記1つ以上のキーと照合する。このとき、照合手段2は、確認ラベル配列内のラベルを確認することでスパースな状態遷移表に入力記号に対する操作が定義されているか否かをチェックし、入力記号に対する遷移先が上記対応する位置に格納されているとき、その遷移先への遷移操作を行い、入力記号に対する操作が上記対応する位置に格納されていないとき、上記シフト操作を行う。
例えば、図1の状態遷移記憶手段1は、実施形態の図5における状態遷移部122に対応し、照合手段2は状態遷移判定部121に対応する。
本発明によれば、与えられたキーワード群に対して、速度と記憶容量の両側面において効率の良い照合表を作成することができる。また、その表を用いて、電子化文書に対して指定された複数のキーワードを、効率よく照合/検索することができる。
また、このような文字列照合処理により、文字列検索や文字列置換などのワードプロセッサの機能を、より効率化することが可能となる。また、全文検索装置における全文検索インデックスの文字列検索、表示段階における括弧付け処理のような文字列置換などの機能や、データベースにおける文字列検索、表示段階における文字列置換などの機能も効率化することができる。
以下、図面を参照しながら、本発明を実施するための最良の形態を詳細に説明する。
図2は、本発明に基づく照合システムの構成図である。図2の照合システムは圧縮装置101と照合装置102から成る。圧縮装置101は、キーワード入力部103、スパース配列有限状態機械作成部104、および状態遷移機械圧縮部105を備え、照合装置102は、照合用状態遷移機械部106およびテキスト入力部107を備える。
キーワード入力部103は、検索対象となる入力されたキーワード群を受理し、スパース配列有限状態機械作成部104は、入力されたキーワード群に対して、配列形式ではスパースとなる、文字列照合のための有限状態機械を中間構造として2進木上に構築する。ここで、スパース配列とは、ほとんど要素が入っていない配列を意味する。状態遷移機械圧縮部105は、スパース配列有限状態機械作成部104が作成した中間構造を、照合が高速な圧縮された配列形式に変換する。
照合用状態遷移機械部106は、圧縮された配列形式の有限状態機械を用いて、テキスト入力部107から入力されたテキストとキーワード群との照合を行う。
図3は、図2の照合システムの動作のフローチャートである。図3において処理が開始されると、まず、キーワード入力部103が検索対象となるキーワード群を受理する(ステップST1)。
次に、スパース配列有限状態機械作成部104は、入力されたキーワードに対して、照合速度がDFAと同じオーダーであり、かつ配列形式ではスパースとなる中間構造の文字列照合機械を2進木の上に構築する(ステップST2)。2進木上の文字列照合機械は、照合速度は低速であるが、要素の追加、挿入が容易な構造になっている。
次に、状態遷移機械圧縮部105は、この2進木上の文字列照合機械を、照合が高速な圧縮された配列形式に変換する(ステップST3)。このとき、配列内で要素の存在する部分に、確認用の文字ラベルを付け、複数の配列の要素の存在する部分が互いに重複しないように、それぞれの配列を重ね合わせることにより、1つの照合用配列を作成する。
そして、照合用状態遷移機械部106は、入力されたテキストに対して、配列形式の有限状態機械を用いて照合を行う。
検索対象となる入力されたキーワード群に対して、DFA化されたAC法や配列実装によるFAST法と、照合速度のオーダーは同じであるが、配列形式ではスパースとなり圧縮が可能である有限状態機械を構築することにより、照合速度が高速であり、記憶容量の節減が可能な文字列照合装置が構築される。
構築方法をまとめると次のようになる。
要素の挿入、追加などが容易であり記憶容量の問題がない2進木上に文字列照合機械を中間構造として構築し、この中間構造を照合が高速でコンパクトな、圧縮された配列形式に変換する。このとき、要素の確認用のラベルをその要素に付与し、互いに要素の重複がないように重ね合わせることにより、配列を圧縮する。
図4は、図2の照合システムを実現する情報処理装置(コンピュータ)の構成図である。図4の情報処理装置は、CPU(中央処理装置)111、メモリ112、入力装置113、出力装置114、外部記憶装置115、媒体駆動装置116、ネットワーク接続装置117を備え、それらの各装置はバス118により互いに結合されている。
CPU111は、メモリ112に格納されたプログラムを実行して、圧縮装置101と照合装置102の各処理を実現する。メモリ112には、上述のプログラムの他に、処理に用いられるデータが格納されている。メモリ112としては、例えばROM(read only memory)、RAM(random access memory)等が用いられる。
入力装置113は、例えばキーボード、ポインティングデバイス等に相当し、ユーザからの要求や指示の入力に用いられる。また、出力装置114は、表示装置やプリンタ等に相当し、状態遷移機械や照合結果等の出力に用いられる。
外部記憶装置115は、例えば、磁気ディスク装置、光ディスク装置、光磁気ディスク装置等である。この外部記憶装置115に、上述のプログラムとデータを保存しておき、必要に応じて、それらをメモリ112にロードして使用することができる。また、外部記憶装置115は、キーワードやテキストを保存するデータベースとしても使用される。
媒体駆動装置116は、可搬記録媒体119を駆動し、その記憶内容にアクセスする。可搬記録媒体119としては、メモリカード、フレキシブルディスク、CD−ROM(compact disk read only memory )、光ディスク、光磁気ディスク等、任意のコンピュータ読み取り可能な記録媒体が使用される。この可搬記録媒体119に、上述のプログラムとデータを格納しておき、必要に応じて、それらをメモリ112にロードして使用することができる。
ネットワーク接続装置117は、LAN(local area network)等の任意の通信ネットワークに接続され、通信に伴うデータ変換等を行う。照合システムは、ネットワーク接続装置117を介して、外部の情報提供者の装置120(データベース等)と通信する。これにより、必要に応じて、上述のプログラムとデータを装置120からネットワークを介して受け取り、それらをメモリ112にロードして使用することができる。
次に、図5から図37までを参照しながら、DFA化されたAC法に基づく第1の実施形態について説明する。
第1の実施形態では、DFA化されたAC法の表構造に対して、初期状態への遷移と初期状態の次状態への遷移とを定義せずに、これらに対する照合が失敗した場合には、初期状態からの遷移として定義し直すような状態遷移機械を構成する。
このように、遷移が定義されていない場合に自動的に初期状態へ遷移するようにすれば、初期状態への遷移を記憶する必要がなくなる。また、初期状態の次状態へは、初期状態経由で必ず遷移することができるので、この遷移についても記憶する必要がない。これらの遷移の定義を省略することで、DFAの状態遷移表の要素を大幅に削除して、スパースな状態遷移表を得ることができる。
次に、この状態遷移機械を配列形式にし、遷移が定義されている部分が重複しないように複数の配列を重ね合わせる。また、同時に、要素がその配列に含まれているかどうか確認を行うために、遷移が定義されている文字に対してはその文字をラベルとして付与する。
また、圧縮された状態遷移表を作成する際に、2進木の中間形式を経由することにより、実際に使用される記憶容量を節減する。
図5は、図2の照合装置102の構成図である。図5において、状態遷移判定部121および状態遷移部122は、照合用状態遷移機械部106に対応する。テキスト入力部107は、対象テキストより1文字ずつ記号を抽出し、状態遷移判定部121は、入力記号に対してどの状態に遷移するかを決定する。
状態遷移部122は、例えばメモリ112に対応し、圧縮状態遷移部123、確認ラベル部124、出力記号部125を含む。圧縮状態遷移部123は、状態遷移表を圧縮した配列形式で格納し、確認ラベル部124は、圧縮に伴い遷移が定義されているかどうかを確認するためのラベルを格納する。出力記号部125は、ある状態に到達した段階で出力される記号列を定義する。
図6は、3つの記号列{ab,bc,bd}を入力キーワードとした場合の圧縮前の第1の状態遷移表を示している。この表を図66の表と比較すると、状態s2、s3、s4、s5、s6における遷移のうち、初期状態s1への遷移と初期状態s1の次状態s2、s3への遷移が除かれている。
図6の状態遷移表に定義された各入力記号に対する遷移を図示すると、図7のようになる。図7において、“〜a,b”はaとb以外の入力記号を表す。
図8は、図6の状態遷移表を圧縮して得られる照合用の配列を示している。図8において、indexは配列の添え字を表し、GOTOは、圧縮状態遷移部123に格納される重ね合わせられた状態遷移表を表し、CHECKは、確認ラベル部124に格納される確認用のラベルを表し、OUTPUTは、出力記号部125に格納されるポインタの配列を表す。これらのポインタは、状態遷移部122内に格納された出力用の文字列を指している。
配列CHECKの要素“#”は終端記号を表す。また、図8の配列の下方に記されている状態s1〜s6は、図6の各状態がどのように重なっているかを表しており、記号a、b等は、図6の入力記号に対応する遷移先の格納位置を表している。
図9は、第1の実施形態の説明のために用いる第1の文字コード変換表を示している。この文字コード変換表に従って、文字コードが内部コードに変換される。ここでは、簡単のため、文字コードの範囲をアルファベットのaからzまでとしているが、これら以外にも数字等の任意の記号を用いることができる。
次に、図10および図11を参照しながら、第1の実施形態における照合処理について説明する。
図10は、AC法に基づく文字列照合処理のフローチャートである。図10において処理が開始されると、状態遷移判定部121は、まず入力されたテキストを指すテキストポインタをその先頭部にセットし、状態遷移部122内の状態遷移配列を指す遷移ポインタを初期状態にセットする(ステップST11)。次に、テキストポインタがテキストの最後を指すかどうかのチェックを行う(ステップST12)。テキストポインタがテキストの終わりを指せば照合は終了する。 テキストポインタがテキストの終わりを指していなければ、そのポインタの指す文字を取り出し(ステップST13)、その文字に対応する内部コードの値を遷移ポインタの値に加算し、その加算値をindexとする位置に格納された文字ラベルがこの文字と同じかどうかのチェックを行う(ステップST14)。
これらの文字が一致しなければ、その入力文字に対する遷移が定義されていないことになる。そこで、初期状態へのポインタに入力文字の内部コードを加算し、その加算値をindexとする位置に定義された遷移先を、新たな遷移ポインタとする(ステップST15)。
ステップST14においてラベルと入力文字が同じであれば、次に、出力文字列が状態に対して定義されているかどうかの確認を行う(ステップST16)。 出力文字列が定義されていなければ、現在の遷移ポインタに入力文字の内部コードを加算し、その加算値をindexとする位置に定義された遷移先を、新たな遷移ポインタとする(ステップST18)。そして、テキストポインタを1文字進め(ステップST19)、ステップST12以降の処理を繰り返す。
出力文字列が定義されているのであれば、その文字列を照合結果として出力し(ステップST17)、ステップST18以降の処理を行う。ステップST17において、現在のテキストポインタの値を、照合された文字列の位置として出力することもできる。
図11は、図8の状態遷移配列を用いた場合の入力テキスト‘cabcz’に対する照合動作を示している。図11において、“’c”等は、文字c等に対応する内部コードの値を表す。また、GOTO[x]は、index“x”の位置に定義されている遷移先の番号を表し、CHECK[x]は、index“x”の位置に格納されているラベルを表し、OUTPUT[x]は、index“x”の位置に格納されている出力用ポインタを表す。この場合の照合は次のように行われる。
図8において、初期状態はindex=1の位置に対応する。最初の入力記号は“c”である(ステップST13)。初期状態においてはすべての入力記号に対する遷移先が定義されているので、図11に“*1”で示されるように、ステップST14のチェックは省略され、ステップST16の処理に移る。ここでは、出力は定義されていないので、ステップST17の処理は行われない。
次に、入力記号“c”に対して図9の変換表を引くと’c=3を得る。そこで、GOTO[1+3]=GOTO[4]の結果を、次に進むべき遷移先とする。図8において、index“4”の位置に定義されている遷移先は“1”であるので、GOTO[4]=1となる。したがって、遷移先は、再びindex“1”に対応する初期状態となる(ステップST18)。
次に、同様にして、入力記号“a”に対して照合動作を行うと、GOTO[1+’a]=26となり、index“26”から始まる状態に移る(ステップST18)。
次に、入力記号“b”に対しては、配列CHECKにアクセスして、遷移が定義されているかいないかを確かめる必要がある(ステップST14)。そこで、現在の遷移ポインタの値26に’b=2を加算すると、index“28”を得る。index“28”の位置に格納されたラベルは“b”であるから、CHECK[28+’b]=bとなり、この入力記号に対する遷移が定義されていることが分かる。
このとき、OUTPUT[26+’b]には出力記号列“ab”が定義されているので、これを出力する(ステップST17)。また、次の遷移先は、GOTO[26+’b]=29となる。
次に、入力記号“c”に対して同様の処理を行い、記号列“bc”を出力して、GOTO[29+’c]=5の位置に遷移する。
次に、最後の入力記号“z”に対して同様の処理を行うと、CHECK[5+’z]はzではないため、index“5”の状態からの遷移は失敗し、記号“z”に対する遷移は初期状態からの遷移として定義される。この結果、遷移ポインタはGOTO[1+’z]=1となり(ステップST15)、テキストが終了したので照合動作を終了する。
こうして、入力テキストに含まれていた記号列“ab”と“bc”が、照合結果として出力される。
次に、照合に用いる状態遷移配列の作成方法を説明する。図12は、図2の圧縮装置の第1の構成図である。図12において、2進木変換部131および遷移追加部132は、スパース配列有限状態機械作成部104に対応し、変換部133は状態遷移機械圧縮部105に対応する。
キーワード入力部103は、指定されたキーワード群を受理する。2進木変換部131は、この受理されたキーワード群を、各キーの左から右に向かう方向に、2進木構造に変換する。遷移追加部132は、作成された2進木構造に対して、照合失敗時における初期状態とその次状態以外への遷移を追加する。変換部133は、遷移追加部132が出力する2進木構造を、圧縮された配列形式に変換する。
このような照合用の配列の作成手順は、入力されたキーワード群からの2進木の作成、その結果得られた2進木のノードに対するfail先ノードの追加、failure遷移の中で直接遷移可能なものを定義するgotoin/gotoout先ノードリストの追加、最終的に得られた2進木の配列形式への変換の各処理より成る。
図13は、2進木作成処理のフローチャートである。図13において処理が開始されると、2進木変換部131は、まず入力キーに対して2進木を作成する(ステップST21)。次に、キーを受理したノードに対して、対応する入力キーを出力記号列として付加し(ステップST22)、処理を終了する。
例えば、図7の状態遷移図に対応するキーワード群{ab,bc,bd}に対して2進木を作成すると、図14のようになる。図14において、矩形のボックスが1つのノードを表し、各ノードに付加された文字ラベルはキーワード中に現れる記号に対応している。また、横へのポインタは、2進木上で同じ深さのノードへのポインタを表し、下へのポインタはより深いノードへのポインタを表す。ここでは、ノード“4”、“5”、“6”に対して、出力記号列“ab”、“bc”、“bd”がそれぞれのoutputとして付加されている。
図15は、作成された2進木のノードに対してfailure遷移の遷移先を付与する処理のフローチャートである。図15において処理が開始されると、遷移追加部132は、まず処理対象となるノードを格納するノードキューQを初期化する(ステップST31)。
次に、2進木のルートノードから遷移可能なノード(ルートノードに対して次ノードになるノードおよびそのノードと深さが同じノード)をキューQに入れる(ステップST32)。
次に、キューに入っているノードのfail先をルートノードに設定し(ステップST33)、Qが空かどうかの判定を行う(ステップST34)。Qが空ならば処理は終了する。Qが空でなければ、次にキューQから1つノードを取り出し、これをrに設定し(ステップST35)、取り出したノードをキューQから除く(ステップST36)。
次に、ノードキューJを初期化し(ステップST37)、rから遷移可能なノード(ノードrに対して次ノードになるノードおよびそのノードと深さが同じノード)をキューJに入れる(ステップST38)。そして、Jが空かどうかを判定する(ステップST39)。
Jが空であるならばステップST34以降の処理を繰り返す。Jが空でないならば、次にノードキューJより1つノードを取り出し、これをsにセットして(ステップST40)、取り出したノードをキューJより除く(ステップST41)。次に、sをキューQに入れて(ステップST42)、ノードrのfail先をtにセットし(ステップST43)、ノードsについている文字ラベルによるノードtからの遷移が定義されているかどうかの判定を行う(ステップST44)。
そのような遷移が定義されていなければtにtのfail先をセットし(ステップST45)、再びステップST44の判定を行い、判定結果がYESになるまでループする。最終的には、初期状態でループを抜けることができる。
ステップST44で遷移が定義されていれば、次に、tからsのラベルで遷移する先をsのfail先とする(ステップST46)。そして、sのoutput(出力文字列)として、sのfail先の出力文字列を加え(ステップST47)、ステップST39以降の処理を繰り返す。
例えば、図14の2進木のfailure遷移を計算し、これを2進木の各ノードに付与すると、図16のようになる。この場合のfailure計算の手順を、図15のフローに沿って説明する。
まず、ルートノード“1”から遷移可能なノード“2”、“3”をキューQに入れ(ステップST32)、それらのノードのfail先をルートノードとする。その後の処理は、図17に示すようになる。図17において、例えばgoto(1,b)の表記は、記号“b”に対して定義されたノード“1”からの遷移を表す。このような手順は、一般のAC法におけるfailure関数の作成手順と同様である。
図18は、付加されたfailure遷移に対して、初期状態とその次状態以外の状態への遷移を、gotoin/gotooutノードリストとして2進木のノードに追加する処理のフローチャートである。図18において処理が開始されると、遷移追加部132は、まずノードキューQを初期化する(ステップST51)。
次に、2進木のルートノードから遷移可能なノードをキューQに入れ(ステップST52)、キューQが空かどうかの判定を行う(ステップST53)。キューQが空であるならば処理は終了する。
キューQが空でないならば、キューQより1つノードを取り出し、これをrにセットし(ステップST54)、そのノードをキューQより取り除く(ステップST55)。次に、キューXにすべての可能な入力記号を入れて(ステップST56)、キューXが空かどうかの判定を行う(ステップST57)。キューXが空であればステップST53以降の処理を繰り返す。
例えば8bit符号を用いた場合、ステップST56においてキューXに入れられる記号のコードは、0〜255までの256個となる。
キューXが空でなければ、キューXより1文字取り出し、これをsにセットし(ステップST58)、同時にこの文字をキューXより取り除く(ステップST59)。そして、記号sによりrから次状態に遷移可能かどうかを判定する(ステップST60)。遷移可能であれば、記号sによるrの遷移先をキューQに追加し(ステップST65)、ステップST57以降の処理を繰り返す。
ステップST60において遷移不可能であれば、次に、ノードrのfail先がルートノードかどうかの判定を行う(ステップST61)。それがルートノードであれば、そのままステップST57以降の処理を繰り返す。
ステップST61においてノードrのfail先がルートノードでなければ、次に、rのfail先から記号sによる遷移が可能かどうかの判定を行う(ステップST62)。遷移が不可能であればステップST57以降の処理を繰り返す。 遷移が可能であれば、次に、rのfail先から記号sで遷移可能なノードを、rのgotooutに追加し(ステップST63)、そのノードのgotoinにノードrを追加して(ステップST64)、ステップST57以降の処理を繰り返す。
今、処理対象ノードrをr=Aとし、記号sによるノードAのfail先のノードをBとし、ノードBから遷移可能なノードの集合をCとする。このとき、図18のステップST57からST65までのループ処理では、まずノードAから記号sで直接遷移可能なノードを集合Cから除く。そして、集合C中のノードのリストをgotooutとしてノードAに付加し、集合C中の各ノードに対してはノードAをgotoinとして付加している。
図16の2進木の場合に対してgotooutとgotoinを求めると、図19のようになる。図19の2進木は、遷移追加部132が最終的に出力する中間構造の有限状態機械に相当する。
上述のgotooutリストおよびgotoinリストの計算において、実際に遷移が定義され得るのは、fail先が初期状態以外のノードになった場合だけである。図16では、この条件を満たすのは明らかにノード“4”だけであるので、このノードについての処理を説明する。
図16において、ノード“4”のfail先はノード“3”である。ノード“3”からは、文字“c”によりノード“5”へ遷移可能であり、文字“d”によりノード“6”へ遷移可能である。したがって、ノード“4”のgotooutはノード“5”とノード“6”となる。また、ノード“5”、“6”のgotoinは、ともにノード“4”となる。図19では、これらのgotooutおよびgotoinが、ラベルの付いたノードの形式で表されている。
従来のDFAの場合は、2進木のすべてのノードに対してgotooutが定義されているが、本発明では、ルートノード以外へのfailure遷移が定義されているノードに対してのみ、gotooutが定義される。この場合、gotoinを付加的に定義する必要があるが、ルートノードをfail先とする多くのノードのfailure遷移が削除されるため、記憶容量の削減に寄与する。
図20および図21は、遷移追加部132が出力する2進木を、圧縮された配列形式の状態遷移機械に変換する処理のフローチャートである。図20において処理が開始されると、変換部133は、まず配列GOTO、CHECK、OUTPUTを0に初期化し(ステップST71)、2進木のノードのメンバindexを0に初期化する(ステップST72)。
このindexは、2進木の各ノードと、図8に示されるような状態遷移配列のindexとの対応関係を記憶するために、状態遷移配列のindexとは独立に設けられる。
次に、可能な入力記号のうち、ルートノードから他のノードにその記号で遷移できないようなものをキューRに入れ(ステップST73)、キューRが空かどうかの判定を行う(ステップST74)。キューRが空でなければ、キューRより1文字取り出し、これをsにセットし(ステップST75)、これをキューRより除く(ステップST76)。
次に、GOTO[1+’s]を1とし(ステップST77)、CHECK[1+’s]をsの文字ラベルとして(ステップST78)、ステップST74以降の処理を繰り返す。“’s”は、sに対する配列中での内部コードを表すが、これは文字コードそのままでも構わない。
そして、キューRが空になると、次にキューQを初期化し(ステップST79)、Pn =ルートノード、Cn =ルートノードの次ノード、Pp =1とする(ステップST80)。
ここで、ルートノードの次ノードとは、ルートノードから遷移可能な複数のノード(ノード列)において、最小の文字ラベルを持つノードを意味する。図19のような2進木の場合、Cn に入れられるノードは、ルートノードから下へのポインタで指されるノードに一致する。
次に、[Pn ,Cn ,Pp ]の3つ組をキューQに追加して(ステップST81)、キューQが空かどうかの判定を行う(ステップST82)。キューQが空であれば処理は終わりとなる。
キューQが空でなければ、次にキューQの先頭より3つ組を取り出し、これをsにセットして(ステップST83)、その3つ組をキューQより取り除く(ステップST84)。次に、s内のノードPn のgotooutに繋がるノードと、s内のノードCn に連なる、Cn と深さが同じノードとを挿入可能な、配列GOTO、CHECK、OUTPUT上の位置を求め、これをpointにセットする(ステップST85)。
このとき、既に挿入されたノードのpointの位置と、新たに挿入するノードのpointの位置が重複しないようにする。もし、新たな挿入可能位置が既にpointとして用いられている場合は、例えばそれを1つずらしてpointに設定する。
次に、GOTO[sのPp ]=pointとし(ステップST86)、sのPn のgotooutに繋がるノードをキューtmpに入れて(ステップST87)、キューtmpが空かどうかの判定を行う(ステップST88)。
キューtmpが空でなければ、次に、キューtmpよりノードを1つ取り出しこれをiにセットし(ステップST89)、そのノードをキューtmpより除く(ステップST90)。そして、GOTO[iのindex]が0かどうかの判定を行う(ステップST91)。
ここで、2進木のノードiのindexには、ノードiが格納された状態遷移配列上の位置のindex、または0が格納されている。これが0であれば、2進木のノードiはまだ状態遷移配列上に移されていない。
GOTO[iのindex]が0であれば、ステップST88の処理を繰り返す。それが0でなければ、gotoout先への遷移は配列上に移されているので、gotooutによる遷移を配列上にマッピングし(ステップST92)、ステップST88以降の処理を繰り返す。
ステップST92では、GOTO[point+’iのラベル]=GOTO[iのindex]、OUTPUT[point+’iのラベル]=iのoutputとすることにより、遷移をマッピングする。ここで、“’iのラベル”とは、ノードiの文字ラベルの内部コードを表し、iのoutputとは、ノードiに定義された出力記号列を表す。こうして、ノードiのoutputが配列上に複写される。
ステップST88においてキューtmpが空になると、次に、s内のPn のgotoinに繋がるノードをキューtmpに入れ(図21、ステップST93)、キューtmpが空かどうかの判定を行う(ステップST94)。
キューtmpが空でなければ、キューtmpよりノードを1つ取り出し、これをiにセットし(ステップST95)、iをキューより除く(ステップST96)。そして、GOTO[iのindex]が0かどうかの判定を行う(ステップST97)。
GOTO[iのindex]が0であれば、ステップST97の処理を繰り返す。それが0でなければ、gotoin経由でgotooutの遷移を配列上にマッピングし(ステップST98)、ステップST97以降の処理を繰り返す。 ステップST98では、GOTO[GOTO[iのindex]+’iのラベル]=pointとすることにより、マッピングを行う。また、s内のノードPn にoutputが定義されているのであれば、OUTPUT[GOTO[iのindex]+’iのラベル]=Pn のoutputとして、Pn のoutputを配列上に複写する。
ステップST94においてキューtmpが空になると、次に、Pn のgotooutに繋がるノードの文字ラベルと、Cn に同じ深さで繋がるノードの文字ラベルとをキューchtmpに入れる(ステップST99)。そして、キューchtmpが空かどうかの判定を行う(ステップST100)。
chtmpが空でなければ、次に、キューchtmpより1つ文字ラベルを取り出し、これをjにセットし(ステップST101)、そのラベルをキューchtmpより除く(ステップST102)。そして、CHECK[point+’j]=jとして、ノードの挿入先のラベルをセットし(ステップST103)、ステップST100以降の処理を繰り返す。
ステップST100においてchtmpが空になると、次に、s内のCn およびそれと同じ深さのノードをキューtmpに入れ(ステップST104)、キューtmpが空かどうかの判定を行う(ステップST105)。
キューtmpが空でなければ、キューtmpよりノードを取り出し、これをiにセットし(ステップST106)、そのノードをキューより取り除く(ステップST107)。次に、ノードiのindexに、(point+’iのラベル)の値をセットして(ステップST108)、ノードiにoutputが定義されているかどうかをチェックする(ステップST109)。
ノードiにoutputがなければ、ステップST105以降の処理を繰り返す。outputがあれば、ノードiのoutputを配列OUTPUTにコピーして(ステップST110)、ステップST105以降の処理を繰り返す。ステップST110においては、OUTPUT[point+’iのラベル]=iのoutputとする。
ステップST105においてtmpが空になると、次に、Cn と同じ深さのノードをキューtmpに入れ(ステップST111)、tmpが空かどうかの判定を行う(ステップST112)。
キューtmpが空でなければ、キューtmpより1つノードを取り出し、これをiにセットし(ステップST113)、そのノードをキューtmpから取り除く(ステップST114)。そして、ノードiより何らかの記号で次状態に遷移可能かどうかの判定を行う(ステップST115)。
遷移不可能であれば、ステップST112以降の処理を繰り返す。遷移可能であれば、Pn =i、Cn =iの遷移先の先頭ノード、Pp =iのindexとして、この3つ組みをキューQに追加し(ステップST116)、ステップST112以降の処理を繰り返す。ここで、iの遷移先の先頭ノードとは、ノードiから遷移可能なノード列において、最小の文字ラベルを持つノードを意味する。
ステップST115においてtmpが空になると、図20のステップST82に戻り、それ以降の処理を繰り返す。
次に、図19の2進木を図8のような配列形式に変換する手順を、図20および図21のフローに沿って説明する。
まず、初期状態に対してはすべての遷移が定義されるので、これを定義する。この処理は、図20のステップST74〜ST78のループに相当する。これにより図22のような配列形式を得る。
この後、2進木のルートノードから順に、2進木上のノードを配列に挿入していくが、この処理が図20のステップST79から図21のステップST116のループに相当する。この挿入処理において、変換部133は、2進木のノードに対する3つ組のデータ[Pn ,Cn ,Pp ]をキューに積み、これを1つずつ配列に挿入していく。
まず、ルートノードより挿入するが、図20では、ステップST79、ST80、ST81でキューQに3つ組を積み、これをステップST13、ST14で取り出している。ここでは、Pn =ルートノード“1”、Cn =ノード“2”、Pp =1となる。ステップST85では挿入可能な場所を捜すが、この処理はルートノード“1”に対しては次のようになる。
この場合、Pn のgotooutは空である。Cn と深さが同じノードはノード“2”とノード“3”となる。これらのノードの文字ラベルは、それぞれ“a”、“b”である。このノード列が挿入可能な配列上の場所を捜す操作は、図23のようなパターンに対応する場所を、配列GOTO、CHECK、OUTPUT上で捜すことに相当する。
図23のパターンにおいて、上の行は、現在の配列CHECK上のパターンを表し、下の行は、挿入されるパターンを表す。また、“0”は、その領域が空であることを表し、“*”は、その領域が空であっても要素が入っていてもどちらでもよいことを表す。
このようなパターンが挿入可能な位置を図22の配列上で捜すと、図23のパターンは図24に示すように重ねることが可能であるので、ノードの挿入位置を表すpointの値は1となる。この位置は、ノード“2”のラベル“a”の挿入位置の1つ前の位置に対応している。
また、ステップST86では、GOTO[Pp ]=pointとなるので、GOTO[1]=1となる。これにより、2進木のノード“1”からノード“2”、“3”への遷移が配列上に移される。ただし、ルートノード“1”に対応するindex=1の位置に対しては、あらかじめGOTO[1]=1となっているため、変化はない。
図20のステップST87から図21のステップST98までの処理は、ノードPp がgotoout/gotoinを持っている場合の処理であるので、ルートノードには関係がない。
図21のステップST99からST103までの処理は、配列に文字ラベルを挿入する処理である。これは、それぞれのノードの持つ文字ラベルを、先に確保された配列上の場所のCHECKの部分にセットすることに相当する。この操作により、図25のような配列形式を得る。図25において、下線を付加したラベル“a”、“b”が、挿入されたラベルに相当する。
図21のステップST104からST110までの処理は、配列上の位置を2進木のノードに対してセットする処理と、ノードのoutputを配列上に複写する処理である。これにより、ノード“2”のindexには2がセットされ、ノード“3”のindexには3がセットされる。
また、ステップST111からST116までのループ処理は、Pp から遷移可能なノードをキューQに積む処理である。ここでは、ルートノードより遷移可能なのは、ノード“2”とノード“3”であるので、[Pn =ノード“2”,Cn =ノード“4”,Pp =2]と[Pn =ノード“3”,Cn =ノード“5”,Pp =3]の2つがキューに積まれる。そして、処理は図20のステップST82に戻る。
今度は、Pn =ノード“2”、Cn =ノード“4”、Pp =2として同様の処理を行い、ノードの挿入可能な位置を捜すと、point=26の位置が見つかる。そこで、図20のステップST85から図21のステップST111までの処理を同様にして行うと、図26のような配列形式が得られる。
図26において、ノード“4”のラベル“b”はindex=28の位置に挿入されているが、図9の変換表を用いた場合、ラベル“b”は内部コード2に変換される。そこで、28から2を引いた値26をpointとする。これにより、図10の照合処理のステップST18において、index=26の位置から入力記号“b”によりindex=28の位置に移動し、その要素が表す遷移先に遷移することができるようになる。
また、OUTPUT[28]にはノード“4”のoutputである“ab”が複写される。
次に、ノード“4”に後続するノードはノード“7”であるので、[Pn =ノード“4”,Cn =ノード“7”,Pp =28]がキューQに積まれる。そして、処理は図20のステップST82に戻る。
次にキューQより取り出されるのは、[Pn =ノード“3”,Cn =ノード“5”,Pp =3]である。これに対しては、図27のようなパターンを満たす挿入場所を見つければよいが、ノード“5”のラベル“c”をindex=29の位置に合わせると、その内部コードは3であるから、point=26となる。この値は既に1度pointに設定されているので、重複を避けるために、1つずらしてpoint=27とする。
こうして、図20のステップST85から図21のステップST111までの処理を同様にして行うと、図28のような配列形式が得られる。この場合には、OUTPUT[30]にはノード“5”のoutputである“bc”が複写され、OUTPUT[31]にはノード“6”のoutputである“bd”が複写される。
次に、ノード“5”、“6”に後続するのは、それぞれノード“8”、“9”である。そこで、[Pn =ノード“5”,Cn =ノード“8”,Pp =30]、[Pn =ノード“6”,Cn =ノード“9”、Pp =31]がキューQに積まれる。そして、処理は図20のステップST82に戻る。
今度は、[Pn =ノード“4”,Cn =ノード“7”,Pp =28]として同様の処理を行う。ノードの挿入可能位置を捜すが、ノード“4”には、gotooutとして文字“c”、“d”による遷移が定義されているため、挿入可能な場所は、図29のようなパターンを満たす場所となる。この場所に対応するpointの値は29となる。
このとき、図20のステップST85から図21のステップST111までの処理を同様にして行うが、この場合には、Pn となるノード“4”にはgotooutが定義されているため、図20のステップST87からST92までのループ処理に入る。しかし、GOTO[ノード“5”のindex]とGOTO[ノード“6”のindex]がともに未定義となるため、ステップST92の処理は行われない。結局、得られる配列は図30のようになる。
ノード“7”から遷移可能なノードはないので、キューQにはこれ以上ノードが積まれず、処理は図20のステップST82に戻る。
次に、キューQより、[Pn =ノード“5”,Cn =ノード“8”,Pp =30]が取り出される。挿入可能な場所は、図31のようなパターンを満たす場所となる。この場所に対応するpointの値は5となる。
このとき、図20のステップST85から図21のステップST111までの処理を同様にして行うが、この場合には、Pn となるノード“5”にはgotoinとしてノード“4”が定義されているため、図21のステップST93からST98までのループ処理に入る。
ステップST97の条件判定では、GOTO[ノード“4”のindex]=29となるので、ステップST98では、GOTO[29+’c]=GOTO[32]=5となる。また、Pn となるノード“5”にはoutputとして“bc”が定義されているので、これもコピーされ、OUTPUT[32]=bcとなる。この結果、図32のような配列が得られる。
また、最後にノード“9”をノード“8”と同様に処理すると、図8のような結果を得る。
なお、この例においては、状態遷移配列の圧縮率を高めるため、許される最小の値をpointとして用いているが、その値より大きいindexをpointとして用いても構わない。
次に、この第1の実施形態の照合装置に文字列置換機能を加えた文字列置換装置の実施形態を説明する。ここでは、入力キーワード{ab,bc,bd}を、それぞれ{aaa,bbb,ccc}に置換する例を示す。
この文字列置換機能は、入力されたテキスト中より検出されたキーワードを出力する代わりに、このキーワードが検出された場所を記憶し、テキストの処理後にキーワードを置換する機能である。
図33は、入力キーに対する文字列置換用の状態遷移配列を示している。図33において、配列GOTOは重ねられた状態遷移表を格納し、配列CHECKは確認用のラベルを格納し、配列SUBSTは置換用の文字列へのポインタを格納し、配列LENGTHは照合された置換前の文字列の長さを格納している。
また、図34は、置換処理に用いるテキストオフセット格納配列の初期状態を示している。この配列には、置換対象となる文字列のテキスト中の位置を表すテキストオフセットと、対応する置換用文字列を指すSUBSTのポインタと、置換対象文字列の長さとが格納される。
入力テキスト‘cabcz’内の各記号に対するテキストオフセットは、図35に示すようになる。また、この入力テキストに対してパターン照合を行った後には、テキストオフセット格納配列は図36のようになる。このときの照合処理は、図10と同様である。照合の結果、キーワード“ab”、“bc”のテキスト内の位置が、それぞれテキストオフセット“1”、“2”として格納されている。
置換処理においては、文字列置換装置は、テキストとテキストオフセット格納配列にそれぞれポインタを設定する。そして、テキストオフセット配列に格納されたテキストオフセットの位置から始まる、置換対象文字列長に対応する長さの区間内に、テキストへのポインタがない限り、テキスト文字を出力する。また、テキストへのポインタが、テキストオフセット配列内のテキストオフセットの位置にあった場合には、対応する置換用文字列を出力する。
図37は、この置換処理のフローチャートである。図37において処理が開始されると、文字列置換装置は、まずテキストポインタtをテキストの先頭にセットし(ステップST121)、置換ポインタpをテキストオフセット格納配列の先頭にセットする(ステップST122)。そして、ポインタtがテキストの最後を指しているかどうかを判定する(ステップST123)。ポインタtがテキストの最後を指していれば、処理を終了する。
ポインタtがテキストの最後を指していなければ、次に、ポインタpの指す位置に格納されたテキストオフセットの値を、ポインタtと比較する(ステップST124)。これらが一致しなければ、ポインタtの指すテキスト内の文字を出力し(ステップST125)、ポインタtを1文字分進めて(ステップST126)、ステップST123以降の処理を繰り返す。
ステップST124において両者が一致すれば、次に、ポインタpの指す位置に格納されたSUBSTのポインタを取り出し、それが指す置換用文字列を出力する(ステップST127)。次に、ポインタtを、ポインタpの指す位置に格納された置換対象文字列長分だけ進め(ステップST128)、ポインタpを1つ進める(ステップST129)。
そして、ポインタtの値がポインタpの指す位置のテキストオフセットより大きく、かつ、ポインタpの指す位置がテキストオフセット格納配列の最後でないかどうかを判定する(ステップST130)。判定結果がYESであればステップST129以降の処理を繰り返し、NOであればステップST123以降の処理を繰り返す。
このような置換処理の結果、テキスト‘cabcz’は‘caaacz’に変換される。
次に、図38から図60までを参照しながら、FAST法に基づく第2の実施形態について説明する。
FAST法の状態遷移表において、各状態の入力記号に対する操作を定義するデータは、デフォルトシフトと遷移の2つに簡単に分離できそうであるが、必ずしもそうではない。例えば図69の状態遷移表では、状態“6”における入力記号“a”に対するシフト量は−2(大きさ2)であるが、その他の入力記号に対するデフォルトのシフト量は−5(大きさ5)である。前者の小さなシフト量は、FAST法のシフト量を計算中に決まる。このため、このままでは、表形式をデフォルトのシフト量と次状態への遷移とに分離し、コンパクトにするのは不可能である。
そこで、第2の実施形態では、まずFAST法の入力記号による操作を3種類に分ける。最初の操作は、一般の入力記号に対する状態のデフォルトシフトである。次の操作は、特定の入力記号に対するシフトである。最後の操作は、入力記号による次状態への遷移である。
照合動作においては、まず入力記号に対して遷移またはシフトが定義されているかどうかを判定する。シフトも遷移も定義されていない場合には、デフォルトシフトに従い、右方向へポインタをシフトさせる。入力記号が受理されるが、遷移ではなくシフトが定義されている場合には、そのシフトに従い右方向へポインタをシフトさせる。遷移が定義されている場合には、次状態へ遷移する。
このような操作を各状態ごとに配列形式で表し、遷移/シフトが定義されている部分が重複しないように配列を重ね合わせる。また、同時に要素がその配列に含まれているかどうかの確認を行うために、遷移/シフトが定義されている文字に対しては、その文字をラベルとして付与する。
また、圧縮された表形式を作成する際に、2進木の中間構造を経由することにより、実際に使用される記憶容量を節減する。
第2の実施形態における照合装置の構成は、図5と同様である。この場合、状態遷移判定部121は、入力記号に対してどの状態に遷移するか、もしくはどの程度テキスト中でシフトするかを決定する。
図38は、3つの記号列{smart,east,state}を入力キーワードとした場合の圧縮前の第2の状態遷移表を示している。この表を図69の表と比較すると、各状態で多用されている典型的なシフト量がデフォルトシフト(default shift)として1つにまとめられ、特定の入力記号に対する特定のシフト量または遷移先のみが入力記号毎に定義されていることが分かる。
図38の状態遷移表に定義された各入力記号に対する遷移を図示すると、図39のようになる。図39の状態遷移図は、ノード“0”〜“13”の14個のノードから成る。各ノードに付与されたデータa1、a2、a3、a4は、それぞれ、状態番号(ノード番号)、デフォルトシフトの大きさ、特定の文字とそれに対する特定のシフトの大きさ、出力文字列を表している。
図40は、図38の状態遷移表を圧縮して得られる照合用の配列を示している。図40において、indexは配列の添え字を表し、GOTOは、圧縮状態遷移部123に格納される重ね合わせられた状態遷移表を表し、CHECKは、確認ラベル部124に格納される確認用のラベルを表し、OUTPUTは、出力記号部125に格納されるポインタの配列を表す。これらのポインタは、状態遷移部122内に格納された出力文字列を指している。
配列GOTOの要素が0未満の場合はシフト量を表し、それ以外の場合は次状態への遷移を表す。
また、図40の配列の下方に記されている状態s0〜s13は、図38の状態“0”〜“13”がどのように重なっているかを表している。また、記号a、e等は、図38の各入力記号に対応するアクセス先のデータの格納位置を表し、記号Dは、デフォルトシフトに対応するアクセス先のデータの格納位置を表している。
図41は、第2の実施形態の説明のために用いる第2の文字コード変換表を示している。この文字コード変換表に従って、文字コードが内部コードに変換される。図41の変換表では、重ね合わせられた各配列の先頭部にデフォルトシフトコードを設定するために、第1列目にその内部コードとして“1”が設定されている。このため、各入力記号に対する内部コードは2以上となり、第2列目以降に設定されている。
また、入力記号の文字コード値に1を加えた結果を内部コードとして用いてもよい。
次に、図42および図43を参照しながら、第2の実施形態における照合処理について説明する。
図42は、FAST法に基づく文字列照合処理のフローチャートである。図42において処理が開始されると、状態遷移判定部121は、まず入力されたテキストを指すテキストポインタを、その先頭に最短キー長を加えた位置にセットし、状態遷移部122内の状態遷移配列を指す遷移ポインタを初期状態にセットする(ステップST131)。次に、テキストポインタがテキストの最後を指すかどうかのチェックを行う(ステップST132)。テキストポインタがテキストの終わりを指せば照合は終了する。
テキストポインタがテキストの終わりを指していなければ、そのポインタの指す文字を取り出し(ステップST133)、その文字に対応する内部コードの値を遷移ポインタの値に加算し、その加算値をindexとする位置に格納された文字ラベルがこの文字と同じかどうかのチェックを行う(ステップST134)。
これらの文字が一致しなければ、その入力文字に対する遷移またはシフトが定義されていないことになる。そこで、テキストポインタをその状態に対するデフォルトシフト分だけ進めて(ステップST135)、遷移ポインタを初期状態にセットし(ステップST136)、ステップST132以降の処理を繰り返す。 ステップST134においてラベルと入力文字が同じであれば、次に、入力文字によるシフトが定義されているかどうかを確かめる(ステップST137)。入力文字でシフトするのであれば、現在の状態において、その入力文字に対して定義されたシフト量の大きさだけテキストポインタを進め(ステップST138)、遷移ポインタを初期状態にセットして(ステップST139)、ステップST132以降の処理を繰り返す。
ステップST137において、シフトではなく入力文字による遷移が定義されている場合は、次に、出力文字列が状態に対して定義されているかどうかの確認を行う(ステップST140)。
出力文字列が定義されていなければ、現在の遷移ポインタに入力文字の内部コードを加算し、その加算値をindexとする位置に定義された遷移先を、新たな遷移ポインタとする(ステップST142)。そして、テキストポインタを1文字戻し(ステップST143)、ステップST132以降の処理を繰り返す。 出力文字列が定義されているのであれば、その文字列を照合結果として出力すし(ステップST141)、ステップST142以降の処理を行う。ステップST141において、現在のテキストポインタの値を、照合された文字列の位置として出力することもできる。
図43は、図40の状態遷移配列を用いた場合の入力テキスト‘aaseastaterrr’に対する照合動作を示している。まず、テキストポインタは、テキストの先頭から最短キーワード長4だけ離れた位置にセットされ、遷移ポインタは、初期状態に対応するindexの値“1”にセットされる。
最初の入力記号“e”に対しては、CHECK[1+’e]=eであり、GOTO[1+’e]=3>0であるため、遷移ポインタ=3として(ステップST142)、次状態に遷移する。
以下、同様にして、図43のような照合動作が行われる。ここでは、まず入力記号による遷移先またはシフト量が定義されているかどうかを、配列CHECKにアクセスして確認し、遷移が定義されていない場合には、デフォルトシフトによりシフトしている。
また、特定の入力記号に対してデフォルトシフトより小さいシフトが定義されている場合には、そのシフト量に応じてシフトしている。図43では、最後の初期状態“1”において記号“r”が入力されたときに、このような特定のシフトが発生している。そして、記号“r”に対しては、デフォルトシフト量4より小さい値のシフト量1だけ、右方向にテキストポインタがシフトされるが、これによりテキストの最後に移動するので、処理を終了している。
こうして、入力テキストに含まれていた記号列“east”と“state”が、照合結果として出力される。
次に、照合に用いる状態遷移配列の作成方法を説明する。図44は、図2の圧縮装置の第2の構成図である。図44において、2進木変換部141、前処理部142、およびシフト量計算部143は、スパース配列有限状態機械作成部104に対応し、変換部144は状態遷移機械圧縮部105に対応する。
キーワード入力部103は、指定されたキーワード群を受理する。2進木変換部141は、この受理されたキーワード群を、各キーの左から右に向かう方向に、2進木構造に変換する。前処理部142は、入力されたキーワードの最も長さの短いものの長さと、それぞれのノードの深さと、各キーワードに対する終端ノードとを設定する。シフト量計算部143は、各状態に対するシフト量を計算する。また、変換部144は、シフト量計算部143が出力する2進木構造を、圧縮された配列形式に変換する。
このような照合用の配列の作成手順は、入力されたキーワード群からの2進木の作成、その結果得られた2進木のノードに対するノードの深さの追加、キーワードに対する最後尾ノードのセット、シフト量の計算と中間構造の2進木の作成、中間構造から配列形式への変換の各処理より成る。
図45は、2進木作成処理のフローチャートである。図45において処理が開始されると、2進木変換部141は、まず入力キーに対してキーの並びの逆順に2進木を作成する(ステップST151)。次に、キーを受理したノードに対して、対応する入力キーを出力記号列として付加し(ステップST152)、処理を終了する。
図46は、2進木に対してシフト量計算を行うための前処理のフローチャートである。図46において処理が開始されると、前処理部142は、まず各ノードに対してルートノードからの距離(深さ)をセットする(ステップST161)。次に、最短の入力キーワード長を求め(ステップST162)、各キーワードに対する最後尾のノードを求めて(ステップST163)、処理を終了する。
例えば、図39の状態遷移図に対応するキーワード群{smart,east,state}に対して2進木を作成し、前処理を行うと、図47のような2進木が得られる。図47において、下へのポインタと横へのポインタの意味は、図14と同様である。
各ノードに付与されたデータdはノードの深さを表し、outputは出力文字列を表す。ここでは、ノード“5”、“9”、“13”に対して、出力記号列“state”、“east”、“smart”がそれぞれのoutputとして付加されている。
また、これらの出力記号列(キーワード)の最短パターン長として4が設定され、各キーワード“state”、“east”、“smart”に対する終端ノードとして、それぞれノード“5”、“9”、“13”が設定されている。
図48、図49、および図50は、2進木に対してシフト量を求める計算処理のフローチャートである。
図48は、各ノードに、特定文字によるシフトとfailure遷移を設定する処理を示している。図48において処理が開始されると、シフト量計算部143は、まず処理対象となるノードを格納するノードキューQを初期化する(ステップST171)。次に、2進木のルートノードから遷移可能なノードをキューQに入れる(ステップST172)。
次に、キューに入っているノードのfail先をルートノードに設定し(ステップST173)、Qが空かどうかの判定を行う(ステップST174)。Qが空ならば処理は終了する。Qが空でなければ、次にキューQから1つノードを取り出し、これをrに設定し(ステップST175)、取り出したノードをキューQから除く(ステップST176)。
次に、ノードキューJを初期化し(ステップST177)、rから遷移可能なノードをキューJに入れる(ステップST178)。そして、Jが空かどうかを判定する(ステップST179)。
Jが空であるならばステップST174以降の処理を繰り返す。Jが空でないならば、次にノードキューJより1つノードを取り出し、これをsにセットして(ステップST180)、取り出したノードをキューJより除く(ステップST181)。次に、sをキューQに入れて(ステップST182)、ノードrのfail先をtにセットし(ステップST183)、ノードsについている文字ラベルによるノードtからの遷移が定義されているかどうかの判定を行う(ステップST184)。
そのような遷移が定義されていれば、次に、tからsのラベルで遷移する先をsのfail先とし(ステップST188)、ステップST179以降の処理を繰り返す。
ステップST184で遷移が定義されていなければ、次に、ノードtにおいてsのラベルでのシフト量が定義されていないか、もしくは、既に定義されているシフト量が現在のsの深さより大きいかどうかを判定する(ステップST185)。
シフト量が未定義、もしくは定義されている値が現在のsの深さより大きければ、次に、ノードtに対するノードsのラベルでのシフト量をsの深さとする(ステップST186)。このような特定のラベルに対するシフト量は、2進木の各ノードに付加されるspecificリストとして表される。次に、tにtのfail先をセットし(ステップST187)、ステップST184以降の処理を繰り返す。
ステップST185で、現在のsの深さ以下のシフト量がsのラベルに対して定義されていれば、ステップST187以降の処理を行う。
図49は、各ノードに、最大のシフト量であるデフォルトシフト量を付加する処理のフローチャートである。図49において処理が開始されると、シフト量計算部143は、各ノードに対するデフォルトシフト量として、ノードの深さに最短キー長を加算した値を設定して(ステップST191)、処理を終了する。
例えば、図47の2進木の場合、まず図48のステップST172の処理により、シフト量計算部143はルートノード“0”から遷移可能なノード“1”、“6”をキューQに入れる。次に、ステップST173の処理により、ノード“1”、“6”のfailure遷移先を、ルートノードに設定する。
次に、キューQからノード“1”が取り出されて、これがrにセットされ、ステップST175〜ST178の処理により、ノードキューJにノード“2”が積まれる。Jに積まれるノードはノード“2”のみであるので、処理は一度だけステップST179〜ST183のループを通る。
ここでは、ステップST180の処理により、sにノード“2”が設定され、ステップST183の処理により、tにノードr(ノード“1”)のfail先、すなわちルートノードが設定される。
ルートノードからはsのラベル(ノード“2”のラベル“t”)で遷移可能であるので、処理はステップST188に進み、sのfail先は、ルートノードからノード“2”のラベル“t”で遷移可能なノード“6”となる。
次に、キューQから取り出されるのはノード“6”である。ノード“6”から遷移可能なノード“7”に対して、同様な処理を行う。この場合には、r=ノード“6”、s=ノード“7”、t=ノード“1”(ノード“6”のfail先)となる。しかし、tからノード“7”のラベル“s”で遷移は不可能である。
そこで、ノード“1”では、入力記号“s”に対する特定のシフト量として、ノード“6”の深さ、すなわち1が設定される。この記号“s”と対応するシフト量“1”は、specificリストとしてリスト構造で表される。
このような処理を同様にして繰り返すと、すべてのノードにfailure遷移と暫定的なシフト量とが付与される。この後、図49の処理に従って、各ノードにおける最大のシフト量であるデフォルトシフト量を、各ノードに割り当てる。こうして、図51のような2進木が得られる。
図51において、破線の矢印はfailure遷移を表し、failure遷移の表示されていないノードのfail先はルートノード“0”になっている。また、各ノードに付加されたデータDはデフォルトシフト量を表す。さらに、ノード“0”、“6”に繋がるspecificリストには、特定の文字ラベルとそれに対応する特定のシフト量とが設定されている。
図50は、各ノードのシフト量を必要に応じて削減して、最終的なシフト量を割り付ける処理のフローチャートである。図50において処理が開始されると、シフト量計算部143は、まず入力キーワードをキューQに積み(ステップST201)、キューQが空かどうかの判定を行う(ステップST202)。
キューQが空でなければ、キューQからポップしたキーワードをjに入れる(ステップST203)。次に、キーワードjに対応する最後尾のノードをjstにセットし(ステップST204)、jstのfail先をbstにセットし(ステップST205)、jlen=jstの深さとする(ステップST206)。そして、bstがルートノードかどうかを判定する(ステップST207)。bstがルートノードであれば、ステップST202以降の処理を繰り返す。
bstがルートノードでなければ、次に、jlenからbstの深さを減算し、その結果をslenに設定する(ステップST208)。次に、キューNにbstを入れて(ステップST209)、キューNが空であるかどうかの判定を行う(ステップST210)。キューNが空であれば、bst=bstのfail先として(ステップST211)、ステップST207以降の処理を繰り返す。 キューNが空でなければ、次に、キューNからポップしたノードをrに入れ(ステップST212)、rのデフォルトシフトが(slen+rの深さ)より大きいかどうかを判定する(ステップST213)。rのデフォルトシフトが(slen+rの深さ)以下であれば、ステップST210以降の処理を繰り返す。 rのデフォルトシフト>(slen+rの深さ)であれば、rのデフォルトシフト=slen+rの深さとし(ステップST214)、rから遷移可能なノードをキューNに積んで(ステップST215)、ステップST210以降の処理を繰り返す。
ステップST202においてキューQが空であれば、ステップST216からST220までのループ処理を行う。この処理は、ノードに対して定義されている特定の文字によるシフトの大きさが、デフォルトシフトの大きさより大きい場合に、これを削って、デフォルトシフトと同じ大きさにする処理である。
ここでは、まずすべてのノードをキューQに入れ(ステップST216)、キューQが空かどうかの判定を行う(ステップST217)。キューQが空であれば処理は終了する。
キューQが空でなければ、次に、キューQからポップしたノードをjに入れ(ステップST218)、jにおいて定義されている特定の文字に対するシフトの大きさが、デフォルトシフトの大きさより大きいかどうかを判定する(ステップST219)。
判定結果がNOの場合はステップST217以降の処理を繰り返す。判定結果がYESの場合は、その特定の文字に対するシフトの大きさ=デフォルトシフトの大きさとして(ステップST220)、ステップST217以降の処理を繰り返す。
図51の2進木に設定されたシフト量を、図50の処理に従って整形すると、次のようになる。まず、ステップST201〜ST203の処理により、照合用のキーワードセット{smart,east,state}をキューQに積み、キューからポップしたキーワードをjにセットする。
今、これを仮に“state”とすると、ステップST204〜ST206の処理により、jst=ノード“5”、bst=ノード“7”、jlen=5となる。このとき、bstはルートノードではないので、処理はステップST208に移る。ステップST208では、slen=jlen−bstの深さ=5−2=3となる。また、ステップST209では、キューNにノード“7”が入れられ、ステップST212では、これがキューNよりポップされてrにセットされる。
ステップST213の条件判定では、rのデフォルトシフト(ノード“7”のデフォルトシフト)は6で、slenより大きい。そこで、処理はステップST214に移り、rのデフォルトシフト=slen+rの深さ=3+2=5となる。
この後、ステップST215の処理により、キューNにはノード“8”が積まれて、同様の処理が行われる。これにより、ノード“8”より下の枝が順に処理されて、各ノードのデフォルトシフトの大きさが変更される。
このように、キーワードの終端ノードのfail先となっているノードと、そのノードに繋がるより深い位置のノードにおいては、ステップST213およびST214の処理により、デフォルトシフトの大きさが(slen+rの深さ)以下に抑えられる。
最終的にすべてのノードに対して処理が終了すると、図52のような2進木が得られる。図52において、キーワードの終端ノード“5”、“9”のfail先となっているノード“7”、“1”のデフォルトシフトは、図51と比べて1だけ小さくなっていることが分かる。また、ノード“7”、“1”の下方に繋がる各ノードのデフォルトシフトもそれぞれ1ずつ小さくなっている。
図53および図54は、シフト量計算部143が出力する2進木を、圧縮された配列形式の状態遷移機械に変換する処理のフローチャートである。図53において処理が開始されると、変換部144は、まず配列GOTO、CHECK、OUTPUTを0に初期化し(ステップST221)、2進木のノードのメンバindexを0に初期化する(ステップST222)。
このindexは、2進木の各ノードと、図40に示されるような状態遷移配列のindexとの対応関係を記憶するために、状態遷移配列のindexとは独立に設けられる。
次に、キューQを初期化し(ステップST223)、Pn =ルートノード、Cn =ルートノードの次ノード、Pp =1とする(ステップST224)。
ここで、ルートノードの次ノードとは、ルートノードから遷移可能な複数のノード(ノード列)において、最小の文字ラベルを持つノードを意味する。図52のような2進木の場合、Cn に入れられるノードは、ルートノードから下へのポインタで指されるノードに一致する。
次に、[Pn ,Cn ,Pp ]の3つ組をキューQに追加して(ステップST225)、キューQが空かどうかの判定を行う(ステップST226)。キューQが空であれば処理は終わりとなる。
キューQが空でなければ、次にキューQの先頭より3つ組をポップしてsにセットする(ステップST227)。そして、s内のノードPn のspecificリストに繋がるノードと、s内のノードCn に連なる、Cn と深さが同じノードと、sに対するデフォルトシフトのシフト量とを挿入可能な、配列GOTO、CHECK、OUTPUT上の位置を求め、これをpointにセットする(ステップST228)。
このとき、既に挿入されたノードのpointの位置と、新たに挿入するノードのpointの位置が重複しないようにする。もし、新たな挿入可能位置が既にpointとして用いられている場合は、例えばそれを1つずらしてpointに設定する。
次に、GOTO[sのPp ]=pointとし(ステップST229)、CHECK[point+1]=1とする(ステップST230)。また、s内のノードPn のデフォルトシフトの大きさに−1を乗じて負の値にし、それをGOTO[point+1]に入れる(ステップST231)。これにより、配列内のindex=point+1の位置に、デフォルトシフトの値が設定される。
次に、sのPn のspecificリストに連なるノードを、キューtmpに入れて(ステップST232)、キューtmpが空かどうかの判定を行う(ステップST233)。キューtmpが空でなければ、次に、キューtmpからポップしたノードをjに設定する(ステップST234)。
そして、ノードjの文字ラベルに対するシフト量として、対応するシフトの大きさに−1を乗じた値を、GOTO[point+’jのラベル]に設定する(ステップST235)。ここで、“’ラベル”は、その文字ラベルに対応する配列上での内部コードであり、図41の変換表を用いた場合は’ラベル≧2である。
次に、CHECK[point+’jのラベル]に、確認用のラベルとしてjの文字ラベルを設定し(ステップST236)、ステップST233以降の処理を繰り返す。
ステップST233においてキューtmpが空になると、次に、s内のCn およびそれと同じ深さのノードをキューtmpに入れて(図54、ステップST237)、キューtmpが空かどうかの判定を行う(ステップST238)。
キューtmpが空でなければ、次に、キューtmpからポップしたノードをiにセットし(ステップST239)、ノードiのindexに、(point+’iのラベル)の値をセットして(ステップST240)、ノードiにoutputが定義されているかどうかをチェックする(ステップST241)。
ノードiにoutputがあれば、ノードiのoutputを配列OUTPUTにコピーする(ステップST242)。ここでは、OUTPUT[point+’iのラベル]=iのoutputとなる。次に、CHECK[point+’iのラベル]=iのラベルとして(ステップST243)、ステップST238以降の処理を繰り返す。ノードiにoutputがなければ、ステップST243以降の処理を行う。
ステップST238においてtmpが空になると、次に、Cn と同じ深さのノードをキューtmpに入れ(ステップST244)、tmpが空かどうかの判定を行う(ステップST245)。
キューtmpが空でなければ、キューtmpからポップしたノードをiにセットし(ステップST246)、ノードiより何らかの記号で次状態に遷移可能かどうかの判定を行う(ステップST247)。遷移不可能であれば、ステップST245以降の処理を繰り返す。
遷移可能であれば、Pn =i、Cn =iの遷移先の先頭ノード、Pp =iのindexとして、この3つ組みをキューQに追加し(ステップST248)、ステップST245以降の処理を繰り返す。ここで、iの遷移先の先頭ノードとは、ノードiから遷移可能なノード列において、最小の文字ラベルを持つノードを意味する。
ステップST245においてtmpが空になると、図53のステップST226に戻り、それ以降の処理を繰り返す。
次に、図52の2進木を図40のような配列形式に変換する手順を、図53および図54のフローに従って説明する。この変換処理では、先行するノードと、それから遷移可能なノードあるいはシフト可能なノードとの関係が、2進木から配列形式にマップされる。
図52の各ノードに対する入力記号による遷移、入力記号による特定のシフト、およびデフォルトシフトをまとめると、図55のようになる。図55において、例えば第1行第2列の“e:1”は、ノード“0”に対する入力記号“e”による遷移先がノード“1”であることを表し、第1行第4列の“a:2”は、ノード“0”に対する入力記号“a”によるシフトの大きさが2であることを表す。
図53のステップST227から図54のステップST248までの処理では、変換部144は、先行する状態に対して、次の遷移/シフトの記号を定義できる配列上の空き場所を捜し出し、それらのデータを挿入して、遷移関係をマップする。このデータ挿入の方法は、基本的には第1の実施形態で述べた方法と同様である。
ここで、ルートノード“0”を例としてマッピングの操作を説明する。ルートノードに関して挿入すべきデータのパターンは、図56のようになる。図56は、ルートノードに対してデフォルトシフト以外に遷移等が定義され得る入力記号は、{a,e,m,r,s,t}の6つであることを示している。
最初は、状態遷移配列の要素がすべて空であるので、図56のパターンが挿入可能な場所を配列上で捜すと、可能な最小の配列のindexは“1”となる。そこで、図53のステップST229からST236までの処理により、pointを“1”に設定し、文字ラベルを書き込み、デフォルトシフトや特定のシフトのシフト量を設定すると、図40のs0の行に示すパターンがマップされる。この段階では、ラベル“e”と“t”に相当する部分は未定義のままである。
ラベル“e”と“t”の部分は、ルートノード“0”の次ノードに対応するため、図54のステップST237からST248までの処理により、それらのノードが配列上に挿入された段階で設定される。ここで、ルートノードの次に処理される次ノードは、ノード“1”である。
ノード“1”から遷移できる文字は“t”のみであるので、ノード“1”の挿入場所は、図57のようなパターンに対応する場所となる。図57において、上の行は、現在の配列CHECK上のパターンを表し、下の行は、挿入されるパターンを表す。
このようなパターンが挿入可能な場所を配列上で捜すと、pointに設定可能な最小の配列のindexは“3”となる。そこで、まずノード“1”がノード“0”からの遷移先であることを定義するために、このpointの値3をGOTO[7]に設定し、ノード“0”から記号“e”で遷移する先のデータは、index=3の位置より始まるということを定義する。
そして、このノード“1”をindex=3の位置に挿入し、ステップST229からST236までの処理により、文字ラベルやデフォルトシフト量等の設定を行う。この結果、図40のs1の行に示すパターンがマップされる。
このような処理を、キューにノードが積まれる順に、すなわちノード“0”、“1”、“6”、“2”、“7”、“10”、“3”、“8”、“11”、“4”、“9”、“12”、“5”、“13”の順に行うことで、最終的に図40のような状態遷移配列が得られる。
図52のノード“14”、“15”、“16”もキューに積まれて同様の処理が施され、厳密には、終端記号“#”による遷移が定義される。しかし、終端記号は出力文字列には含まれないため、ここでは、これらのノードの処理を省略し、図40においてもこれらのノードへの遷移は省略されている。また、配列内での終端記号のラベルの値を0とすることにより、終端ノードに対する遷移を定義しないようにすることも可能である。
次に、この第2の実施形態の照合装置に文字列置換機能を加えた文字列置換装置の実施形態を説明する。ここでは、入力キーワード{smart,east,state}を、それぞれ{SMART,EAST,STATE}に置換する例を示す。
図58は、入力キーに対する文字列置換用の状態遷移配列を示している。図58において、配列GOTOは重ねられた状態遷移表を格納し、配列CHECKは確認用のラベルを格納し、配列SUBSTは置換用の文字列へのポインタを格納し、配列LENGTHは置換前の文字列の長さを格納している。また、置換処理に用いるテキストオフセット格納配列の初期状態は、図34と同様である。
入力テキスト‘aaseast’内の各記号に対するテキストオフセットは、図59に示すようになる。また、この入力テキストに対してパターン照合を行った後には、テキストオフセット格納配列は図60のようになる。このときの照合処理は、図42と同様である。照合の結果、キーワード“east”のテキスト内の位置が、テキストオフセット“3”として格納されている。
また、置換処理は、図37と同様にして行われる。この置換処理の結果、テキスト‘aaseast’は‘aasEAST’に変換される。
以上説明した第1および第2の実施形態では、基本的に表構造のDFAを圧縮した状態遷移配列を用いているため、入力記号の数と同じ回数の遷移操作で照合を終了することができ、DFAの高速性が保たれる。しかし、状態遷移配列を格納するために必要な記憶容量は、従来の状態遷移表に比べてはるかに少なくて済む。
ところで、上述の例では英文字のテキストを入力としているが、日本語のような2byte文字コードで書かれたテキストに対しては、次の2つの方法で本発明を適用できる。
第1の方法では、まずキーワード群に対して1byte毎に状態遷移配列を作成する。そして、テキスト中でいずれかのキーワードのパターンを検出した段階で、そのパターンの前にある改行記号まで戻る。次に、その改行記号の次の位置から始まる文において、検出されたパターンが1byteずれていないかどうかを確認する。
第2の方法では、入力された2byte文字コードを1つの単位として状態遷移配列を作成し、照合処理を行う。
ASCII(American Standard Code for Information Interchange)のような1byte文字と日本語EUC(Extended UNIX Code)のような2byte文字とが混在するテキストでは、第2の実施形態においてシフトした際に、2byte文字が1byte分ずれて照合される可能性がある。
このため、このようなテキストに対しては、パターンを受理した段階でそのパターンを含む文の先頭まで戻り、その先頭位置を基準として、検出されたパターンがずれていないかどうかを確認する必要がある。
以下では、文字列検索時の記憶容量と検索速度を、従来の照合装置と本発明の照合装置について比較した結果を説明する。
まず、AC法に基づくキーワード検索の場合について比較してみる。図61は、従来法と本発明の方法におけるメモリ使用量の変化を示している。図61において、グラフの縦軸はメモリ使用量を表し、横軸はキーワード数を表す。また、“AC+ours”は、DFA化されたAC法に基づく本発明の第1の実施形態の照合装置に対応し、“DFA of AC”は、従来の状態遷移表を用いた照合装置に対応する。
図61を見ると、キーワードの数が増加するにつれて、従来法ではメモリ使用量が激増するが、本発明の第1の実施形態の方法ではそれほど増加しないことが分かる。
また、図62は、75Mbyteのテキストに対してキーワード検索を行った場合の、それぞれの照合装置の検索速度の変化を示している。図62において、縦軸は検索に要した時間(秒)、横軸はキーワード数を表す。ここでは、比較のために、従来のAC法の検索速度を“AC”として追加している。
図62を見ると、キーワードの数が増加するにつれて、従来のAC法では検索速度が低下するが、従来のDFA化されたAC法と第1の実施形態の方法では、検索速度が高速に保たれることが分かる。さらに、“AC+ours”と“DFA of AC”の検索時間の差は僅かなものである。
次に、FAST法に基づくキーワード検索の場合について比較してみる。本発明の第2の実施形態の照合装置において必要な記憶領域は、2進木領域、特定の文字に対するシフト量のリスト領域、および圧縮された状態遷移配列の領域である。また、従来のFAST法の照合装置において必要な記憶領域は、可能な入力記号の数と状態数とに基づいて決まる数だけのポインタ領域である。
図63は、従来法と本発明の方法におけるメモリ使用量の変化を示している。図63において、グラフの縦軸はメモリ使用量を表し、横軸はキーワード数を表す。また、“NORMAL”は、従来のFAST法を用いた照合装置に対応し、“COMPRESS”は、本発明の第2の実施形態の照合装置に対応する。
図63を見ると、キーワードの数が増加するにつれて、従来法ではメモリ使用量が激増するが、本発明の第2の実施形態の方法ではほとんど増加しないことが分かる。
本発明の照合装置の原理図である。 照合システムの構成図である。 照合システムの動作のフローチャートである。 情報処理装置の構成図である。 照合装置の構成図である。 圧縮前の第1の状態遷移表を示す図である。 第1の状態遷移を示す図である。 圧縮された第1の状態遷移表を示す図である。 第1の文字コード変換表を示す図である。 第1の照合処理のフローチャートである。 第1の照合動作を示す図である。 第1の圧縮装置の構成図である。 第1の2進木作成処理のフローチャートである。 第1の2進木を示す図である。 2進木にfailureを追加する処理のフローチャートである。 failureを付けた第1の2進木を示す図である。 failure計算の例を示す図である。 2進木にgotoin,gotooutを追加する処理のフローチャートである。 gotoin,gotooutを付けた第1の2進木を示す図である。 第1の変換処理のフローチャート(その1)である。 第1の変換処理のフローチャート(その2)である。 第1の配列を示す図である。 第1のパターンを示す図である。 第2の配列を示す図である。 第3の配列を示す図である。 第4の配列を示す図である。 第2のパターンを示す図である。 第5の配列を示す図である。 第3のパターンを示す図である。 第6の配列を示す図である。 第4のパターンを示す図である。 第7の配列を示す図である。 文字列置換用の第1の状態遷移表を示す図である。 テキストオフセット格納配列を示す図である。 第1のテキストのテキストオフセットを示す図である。 パターン照合後の第1のテキストオフセット格納配列を示す図である。 置換処理のフローチャートである。 圧縮前の第2の状態遷移表を示す図である。 第2の状態遷移を示す図である。 圧縮された第2の状態遷移表を示す図である。 第2の文字コード変換表を示す図である。 第2の照合処理のフローチャートである。 第2の照合動作を示す図である。 第2の圧縮装置の構成図である。 第2の2進木作成処理のフローチャートである。 シフト計算の前処理のフローチャートである。 第2の2進木を示す図である。 第1のシフト量計算処理のフローチャートである。 第2のシフト量計算処理のフローチャートである。 第3のシフト量計算処理のフローチャートである。 failureとシフトを付けた第2の2進木を示す図である。 最終的な第2の2進木を示す図である。 第2の変換処理のフローチャート(その1)である。 第2の変換処理のフローチャート(その2)である。 2進木上の情報を示す図である。 第5のパターンを示す図である。 第6のパターンを示す図である。 文字列置換用の第2の状態遷移表を示す図である。 第2のテキストのテキストオフセットを示す図である。 パターン照合後の第2のテキストオフセット格納配列を示す図である。 AC法におけるメモリ使用量の変化を示す図である。 AC法における速度の変化を示す図である。 FAST法におけるメモリ使用量の変化を示す図である。 AC法のパターンマッチングマシンの例を示す図である。 AC法の動作例を示す図である。 AC法のDFAを示す図である。 AC法のDFAの動作例を示す図である。 FAST法のパターンマッチングマシンの例を示す図である。 FAST法の遷移とシフトを示す図である。 FAST法による照合の例を示す図である。
符号の説明
1 状態遷移記憶手段
2 照合手段
101 圧縮装置
102 照合装置
103 キーワード入力部
104 スパース配列有限状態機械作成部
105 状態遷移機械圧縮部
106 照合用状態遷移機械部
107 テキスト入力部
111 CPU
112 メモリ
113 入力装置
114 出力装置
115 外部記憶装置
116 媒体駆動装置
117 ネットワーク接続装置
118 バス
119 可搬記録媒体
120 情報提供者の装置
121 状態遷移判定部
122 状態遷移部
123 圧縮状態遷移部
124 確認ラベル部
125 出力記号部
131、141 2進木変換部
132 遷移追加部
133、144 変換部
142 前処理部
143 シフト量計算部

Claims (14)

  1. 与えられた記号列をキーとし、照合対象ファイル中に該キーが存在するか否かを、有限状態機械を用いて判定する照合装置であって、
    少なくとも1つ以上のキーに関する照合操作を定義した前記有限状態機械の状態遷移表であって、前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな該状態遷移表を、圧縮された配列形式で記憶する状態遷移記憶手段と、
    前記スパースな状態遷移表を参照しながら、前記ファイルに含まれる各記号に対応する操作を行い、該ファイル中の記号列を前記1つ以上のキーと照合する照合手段とを備え、
    前記状態遷移記憶手段は、前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とを記憶し、
    前記照合手段は、前記確認ラベル配列内の前記ラベルを確認することで前記スパースな状態遷移表に前記入力記号に対する操作が定義されているか否かをチェックし、該入力記号に対する遷移先が前記対応する位置に格納されているとき、該遷移先への遷移操作を行い、該入力記号に対する操作が該対応する位置に格納されていないとき、前記シフト操作を行うことを特徴とする照合装置。
  2. 前記照合手段は、前記入力記号に対する特定のシフト操作を表すデータが前記対応する位置に格納されているとき、前記ファイル内の照合位置を該特定のシフト操作によりシフトさせることを特徴とする請求項1記載の照合装置。
  3. 請求項1記載の照合装置と、前記1つ以上のキーに含まれる入力記号に対応してキーを特定するデータを格納する出力記号配列を記憶する記憶手段と、該出力記号配列内のデータに基づいて前記入力記号に対応するキーを出力する出力手段とを備えることを特徴とする検索装置。
  4. 請求項1記載の照合装置と、前記1つ以上のキーに含まれる入力記号に対応して、キーの代わりに出力される置換記号列を特定するデータを格納する置換記号配列を記憶する記憶手段と、該置換記号配列内のデータに基づいて前記入力記号に対応する置換記号列を出力する出力手段とを備えることを特徴とする置換装置。
  5. 請求項1記載の照合装置を備え、該照合装置を用いた記号列検索機能と記号列置換機能のうち少なくとも一方の機能を行うことを特徴とするワードプロセッサ装置。
  6. 請求項1記載の照合装置を備え、該照合装置を用いた記号列検索機能と記号列置換機能のうち少なくとも一方の機能を行うことを特徴とするデータベースシステム。
  7. 請求項1記載の照合装置を備え、該照合装置を用いた記号列検索機能と記号列置換機能のうち少なくとも一方の機能を行うことを特徴とする全文検索装置。
  8. 与えられた記号列をキーとし、照合対象ファイル中に該キーが存在するか否かを判定するための有限状態機械を作成する照合装置であって、
    少なくとも1つ以上のキーを表現する2進木データを作成し、前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな状態遷移表に対応する中間構造の有限状態機械を、該2進木データに基づいて作成するスパース有限状態機械作成手段と、
    前記中間構造の有限状態機械を、前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とからなる、圧縮された配列形式に変換する状態遷移機械圧縮手段とを備え、
    前記配列形式に変換された前記スパースな状態遷移表を参照して前記確認ラベル配列内の前記ラベルを確認することで、該スパースな状態遷移表に前記入力記号に対する操作が定義されているか否かがチェックされ、該入力記号に対する遷移先が前記対応する位置に格納されているとき、該遷移先への遷移操作が行われ、該入力記号に対する操作が該対応する位置に格納されていないとき、前記シフト操作が行われることを特徴とする照合装置。
  9. 前記スパース有限状態機械作成手段は、前記1つ以上のキーを表現する2進木データ作成手段と、failure遷移先、デフォルトシフト、および特定の記号による特定のシフトを計算して、該2進木データに加えるシフト量計算手段とを含み、前記状態遷移機械圧縮手段は、該シフト量計算手段から受け取る該2進木データに基づいて、複数の要素が互いに重複しないように圧縮された前記遷移先配列を作成することを特徴とする請求項8記載の照合装置。
  10. 与えられた記号列をキーとし、照合対象ファイル中に該キーが存在するか否かを、有限状態機械を用いて判定する照合装置であって、
    少なくとも1つ以上のキーを表現する2進木データを作成し、前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな状態遷移表に対応する中間構造の有限状態機械を、該2進木データに基づいて作成するスパース有限状態機械作成手段と、
    前記中間構造の有限状態機械を、前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とからなる、圧縮された配列形式に変換する状態遷移機械圧縮手段と、
    前記配列形式に変換された前記スパースな状態遷移表を記憶する状態遷移記憶手段と、
    前記スパースな状態遷移表を参照しながら、前記ファイルに含まれる各記号に対応する操作を行い、該ファイル中の記号列を前記1つ以上のキーと照合する照合手段とを備え、
    前記照合手段は、前記確認ラベル配列内の前記ラベルを確認することで前記スパースな状態遷移表に前記入力記号に対する操作が定義されているか否かをチェックし、該入力記号に対する遷移先が前記対応する位置に格納されているとき、該遷移先への遷移操作を行い、該入力記号に対する操作が該対応する位置に格納されていないとき、前記シフト操作を行うことを特徴とする照合装置。
  11. 与えられた記号列をキーとし、照合対象ファイル中に該キーが存在するか否かを、有限状態機械を用いて判定するコンピュータのためのプログラムを記録した記録媒体であって、
    少なくとも1つ以上のキーに関する照合操作を定義した前記有限状態機械の状態遷移表であって、前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな該状態遷移表を参照しながら、前記ファイルに含まれる各記号に対応する操作を行い、該ファイル中の記号列を前記1つ以上のキーと照合する際に、
    前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とからなる、圧縮された配列形式で格納された前記スパースな状態遷移表を参照して該確認ラベル配列内の該ラベルを確認することで、該入力記号に対する操作が該スパースな状態遷移表に定義されているか否かをチェックする機能と、
    前記入力記号に対する遷移先が前記対応する位置に格納されているとき、該遷移先への遷移操作を行う機能と、
    前記入力記号に対する操作が前記対応する位置に格納されていないとき、前記シフト操作を行う機能と
    を前記コンピュータに実現させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体。
  12. 与えられた記号列をキーとし、照合対象ファイル中に該キーが存在するか否かを判定するための有限状態機械を作成するコンピュータのためのプログラムを記録した記録媒体であって、
    少なくとも1つ以上のキーを表現する2進木データを作成する機能と、
    前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな状態遷移表に対応する中間構造の有限状態機械を、該2進木データに基づいて作成する機能と、
    前記中間構造の有限状態機械を、前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とからなる、圧縮された配列形式に変換する際に、該確認ラベル配列内の該ラベルを確認することで前記スパースな状態遷移表に該入力記号に対する操作が定義されているか否かがチェックされ、該入力記号に対する遷移先が該対応する位置に格納されているとき、該遷移先への遷移操作が行われ、該入力記号に対する操作が該対応する位置に格納されていないとき、前記シフト操作が行われるように、該中間構造の有限状態機械を該圧縮された配列形式に変換する機能と
    を前記コンピュータに実現させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体。
  13. コンピュータが、与えられた記号列をキーとし、照合対象ファイル中に該キーが存在するか否かを、有限状態機械を用いて判定する方法において、
    前記コンピュータが、少なくとも1つ以上のキーに関する照合操作を定義した前記有限状態機械の状態遷移表であって、前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな該状態遷移表を参照しながら、前記ファイルに含まれる各記号に対応する操作を行い、該ファイル中の記号列を前記1つ以上のキーと照合する際に、
    前記コンピュータが、前記スパースな該状態遷移表を、前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とからなる、圧縮された配列形式で格納し、
    前記コンピュータが、前記確認ラベル配列内の前記ラベルを確認することで前記入力記号に対する操作が前記スパースな状態遷移表に定義されているか否かをチェックし、
    前記コンピュータが、前記入力記号に対する遷移先が前記対応する位置に格納されているとき、該遷移先への遷移操作を行い、
    前記コンピュータが、前記入力記号に対する操作が前記対応する位置に格納されていないとき、前記シフト操作を行う
    ことを特徴とする照合方法。
  14. コンピュータが、与えられた記号列をキーとし、照合対象ファイル中に該キーが存在するか否かを判定するための有限状態機械を作成する方法において、
    前記コンピュータが、少なくとも1つ以上のキーを表現する2進木データを作成し、
    前記コンピュータが、前記ファイル内の照合位置を照合方向と逆の方向に戻すシフト操作を表すデータを削減したスパースな状態遷移表に対応する中間構造の有限状態機械を、該2進木データに基づいて作成し、
    前記コンピュータが、前記中間構造の有限状態機械を、前記ファイル内の照合位置から入力される入力記号に対して現状態からの遷移先となる次の状態を格納する圧縮された遷移先配列と、該入力記号に対する操作が該遷移先配列内の対応する位置に格納されているかどうかを表すラベルを格納する確認ラベル配列とからなる、圧縮された配列形式に変換する際に、該確認ラベル配列内の該ラベルを確認することで前記スパースな状態遷移表に該入力記号に対する操作が定義されているか否かがチェックされ、該入力記号に対する遷移先が該対応する位置に格納されているとき、該遷移先への遷移操作が行われ、該入力記号に対する操作が該対応する位置に格納されていないとき、前記シフト操作が行われるように、該中間構造の有限状態機械を該圧縮された配列形式に変換する
    ことを特徴とする有限状態機械作成方法。
JP2003358561A 1996-06-27 2003-10-17 スパースな状態遷移表に基づく複数記号列の照合装置および方法 Expired - Fee Related JP4021832B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2003358561A JP4021832B2 (ja) 1996-06-27 2003-10-17 スパースな状態遷移表に基づく複数記号列の照合装置および方法

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
JP16711796 1996-06-27
JP2003358561A JP4021832B2 (ja) 1996-06-27 2003-10-17 スパースな状態遷移表に基づく複数記号列の照合装置および方法

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
JP16724297A Division JP4118363B2 (ja) 1996-06-27 1997-06-24 スパースな状態遷移表に基づく複数記号列の照合装置および方法

Publications (2)

Publication Number Publication Date
JP2004103034A JP2004103034A (ja) 2004-04-02
JP4021832B2 true JP4021832B2 (ja) 2007-12-12

Family

ID=32299938

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2003358561A Expired - Fee Related JP4021832B2 (ja) 1996-06-27 2003-10-17 スパースな状態遷移表に基づく複数記号列の照合装置および方法

Country Status (1)

Country Link
JP (1) JP4021832B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
BRPI0419214B1 (pt) 2004-12-09 2021-09-21 Mitsubishi Denki Kabushiki Kaisha Sistema e método de correspondência de sequência

Also Published As

Publication number Publication date
JP2004103034A (ja) 2004-04-02

Similar Documents

Publication Publication Date Title
US5995963A (en) Apparatus and method of multi-string matching based on sparse state transition list
US4812966A (en) Word block searcher for word processing equipment and searching method therefor
US5680612A (en) Document retrieval apparatus retrieving document data using calculated record identifier
JP2957375B2 (ja) 文書書式のデジタル・イメージの文字認識誤りを修復するデータ処理システム及び方法
JP4261779B2 (ja) データ圧縮装置および方法
US5515532A (en) File management system for memory card
EP0471518B1 (en) Data compression method and apparatus
JP4118363B2 (ja) スパースな状態遷移表に基づく複数記号列の照合装置および方法
US20120041958A1 (en) Efficient retrieval of variable-length character string data
EP0657851A2 (en) File management system for memory card
US4931984A (en) File data retrieving system using retrieval-use-image data
JPS62212849A (ja) デ−タフアイルシステム
US6205580B1 (en) Method for loading a program
CA2275391C (en) File processing method, data processing device, and storage medium
US20020099698A1 (en) Pattern retrieving method, pattern retrieval apparatus, computer-readable storage medium storing pattern retrieval program, pattern retrieval system, and pattern retrieval program
JP4021832B2 (ja) スパースな状態遷移表に基づく複数記号列の照合装置および方法
JP4056962B2 (ja) スパースな状態遷移表に基づく複数記号列の照合装置および方法
US20040015498A1 (en) Method for accessing a storage unit during the search for substrings, and a corresponding storage unit
AU712626B2 (en) Data check method for an external memory and check system for an external ROM data
JPH07210569A (ja) 情報検索方法および情報検索装置
JP4510041B2 (ja) 文書検索システム及びプログラム
Bagchi et al. Biased skip lists
JP4519701B2 (ja) 可変長符号の復号装置
JPS60233782A (ja) 住所読取装置
JP4356495B2 (ja) データ処理装置及びプログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20040212

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20070424

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20070531

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20070710

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20070827

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20070925

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20070927

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20101005

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20101005

Year of fee payment: 3

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20111005

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20111005

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20121005

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20121005

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20131005

Year of fee payment: 6

LAPS Cancellation because of no payment of annual fees