図2は、本実施例2にかかる検索装置の構成を示す図である。図2に示すように、この検索装置100は、入力部110、出力部120、通信制御IF部130、入出力制御IF部140、記憶部150、制御部160を有する。なお、検索装置100は、ネットワークを介して端末装置(図示略)に接続する。
入力部110は、各種の情報を入力する入力部であり、キーボードやマウス、マイクなどを含む。また、後述するモニタ(出力部120)も、マウスと協働してポインティングデバイス機能を実現する。
出力部120は、各種の情報を出力する出力部であり、モニタ(若しくはディスプレイ、タッチパネル)やスピーカ等を含む。通信制御IF部130は、端末装置(図示略)との間における通信を制御する処理部である。入出力制御IF部140は、入力部110、出力部120、通信制御IF部130、記憶部150、制御部160によるデータの入出力を制御する手段である。
記憶部150は、制御部160による各種処理に必要なデータおよびプログラムを記憶する記憶部である。この記憶部150は、XMLデータ150a、符号化データ150b、対応表150c、ACマシン150d、圧縮辞書150e、圧縮データ用ACマシン150f、抽出条件150g、変換後抽出条件150hを有する。
XMLデータ150aは、要素識別子「<」、「</」等により要素が区切られた階層構造を有する文書データである。図3は、XMLデータのデータ構造の一例を示す図である。符号化データ150bは、圧縮されたXMLデータである。図4は、符号化データ150bのデータ構造の一例を示す図である。
対応表150cは、XMLデータ150aのタグ名と、このタグ名に対応する符号を対応付けたテーブルである。図5は、対応表150cのデータ構造の一例を示す図である。
ACマシン150dは、有限個の状態と遷移の組合せを含むデータである。かかるACマシン150dに、テキストデータ(文字列)を入力することで、テキストデータに特定のキーワードが含まれているか否かを照合することが出来る。図6は、ACマシン150dのデータ構造の一例を示す図である。このACマシン150dは、テキストデータに、キーワードAC、BA、BB、BAA、BACDが含まれているか否かを照合するACマシンを示している。
図6に示すように、ACマシン150dは状態0〜8を有している。各状態は、初期状態、通常状態、照合状態に分類される。初期状態は、初めにテキストデータと照合される状態である。通常状態は、2番目以降にテキストデータと照合される状態である。照合状態は、テキストデータが特定のキーワードにヒットした場合に遷移する状態である。図6に示す例では、初期状態を状態1とし、通常状態を状態1,3とし、照合状態を状態2,4〜8とする。
ACマシンは、テキストデータの文字を初期状態0から順次照合し、通常遷移とフェイラ(Failure)遷移を繰り返すことで、テキストデータに含まれるキーワードを判定する。ここで、通常遷移は、照合対象となる状態において、テキストデータの比較対象となる文字による遷移先が存在する場合の遷移を示す。例えば、状態1において、テキストデータの比較対象となる文字がCの場合には、通常遷移となる。テキストデータの文字がCの場合には、状態1から状態2に通常遷移する。
一方、通常遷移の条件に該当しない場合には、フェイラ遷移となる。例えば、状態1において、テキストデータの比較対象となる文字がC以外の場合には、フェイラ遷移となる。状態1においてフェイラ遷移した場合には、状態0となる。ACマシンには、各状態に1本ずつ存在する。図6で省略されているフェイラ遷移は、全て初期状態0に向かっているものとする。
ここで、図6に示したACマシンが有する状態(状態構造体)のデータ構造について説明する。図7は、状態構造体のデータ構造の一例を示す図である。図7に示すように、この状態構造体は、各状態を識別する状態IDと、パターンリストと、通常遷移先へのポインタと、通常遷移先へのポインタと、フェイラ遷移先へのポインタを有する。
このうち、パターンリストは、初期状態0から遷移先の状態までの文字列を格納する。そして、パターンリストは、該当する通常遷移先へのポインタに対応付けられている。例えば、状態1の状態構造体において、状態1から状態2に遷移する通常遷移先のポインタがg[1]に格納されている場合には、plist[1]に初期状態0から状態2までの文字列「AC」が格納される。
圧縮辞書データ150eは、文字の組と、この文字の組に対応付けられた符号を対応付けたテーブルである。図8は、圧縮辞書データ150eのデータ構造の一例を示す図である。例えば、図8に示すように、文字B,Aのペアは、符号Xに対応する。かかる圧縮辞書データ150eは、ACマシン150dから圧縮データ用ACマシン150fを生成する場合に利用する。
圧縮データ用ACマシン150fは、圧縮されたデータに特定のキーワードが含まれるか否かを照合するべく、ACマシン150dにスキップ遷移を加えたACマシンである。図9は、圧縮データ用ACマシン150fのデータ構造の一例を示す図である。
ここで、スキップ遷移は、状態をスキップする通常遷移である。例えば、照合対象となる状態を状態0とし、圧縮データの比較対象となる文字がXの場合には、状態3をスキップして、状態4に遷移する。
抽出条件150gは、XMLデータ150aから抽出するデータの条件である。例えば、抽出条件150gは、「/AAA/BBB="BACD"」となる。ここで、「/AAA/BBB」は、検索位置を指定する項目名である。検索条件「/AAA/BBB="BACD"」は、区切文字「AAA」の下位の階層に存在する区切文字「BBB」に挟まれた文字列のうち、文字列「BACD」を含む文字列を検索する検索条件である。
変換後抽出条件150hは、対応表150cに基づいて、タグ名を変換された抽出条件である。例えば、変換後抽出条件150hは、「/1/2="BACD"」となる。かかる変換後抽出条件150hに含まれるキーワードに基づいて、ACマシン150dが生成される。
制御部160は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する制御部である。図2に示すように、制御部160は、データ管理部160a、データ圧縮処理部160b、ACマシン構築部160c、照合処理部160d、切出処理部160eを有する。
データ管理部160aは、入力部110、通信制御IF部130からXMLデータ、抽出条件を取得した場合に、取得したXMLデータ、抽出条件を記憶部150に格納する処理部である。
データ圧縮処理部160bは、XMLデータ150aを圧縮して符号化データ150bを生成する処理、および、抽出条件150gを変換して変換後抽出条件150hを生成する処理を実行する処理部である。
まず、XMLデータ150aを圧縮して、符号化データ150bを生成する処理について説明する。この符号化データ150bを生成する処理は、XMLデータ150aのタグに挟まれた文字列を圧縮する処理と、タグ名を置換する処理を有する。
文字列を圧縮する処理において、データ圧縮処理部160bは文字列を参照し、隣接する長さ2の文字列を特定する。以下の説明において、隣接する長さ2の文字列を文字ペアと表記する。データ圧縮処理部160bは、文字列に含まれる文字ペアの出現数を計数し、出現数が最大となる文字ペアを、未使用文字(符号)に割当てることで、文字列を圧縮する。データ圧縮処理部160bは、文字列に含まれる文字ペアの出現数が計数閾値未満となるまで、上記処理を繰り返し実行する。
図10は、文字列圧縮の動作例を示す図である。図10の説明において、圧縮対象となる文字列を「ABABACBACD」とする。また、計数閾値αを2とし、文字セットを「A,B,C,D,X,Y,Z」とする。データ圧縮処理部160bは、文字列「ABABACBACD」を参照し、文字ペアを特定する。文字列「ABABACBACD」に含まれる文字ペアは、「A,B」、「B,A」、「A,C」、「C,B」、「C,D」となる。
データ圧縮処理部160bは、文字列と各文字ペアを比較して、各文字ペアの出現数を計数し、計数表に登録する。計数表は、データ圧縮処理部160bが保持しているものとする。文字ペア「A,B」の出現数は2、文字ペア「B,A」の出現数は3、文字ペア「A,C」の出現数は2、文字ペア「C,B」の出現数は1、文字ペア「C,D」の出現数は1となる。ステップS1参照。
続いて、データ圧縮処理部160bは、計数表に登録した各文字ペアのうち、出現数が最大となる文字ペアを特定し、特定した文字ペアに未使用文字を割当てる。文字ペアと未使用文字の関係は、圧縮辞書データ150eに登録する。
ステップS1で作成した計数表を参照すると、文字ペア「B,A」の出現数が最大となるので、データ圧縮処理部160bは、文字ペア「B,A」に未使用文字「X」を割当てる。文字ペア「B,A」に未使用文字「X」を割当てることで、文字列「ABABACBACD」は、文字列「AXXCXCD」となる。データ圧縮処理部160bは、文字ペア「B,A」と未使用文字(符号)「X」の関係を圧縮辞書データ150eに登録する。
データ圧縮処理部160bは、文字列「AXXCXCD」を参照し、文字ペアを特定する。文字列「AXXCXCD」に含まれる文字ペアは、「A,X」、「X,X」、「X,C」、「C,X」、「C,D」となる。
データ圧縮処理部160bは、文字列と各文字ペアを比較して、各文字ペアの出現数を計数し、計数表に登録する。文字ペア「A,X」の出現数は1、文字ペア「X,X」の出現数は1、文字ペア「X,C」の出現数は2、文字ペア「C,X」の出現数は1、文字ペア「C,D」の出現数は1となる。ステップS2参照。
ステップS2で作成した計数表を参照すると、文字ペア「X,C」の出現数が最大となるので、データ圧縮処理部160bは、文字ペア「X,C」に未使用文字「Y」を割当てる。文字ペア「X,C」に未使用文字を割当てることで、文字列「AXXCXCD」は、文字列「AXYYD」となる。データ圧縮処理部160bは、文字ペア「X,C」と未使用文字(符号)「Y」の関係を圧縮辞書データ150eに登録する。
データ圧縮処理部160bは、文字列「AXYYD」を参照し、文字ペアを特定する。文字列「AXYYD」に含まれる文字ペアは、「A,X」、「X,Y」、「Y,Y」、「Y,D」となる。
データ圧縮処理部160bは、文字列と各文字ペアを比較して、各文字ペアの出現数を計数し、計数表に登録する。文字ペア「A,X」の出現数は1、「X,Y」の出現数は1、「Y,Y」の出現数は1、「Y,D」の出現数は1となる。ステップS3参照。
データ圧縮処理部160bは、各文字ペアの出現数が計数閾値α未満となった場合、あるいは、文字セットに未使用文字が存在しない場合に、文字列の圧縮を終了する。データ圧縮処理部160bは、文字列の圧縮が終了した場合に、圧縮後の文字列と圧縮辞書データ150eを出力する。ステップS4参照。
データ圧縮処理部160bは、XMLデータ150aに含まれる全ての文字列に対して、上述した圧縮処理を実行する。以下の説明において、文字列を圧縮したXMLデータを文字列圧縮済みデータと表記する。図11は、文字列圧縮済みデータのデータ構造の一例を示す図である。図3のXMLデータ150aと、図11の文字列圧縮済みデータを比較すると、文字列「ABABACBACD」が文字列「AXYYD」に圧縮されている。
続いて、タグ名を置換する処理について説明する。データ圧縮処理部160bは、文字列圧縮済みデータをスキャンし、文字列圧縮済みデータに出現する全てのタグ名を対応表150cに登録する。データ圧縮処理部160bは、対応表150cに登録されたタグ名に対して、それぞれ固有の符号を割当てる。そして、データ圧縮処理部160bは、文字列圧縮済みデータと対応表150cとを比較して、文字列圧縮済みデータのタグ名を、該当する符号に置換することで、符号化データ150bを生成する。
例えば、文字列圧縮済みデータを、図11に示す文字列圧縮済みデータとし、対応表150cを、図5に示す対応表とする。この場合、データ圧縮処理部160bは、文字列圧縮済みデータ中のタグ名「AAA」、「BBB」、「CCC」はそれぞれ符号「1」、「2」、「3」に置換し、図4に示す符号化データを生成する。
続いて、抽出条件150gを変換して変換後抽出条件150hを生成する処理について説明する。データ圧縮処理部160bは、抽出条件150gと対応表150cを比較して、抽出条件150gに含まれるタグ名を、符号に置換することで、変換後抽出条件150hを生成する。
例えば、対応表150cを、図5に示す対応表とし、抽出条件150cを「/AAA/BBB="BACD"」とする。この場合、データ圧縮処理部160bは、抽出条件150cのタグ名「AAA」、「BBB」をそれぞれ「1」、「2」に置換し、変換後抽出条件150h「/1/2="BACD"」を生成する。
次に、図2に示したACマシン構築部160cについて説明する。ACマシン構築部160cは、変換後抽出条件150hに含まれるキーワードに基づいて、当該キーワードを照合するACマシン150dを生成する。そして、ACマシン構築部160cは、圧縮辞書データ150eに基づいて、ACマシン150dにスキップ遷移を追加することで、圧縮データ用ACマシン150fを生成する。
以下において、ACマシン構築部160cについて具体的に説明する。ACマシン構築部160cがACマシン150dを生成する処理について説明した後に、圧縮データ用ACマシン150fを生成する処理について説明する。また、変換後抽出条件150hに含まれるキーワードの集合をパターン集合Πとし、説明の便宜上、パターン集合Π={AC、BA、BB、BAA、BACD}とする。
ACマシン150dを生成する処理には、トライを構築する処理と、フェイラ遷移をトライに追加する処理が含まれる。図12〜図14は、トライT構築処理を説明するための図である。
図12において、ACマシン構築部160cは、初期状態0を作成し、初期状態の状態構造体における通常遷移先をすべて初期状態に設定する(図12、ステップS10)。そして、ACマシン構築部160cは、パターン集合Πからパターン「AC」を取り出す。ACマシン構築部160cは、文字「A」を選択し、文字Aによる初期状態0の通常遷移先を通常状態1に設定する。
ACマシン構築部160cは、文字「C」を選択し、文字Cによる通常状態1の通常遷移先を照合状態2に設定する。また、ACマシン構築部160cは、通常状態1の状態構造体において、照合状態2へのポインタg[C]に対応するパターンリストをPlist[C]=ACに設定する(図12、ステップS11)。
ACマシン構築部160cは、初期状態0に戻り、パターン集合Πからパターン「BA」を取り出す。ACマシン構築部160cは、文字「B」を選択し、文字Bによる初期状態0の通常遷移先を通常状態3に設定する。
ACマシン構築部160cは、文字「A」を選択し、文字Aによる通常状態3の通常遷移先を照合状態4に設定する。また、ACマシン構築部160cは、通常状態3の状態構造体において、照合状態4へのポインタg[A]に対応するパターンリストをPlist[A]=BAに設定する(図12、ステップS12)。
図13において、ACマシン構築部160cは、初期状態0に戻り、パターン集合Πからパターン「BB」を取り出し、文字「B」を選択する。ここで、文字Bによる初期状態0の通常遷移先は通常状態3であり、既に作成済みであるため、現在の状態を通常状態3に遷移する。
ACマシン構築部160cは、文字「B」を選択し、文字Bによる通常状態3の通常遷移先を照合状態5に設定する。また、ACマシン構築部160cは、状態3の状態構造体において、照合状態5へのポインタg[B]に対応するパターンリストをPlist[B]=BBに設定する(図13、ステップS13)。
ACマシン構築部160cは、初期状態0に戻り、パターン集合Πからパターン「BAA」を取り出し、文字「B」を選択する。ここで、文字Bによる初期状態0の通常遷移先は通常状態3であり、既に作成済みであるため、現在の状態を通常状態3に遷移する。
ACマシン構築部160cは、文字「A」を選択する。ここで、文字Aによる通常状態3の通常遷移先は照合状態4であり、既に作成済みであるため、現在の状態を照合状態4に遷移する。
ACマシン構築部160cは、文字「A」を選択する。ACマシン構築部160cは文字「A」による照合状態4の通常遷移先を照合状態6に設定する。また、ACマシン構築部160cは、状態4の状態構造体において、照合状態6へのポインタg[a]に対応するパターンリストをPlist[A]=BAAに設定する(図13、ステップS14)。
図14において、ACマシン構築部160cは、初期状態0に戻り、パターン集合Πからパターン「BACD」を取り出し、文字「B」を選択する。ここで、文字Bによる初期状態0の通常遷移先は通常状態3であり、既に作成済みであるため、現在の状態を通常状態3に遷移する。
ACマシン構築部160cは、文字「A」を選択する。ここで、文字Aによる通常状態3の通常遷移先は状態4であり、既に作成済みであるため、現在の状態を照合状態4に遷移する。
ACマシン構築部160cは、文字「C」を選択する。ACマシン構築部160cは、文字Cによる照合状態4の通常遷移先を通常状態7に設定する。ACマシン構築部160cは、文字「D」を選択する。ACマシン構築部160cは、文字Dによる通常状態7の通常遷移先を照合状態8に設定する(図14、ステップS15)。ステップS15が終了した段階で、パターン集合Πに含まれる全てのパターンの登録が終了し、トライTの構築処理が終了する。
次に、ACマシン構築部160cがフェイラ遷移をトライに追加する処理について説明する。図15〜図23は、フェイラ遷移追加処理を説明するための図である。ACマシン構築部160cは、初期状態0から通常遷移先となる状態を判定し、判定した状態をキュー(Queue)に登録する。ACマシン構築部160cは、キューに登録された状態のフェイラ遷移先を初期状態0に設定する。ここで、初期状態0の通常遷移先は、通常状態1,3となるので、キューに1,3を登録する。また、通常状態1,3のフェイラ遷移先を初期状態0に設定する。図15参照。
ACマシン構築部160cは、キューの先頭の状態1を取り出し、取り出した状態1を状態sに設定する。ACマシン構築部160cは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。この場合、ACマシン構築部160cは、文字Cを抽出し、集合Xに文字Cを格納する。
ACマシン構築部160cは、集合Xから文字Cを取り出し、状態sの通常遷移先となる状態2をキューの最後尾に追加する。ACマシン構築部160cは、状態1からフェイラ遷移した初期状態0に移行し、文字Cに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、初期状態0となる。ACマシン構築部160cは、状態s(通常状態1)から文字Cにより遷移する状態nextを判定し、判定した状態(照合状態2)のフェイラ遷移先を初期状態0に設定する。図16参照。
ACマシン構築部160cは、キューの先頭の状態3を取り出し、取り出した状態3を状態sに設定する。ACマシン構築部160cは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。この場合は、ACマシン構築部160cは、文字A、Bを抽出し、集合Xに文字A、Bを格納する。
ACマシン構築部160cは、集合Xから文字Aを取り出し、状態sの文字Aの通常遷移先となる状態4をキューの最後尾に追加する。ACマシン構築部160cは、状態sからフェイラ遷移した初期状態0に移行し、文字Aに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態1となる。ACマシン構築部160cは、状態s(通常状態3)から文字Aにより遷移する状態nextを判定し、判定した状態(照合状態4)のフェイラ遷移先を状態1に設定する。図17の状態4参照。
ACマシン構築部160cは、集合Xから文字Bを取り出し、状態s(通常状態3)の文字Bの通常遷移先となる状態5をキューの最後尾に追加する。ACマシン構築部160cは、状態sからフェイラ遷移した初期状態0に移行し、文字Bに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態3となる。ACマシン構築部160cは、状態sから文字Bにより遷移する状態nextを判定し、判定した状態(照合状態5)のフェイラ遷移先を状態3に設定する。図17の状態5参照。
ACマシン構築部160cは、キューの先頭の状態2を取り出し、取り出した状態2を状態sに設定する。ACマシン構築部160cは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する。図18参照。
ACマシン構築部160cは、キューの先頭の状態4を取り出し、取り出した状態4を状態sに設定する。ACマシン構築部160cは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。この場合は、ACマシン構築部160cは、文字A、Cを抽出し、集合Xに文字A、Cを格納する。
ACマシン構築部160cは、集合Xから文字Aを取り出し、状態s(照合状態4)の文字Aの通常遷移先となる状態6をキューの最後尾に追加する。ACマシン構築部160cは、状態sからフェイラ遷移した状態1に移行する。状態1において、文字Aに対する通常遷移先はNullであるため、再度フェイラ遷移し、初期状態0に移行する。
そして、初期状態0において、文字Aに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態1となる。ACマシン構築部160cは、状態s(通常状態4)から文字Aにより遷移する状態nextを判定し、判定した状態(照合状態6)のフェイラ遷移先を状態1に設定する。図19の状態6参照。
ACマシン構築部160cは、集合Xから文字Cを取り出し、状態s(照合状態4)の文字Cの通常遷移先となる状態7をキューの最後尾に追加する。ACマシン構築部160cは、状態sからフェイラ遷移した状態1に移行し、文字Cに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、状態2となる。ACマシン構築部160cは、状態sから文字Cによる遷移する状態nextを判定し、判定した状態(通常状態7)のフェイラ遷移先を状態2に設定する。
また、ACマシン構築部160cは、状態7のフェイラ遷移先が照合状態2となる。この場合、ACマシン構築部160cは、状態4の状態構造体において、状態7へのポインタg[C]に対応するパターンリストをPlist[C]=ACに設定し、状態7を通常状態から照合状態に変更する。図19参照の状態4、7参照。
ACマシン構築部160cは、キューの先頭の状態5を取り出し、取り出した状態5を状態sに設定する。ACマシン構築部160cは、状態sにおいてg[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する。図20参照。
ACマシン構築部160cは、キューの先頭の状態6を取り出し、取り出した状態6を状態sに設定する。ACマシン構築部160cは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する。図21参照。
ACマシン構築部160cは、キューの先頭の状態7を取り出し、取り出した状態7を状態sに設定する。ACマシン構築部160cは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。この場合は、ACマシン構築部160cは、文字Dを抽出し、集合Xに文字Dを格納する。
ACマシン構築部160cは、集合Xから文字Dを取り出し、状態s(照合状態7)の文字Dの通常遷移先となる状態8をキューの最後尾に追加する。ACマシン構築部160cは、状態sからフェイラ遷移した状態2に移行する。状態2において、文字Dに対する通常遷移先はNullであるため、再度フェイラ遷移し、初期状態0に移行する。
ACマシン構築部160cは、初期状態0において、文字Dに対する通常遷移先を判定することで、状態nextのフェイラ遷移先を判定すると、初期状態0となる。ACマシン構築部160cは、状態s(照合状態7)から文字Dにより遷移する状態nextを判定し、判定した状態(照合状態8)のフェイラ遷移先を初期状態0に設定する。図22の状態8参照。
ACマシン構築部160cは、キューの先頭の状態8を取り出し、取り出した状態8を状態sに設定する。ACマシン構築部160cは、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aを抽出し、集合Xに格納する。状態sに通常遷移先は存在しないので、次のステップに移行する。そして、キューに状態が存在しなくなった場合に、パターン集合ΠのACマシンが完了する。図23参照。
次に、ACマシン構築部160cが、ACマシン150dにスキップ遷移を追加して、圧縮データ用ACマシン150fを生成する処理について説明する。圧縮辞書データ150eの文字ペアをa,bとした場合、ACマシン構築部160cは、ACマシン150dのパスをスキャンし、文字aの遷移と文字bの遷移が連続する箇所を判定する。そして、ACマシン構築部160cは、ACマシン150dの該当箇所にスキップ遷移を追加する。
また、ACマシン構築部160cは、ACマシン150dのパスをスキャンし文字aの遷移と、文字bの遷移がフェイラ遷移を挟む箇所を判定する。そして、ACマシン構築部160cは、ACマシン150dの該当箇所にスキップ遷移を追加する。
図24〜図26は、圧縮データ用ACマシン構築処理を説明するための図である。ACマシン構築部160cは、圧縮辞書データ150eに登録された文字ペアに対応するスキップ遷移をACマシン150dに追加する。
まず、ACマシン構築部160cは、圧縮辞書データ150eの1段目に登録された文字ペア「B,A」に対応するスキップ遷移をACマシン150dに追加する。ACマシン構築部160cは、ACマシン150dに含まれる全パスをスキャンし、文字Bの遷移と文字Aの遷移が連続する箇所を判定する。
ACマシン構築部160cは、ACマシン150dのパス上の状態sと状態tに対して、状態sの文字Bによる通常遷移先が状態tとなり(s.g[code(B)]=t)、かつ、状態tの、文字Aによる通常遷移先が状態uとなる場合(s.g[code(A)]=u)に、状態sにスキップ遷移Xを作成する(s.g[code(X)]=u)。このとき、状態sのスキップ遷移Xのパターンリスト(s.Plist[code(X)])は、s.Plist[code(X)]=s.Plist[code(B)]∪t.Plist[code(A)]とする。
ACマシン150dの全パスの中で、(s.g[code(B)]=t)かつ(t.g[code(A)]=u)の条件を満たす状態s、状態t、状態uの組は、初期状態0、通常状態3、照合状態4となる。従って、ACマシン構築部160cは、初期状態0の文字Xによる通常遷移先のポインタ(g[code(X)])に、照合状態4を設定し、該当するパターンリスト(Plist[X])に「BA」を登録する。図24の初期状態0参照。
続いて、ACマシン構築部160cは、ACマシン150dのパスをスキャンし文字Bの遷移と、文字Aの遷移がフェイラ遷移を挟む箇所を判定する。ACマシン構築部160cは、ACマシン150dのパス上の状態sと状態tに対して、状態sの文字Bによる通常遷移先が状態tとなり(s.g[code(B)]=t)、かつ、状態tの、文字Aによる通常遷移先がNullとなる(t.g[code(A)]=Null)状態tを全て集合Fに格納する。
ACマシン150dの全パスの中で、(s.g[code(B)]=t)かつ(t.g[code(A)]=Null)の条件を満たす状態tは、照合状態5となるため、ACマシン構築部160cは、照合状態5を集合Fに格納する。ACマシン構築部160cは、集合Fのうち、状態tからフェイラ遷移し、フェイラ遷移先の状態の文字Aによる通常遷移先がNull(t.fail.g[code(A)]=Null)となる状態tを削除する。照合状態5は、(t.fail.g[code(A)]=Null)の条件を満たさないので、集合Fに残る。
ACマシン構築部160cは、集合Fの任意の状態tに対して、状態tからフェイラ遷移し、フェイラ遷移先の状態の文字Aによる通常遷移先を状態u(t.fail.g[code(A)]=u)とする。また、ACマシン構築部160cは、(s.g[code(B)]=t)の条件を満たす状態を状態sとする。このとき、状態sのスキップ遷移Xのパターンリスト(s.Plis[code(X)])を、s.Plist[code(X)]=s.Plist[code(B)]∪t.fail.Plist[code(A)]とする。
(t.fail.g[code(A)]=u)、(s.g[code(B)]=t)を満たす状態sは、通常状態3となる。ACマシン構築部160cは、通常状態3の文字Xによる通常遷移先のポインタ(g[code(X)])に、照合状態4を設定し、該当するパターンリスト(Plist[X])に「BB,BA」を登録する。図25の通常状態3参照。
続いて、ACマシン構築部160cは、圧縮辞書データ150eの2段目に登録された文字ペア「X,C」に対応するスキップ遷移をACマシン150dに追加する。ACマシン構築部160cは、ACマシン150dの該当箇所にスキップ遷移を追加する。
ACマシン構築部160cは、ACマシン150dのパス上の状態sと状態tに対して、状態sの文字Xによる通常遷移先が状態tとなり(s.g[code(X)]=t)、かつ、状態tの文字Cによる通常遷移先が状態uとなる場合(s.g[code(C)]=u)に、状態sにスキップ遷移Yを作成する(s.g[code(Y)]=u)。このとき、状態sのスキップ遷移Yのパターンリスト(s.Plist[code(Y)])は、s.Plist[code(Y)]=s.Plist[code(X)]∪t.Plist[code(C)]とする。
ACマシン150dの全パスの中で、(s.g[code(X)]=t)かつ(s.g[code(C)]=u)の条件を満たす状態s、状態t、状態uの組は、初期状態0、照合状態4、照合状態7の組と、通常状態3、照合状態4、照合状態7の組となる。
ACマシン構築部160cは、初期状態0の文字Yによる通常遷移先のポインタ(g[code(Y)])に、照合状態7を設定し、該当するパターンリスト(Plist[Y])に「BA、AC」を登録する。図26の初期状態0参照。
また、ACマシン構築部160cは、通常状態3の文字Yによる通常遷移先のポインタ(g[code(Y)])に、照合状態7を設定し、該当するパターンリスト(Plist[Y])に「BB、BA、AC」を登録する。図26の通常状態3参照。
続いて、ACマシン構築部160cは、ACマシン150dのパスをスキャンし文字Xの遷移と、文字Cの遷移がフェイラ遷移を挟む箇所を判定する。図26に示すACマシン150dにおいて、文字Xの遷移と、文字Cの遷移がフェイラ遷移を挟む箇所は存在しないので、図26に示したACマシンが、圧縮データ用ACマシン150fとなる。
次に、図2に示した照合処理部160dについて説明する。照合処理部160dは、照合対象となるテキストが与えられた場合に、与えられたテキストと圧縮データ用ACマシン150fとを比較して、テキストに特定のキーワードが含まれているか否かを判定する処理部である。
図27〜図32は、照合処理を説明するための図である。ここでは一例として、照合対象となるテキストを「AXYYD」とする。照合処理部160dは、現在の状態sを圧縮データ用ACマシン150fの初期状態0に設定する。図27参照。
照合処理部160dは、テキストの1文字目「A」を読み出し、文字Aによる初期状態0の通常遷移先を判定する。文字Aによる初期状態0の遷移先は、通常状態1であるため、現在の状態sを通常状態1に設定する。図28参照。
照合処理部160dは、テキストの2文字目「X」を読み出し、文字Xによる通常状態3の遷移先を判定する。文字Xによる通常状態3の通常遷移先は存在しないので、通常状態3からフェイラ遷移し、状態sを初期状態0に設定する。
照合処理部160dは、文字Xによる初期状態0の通常遷移先を判定する。文字Xによる初期状態0の通常遷移先は照合状態4であるため、現在の状態sを照合状態4に設定する。また、照合状態4にヒットしたため、照合処理部160dは、初期状態0のg[code(X)]に対応付けられたパターンリストPlist[X]={BA}を、集合Rに登録する。図29参照。
照合処理部160dは、テキストの3文字目「Y」を読み出し、文字Yによる照合状態4の通常遷移先を判定する。文字Yによる照合状態4の通常遷移先は存在しないので、照合状態4からフェイラ遷移し、状態sを通常状態1に設定する。
照合処理部160dは、文字Yによる通常状態1の通常遷移先を判定する。文字Yによる通常状態1の通常遷移先は存在しないので、通常状態1からフェイラ遷移し、状態sを初期状態0に設定する。
照合処理部160dは、文字Yによる初期状態0の通常遷移先を判定する。文字Yによる初期状態0の通常遷移先は照合状態7であるため、現在の状態sを照合状態7に設定する。また、照合状態7にヒットしたため、照合処理部160dは、初期状態0のg[code(Y)]に対応付けられたパターンリストPlist[X]={BA,AC}を、集合Rに登録する。なお、照合処理部160dは、BAが既に集合Rに登録されているので、ACを集合Rに登録する。図30参照。
照合処理部160dは、テキストの4文字目「Y」を読み出し、文字Yによる照合状態7の通常遷移先を判定する。文字Yによる照合状態7の通常遷移先は存在しないので、照合状態7からフェイラ遷移し、状態sを照合状態2に設定する。
照合処理部160dは、文字Yによる照合状態2の通常遷移先を判定する。文字Yによる照合状態2の通常遷移先は存在しないので、照合状態2からフェイラ遷移し、状態sを初期状態0に設定する。
照合処理部160dは、文字Yによる初期状態0の通常遷移先を判定する。文字Yによる初期状態0の通常遷移先は照合状態7であるため、現在の状態sを照合状態7に設定する。また、照合状態7にヒットしたため、照合処理部160dは、初期状態0のg[code(Y)]に対応付けられたパターンリストPlist[X]={BA,AC}を、集合Rに登録する。なお、照合処理部160dは、BA、ACが既に集合Rに登録されているので、集合Rには何も登録しない。図31参照。
照合処理部160dは、テキストの5文字目「D」を読み出し、文字Dによる照合状態7の通常遷移先を判定する。文字Dによる照合状態7の通常遷移先は照合状態8であるため、現在の状態sを照合状態8に設定する。また、照合状態8にヒットしたため、照合所理部160dは、照合状態7のg[code(D)]に対応付けられたパターンリストPlist[D]={BACD}を、集合Rに登録する。図32参照。
図27〜図32に示したように、照合処理部160dは、テキストを1文字ずつ読み出して、圧縮データ用ACマシン150fの各状態を遷移し、照合処理を実行することで、例えば、テキスト「AXYYD」が特定のキーワード「BA、AC、BADC」を含んでいることを判定する。なお、照合処理部160dは、テキスト「AXYYD」をまとめて取得する代わりに、1文字ずつテキストを取得した場合でも、図27〜図32と同様にして、照合処理を実行する。
次に、図2に示した切出処理部160eについて説明する。切出し処理部160eは、照合処理部160dと協働し、変換後抽出条件150hに対応する符号化データ150bの位置を算出する処理部である。以下の説明において、変換後抽出条件150hに対応する符号化データ150bの位置を切出し位置リストと表記する。
切出し処理部160eは、切出し位置リストに対応する位置の情報を符号化データ150bから切出し、切出した情報を、検索条件の回答として出力部120または通信制御IF部130に出力する。
以下において、切出処理部160eの処理を具体的に説明する。切出処理部160eは、符号化データ150bを1文字ずつスキャンし、文字の種類に応じた各種の処理を実行する。ここでは、スキャンした文字が、文字列部の場合、開始タグ「<>」の場合、終了タグの場合「</>」に分けて説明する。
スキャンした文字が文字列部の場合について説明する。切出処理部160eは、スキャンした文字が文字列部の場合に、スキャンした文字を照合処理部160dに出力し、圧縮データ用ACマシン150fの照合状態に遷移したか否かの情報を照合処理部160dから取得する。
上述した照合処理部160dは、上述した処理に加え、切出処理部160eから文字を取得した場合には、現在の状態sを遷移させ、照合状態に遷移したか否かを情報を切出処理部160eに通知するものとする。切出処理部160eは、照合状態に遷移した旨の情報を取得した場合には、キーワードフラグkの値を1に設定する。
続いて、スキャンした文字が開始タグの場合について説明する。切出処理部160eは、スキャンした文字が開始タグの場合に、タグ符号と現在の位置(符号化データ150bの先頭文字から数えた、該当タグ符号の「<」までの数;start)をスタックSに登録する。
また、切出処理部160eは、スタックSに登録したタグ符号が、変換後抽出条件150hの項目部と一致しているか否かを判定し、一致している場合には項目フラグfを1に設定する。
続いて、スキャンした文字が終了タグの場合について説明する。切出処理部160eは、スキャンした文字が終了タグの場合に、キーワードフラグkと項目フラグfが1であるか否かを判定する。キーワードフラグkと項目フラグfが1の場合に、切出処理部160eは、現在の位置(符号化データ150bの先頭文字から数えた、該当タグ符号の「>」までの数)をendに登録し、スタックSの最終要素のstartを取得する。そして、切出処理部160eは、取得したstartとendの組合せ(start、end)を切出し位置リストに登録する。切出処理部160eは、スタックSからタグ符号を取り出し、キーワードフラグkを0に設定する。
ここで、符号化データ150bを図4に示す符号化データとし、変換後抽出条件「/1/2="BACD"」として、切出処理部160eの処理を説明する。切出処理部160eの初期設定として、キーワードフラグkと項目フラグfを0、スタックSを空スタック、切出し位置リストRを空リストとする。
切出処理部160eは、符号化データ150bの文字「<1>」をスキャンする。文字「<1>」は、開始タグである。切出処理部160eは、スタックSにタグ符号「<1>」と現在位置「1」をスタックSに登録する。スタックS={(<1>、1)}。切出処理部160eは、スタックSのタグ符号「<1>」が、変換後抽出条件の項目部「/1/2」と一致しないので、項目フラグfを0のままにする。
切出処理部160eは、符号化データ150bの文字「<2>」をスキャンする。文字「<2>」は、開始タグである。切出処理部160eは、スタックSにタグ符号「<2>」と現在位置「4」をスタックSに登録する。スタックS={(<1>、1)、(<2>)、4}。切出処理部160eは、スタックSのタグ符号「<1>」、「<2>」が、変換後抽出条件の項目部「/1/2」と一致するので、項目フラグfを1に設定する。
切出処理部160eは、符号化データ150bの文字列「AXYYD」をスキャンする。切出処理部160eは、文字列「AXYYD」を照合処理部160dに出力し、照合結果を取得する。照合状態に遷移した旨が照合結果に含まれる場合、切出処理部160eは、キーワードフラグkを1に設定する。
切出処理部160eは、符号化データ150bの文字「<2/>」をスキャンする。文字「<2/>」は終了タグであり、項目フラグfとキーワードフラグkが1である。この場合、切出処理部160eは、end=15と、スタックSの最終要素のstart値(=4)の組を、切出し位置リストRに登録する。R={(4,15)}。切出処理部160eは、スタックSから(<2>、4)を取り出す(ホップする)。スタックS={(<1>、1)}。切出処理部160eは、キーワードフラグkを0に設定する。
切出処理部160eは、符号化データ150bの文字「<3>」をスキャンする。文字「<3>」は、開始タグである。切出処理部160eは、スタックSにタグ符号「<3>」と現在位置「16」をスタックSに登録する。スタックS={(<1>、1)、(<3>)、16}。切出処理部160eは、スタックSのタグ符号「<1>」、「<3>」が、変換後抽出条件の項目部「/1/2」と一致しないので、項目フラグfを0に設定する。
切出処理部160eは、符号化データ150bの文字列「AXYYD」をスキャンする。切出処理部160eは、文字列「AXYYD」を照合処理部160dに出力し、照合結果を取得する。照合状態に遷移した旨が照合結果に含まれる場合、切出処理部160eは、キーワードフラグkを1に設定する。
切出処理部160eは、符号化データ150bの文字「</3>」をスキャンする。文字「</3>」は終了タグである。キーワードフラグkは1であるが、項目フラグfは0であるため、切出処理部160eは、切出し位置リストRに対する登録を行わない。切出処理部160eは、スタックSから(<3>、16)を取り出す(ポップする)。スタックS={(<1>、1)}。切出処理部160eは、キーワードフラグkを0に設定する。
切出処理部160eは、符号化データ150bの文字「</1>」をスキャンする。文字「</1>」は終了タグである。キーワードフラグkと項目フラグfが0であるため、切出処理部160eは、切出し位置リストRに対する登録を行わない。切出処理部160eは、スタックSから(<1>、1)を取り出す。スタックS=空スタック。切出処理部160eは、キーワードフラグkを0に設定する。
切出処理部160eは、符号化データ150bを最後までスキャンしたので、切出し位置リストR={(4,15)}に基づいて、情報を符号化データ150bから切り出す。この場合、切出し処理部160eは、符号化データ150bの先頭文字から4文字目と16文字目の間に位置する文字「<2>AXYYD</2>」を切り出す。
次に、本実施例2にかかる検索装置100の処置手順について説明する。まず、データ圧縮処理部160bが実行する圧縮処理について説明する。図33は、圧縮処理の処理手順を示すフローチャートである。
図33に示すように、データ圧縮処理部160bは、文字列計数処理を実行し(ステップS101)、辞書構築・文字列置換処理を実行する(ステップS102)。そして、データ圧縮処理部160bは、タグ名置換処理を実行する(ステップS103)。
ここで、図33のステップS101に示した文字列計数処理の処理手順について説明する。図34は、文字列計数処理の処理手順を示すフローチャートである。図34に示すように、データ圧縮処理部160bは、一つ前の文字c0=εに設定し、現在の文字c1にXMLデータD(XMLデータ150a)の先頭文字を代入する(ステップS111)。
データ圧縮処理部160bは、計数表Tを初期化し、タグ内フラグf=0に設定する(ステップS112)。データ圧縮処理部160bは、XMLデータDに次の文字が存在するか否かを判定する(ステップS113)。データ圧縮処理部160bは、XMLデータDに次の文字が存在しない場合に(ステップS114,No)、計数表Tを出力する(ステップS115)。
一方、データ圧縮処理部160bは、XMLデータDに次の文字が存在する場合に(ステップS114,Yes)、c0=c1とし、c1に次の文字を代入する(ステップS116)。データ圧縮処理部160bは、c1がタグ開始記号(<)またはタグ終了記号(>)であるかを判定する(ステップS117)。
データ圧縮処理部160bは、c1がタグ開始記号ではなく、かつ、タグ終了記号ではない場合に(ステップS118,No)、ステップS121に移行する。一方、データ圧縮処理部160bは、c1がタグ開始記号またはタグ終了記号の場合に(ステップS118,Yes)、c1がタグ開始記号ならf=1とし、c1がタグ終了記号ならf=0に設定する(ステップS119)。
f=1の場合には(ステップS120,No)、ステップS113に移行する。f=0の場合に(ステップS120,Yes)、データ圧縮処理部160bは、c0とc1を繋げた長さ2の文字列を計数表Tに登録する。該文字列が登録時未の場合、データ圧縮処理部160bは、該文字列の出現数を1増やし(ステップS121)、ステップS113に移行する。
次に、図33のステップS102に示した辞書構築・文字列置換処理の処理手順について説明する。図35は、辞書構築・文字列置換処理の処理手順を示すフローチャートである。図35に示すように、データ圧縮処理部160bは、未使用文字集合Uに文字が存在するか否かを判定する(ステップS131)。
データ圧縮処理部160bは、未使用文字集合Uに文字が存在しない場合には(ステップS132,No)、XMLデータDを、文字列圧縮済みデータCとして出力し、圧縮辞書データDic(圧縮辞書データ150e)を出力する(ステップS133)。
一方、データ圧縮処理部160bは、未使用文字集合Uに文字が存在する場合に(ステップS132,Yes)、圧縮辞書データ150eに未登録な文字列のうちで、もっとも頻度の高い(出現数が最も大きい)文字列sを計数表Tから検索する(ステップS134)。
データ圧縮処理部160bは、文字列sの出現数が計数閾値α以上であるか否かを判定する(ステップS135)。データ圧縮処理部160bは、文字列sの出現数が計数閾値α未満の場合に(ステップS136,No)、ステップS133に移行する。
データ圧縮処理部160bは、文字列sの出現数が計数閾値α以上の場合に(ステップS136,Yes)、未使用文字集合Uの文字aに対して、(s、a)の組を圧縮辞書データDicに加え、Uから文字aを削除する(ステップS137)。
データ圧縮処理部160bは、XMLデータD中の全ての文字列sを文字aに置換し(ステップS138)、文字列計数処理を実行し(ステップS139)、ステップS131に移行する。図35のステップS139に示す文字列計数処理は、図34に示した文字列計数処理と同じである。
次に、図33のステップS103に示したタグ名置換処理の処理手順について説明する。図36は、タグ名置換処理の処理手順を示すフローチャートである。図36に示すように、データ圧縮処理部160bは、XMLデータDをスキャンし、Dに出現する全てのタグ名を対応表T(対応表150c)に登録する(ステップS141)。
データ圧縮処理部160bは、対応表Tに登録された全てのタグ名に対して、符号を割り当てる(ステップS142)。データ圧縮処理部160bは、XMLデータDの全てのタグ名を、対応表Tに割当てられた符号に変換し(ステップS143)、符号化データB(符号化データ150b)を出力する(ステップS144)。
次に、ACマシン構築部160c、照合処理部160d、切出処理部160eが実行する構築処理について説明する。図37は、構築処理の処理手順を示すフローチャートである。図37に示すように、ACマシン構築部160cは、抽出条件受け付け処理を実行する(ステップS201)。
そして、ACマシン構築部160cは、ACマシン構築処理を実行し(ステップS202)、照合処理部160d、切出処理部160eは、切出し位置計算処理を実行する(ステップS203)。
ここで、図37のステップS201に示した抽出条件受け付け処理の処理手順について説明する。図38は、抽出条件受け付け処理の処理手順を示すフローチャートである。図38に示すように、ACマシン構築部160cは、抽出条件Q(抽出条件150g)を受け付ける(ステップS211)。
ACマシン構築部160cは、対応表150cを用いて抽出条件Qにおける項目名を書き換え(ステップS212)、書き換えた抽出条件Qを抽出条件Q’とする(ステップS213)。
続いて、図37のステップS202に示したACマシン構築処理の処理手順について説明する。図39は、ACマシン構築処理の処理手順を示すフローチャートである。図39に示すように、ACマシン構築部160cは、ΠのトライTを構築し(ステップS221)、トライ(Π)にフェイラ遷移を追加する(ステップS222)。
ACマシン構築部160cは、ACマシンAC(Π)にスキップ遷移を追加し(ステップS223)、圧縮データ用ACマシンAC_b(Π、dic)を出力する(ステップS224)。
ここで、図39のステップS221に示したΠのトライTを構築する処理について説明する。図40は、ΠのトライTを構築する処理の処理手順を示すフローチャートである。図40に示すように、ACマシン構築部160cは、初期状態(id=0)を作成し、トライ(Π)を初期状態のみで構成されるトライに設定する(ステップS231)。
ACマシン構築部160cは、初期状態の全ての通常遷移先を初期状態に設定し(ステップS232)、Πにパターンが存在するか否かを判定する(ステップS233)。ACマシン構築部160cは、Πにパターンが存在しない場合に(ステップS234,No)、ΠのトライT(Π)を出力する(ステップS235)。
ACマシン構築部160cは、Πにパターンが存在しない場合に(ステップS234,Yes)、Πから1つパターンを取り出し、取り出したパターンをpに設定する(ステップS236)。ACマシン構築部160cは、パターン登録処理を実行し(ステップS237)、ステップS233に移行する。
続いて、図40のステップS237に示したパターン登録処理の処理手順について説明する。図41は、パターン登録処理の処理手順を示すフローチャートである。図41に示すように、ACマシン構築部160cは、現在の状態sをトライTの初期状態に設定し、sの前の状態rを空の状態に設定する(ステップS241)。
ACマシン構築部160cは、パターンpに次の文字が存在するか否かを判定する(ステップS242)。ACマシン構築部160cは、パターンpに次の文字が存在しない場合に(ステップS243,No)、パターンpの最後の文字(a)と状態rに対して、rのパターンリストPlist[code(a)]に、pを代入し(ステップS244)、トライTを出力する(ステップS245)。
一方、ACマシン構築部160cは、パターンpに次の文字が存在する場合に(ステップS243,Yes)、次の文字をaとし、aのasciiコードをcode(a)に設定する(ステップS246)。ACマシン構築部160cは、sの通常遷移g[code(a)]=Nullであるか否かを判定する(ステップS247)。
ACマシン構築部160cは、通常遷移g[code(a)]=Nullの場合に(ステップS248,Yes)、ステップS250に移行する。一方、ACマシン構築部160cは、g[code(a)]=Nullではない場合に(ステップS248,No)、状態nを新規作成し、g[code(a)]=nに設定する(ステップS249)。ACマシン構築部160cは、状態rに状態sを代入し、状態sにg[code(a)]を代入し(ステップS250)、ステップS242に移行する。
次に、図39のステップS222に示したトライ(Π)にフェイラ遷移を追加する処理について説明する。図42、図43は、トライ(Π)にフェイラ遷移を追加する処理の処理手順を示すフローチャートである。
図42に示すように、ACマシン構築部160cは、初期状態から通常遷移できる全ての状態sに対して、それらのフェイラ遷移先に初期状態を代入し、現在の状態sをqueueに登録する(ステップS251)。
ACマシン構築部160cは、状態リストqueueに状態が存在するか否かを判定する(ステップS252)。ACマシン構築部160cは、状態リストqueueに状態が存在しない場合に(ステップS253,No)、現在のトライTをACマシンαとして出力する(ステップS254)。
ACマシン構築部160cは、状態リストqueueに状態が存在する場合に(ステップS253,Yes)、状態リストqueueの先頭の状態をsとし、状態リストqueueからsを除去する(ステップS255)。
ACマシン構築部160cは、状態sの通常遷移が全てNullであるか否かを判定する(ステップS256)。ACマシン構築部160cは、状態sの通常遷移が全てNullの場合に(ステップS257,Yes)、ステップS252に移行する。
一方、ACマシン構築部160cは、状態sの通常遷移が全てNullではない場合に(ステップS257,No)、状態sにおいて、g[code(a)]≠Nullとなる全ての文字aの集合をAに設定する(ステップS258)。
ACマシン構築部160cは、集合Aに文字が存在するか否かを判定する(ステップS259)。ACマシン構築部160cは、集合Aに文字が存在しない場合に(ステップS260,No)、ステップS252に移行する。
一方、ACマシン構築部160cは、集合Aに文字が存在する場合に(ステップS260,Yes)、図43に移行し、集合Aから文字を1つ取り出し、取り出した文字をaに設定する(ステップS261)。
ACマシン構築部160cは、状態sの通称遷移先next=g[code(a)]を、状態リストqueueの最後尾に追加し(ステップS262)、状態sからフェイラ遷移を繰り返し、文字aに対する通常遷移先がNullにならない最初の状態をfに設定する(ステップS263)。
ACマシン構築部160cは、状態fに対する文字aの通常遷移先へのポインタfnext=g[code(a)]を判定し(ステップS264)、状態nextのフェイラ遷移先をfnext=g[code(a)]に設定する(ステップS265)。ACマシン構築部160cは、状態nextを与える遷移のパターンリストに、状態fnextを与える遷移のパターンリストを足し合わせ(ステップS266)、図42のステップS259に移行する。
次に、図39のステップS223に示したACマシンAC(Π)にスキップ遷移を追加する処理の処理手順について説明する。図44は、ACマシンAC(Π)にスキップ遷移を追加する処理の処理手順を示すフローチャートである。図44に示すように、ACマシン構築部160cは、n=1に設定し(ステップS271)、圧縮辞書データdicにn行目が存在するか否かを判定する(ステップS272)。
ACマシン構築部160cは、圧縮辞書データdicにn行目が存在しない場合に(ステップS273,No)、現在のACマシンAC(Π)を圧縮データ用ACマシンAC_b(Π、dic)として出力する(ステップS274)。
一方、ACマシン構築部160cは、圧縮辞書データdicにn行目が存在する場合に(ステップS273,Yes)、圧縮辞書データdicのn行目において、ペア文字列を(a,b)とおき、置換される文字列をXに設定する(ステップS275)。
ACマシン構築部160cは、第1のスキップ遷移作成処理を実行し(ステップS276)、第2のスキップ遷移作成処理を実行する(ステップS277)。ACマシン構築部160cは、n=n+1に設定し(ステップS278)、ステップS272に移行する。
続いて、図44のステップS276に示した第1のスキップ遷移作成処理の処理手順について説明する。図45は、第1のスキップ遷移作成処理の処理手順を示すフローチャートである。図45に示すように、ACマシン構築部160cは、ACマシンAC(Π)の全パスの集合をPとおき(ステップS281)、Pにパスが存在するか否かを判定する(ステップS282)。
ACマシン構築部160cは、Pにパスが存在しない場合に(ステップS283,No)、現在のACマシンAC(Π)を出力する(ステップS284)。一方、ACマシン構築部160cは、Pにパスが存在する場合に(ステップS283,Yes)、Pから任意のパスを取り出す(ステップS285)。
ACマシン構築部160cは、パスを初期状態から葉に向かって走査する。そして、パス上の状態sとtに対してs.g[code(a)]=t、かつt.g[code(a)]=uが成り立つ場合に、スキップ遷移s.g[code(X)]=uを作成する(ステップS286)。ACマシン構築部160cは、Pからパスを消去し(ステップS287)、ステップS282に移行する。
続いて、図44のステップS277に示した第2のスキップ遷移作成処理の処理手順について説明する。図46は、第2のスキップ遷移作成処理の処理手順を示すフローチャートである。
ACマシン構築部160cは、ACマシンAC(Π)の全状態を探索し(ステップS291)、ある状態sに対して、s.g[code(a)]=tかつt.g[code(b)]=NULLが成り立つものを、集合Fから除去する(ステップS292)。
ACマシン構築部160cは、集合Fに状態tが存在するか否かを判定する(ステップS294)。ACマシン構築部160cは、集合Fに状態tが存在しない場合に(ステップS293,No)、第2のスキップ遷移作成処理を終了する。
一方、ACマシン構築部160cは、集合Fに状態tが存在する場合に(ステップS294,Yes)、集合Fから任意の状態tを選択する(ステップS295)。ACマシン構築部160cは、t.fail.g[code(X)]=uとし、s.g[code(a)]=tとなる状態をsとする場合、スキップ遷移s.g[code(X)]=uを作成する(ステップS296)。ACマシン構築部160cは、選択済みの状態tを消去し(ステップS297)、ステップS293に移行する。
次に、図37のステップS203に示した切出し位置計算処理の処理手順について説明する。かかる切出し位置計算処理を実行することで、切出処理部160eは、抽出条件150gに対応する符号化データ150bの位置を計算し、計算した位置の情報を圧縮データのまま抽出する。図47は、切出し位置計算処理の処理手順を示すフローチャートである。図47に示すように、切出処理部160eは、符号化データBの先頭文字をスキャンし(ステップS301)、スキャンした文字が文字列部であるか否かを判定する(ステップS302)。
切出処理部160eは、スキャンした文字が文字列部である場合に(ステップS303,Yes)、文字にあわせて、圧縮データ用ACマシン150fを1文字遷移させ、照合を検知した場合にk=1に設定し(ステップS304)、ステップS311に移行する。
一方、切出処理部160eは、スキャンした文字が文字列部でない場合に(ステップS303,No)、スキャンした文字が開始タグであるか終了タグであるかを判定する(ステップS305)。
切出処理部160eは、スキャンした文字が終了タグの場合に(ステップS306,No)、f=1かつk=1の場合に、現在位置をendに登録し、スタックSの最終要素のstartを取得し、(start、end)をRに登録する(ステップS307)。ここで、endに登録する現在位置は、符号化データ150bの先頭文字から数えた、終了タグ符号の「>」までの数に対応する。切出処理部160eは、タグ符号をスタックSからポップし(取り出し)、k=0に設定し(ステップS308)、ステップS310に移行する。
一方、切出処理部160eは、スキャンした文字が開始タグの場合に(ステップS306,Yes)、タグ符号と現在位置startをスタックSにプッシュする(格納する)(ステップS309)。ここで、現在位置startは、符号化データ150bの先頭文字から数えた、開始タグ符号の「<」までの数に対応する。
切出処理部160eは、スタックSの値が、変換後抽出条件Q’の項目部と一致する場合にf=1とし、一致しない場合にf=0とし(ステップS310)、全ての文字をスキャンしたか否かを判定する(ステップS311)。
切出処理部160eは、全ての文字をスキャンしていない場合に(ステップS312,No)、次の文字をスキャンし(ステップS313)、ステップS302に移行する。一方、切出処理部160eは、全ての文字をスキャンした場合に(ステップS312,Yes)、Rを出力する(ステップS314)。
上述してきたように、本実施例1にかかる検索装置100は、データ圧縮処理部160bが、XMLデータ150aを圧縮する場合に、XMLデータ150aに含まれる文字列と、XMLデータ150aに含まれる区切り文字とを区別して符号化した符号化データ150bを生成する。符号化データ150bは、文字列と区切文字を区別して符号化しているので、切出処理部160eが抽出条件に基づいて、符号化データ150bから圧縮データをそのまま切出しても、正確な検索結果を得ることが出来る。
ところで、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
図48は、実施例にかかる検索装置100を構成するコンピュータのハードウェア構成を示す図である。図48に示すように、このコンピュータ(検索装置)200は、入力装置201、モニタ202、RAM(Random Access Memory)203、ROM(Read Only Memory)204、他の装置(例えば、端末装置)との間でデータの送受信を行う通信装置205、記憶媒体からデータを読み取る媒体読取装置206、CPU(Central Processing Unit)207、HDD(Hard Disk Drive)208をバス209で接続して構成される。
そして、HDD208には、上記した検索装置100の機能と同様の機能を発揮する検索プログラム208bが記憶されている。CPU207が、検索プログラム208bを読み出して実行することにより、検索プロセス207aが起動される。ここで、検索プロセス207aは、図2に示したデータ管理部160a、データ圧縮処理部160b、ACマシン構築部160c、照合処理部160d、切出処理部160eに対応する。
また、HDD208は、記憶部150に格納されたデータに対応する各種データ208aを記憶する。CPU207は、HDD208に格納された各種データ208aを読み出して、RAM203に格納し、RAM203に格納された各種データ203aを利用して、XMLデータを圧縮し、抽出条件に対応するデータを圧縮データのまま抽出する。
ところで、図48に示した検索プログラム208bは、必ずしも最初からHDD208に記憶させておく必要はない。たとえば、コンピュータに挿入されるフレキシブルディスク(FD)、CD−ROM、DVDディスク、光磁気ディスク、ICカードなどの「可搬用の物理媒体」、または、コンピュータの内外に備えられるハードディスクドライブ(HDD)などの「固定用の物理媒体」、さらには、公衆回線、インターネット、LAN、WANなどを介してコンピュータに接続される「他のコンピュータ(またはサーバ)」などに検索プログラム208bを記憶しておき、コンピュータがこれらから検索プログラム208bを読み出して実行するようにしてもよい。
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)圧縮されたデータの集合を対象に検索処理を実行する検索システムであって、
データの属性を示す区切情報により各データが区切られたデータ集合を取得し、当該データ集合に含まれるデータに基づき符号化データに置換し、さらに、該データの属性を示す区切情報のみに基づき符号化データに置換することで前記データ集合を圧縮する圧縮処理部
を有することを特徴とする検索システム。
(付記2)付記1記載の検索システムであって、
前記圧縮処理部により圧縮されたデータ集合を対象に、検索すべき属性およびデータを有する検索条件を取得した場合に、前記圧縮されたデータ集合の区切情報と置換前の区切情報の関係に基づいて、前記検索条件の属性を符号化データに置換する置換処理部と、
前記検索条件の属性を符号化データに置換された検索条件と前記圧縮されたデータ集合を基にして、前記検索条件に指定される前記圧縮されたデータ集合上の領域を特定し、特定した領域に含まれるデータを出力する検索処理部と
を有することを特徴とする検索システム。
(付記3)付記2記載の検索システムであって、
前記検索処理部は、前記圧縮されたデータ集合を先頭から読み出して、前記検索条件の属性に対応する位置の区切情報に囲まれたデータに対応する符号化データを抽出し、抽出した符号化データに対応するデータが前記検索条件のデータを有するか否かを判定し、判定結果に基づいて、前記検索条件に指定される前記圧縮されたデータ集合上の領域を特定することを特徴とする検索システム。
(付記4)コンピュータに、
データの属性を示す区切情報により各データが区切られた階層構造を有するデータ集合を取得し、当該データ集合に含まれるデータに基づき符号化データに置換し、さらに、該データの属性を示す区切情報のみに基づき符号化データに置換することで前記データ集合を圧縮する圧縮処理機能
を実現させるためのプログラムを記録した記憶媒体。
(付記5)付記4記載の記憶媒体であって、
前記圧縮処理機能により圧縮されたデータ集合を対象に、検索すべき属性およびデータを有する検索条件を取得した場合に、前記圧縮されたデータ集合の区切情報と置換前の区切情報の関係に基づいて、前記検索条件の属性を符号化データに置換する置換処理機能と、
前記検索条件の属性を符号化データに置換された検索条件と前記圧縮されたデータ集合を基にして、前記検索条件に指定される前記圧縮されたデータ集合上の領域を特定し、特定した領域に含まれるデータを出力する検索処理機能と
を実現させるためのプログラムを記録した記憶媒体。
(付記6)付記5記載の記憶媒体であって、
前記検索処理機能は、前記圧縮されたデータ集合を先頭から読み出して、前記検索条件の属性に対応する位置の区切情報に囲まれたデータに対応する符号化データを抽出し、抽出した符号化データに対応するデータが前記検索条件のデータを有するか否かを判定し、判定結果に基づいて、前記検索条件に指定される前記圧縮されたデータ集合上の領域を特定することを特徴とする記憶媒体。
(付記7)圧縮装置が、
データの属性を示す区切情報により各データが区切られた階層構造を有するデータ集合を取得するステップと、
前記データ集合に含まれるデータに基づき符号化データに置換し、さらに、該データの属性を示す区切情報のみに基づき符号化データに置換することで前記データ集合を圧縮するステップと
を実行することを特徴とする圧縮方法。
(付記8)検索装置が、
付記7に記載の圧縮装置により圧縮されたデータ集合を対象に、検索すべき属性およびデータを有する検索条件を取得した場合に、前記圧縮されたデータ集合の区切情報と置換前の区切情報の関係に基づいて、前記検索条件の属性を符号化データに置換するステップと、
前記検索条件の属性を符号化データに置換された検索条件と前記圧縮されたデータ集合を基にして、前記検索条件に指定される前記圧縮されたデータ集合上の領域を特定し、特定した領域に含まれるデータを出力するステップと
を実行することを特徴とする検索方法。
(付記9)前記データを出力するステップにおいて、前記圧縮されたデータ集合を先頭から読み出して、前記検索条件の属性に対応する位置の区切情報に囲まれたデータに対応する符号化データを抽出し、抽出した符号化データに対応するデータが前記検索条件のデータを有するか否かを判定し、判定結果に基づいて、前記検索条件に指定される前記圧縮されたデータ集合上の領域を特定すること特徴とする付記8に記載の検索方法。