以下、図面に基づいて本発明の実施の形態を説明する。本実施の形態では、算出するための非循環の有向グラフ(以下、「編集距離算出グラフ」という。)が、編集距離の算出に利用される。
図2は、編集距離算出グラフの生成方法及び編集距離算出グラフを用いた編集距離の算出方法を説明するための図である。図2において、(1)は、生成された編集距離算出グラフの例を示す。(2)は、当該編集距離算出グラフを用いて、編集距離を算出する例を示す。
編集距離算出グラフを生成するには、まず、比較対象の一方の文字列(以下「文字列X」という。)がX軸に沿って、他方の文字列(以下「文字列Y」という。)がY軸に沿って配列される(ステップ1)。X軸上又はY軸上において、各文字列を構成する文字の配置位置は、編集距離算出グラフのノードを形成する。また、X軸に沿って配列された文字列を構成する文字ごとの、当該文字の配置位置をX座標値とし、X軸に垂直な仮想の直線と、Y軸に沿って配列された文字列を構成する文字ごとの、当該文字の配置位置をY座標値とし、Y軸に垂直な仮想の直線との交点もノードを形成する。
図2では、「kitten」がX軸に配列された文字列Xであり、「sitting」がY軸に配列された文字列Yである例が示されている。また、図1の編集距離算出グラフは、左上頂点を原点(0,0)とする。なお、本実施の形態において、「」は、文字列や記号等を視認し易くするために、当該文字列又は記号を囲むために付加される記号であり、説明対象の文字列又は記号等の構成要素ではない。また、本実施の形態において、文字列を構成する文字とは、厳密な意味において文字に限られず、記号又は符号等、文字列の構成要素となりうるものを含む。すなわち、後述される、正規表現に関して用いられる「(」、「|」、「)」、及び量化子等の記号と、文字列を構成する記号とを区別するため、文字列を構成する記号については、文字として扱われる。また、文字列の構成要素又は文字列の要素という場合、文字列を構成する文字と、正規表現に関する記号との両方を含む。
続いて、水平方向又は垂直方向に隣り合うノード間を結ぶ有向枝(エッジ)が生成される(ステップ2)。各有向枝には、削除又は挿入に必要な距離(コスト)として、例えば、1が付与される。また、図2において、水平な有向枝は右向きであり、垂直な有向枝は下向きである。
なお、本実施の形態において、編集距離算出グラフは、便宜上、X軸及びY軸が直交するように示されているが、編集距離算出グラフにおいて、X軸及びY軸は直交していなくてもよい。また、X軸又はY軸に平行な各有向枝は、直線上に並んでいなくてもよい。したがって、X軸又はY軸に「平行」とは、必ずしも、図形的な平行を意味するものではない。例えば、X軸に平行な有向枝とは、始点ノードと終点ノードとのY座標値が変わらない有向枝をいう。Y軸に平行な有向枝とは、始点ノードと終点ノードのX座標値が変わらない有向枝をいう。
続いて、ステップ2において生成されたノード(原点も含む)ごとに、当該ノード(x,y)からノード(x+1,y+1)へ向かう有向枝が生成される(ステップ3)。すなわち、図2において、斜めの線が当該有向枝に該当する。この時、ノード(x,y)において、文字列Xのx番目の文字と、文字列Yのy番目の文字とが一致すれば、ノード(x−1,y−1)からノード(x,y)への有向枝の距離は0とされ、一致しなければ、当該有向枝の距離は、置換の編集に必要な値(例えば、1)とされる。なお、図2において、破線は、距離が0であることを示す。実線は、距離が1であることを示す。
以上によって、図2(1)に示されるように、編集距離算出グラフは完成する。
編集距離算出グラフを用いて編集距離を求める際には、図2(2)に示されるように、原点(0,0)を始点とし、ノード(Aの文字数,Bの文字数)を終点として、始点から終点までの最短経路が探索される。最短経路とは、始点から終点までの距離の総和が最小となる経路をいう。最短経路の探索には、ダイクストラ法やA*法等、公知のグラフ最短経路探索法を用いることができる。
続いて、探索された最短経路に基づいて、編集距離が算出される。すなわち、最短経路の距離の総和が、編集距離となる。図2の例では、編集距離は、以下のように算出される。
1+0+0+0+1+0+1=3
なお、最短経路を構成する有向枝において、文字列が配列された軸に平行な有向枝は、当該文字列を構成する文字のうち、当該有向枝の終点ノードに係る文字の削除を示す。文字列が配置された軸に垂直な有向枝は、当該文字列を構成する文字のうち、当該有向枝の終点ノードに係る文字の後に、他方の文字列において当該有向枝の終点ノードに係る文字を挿入することを示す。軸に対して斜めであって、距離が1の有向枝は、当該文字列を構成する文字のうち、当該有向枝の終点ノードに係る文字について、他方の文字列において当該有向枝の終点ノードに係る文字への置換を示す。軸に対して斜めであって、距離が0の有向枝は、当該文字列を構成する文字のうち、当該有向枝の終点ノードに係る文字の編集は不要であることを示す。
したがって、図2(2)に示される最短経路によれば、文字列Xを構成する各文字に対して、以下のような編集が必要であることが分かる。
・kをsに置換
・iはそのまま
・tはそのまま
・tはそのまま
・eをiに置換
・nはそのまま
・nの後にgを挿入
なお、図2に示した、編集距離算出グラフの生成手順を、以下、「基本手順」という。本実施の形態では、比較対象の二つの文字列の少なくともいずれか一方に、正規表現が含まれる場合の編集距離の算出方法が開示される。本実施の形態において、正規表現を含む文字列の編集距離とは、正規表現が表現可能な文字列群のうち、比較対象に最も類似する文字列が選択された状態において算出される編集距離をいう。換言すれば、正規表現を含む文字列に関する編集距離は、正規表現によって表現可能な文字列群のうち、比較対象との編集距離が最小となる文字列と、比較対象との編集距離である。斯かる編集距離について具体例を用いて説明する。
図3は、正規表現を含む文字列に関する編集距離を説明するための図である。図3では、正規表現を含む文字列が「a(bc)+e」であり、「a(bc)+e」によって表現可能な文字列ごとに、文字列「abcbcbde」との編集距離が示されている。図3の例では、「a(bc)+e」によって表現可能な文字列群のうち、「abcbcbce」が選択された状態において、文字列「abcbcbde」との編集距離が1となり、最小となる。したがって、本実施の形態において、正規表現を含む文字列「a(bc)+e」と、文字列「abcbcbde」との編集距離は、1となる。
本実施の形態では、編集距離算出グラフを用いて正規表現を含む文字列に関する編集距離を算出するために、基本手順に対して、図4に示されるような拡張手順が追加される。
図4は、本発明の実施の形態における編集距離算出グラフの生成に関する拡張手順の一例を示す図である。図4では、比較対象の二つの文字列のうちの一方が、「abc(−[de])+:」である例が示されている。当該文字列(以下、「文字列A」という。)において、「(−[de])+」が正規表現に該当する。すなわち、「[de]」は、選言を示し、「(d|e)」を意味する。「(−[de])+」は、量化を示し、「(−[de])」の1以上の繰り返しを意味する。
拡張手順においては、まず、文字列Aにおける量化を示す正規表現について、当該量化における繰り返し対象の文字列(以下、「量化対象」という。)が量化子に応じた回数分繰り返す文字列によって置換される。その結果、量化に関する正規表現は文字列Aから除去される。換言すれば、量化子に応じた個数分の量化対象の複製が、量化対象の後に挿入され、量化子が削除される。本実施の形態において、斯かる文字列の変形を「量化子の展開」という。
文字列Aについて量化子の展開が行われることにより、文字列Aは、「abc(−[de](−[de]):」に変形される。以下、変形後の文字列を、「文字列A'」という。当該変形では、「(−[de])」の括弧閉じ「)」の前に、「(−[de]」の複製が挿入されている。このように、複製対象には、括弧開き「(」も含まれる。例えば、複製個数等の複製規則は、量化子によって異なるが、その詳細については後述される。
なお、量化子の展開は、正規表現に基づいて当然導かれる文字列操作ではない。後述より明らかなように、量化子の展開は、量化を示す正規表現を含む文字列について、編集距離算出グラフを用いた編集距離の算出を可能とするための工夫としての文字列操作である。
続いて、文字列A'が、X軸又はY軸に沿って 配列される。図4(1)では、文字列A'が、X軸に沿って配列された例が示されている。この際、「(」、「|」、及び「)」等の正規表現に関する記号は、一つの要素として扱われる。具体的には、正規表現に関する記号の配置位置にも、他の文字と同様のノード(以下、「記号ノード」という。)が形成される。なお、図4(1)では、便宜上、既に基本手順は完了している状態が示されている。また、図4(1)において、「[de]」については、一文字として扱われている。これは、編集距離算出グラフにおいて、全ての選択肢が一文字である選言は、一文字として扱われても、基本手順によって編集距離を算出可能であるからである。すなわち、基本手順において、置換に対応する有向枝を追加する際の対応する文字同士の比較において、全ての選択肢が一文字である選言のいずれかの選択肢が、他方の文字と一致すれば、当該有向枝の距離は0となる。一方、全ての選択肢が一文字である選言のいずれの選択肢も、他方の文字と一致しない場合、当該有向枝の距離は1となる。
続いて、記号ノードを終点ノードとする「置換」又は「削除」に関する有向枝(すなわち、斜めの有向枝又は水平な有向枝)が削除される。正規表現の記号は、文字ではないため、編集距離の算出において、当該記号の削除又は置換といった編集は行われないからである。当該有向枝の削除により、編集距離算出グラフは、例えば、図4(2)に示されるようになる。(2)においては、「(」又は「)」等の記号ノードを終点ノードとする斜めの有向枝及び水平の有向枝が削除されている。
続いて、(3)に示されるように、最初の「(」に対応する記号ノード、及び「)」の直前の文字「[de]」に対応するノードについて、「挿入」に関する有向枝(すなわち、垂直な有向枝)が削除される。(3)の処理は、編集距離を算出する際に、最初の「(」の後、及び「)」の前に対する文字の挿入が制限されるようにするために実行される。斯かる制限の意義については、後述される。
続く(4)〜(6)では、選言又は量化を表現するために、「X軸又はY軸に平行で、距離が0である、記号ノードに向かう有向枝が追加される。
まず、(4)に示されるように、記号ノード「(」又は「)」に対して、当該記号ノードの直前のノードからの有向枝が追加される。
続いて、(5)及び(6)に示される処理が実行される。以下の説明において、量化対象の最後尾の要素を「量化対象最後尾要素」という。量化子の展開の結果、量化対象最後尾要素は、複数存在する。すなわち、「abc(−[de](−[de]):」のうち、最初の「−[de]」及び2番目の「−[de]」は、それぞれ量化対象であり、それぞれの量化対象の「[de]」は、量化対象最後尾要素である。
(5)及び(6)では、最後の量化対象最後尾要素から直前の「(」及び直後の「)」への有向枝、並びに最初の量化対象最後尾要素から「)」への有向枝が追加される。最後の量化対象最後尾要素の「[de]」から直前の「(」への有向枝は、繰り返しを表現する有向枝である。最初の量化対象最後尾要素の「[de]」から「)」への有向枝、繰り返しの終了(繰り返しからの脱出)を表現する有向枝である。また、最後の「[de]」から「)」への有向枝も、繰り返しの終了の有向枝として追加されるが、当該有向枝は、(4)において追加される有向枝に一致する。
なお、図4の例では、該当する記号は存在しないが、「選言」については、「(」と各「|」、各選言対象最後尾要素と「)」とを接続する有向枝が追加される。当該有向枝によって、選言が表現される。
以上の拡張手順が追加されることにより、例えば、図5に示されるような、編集距離算出グラフが生成される。図5は、本発明の実施の形態において一方の文字列が正規表現を含む場合に生成される編集距離算出グラフの例を示す図である。
図5では、文字列Aと、文字列「abc−d−e−f:」(以下、「文字列B」という。)とが比較される場合に生成される編集距離算出グラフが示されている。文字列Bは、Y軸に沿って配列されている。当該編集距離算出グラフが用いられて、図6に示されるように編集距離が算出される。
図6は、本発明の実施の形態において一方の文字列が正規表現を含む場合の編集距離の算出例を示す図である。
編集距離算出グラフを用いた編集距離の算出方法は、基本手順と共に説明した通りである。すなわち、拡張手順の追加は、編集距離算出グラフにおける最短経路の探索方法には影響しない。したがって、ダイクストラ法やA*法等、公知のグラフ最短経路探索法を用いることができる。図6では、ダイクストラ法を用いて最短経路の探索が行われた例を示している。図6において探索された最短経路によれば、文字列Aと文字列Bとの編集距離は、以下の通りである。
0+0+0+0+0+0+0+0+0+0+0+1+0+0=1
ここで、文字列Aによって表現可能な文字列群のうち、文字列Bとの編集距離が最小となる文字列は、「abc−d−e−e:」である。「abc−d−e−e:」の最後の「e」を「f」に置換した文字列は、文字列Bに一致するため、文字列Aと文字列Bとの編集距離は、1である。当該編集距離は、図6の方法によって算出される編集距離に一致する。すなわち、図5及び図6において説明した方法の妥当性が確認される。
なお、拡張手順において追加された有向枝に関しては、置換、削除、又は追加等の編集に関する意味は有さない。以下、拡張手順において追加される有向枝を、「拡張枝」という。
比較対象の二つの文字列の双方が、正規表現を含む場合、X軸方向及びY軸方向のそれぞれについて、拡張枝が追加されればよい。
例えば、図7は、本発明の実施の形態において双方の文字列が正規表現を含む場合に生成される編集距離算出グラフの例を示す図である。図7では、文字列「a(−[bcd])+e:」(以下、「文字列C」という。)と、文字列「a−(c)+e:」(以下、「文字列D」という。)とが比較される場合に生成される編集距離算出グラフが示されている。文字列Cにおいて、「(−[bcd])+」は、量化の正規表現に相当する。上記したように、当該正規表現について、量化子の展開が行われることにより、文字列Cは、「a(−[bcd](−[bcd])e:」に変形される。以下、変形後の文字列を、「文字列C'」という。また、文字列Dにおいて、「(c)+」は、量化の正規表現に相当する。当該正規表現について、量化子の展開が行われることにより、文字列Dは、「a−(c(c))e:」に変形される。以下、変形後の文字列を、「文字列D'」という。
図7に示される編集距離算出グラフでは、X軸に文字列C'が配列され、Y軸に文字列D'が配列されている。文字列D'についても、拡張手順が適用されることにより、Y軸に平行な拡張枝が追加される。なお、文字列C'に関する拡張枝はX軸に平行であり、文字列D'に関する拡張枝はY軸に平行であるため、双方の拡張枝は干渉することはない。干渉とは、例えば、一方の拡張枝が他方の拡張枝を変形させてしまうことである。図7に示される編集距離算出グラフに基づく編集距離の算出は、例えば、図8に示されるように行われる。
図8は、本発明の実施の形態において双方の文字列が正規表現を含む場合の編集距離の算出例を示す図である。双方の文字列が正規表現を含む場合も、編集距離算出グラフにおける最短経路の探索方法には変更は生じない。したがって、公知のグラフ最短経路探索法を用いることができる。図8では、ダイクストラ法を用いて経路探索が行われた例を示している。図8において探索された最短経路によれば、文字列Cと文字列Dとの編集距離は、以下の通りである。
0+0+0+0+0+0+0+1+0+0+0+0+0+0=1
ここで、文字列Cによって表現可能な文字列群と、文字列Dによって表現可能な文字列群との中で、両者の編集距離が最小となる文字列は、文字列Cに関して「a−c−ce:」であり、文字列Dに関して「a−ccce:」である。「a−c−ce:」の2番目の「−」を「c」に置換した文字列は、「a−ccce:」に一致するため、文字列Cと文字列Dとの編集距離は、1である。当該編集距離は、図8の方法によって算出される編集距離に一致する。すなわち、図7及び図8において説明した方法の妥当性が確認される。
図6及び図8より明らかなように、正規表現によって表現可能な文字列は複数存在するが、拡張枝が追加された編集距離算出グラフにおいて、最短経路を求めることで、正規表現によって表現可能な文字列群の中から、編集距離の算出に適した文字列を抽出することができる。
続いて、以上に説明した編集距離算出グラフの生成、及び編集距離算出グラフを用いた編集距離の算出等を実行する編集距離算出装置10について具体的に説明する。
図9は、本発明の実施の形態における編集距離算出装置のハードウェア構成例を示す図である。図9の編集距離算出装置10は、それぞれバスBで相互に接続されているドライブ装置100、補助記憶装置102、メモリ装置103、CPU104、及びインタフェース装置105等を有する。
編集距離算出装置10での処理を実現するプログラムは、記録媒体101によって提供される。プログラムを記録した記録媒体101がドライブ装置100にセットされると、プログラムが記録媒体101からドライブ装置100を介して補助記憶装置102にインストールされる。但し、プログラムのインストールは必ずしも記録媒体101より行う必要はなく、ネットワークを介して他のコンピュータよりダウンロードするようにしてもよい。補助記憶装置102は、インストールされたプログラムを格納すると共に、必要なファイルやデータ等を格納する。
メモリ装置103は、プログラムの起動指示があった場合に、補助記憶装置102からプログラムを読み出して格納する。CPU104は、メモリ装置103に格納されたプログラムに従って編集距離算出装置10に係る機能を実行する。インタフェース装置105は、ネットワークに接続するためのインタフェースとして用いられる。
なお、記録媒体101の一例としては、CD−ROM、DVDディスク、又はUSBメモリ等の可搬型の記録媒体が挙げられる。また、補助記憶装置102の一例としては、HDD(Hard Disk Drive)又はフラッシュメモリ等が挙げられる。記録媒体101及び補助記憶装置102のいずれについても、コンピュータ読み取り可能な記録媒体に相当する。
図10は、本発明の実施の形態における編集距離算出装置の機能構成例を示す図である。図10において、編集距離算出装置10は、入力受付部11、グラフ生成部12、経路探索部13、及び編集距離算出部14等を有する。これら各部は、編集距離算出装置10にインストールされたプログラムが、CPU104に実行させる処理により実現される。
入力受付部11は、比較対象とされる二つの文字列の入力を受け付ける。グラフ生成部12は、比較対象とされた二つの文字列について、編集距離算出グラフを生成する。図10において、グラフ生成部12は、記号補完部121、対応グループ生成部122、量化子展開部123、及びグラフ要素生成部124等を含む。これら各部の機能については、処理手順の説明において明確にされる。経路探索部13は、グラフ生成部12によって生成される編集距離算出グラフの始点から終点までの最短経路を探索する。編集距離算出部14は、経路探索部13によって探索された最短経路に基づいて、比較対象とされた二つの文字列の編集距離を算出する。
以下、編集距離算出装置10が実行する処理手順について説明する。図11は、編集距離算出装置が実行する全体処理フローの処理手順の一例を説明するためのフローチャートである。
ステップS101において、入力受付部11は、比較される二つの文字列の入力を受け付ける。続いて、グラフ生成部12は、二つの文字列のそれぞれごとに、グラフ要素型の配列(以下、「グラフ要素配列」という。)を生成する(S102)。グラフ要素型とは、文字列の一構成要素を管理するためのデータ型をいう。
図12は、グラフ要素型の一例を示す図である。図12において、グラフ要素型は、属性として、要素、入力、出力、及び拡張枝等を含むクラス又は構造体である。
要素属性は、String型を有し、文字列の一構成要素の実体を格納する。実体とは、文字そのもの又は記号そのものである。なお、図12では、便宜上、各属性のデータ型は、Java(登録商標)言語におけるデータ型で表現されている。但し、このことは、本実施の形態における方法を実現するためのプログラムが、Java(登録商標)言語によって記述される必要があることを意味するものではない。
入力属性は、boolean型を有し、要素属性に係る要素への削除に対応する有向枝及び置換に対応する有向枝の有無を示す。trueは、当該要素への削除に対応する有向枝及び置換に対応する有向枝が有ることを示す。falseは、当該要素への削除に対応する有向枝及び置換に対応する有向枝が無いことを示す。
出力属性は、boolean型を有し、要素属性に係る要素からの、挿入に対応する有向枝の有無を示す。trueは、当該要素からの、挿入に対応する有向枝が有ることを示す。falseは、当該要素からの、挿入に対応する有向枝が無いことを示す。
なお、削除に対応する有向枝及び置換に対応する有向枝の有無が一つの属性(入力属性)によって管理されるのは、本実施の形態では、或る要素に関して、削除に対応する有向枝の有無と置換に対応する有向枝の有無とは、常に一致するからである。また、挿入に対応する有向枝の有無が、入力属性とは別の属性(出力属性)によって管理されるのは、本実施の形態において、挿入に対応する有向枝の有無は、削除に対応する有向枝及び置換に対応する有向枝の有無に必ずしも一致しないからである。
拡張枝属性は、TreeSet<Integer>型を有し、要素属性に係る要素からの拡張枝の接続先となる他の要素の位置を示す数値を格納する配列である。他の要素の位置を示す数値とは、グラフ要素配列を構成する配列要素の中で、拡張枝の接続元に対応する配列要素を起点とした、拡張枝の接続先の配列要素の位置をいう。例えば、拡張枝の接続元が、グラフ要素配列の1番目の配列要素であり、接続先が、当該配列の2番目の配列要素である場合、当該接続先の位置は、「1」となる。また、グラフ要素配列の6番目の配列要素であり、接続先が、当該配列の3番目の配列要素である場合、当該接続先の位置は、「−3」となる。なお、TreeSet<Integer>型のデータは、数値をソートして格納する配列である。なお、配列要素とは、配列を構成する要素をいい、本実施の形態において、文字列を構成する要素と区別するために用いられる用語である。
ステップS102では、文字列ごとに、グラフ要素配列が生成され、各配列要素の要素属性には、各文字列における配列順に、当該文字列の構成要素が格納される。量化を含む文字列については、量化子の展開が行われた後の文字列が、グラフ要素配列に格納される。また、各配列の各要素の入力属性、出力属性、及び拡張枝属性に対して、各要素に応じた値が格納される。なお、二つのグラフ要素配列が生成されることにより、実質的に、編集距離算出グラフが生成されたことになる。二つのグラフ要素配列には、編集距離算出グラフを表現又は構成するために十分な情報が含まれているからである。
続いて、経路探索部13は、二つのグラフ要素配列によって表現される編集距離算出グラフの始点から終点までの最短経路を探索する(S103)。続いて、編集距離算出部14は、探索された最短経路に基づいて、比較対象の二つの文字列の編集距離を算出する(S104)。
続いて、ステップS102の詳細について説明する。図13は、グラフ要素配列の生成処理の処理手順の一例を説明するためのフローチャートである。なお、図13の処理は、比較対象とされた文字列ごとに実行される。図13において処理対象とされている一つの文字列を、「対象文字列」という。
ステップS201において、グラフ生成部12は、対象文字列に正規表現が含まれているか否かを判定する。正規表現が含まれているか否かは、例えば、所定形式の記述が対象文字列に含まれているか否かに基づいて判定されてもよい。
対象文字列に正規表現が含まれている場合(S201でYes)、記号補完部121は、当該正規表現の対象範囲を示す括弧を補完する(S202)。例えば、「a*」のように、文字の量化については、量化の対象範囲が明確であるため、括弧が省略されている場合がある。そのような場合、括弧の補完が行われ、「a*」は、「(a)*」に変形される。また、「(A|BC)+」のように、一つの括弧が選言及び量化の双方の対象範囲を示している場合がある。このような場合、選言用の括弧と量化用の括弧とが区別可能なように、括弧の補完が行われる。例えば、「(A|BC)+」は、「((A|BC))+」に変形される。「((A|BC))+」において、外側の括弧は、量化に対応する括弧であり、内側の括弧は、選言に対応する括弧である。なお、選言用の括弧と量化用の括弧とが区別可能なように括弧の補完が行われるのは、拡張枝の生成時において、選言用の括弧と量化用の括弧との扱いが異なるためである。
続いて、対応グループ生成部122は、対象文字列内における選言又は量化ごとに、当該選言又は当該量化に係る記号及び最後尾要素を対応付けてグループ化する(S203)。例えば、対象文字列内の量化ごとに、「(」、「)」、量化子、及び量化対象最後尾要素が対応付けられて一つのグループ(以下、「対応グループ」という。)とされる。また、対象文字列内の選言ごとに、「(」、「|」、「)」、及び選言対象の最後尾要素が対応付けられて一つの対応グループとされる。選言対象の最後尾要素とは、各選択肢の末尾の要素をいう。
例えば、ステップS203の実行前において、対象文字列が、「(a(bc|def)){1,}」であったとする。この場合、量化に関しては、外側の括弧開き「(」及び外側の括弧閉じ「)」と、量化子{1,}と、外側の括弧内の最後尾要素である、内側の括弧閉じ「)」とが対応付けられ、一つの対応グループが生成される。内側の括弧閉じとは、fの直後の括弧閉じである。また、選言に関しては、内側の括弧開き「(」及び内側の括弧閉じ「)」と、選言の記号「|」と、各選択肢の末尾である「c」及び「f」とが対応付けられ、一つの対応グループが生成される。対応付けの結果は、例えば、メモリ装置103に記憶される。なお、ステップS203における対応付けは、後段のステップにおいて、拡張枝の生成に利用される。
続いて、量化子展開部123は、対象文字列に含まれる量化子の展開を実行する(S204)。その結果、対象文字列から量化子は除去される。なお、量化子の展開の規則は、量化子に応じて異なる。
第1規則として、量化子が{X}(Xは自然数)である場合、すなわち、固定回数の繰り返しの場合、量化対象を囲む括弧開き「(」から量化対象の末尾までの文字列のX−1個の複製が、量化対象を囲む括弧閉じ「)」の前に挿入される。但し、X−1が、負の値になる場合(すなわち、X=0の場合)、複製の個数は、1となる。なお、本実施の形態において、自然数には、0も含まれる。
例えば、「(ab){3}」の場合、量化対象を囲む括弧開きから量化対象の末尾までである「(ab」の2個の複製が、量化対象を囲む括弧閉じの前に挿入される。その結果、「(ab){3}」は、「(ab(ab(ab)」に変形される。換言すれば、「(ab){3}」は、「(ab(ab(ab)」に置換される。
なお、第1規則並びに後述される第2規則及び第3規則のいずれの展開規則においても、対応グループに含まれる要素の複製は、当該対応グループに追加される。したがって、例えば、「(ab){3}」に関しては、ステップS203において、「(」、「)」、「b」、及び「{3}」が、一つの対応グループを形成するが、量化子の展開によって、更に、二つの「(」と、二つの「b」とが当該対応グループに追加される。
第2規則として、量化子が{X,}(Xは自然数)である場合、すなわち、X回を下限とする任意回数の繰り返し(X以上の繰り返し)の場合、X=0であるか、X>0であるかによって展開方法が異なる。なお、X=0の場合、すなわち、{0,}は、量化子「*」と同義である。また、X=1の場合、すなわち、{1,}は、量化子「+」と同義である。
X=0である場合、量化対象を囲む括弧開き「(」から量化対象の末尾までの文字列の1個の複製が、量化対象を囲む括弧閉じ「)」の前に挿入される。
X>0である場合、量化対象を囲む括弧開き「(」から量化対象の末尾までの文字列のX個の複製が、量化対象を囲む括弧閉じ「)」の前に挿入される。
例えば、「(ab){2,}」の場合、量化対象を囲む括弧開きから量化対象の末尾までである「(ab」の2個の複製が、量化対象を囲む括弧閉じの前に挿入される。その結果、「(ab){2,}」は、「(ab(ab(ab)」に変形される。
第3規則として、量化子が{X,Y}(X、Yは自然数)である場合、すなわち、X回を下限としてY回を上限とする任意回数の繰り返し(X以上Y以下の繰り返し)の場合、量化対象を囲む括弧開き「(」から量化対象の末尾までの文字列のY−1個の複製が、量化対象を囲む括弧閉じ「)」の前に挿入される。その結果、量化子の展開後の文字列には、当該量化子の繰り返しの上限分(Y個分)の量化対象が含まれることになる。
例えば、「(ab){2,4}」の場合、量化対象を囲む括弧開き「(」から量化対象の末尾までである「(ab」の3個の複製が、量化対象を囲む括弧閉じの前に挿入される。その結果、「(ab){2,4}」は、「(ab(ab(ab(ab)」に変形される。ここには、4個の量化対象が含まれる。
なお、図13に関する以下の説明において、「対象文字列」とは、量化子の展開後の文字列をいう。
続いて、グラフ要素生成部124は、対象文字列の先頭に1文字分の空文字を追加する(S205)。当該空文字は、編集距離算出グラフの原点に対応する要素である。以下の説明において、「対象文字列」とは、空文字が追加された文字列をいう。
続いて、グラフ要素生成部124は、対象文字列を格納するためのグラフ要素配列を生成する(S206)。ここで、グラフ要素配列の配列長は、対象文字列長とされる。対象文字列長とは、空文字を含む対象文字列の要素数である。なお、ステップS206の段階において、グラフ要素配列の各配列要素の要素属性の値は空である。入力属性の値は、初期値であるtrueである。出力属性の値は、初期値であるtrueである。拡張枝属性の値は、空である。
続いて、グラフ要素生成部124は、グラフ要素配列に、対象文字列を代入する(S207)。すなわち、対象文字列のN番目の要素が、グラフ要素配列のN番目の配列要素の要素属性に代入される。1≦N≦対象文字列の要素数である。
続いて、グラフ要素生成部124は、グラフ要素配列の2番目以降の各配列要素(原点に対応する配列要素を除く各配列要素)について、入力属性、出力属性、及び拡張枝属性の値を、当該要素に代入された文字又は記号に応じて更新する(S208)。
量化対象を囲む括弧開き「(」が代入された配列要素の入力属性は、falseに更新される。当該更新は、図4の(2)の処理に対応する。当該「(」が、対応グループ内において先頭の「(」である場合、当該配列要素の出力属性は、falseに更新される。当該更新は、図4の(3)の処理に対応する。当該配列要素に係る「(」が、対応グループ内において先頭の「(」であり、かつ、当該対応グループ内の量化子が、「{0,}」又は「{0,X}」である場合、当該配列要素の拡張枝属性には、当該対応グループ内の「)」の位置が代入される。すなわち、量化対象を1回も繰り返さない場合(量化対象を経由しない場合)の拡張枝が、拡張枝属性に代入される。
量化対象を囲む括弧閉じ「)」が代入された配列要素の入力属性は、falseに更新される。当該更新は、図4の(2)の処理に対応する。
量化対象最後尾要素が代入された配列要素の出力属性は、falseに更新される。当該更新は、図4の(3)の処理に対応する。なお、当該量化対象最後尾要素には、ステップS204において複製された量化対象最後尾要素も含まれる。当該量化対象最後尾要素が属する対応グループ内の量化子が、{X,}(X≧0)であり、かつ、当該量化対象最後尾要素が、当該対応グループ内において最後の量化対象最後尾要素である場合、当該対応グループ内において、当該量化対象最後尾要素の直前の「(」の位置が、当該配列要素の拡張枝属性に代入される。すなわち、繰り返しを表現する拡張枝が、拡張枝属性に代入される。なお、対応グループ内において最後の量化対象最後尾要素とは、X=0の場合であれば、当該対応グループ内において2番目の量化対象最後尾要素であり、X>0の場合であれば、当該対応グループ内においてX+1番目の量化対象最後尾要素である。
又は、当該量化対象最後尾要素が属する対応グループ内の量化子が、{X,}(X=0)であり、当該量化対象最後尾要素が、当該対応グループ内において2個目の量化対象最後尾要素である場合、若しくは、当該量化対象最後尾要素が、{X,}(X>0)であり、当該量化対象最後尾要素が、当該対応グループ内においてX個目の量化対象最後尾要素である場合、当該対応グループ内における「)」の位置が、当該配列属性の拡張枝属性に代入される。すなわち、下限回数の繰り返し後に繰り返しを終了するための経路が拡張枝属性に追加される。
又は、量化子が、{X,Y}であり、かつ、当該量化対象最後尾要素が、当該対応グループ内においてX個目以降の量化対象最後尾要素である場合、当該対応グループ内における「)」の位置が、当該配列属性の拡張枝属性に代入される。すなわち、下限回数の繰り返し後に繰り返しを終了するための経路が拡張枝属性に追加される。
なお、量化対象最後尾要素が代入された配列要素の拡張枝属性について整理すると、量化子が{X}の場合や{X,Y}の場合のように、繰り返し回数の上限が明らかである場合、繰り返しを表現する拡張枝は代入されない。換言すれば、編集距離算出グラフにおいて、当該拡張枝は生成されない。量化子が{X}の場合や{X,Y}の場合、量化子の展開の結果、量化対象の複製及び複製元の個数が、繰り返しの上限に一致しているため、繰り返しを表現する拡張枝が無くても、上限分の繰り返し経路を確保可能であるからである。一方、量化子が{X,}である場合、すなわち、繰り返し回数に上限が無い場合、当該拡張枝属性には、繰り返しを表現する拡張枝が代入される。上限の無い繰り返しの場合、量化子の展開により、量化対象の複製及び複製元の個数を、上限に一致させることができないため、当該拡張枝によって、上限の無い繰り返しを表現する必要が有るからである。
選言対象を囲む括弧開き「(」が代入された配列要素の入力属性及び出力属性は、falseに更新される。入力属性に関する当該更新は、図4の(2)の処理に対応する。出力属性に関する当該更新は、図4の(3)の処理に対応する。当該配列要素の拡張枝属性には、当該「(」が属する対応グループ内の全ての「|」の位置が代入される。すなわち、各選択肢への経路が拡張枝属性に追加される。
選言対象を囲む括弧閉じ「)」が代入された配列要素の入力属性は、falseに更新される。当該更新は、図4の(2)の処理に対応する。
選言の「|」が代入された配列要素の入力属性及び出力属性は、falseに更新される。当該更新は、図4の(2)の処理に対応する。
選言対象におけるいずれかの選択肢の最後尾要素が代入された配列要素の出力属性は、falseに更新される。当該更新は、図4の(3)の処理に対応する。当該配列要素の拡張枝属性には、当該配列要素に係る最後尾要素が属する対応グループ内の「)」の位置が代入される。すなわち、各選択肢からの脱出経路が拡張枝属性に追加される。
量化対象又は選言対象を囲む「(」又は「)」の直前の要素が代入された配列要素の拡張枝属性には、当該要素の直後の「(」又は「)」の位置が代入される。すなわち、図4の(4)において説明した拡張枝が、拡張枝属性に追加される。
一方、ステップS201において、対象文字列に正規表現が含まれていない場合(S201でNo)、グラフ要素生成部124は、ステップS205〜S207と同様の処理を、対象文字列について実行する(S209〜S211)。
図13について、対象文字列が、「a(bc|de){2}fg*h(ij){1,3}」である場合の処理内容を説明する。
まず、ステップS202において、「()」が補完されることにより、対象文字列は、「a((bc|de)){2}f(g)*h(ij){1,3}」に変形される。
続いて、ステップS203において、図14に示されるように、対応グループが生成される。
図14は、対応グループの具体例を示す図である。図14には対象文字列内における選言又は量化ごとに、当該選言対象又は当該量化対象の最後尾要素と、当該選言又は当該量化に関して生成される対応グループに属する要素が示されている。
続いて、ステップS204において、量化子の展開が行われる。その結果、対象文字列は、以下のように変形される。
a((bc|de)((bc|de)){2}f(g(g)*h(ij(ij(ij){1,3}
続いて、ステップS205において、空文字の追加が行われる。その結果、対象文字列は、以下のように変化する。
[null]a((bc|de)((bc|de)){2}f(g(g)*h(ij(ij(ij){1,3}
なお、上記において、空文字は、[null]によって表現されている。
続いて、ステップS206〜S208が実行されることにより、図15に示されるようなグラフ要素配列が生成される。
図15は、グラフ要素配列の一例を示す図である。図15において、各列は、グラフ要素配列の一つの配列要素を示す。各行は、グラフ要素型の各属性に対応する。図15に示されるように、要素属性には、対象文字列を構成する各要素が格納される。入力属性、出力属性、及び拡張枝属性には、ステップS208において説明した規則に従った値が代入されている。なお、図15では、便宜上、入力属性及び出力属性について、「f」は、falseを示し、値が空であることは、trueを示す。
図15に示されるグラフ要素配列は、図16に示されるような編集距離算出グラフを表現する。図16は、グラフ要素配列によって表現される編集距離算出グラフの一例を示す図である。
図16において、(1)は、入力属性又は出力属性がfalseに対応する経路は削除されることを示す。すなわち、(1)において、破線の経路は、削除対象の経路を示す。
(2)は、記号ノードの直前の要素から記号ノードへの拡張枝の追加を示す。図16においては、当該拡張枝は、値が1である拡張枝属性によって表現される。
(3)は、量化や選言等を表現するための拡張枝の追加を示す。図16においては、当該拡張枝は、値が1以外である拡張枝属性によって表現される。なお、値が負である拡張枝属性は、図中において、左方向に向いている拡張枝である。
このように、グラフ要素配列は、実質的に編集距離算出グラフを表現することができる。したがって、グラフ要素配列に基づいて、編集距離を算出することができる。図1等において説明したように、編集距離は、編集距離算出グラフの最短経路の距離として求められる。既存のグラフ最短経路探索法を用いる場合、編集距離算出グラフの各ノードの接続先のノードと、当該接続先までの距離とが分かればよい。そこで、本実施の形態では、グラフ要素配列に基づいて、編集距離算出グラフの各ノードの接続先と、接続先までの距離とを判定する処理を説明することにより、グラフ要素配列に基づく編集距離の算出処理の説明に代える。
図17は、グラフ要素配列に基づく編集距離算出グラフの各ノードの接続先と接続先までの距離との判定処理の処理手順の一例を説明するためのフローチャートである。図17の処理は、図11のステップS103の一部として実行される。図17の説明において、比較対象とされる二つの文字列に関して生成された二つのグラフ要素配列は、それぞれ変数X、変数Yによって表現される。変数Xによって表現されるグラフ要素配列(以下、「グラフ要素配列X」という。)は、編集距離算出グラフのX軸に沿って配列された文字列に対応する。変数Yによって表現されるグラフ要素配列(以下、「グラフ要素配列Y」という。)は、編集距離算出グラフのY軸に沿って配列された文字列に対応する。
ステップS301において、経路探索部13は、処理対象とされるノードを受け付ける。ノードは、編集距離算出グラフの座標値によって表現される。以下、処理対象とされるノードを、ノード(x,y)という。xは、編集距離算出グラフのx座標値である。yは、編集距離算出グラフのy座標値である。
ここで、基本経路において、ノード(x,y)の接続先となりうるノードは、斜め下方向のノード(x+1,y+1)、右方向のノード(x+1,y)、及び下方向のノード(x,y+1)である。なお、基本経路とは、図1において説明した基本手順において生成される置換、削除、又は挿入に対応する経路である。
まず、経路探索部13は、ノード(x+1,y+1)への有向枝について検査する。すなわち、ステップS302において、経路探索部13は、ノード(x,y)からノード(x+1,y+1)への経路の有無を判定する。当該経路は、次の二つの条件が共に満たされた場合に有ると判定される。
第1条件は、(x+1<X.size() && y+1<Y.size())である。ここで、X.size()は、グラフ要素配列Xの配列長を示す。また、Y.size()は、グラフ要素配列Yの配列長を示す。したがって、第1条件は、ノード(x,y)が、X軸方向において右端のノードではなく、かつ、Y軸方向において下端のノードではないことである。第2条件は、(X[x+1].input && Y[y+1].input)である。ここで、X[x+1].inputは、グラフ要素配列Xにおいて、ノード(x+1,y+1)に対応する配列要素の入力属性を示す。また、Y[y+1].inputは、グラフ要素配列Yにおいて、ノード(x+1,y+1)に対応する配列要素の入力属性を示す。したがって、第2条件は、ノード(x+1,y+1)への置換に対応する有向枝が存在することである。当該置換に対応する有向枝は、ノード(x,y)からノード(x+1,y+1)への経路に該当する。
ステップS302の条件が満たされる場合(S302でYes)、経路探索部13は、X[x+1].stringとY[y+1].stringとが一致するか否かを判定する(S303)。ここで、X[x+1].stringは、ノード(x+1,y+1)においてX軸に対応する要素である。Y[y+1].stringは、ノード(x+1,y+1)においてY軸に対応する要素である。したがって、ステップS303の判定は、ノード(x+1,y+1)のX軸の要素とY軸の要素とが一致するか否かの判定に該当する。
ノード(x+1,y+1)のX軸の要素とY軸の要素とが一致する場合(S303でYes)、経路探索部13は、ノード(x+1,y+1)を、距離=0の接続先として、メモリ装置103に記憶する(S304)。
一方、ノード(x+1,y+1)のX軸の要素とY軸の要素とが一致しない場合(S303でNo)、経路探索部13は、ノード(x+1,y+1)を、距離=1の接続先として、メモリ装置103に記憶する(S305)。
ステップS302でNoの場合、ステップS304、又はステップS305に続いて、経路探索部13は、ノード(x,y)からノード(x+1,y)への有向枝の有無を判定する(S306)。当該有向枝は、次の二つの条件が共に満たされた場合に有ると判定される。
第1条件は、(x+1<X.size())である。すなわち、第1条件は、ノード(x,y)が、X軸方向において右端のノードではないことである。第2条件は、(X[x+1].input=true && Y[y].output=true)である。ここで、Y[y].outputは、グラフ要素配列Yにおいて、ノード(x,y)に対応する配列要素の出力属性を示す。したがって、第2条件は、X軸方向においてノード(x+1、y)への削除に対応する有向枝が存在し、かつ、Y軸方向においてノード(x、y)からの、挿入に対応する有向枝が存在することである。当該削除に対応する有向枝及び当該挿入に対応する有向枝は、同一の有向枝を示し、ノード(x,y)からノード(x+1,y)への有向枝に該当する。
ステップS306の条件が満たされる場合(S306でYes)、経路探索部13は、ノード(x+1,y)を、距離=1の接続先として、メモリ装置103に記憶する(S307)。
ステップS306でNoの場合、又はステップS307に続いて、経路探索部13は、ノード(x,y)からノード(x,y+1)への有向枝の有無を判定する(S308)。当該有向枝は、以下の二つの条件が共に満たされた場合に有ると判定される。
第1条件は、(y+1<Y.size())である。すなわち、第1条件は、ノード(x,y)が、Y軸方向において下端のノードではないことである。第2条件は、(X[x].output=true && Y[y+1].input=true)である。すなわち、第2条件は、X軸方向において、ノード(x、y+1)からの、挿入に対応する有向枝が存在し、かつ、Y軸方向において、ノード(x,y+1)への削除に対応する有向枝が存在することである。当該挿入に対応する有向枝及び当該削除に対応する有向枝は、同一の有向枝を示し、ノード(x,y)からノード(x,y+1)への有向枝に該当する。
ステップS308の条件が満たされる場合(S308でYes)、経路探索部13は、ノード(x,y+1)を、距離=1の接続先として、メモリ装置103に記憶する(S309)。
続いて、拡張枝について検査が行われる。ステップS310において、経路探索部13は、X[x].extraroutesが空であるか否かを判定する。X[x].extraroutesは、グラフ要素配列Xにおいて、x番目の要素の拡張枝属性を示す。extraroutesは、拡張枝の接続先の配列要素の位置を示す数値の配列に相当する。なお、ステップS310の判定は、ノード(x,y)を起点とし、X軸に平行な拡張枝の有無の判定に相当する。
該当する拡張枝が有る場合(S310でYes)、経路探索部13は、X[x].extraroutesの配列要素ごとに、ステップS311を実行する。X[x].extraroutesの配列要素ごととは、ノード(x,y)を起点とし、X軸に平行な拡張枝ごとを意味する。ステップS311において、経路探索部13は、処理対象の拡張枝の接続先のノード(x+X[x].extraroutes[n],y)を、距離=0の接続先として、メモリ装置103に記憶する。
続いて、経路探索部13は、Y[y].extraroutesが空であるか否かを判定する。すなわち、ステップS310の判定は、ノード(x,y)を起点とし、Y軸に平行な拡張枝の有無の判定に相当する。
該当する拡張枝が有る場合(S312でYes)、経路探索部13は、Y[y].extraroutesの配列要素ごとに、ステップS313を実行する。Y[y].extraroutesの配列要素ごととは、ノード(x,y)を起点とし、Y軸に平行な拡張枝ごとを意味する。ステップS313において、経路探索部13は、処理対象の拡張枝の接続先のノード(x,y+Y[y].extraroutes[n])を、距離=0の接続先として、メモリ装置103に記憶する。
続いて、経路探索部13は、メモリ装置103に記憶された接続先ノードごとに、座標値及び距離等を出力する(S314)。当該出力情報に基づいて、経路探索が行われる。
次に、図4の(3)の処理、すなわち、対応グループ内において最初の「(」と、「)」の直前の要素とについて、「挿入」に対応する有向枝が削除される処理の意義について説明する。これらの有向枝が削除されるのは、当該最初の「(」の後と、「)」の前とに対する文字の挿入が制限されるようにするためである。このような制限が必要となるのは、編集距離の算出の際に、文字の挿入位置を正確に把握可能とするためである。具体的には、「(」の後や「)」の前に対する文字の挿入(以下、「括弧内挿入」という。)と、「(」の前や「)」の後に対する文字の挿入(以下、「括弧外挿入」という。)とを区別可能とするためである。
例えば、文字列A「abc(−[de])+:」と、文字列E「abcf−d−e:」との編集距離を算出する場合について考える。文字列Aによって表現可能な文字列群のうち、文字列Eとの編集距離が最小となる文字列は、「abc−d−e:」であり、当該文字列と文字列Eとの編集距離は、1である。すなわち、「abc−d−e:」の「c」と「−」の間に「f」が挿入された文字列は、文字列Eに一致する。
ここで、「c」と「−」の間に対応する、文字列Aにおける挿入位置は、括弧外挿入である、最初の「(」の直前、又は括弧内挿入である、当該「(」の直後の二通りが考えられる。文字列Aに対する「f」の括弧外挿入によって得られる文字列は、「abcf(−[de])+:」であり、括弧内挿入によって得られる文字列は、「abc(f−[de])+:」である。
このうち、括弧内挿入によって得られる「abc(f−[de])+:」は、文字列Aの「c」と「−」の間に「f」を挿入した結果という意味では正しいが、文字列E「abcf−d−e:」にマッチする正規表現ではない。したがって、括弧内挿入であるのか、又は括弧外挿入であるのかが明確に区別可能である必要が有る。
そこで、本実施の形態では、対応グループ内において最初の「(」の後における括弧内挿入と、「)」の前における括弧内挿入とを制限することで、括弧内挿入及び括弧外挿入の区別、すなわち、挿入位置の一意性の確保を可能としているのである。
なお、挿入位置の一意性の確保という観点においては、括弧内挿入及び括弧外挿入のいずれが優先されるかが明確化されていればよく、本実施の形態にように、括弧外挿入が優先されなければならないわけではない。本実施の形態において、括弧外挿入が優先される理由の一つ(すなわち、制限される挿入の形態が、括弧外挿入ではなく、括弧内挿入である理由の一つ)は、正規表現的に不自然にならない括弧外挿入を優先させたいからである。例えば、括弧内挿入を許容した場合、「abc(f−[de])+:」のままでは、文字列Eにマッチしないため、更に、正規表現「?」を追加し、「abc(f?−[de])+:」とする必要があり、編集が煩雑となるからである。ここで、正規表現「?」は、「?」の直前の文字が0個か1個であることを示す。
なお、本実施の形態において、挿入位置の一意性の確保に寄与する事項は、以下の(1)〜(3)に示される通りである。
(1)上記したように括弧内挿入が制限されること。すなわち、対応グループの最初の「(」の後への挿入に対応する有向枝と、「)」の前への挿入に対応する有向枝とが削除されることである。したがって、仮に、挿入位置の一意性の確保が必要でない場合、当該有向枝は削除されなくてもよい。
(2)量化子が{X,}(X>0)である場合、すなわち、上限の無い繰り返しの場合に、量化子の展開において、量化対象がX個複製され、結果的に、量化対象がX+1個になること。仮に、挿入位置の一意性の確保が必要でない場合、量化対象の複製はX−1個でよい。
(3)量化子の展開において、量化対象と共に括弧開き「(」も複製されること。したがって、仮に、挿入位置の一意性の確保が必要でない場合、「(」の複製は行われなくてもよい。この場合、グラフ要素配列の配列要素の中で、量化対象最後尾要素が代入された配列要素の拡張枝属性には、当該量化対象最後尾要素の直前の「(」の位置ではなく、当該量化対象最後尾要素の直線の量化対象最後尾要素の位置が代入されればよい。
例えば、挿入位置の一意性の確保を考慮しない場合、文字列A及び文字列Eに関する編集距離算出グラフは、図18に示されるように生成される。
図18は、挿入位置の一意性の確保を考慮しない場合の編集距離算出グラフの例を示す図である。図18に示される編集距離算出グラフにおいて、X軸に配列されている文字列は、文字列Aに対応する文字列である。本実施の形態では、量化子の展開によって、文字列Aは、文字列A'「abc(−[de](−[de]):」に変形されるが、挿入位置の一意性の確保を考慮しない場合、文字列Aは、文字列A''「abc(−[de]):」に変形される。量化子「+」は、量化子{1,}に該当し、挿入位置の一意性の確保を考慮しない場合、上記の(2)より、1−1=0個の複製が追加されれば良いからである。したがって、図18に示される編集距離算出グラフでは、X軸に対して文字列A''が配列されている。また、図18では、「(」の後に対する挿入に対応する有向枝、及び「)」の前に対する挿入に対応する有向枝は削除されていない。なお、図18に示される編集距離算出グラフにおいて、Y軸には文字列Eが配列されている。したがって、図18に示される編集距離算出グラフは、文字列Aと文字列Eとの編集距離を算出するための編集距離算出グラフである。
当該編集距離算出グラフにおける編集距離の算出結果は、例えば、図19に示される通りである。図19は、挿入位置の一意性の確保を考慮しない場合の編集距離算出グラフに基づく編集距離の算出例を示す図である。
図19では、二通りの最短経路が探索されている。ここで、(1)に示される最短経路では、「(」の後に対する「f」の挿入、すなわち、括弧内挿入が示されている。一方、(2)に示される最短経路では、「(」の前に対する「f」の挿入、すなわち、括弧外挿入が示されている。なお、(1)及び(2)のいずれの最短経路に基づいても、編集距離は1である。
一方、挿入位置の一意性の確保を考慮した場合、文字列Aと文字列Eとの編集距離算出グラフは、図4等において説明した手順と同様の手順によって、図20に示されるように生成される。
図20は、挿入位置の一意性の確保を考慮した場合の編集距離算出グラフの例を示す図である。図20に示される編集距離算出グラフにおいて、X軸に配列されている文字列は、文字列Aに関して量化子の展開が行われた文字列A'である。また、Y軸には文字列Eが配列されている。なお、図20では、「(」の後に対する挿入に対応する有向枝、及び「)」の前に対する挿入に対応する有向枝は削除されている。すなわち、括弧内挿入は制限されている。
当該編集距離算出グラフにおける編集距離の算出結果は、例えば、図21に示される通りである。図21は、挿入位置の一意性の確保を考慮した場合の編集距離算出グラフに基づく編集距離の算出例を示す図である。
図21に示される通り、当該編集距離算出グラフにおいて探索される最短経路では、「f」の挿入位置が一意に決定される。すなわち、図21では、「f」が「(」の前に挿入されることが示されている。このように、括弧内挿入を制限し、量化子の展開等を行うことで、挿入位置を一意に決定することができる。なお、図21に示される最短経路に基づいて算出される編集距離は、図19と同様に1である。すなわち、図19と図21との違いは、挿入位置の一意性の有無であり、編集距離の算出結果は同じとなる。
なお、挿入位置の特定まで必要とされない場合、すなわち、編集距離が算出されればよい場合、図18及び図19において示した方法が採用されてもよい。
上述したように、本実施の形態によれば、正規表現が量化子の展開等によって編集距離算出グラフとの親和性が高い形式に置換されて、当該正規表現を含む文字列が編集距離算出グラフに配列される。また、編集距離算出グラフには、正規表現に対応した拡張枝が追加される。その結果、斯かる編集距離算出グラフに基づいて、公知の最短経路探索方法を用いることにより、比較対象の二つの文字列のうちの少なくともいずれか一方が正規表現を含む場合であっても、当該二つの文字列の編集距離を効率的に算出することができる。そして、当該正規表現が量化を示すものであっても、本実施の形態によれば、二つの文字列の編集距離を効率的に算出することができる。
また、括弧内挿入の制限等により、挿入位置の一意性を確保することができる。
なお、本実施の形態では、正規表現の対象範囲の開始を示す記号として括弧開き「(」を用い、正規表現の対象範囲の終了を示す記号として括弧閉じ「)」を用いる例を説明したが、これらの記号はどのようなものであってもよい。
次に、本実施の形態における編集距離の算出方法の具体的な利用シーンの一例を説明する。具体的には、コンピュータシステムやネットワーク内において発生するイベントの記録であるログデータを外部へ提供する際に、本実施の形態の編集距離の算出方法が適用される例について説明する。ログデータには、例えば、ホスト名、ポート名、又はファイルパス名等の機微情報が含まれる。したがって、ログデータが外部へ提供される際には、機微情報の秘匿化が行われる必要が有る。本実施の形態における編集距離の算出方法によれば、ログデータ内の機微情報の秘匿化のための作業を効率化することができる。
ログデータの秘匿方法として、正規表現で記述された秘匿ルールを使う手法がある。
図22は、ログデータ及び秘匿ルールの例を示す図である。図22には、ログデータL1と、秘匿ルールr1〜r4(以下、それぞれを区別しない場合「秘匿ルールr」という。)とが示されている。秘匿ルールrからログデータL1内のいずれかの行(以下、「ログデータ行」という。)に伸びる矢印は、当該矢印に係る秘匿ルールrと、当該秘匿ルールrにマッチするログデータ行との対応関係を示す。
このように、秘匿ルールrにおいて、例えば、ホスト名、ポート名、又はファイルパス名等の機微情報に該当する部分に正規表現を用いることで、機微情報の具体的な値ごとに秘匿ルールrを定義する必要性を低減させることができる。
秘匿ルールの作成方法として、秘匿したいログデータ行から直接正規表現を作成する方法が考えられる。
図23は、ログデータ行からの秘匿ルールの作成例を示す図である。図23では、ログデータ行「Path=/a/b/c」に基づいて、「Path=(/[a−z])+」が、秘匿ルールr5として作成された例が示されている。このような方法では、秘匿ルールr5に漏れが有った場合、改めて、秘匿化されなかったログデータ行が参照されて、秘匿ルールが生成される必要がある。例えば、「path=/a/b/c」というログデータ行は、秘匿ルールr5にマッチしない。したがって、この場合、当該ログデータ行に基づいて、例えば、「path=(/[a−z])+」という秘匿ルールが作成されることになる。
これに対し、既存の秘匿ルールを利用することで、新しい秘匿ルールの作成負荷を軽減することができる。すなわち、秘匿ルールは正規表現であり、ログデータ行は文字列であるため、本実施の形態における編集距離の算出方法を利用して、ログデータ行にマッチしないが類似する既存の秘匿ルールを抽出することができる。抽出された既存の秘匿ルールの一部を修正して新たな秘匿ルールを作成することで、ログデータ行から直接秘匿ルールを作成する場合に比べ、秘匿ルールの作成負荷の軽減を期待することができる。
図24は、既存の秘匿ルールを利用した新たな秘匿ルールの作成例を示す図である。図24では、既存の秘匿ルールr5とログデータ行「path=/a/b/c」との編集距離が算出され、編集距離=1、秘匿ルールr5の「P」を「p」に置換という結果が得られた例が示されている。この場合、例えば、当該結果に基づいて、自動的に、秘匿ルールr5を、「(p|P)ath=(/[a−z])+」という秘匿ルールr6に更新することができる。または、「path=(/[a−z])+」という新たな秘匿ルールが自動的に生成されてもよい。
または、予め既存の秘匿ルール同士が比較され、類似する秘匿ルール群がクラスタリングされ、インデックス化されることで、ログデータ行に類似する既存の秘匿ルールの抽出が高速化されてもよい。秘匿ルールは正規表現であるため、本実施の形態における編集距離の算出方法を利用して秘匿ルール同士の編集距離を算出することにより、類似する秘匿ルールのクラスタリングを実現することができる。
なお、本実施の形態において、編集距離算出グラフは、二つの文字列の編集距離を算出するための文字列の編集に対応する有向枝の集合を含む有向グラフの一例である。編集距離算出装置10は、有向グラフ生成装置の一例である。量化子展開部123は、置換部の一例である。グラフ要素生成部124は、追加部の一例である。
以上、本発明の実施例について詳述したが、本発明は斯かる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。
以上の説明に関し、更に以下の項を開示する。
(付記1)
二つの文字列の編集距離を算出するための文字列の編集に対応する有向枝の集合を含む有向グラフの生成方法であって、
前記文字列のうち、量化を示す正規表現の部分を、当該量化における繰り返し対象が量化子に応じた回数分繰り返す第一の文字列によって置換し、
前記有向グラフにおいて、前記正規表現について置換が行われた部分を含む文字列が配列された軸に対して平行に、前記量化子に応じた有向枝を追加する、
処理をコンピュータが実行する有向グラフ生成方法。
(付記2)
前記追加する処理は、前記第一の文字列の末尾から、前記第一の文字列内において最後の前記繰り返し対象の先頭への有向枝を追加する付記1記載の有向グラフ生成方法。
(付記3)
前記追加する処理は、前記第一の文字列において、前記量化子が示す下限の繰り返し回数に対応する前記繰り返し対象の末尾から、前記第一の文字列の直後までの有向枝を追加する付記1又は2記載の有向グラフ生成方法。
(付記4)
前記追加する処理は、前記量化子が0回以上の繰り返しを示す場合は、前記第一の文字列の直前から前記第一の文字列の直後までの有向枝を追加する付記1乃至3いずれか一項記載の有向グラフ生成方法。
(付記5)
前記置換する処理は、量化を示す正規表現の対象範囲の終了を示す記号の前に、当該正規表現の対象範囲の開始を示す記号及び前記繰り返し対象が前記量化子に応じた回数分繰り返す文字列を挿入し、
前記記号に対応するノードへの有向枝と、前記第一の文字列の中で最初の前記記号の前への文字の挿入に対応する有向枝と、前記第一の文字列の中で最後の前記記号の前への文字の挿入に対応する有向枝とを削除する処理を前記コンピュータが実行する付記1乃至4いずれか一項記載の有向グラフ生成方法。
(付記6)
二つの文字列の編集距離を算出するための文字列の編集に対応する有向枝の集合を含む有向グラフの生成をコンピュータに実行させる有向グラフ生成プログラムであって、
前記文字列のうち、量化を示す正規表現の部分を、当該量化における繰り返し対象が量化子に応じた回数分繰り返す第一の文字列によって置換し、
前記有向グラフにおいて、前記正規表現について置換が行われた部分を含む文字列が配列された軸に対して平行に、前記量化子に応じた有向枝を追加する、
処理をコンピュータに実行させる有向グラフ生成プログラム。
(付記7)
前記追加する処理は、前記第一の文字列の末尾から、前記第一の文字列内において最後の前記繰り返し対象の先頭への有向枝を追加する付記6記載の有向グラフ生成プログラム。
(付記8)
前記追加する処理は、前記第一の文字列において、前記量化子が示す下限の繰り返し回数に対応する前記繰り返し対象の末尾から、前記第一の文字列の直後までの有向枝を追加する付記6又は7記載の有向グラフ生成プログラム。
(付記9)
前記追加する処理は、前記量化子が0回以上の繰り返しを示す場合は、前記第一の文字列の直前から前記第一の文字列の直後までの有向枝を追加する付記6乃至8いずれか一項記載の有向グラフ生成プログラム。
(付記10)
前記置換する処理は、量化を示す正規表現の対象範囲の終了を示す記号の前に、当該正規表現の対象範囲の開始を示す記号及び前記繰り返し対象が前記量化子に応じた回数分繰り返す文字列を挿入し、
前記記号に対応するノードへの有向枝と、前記第一の文字列の中で最初の前記記号の前への文字の挿入に対応する有向枝と、前記第一の文字列の中で最後の前記記号の前への文字の挿入に対応する有向枝とを削除する処理を前記コンピュータに実行させる付記6乃至9いずれか一項記載の有向グラフ生成プログラム。
(付記11)
二つの文字列の編集距離を算出するための文字列の編集に対応する有向枝の集合を含む有向グラフの生成装置であって、
前記文字列のうち、量化を示す正規表現の部分を、当該量化における繰り返し対象が量化子に応じた回数分繰り返す第一の文字列によって置換する置換部と、
前記有向グラフにおいて、前記正規表現について置換が行われた部分を含む文字列が配列された軸に対して平行に、前記量化子に応じた有向枝を追加する追加部と、
を有する有向グラフ生成装置。
(付記12)
前記追加部は、前記第一の文字列の末尾から、前記第一の文字列内において最後の前記繰り返し対象の先頭への有向枝を追加する付記6記載の有向グラフ生成装置。
(付記13)
前記追加部は、前記第一の文字列において、前記量化子が示す下限の繰り返し回数に対応する前記繰り返し対象の末尾から、前記第一の文字列の直後までの有向枝を追加する付記11又は12記載の有向グラフ生成装置。
(付記14)
前記追加部は、前記量化子が0回以上の繰り返しを示す場合は、前記第一の文字列の直前から前記第一の文字列の直後までの有向枝を追加する付記11乃至13いずれか一項記載の有向グラフ生成装置。
(付記15)
前記置換する処理は、量化を示す正規表現の対象範囲の終了を示す記号の前に、当該正規表現の対象範囲の開始を示す記号及び前記繰り返し対象が前記量化子に応じた回数分繰り返す文字列を挿入し、
前記追加部は、前記記号に対応するノードへの有向枝と、前記第一の文字列の中で最初の前記記号の前への文字の挿入に対応する有向枝と、前記第一の文字列の中で最後の前記記号の前への文字の挿入に対応する有向枝とを削除する付記11乃至14いずれか一項記載の有向グラフ生成装置。