文書比較
MATSUURA Satoshi [email protected]
1
文書の差分(diff)を求めるとは
2
どの部分に文字を追加し、どの部分の文字を削除するか
見極めること
3
4
ラジオ
ラジコン
ラジオラジオラジラジコ
共通-ラ
共通-ジ
削除-オ
追加-コ
追加-ン
ラジコン
ラジオ→ラジコンの例
5
diffに関する基礎用語
• Levenshtein Distance (編集距離)
•追加、削除の合計数
• LCS (Longest Common Subsequence)
•最長共通部分列
• SES (Shortest Edit Script)
•最小の変換手順
6
ラジオ
ラジコン
ラジオラジオラジラジコ
共通-ラ
共通-ジ
削除-オ
追加-コ
追加-ン
ラジコン
LCS: ラジ
編集距離: 3
SES
問題設定
みんかんじん
みかんせいじん
8
みんかん
んじん
み か ん せ い じ ん
9
各文書をx,y方向に並べ格子を作る
Y
x
みんかん
んじん
み か ん せ い じ ん
10
共通の文字が交差する点を探す
Y
x
みんかん
んじん
み か ん せ い じ ん
11
共通の文字が存在する点(x,y)へは点(x-1, y-1)から移動することを可能とする
Y
x
みんかん
んじん
み か ん せ い じ ん
12
点S→点Gへの最小経路を求める
S
G
Y
x
みんかん
んじん
み か ん せ い じ ん共通
共通
共通
共通
共通
削除
追加 追加
追加
削除
13
編集距離、LCS、SESが求まるつまり、diffが求まる
Y
x
Edit Graph上でどのような手順で最短経路を求めるか
14
diffアルゴリズム
16
•原点から順次コストを計算していく
• x+y=1, 2, 3・・・方向に計算していく
•要はダイクストラ法
•O(MN)
•M、N: 比較対象の各文字列長
•マス目の数に比例してコスト計算が必要
17
みんかん
んじん
み か ん せ い じ ん1
01
Y
x
n nコスト確定 コスト未確定
18
1
01
2
2
みんかん
んじん
み か ん せ い じ んY
x
19
1
01
2
2
1
3
1
3
みんかん
んじん
み か ん せ い じ んY
x
20
1
01
2
2
1
3
1
3
2
4
2
2
1
1
4
みんかん
んじん
み か ん せ い じ んY
x
21
1
01
2
2
1
3
1
3
2
4
2
2
1
1
4
3
5
3
5
みんかん
んじん
み か ん せ い じ んY
x
以下、繰り返し
23
•編集回数に着目
•D=1, 2, 3・・・と増やしていく
•通過済みの経路は通らない
•通過済みの経路を通ると編集回数が必ず増加
24
D=0
みんかん
んじん
み か ん せ い じ んY
x
25
D=1
みんかん
んじん
み か ん せ い じ んY
x
26
D=2
みんかん
んじん
み か ん せ い じ んY
x
27
D=3
みんかん
んじん
み か ん せ い じ んY
x
Myers’ algorithmO(ND) algorithm
28
k=y-xの線を引くと
みんかん
んじん
み か ん せ い じ ん
k=0k=-1k=-2k=-3 k=1
k=3
k=4
k=2
29
30
•編集回数Dと対角線kの関係
•D=iの時、kの範囲は -i ≦ k ≦ i
•V[k, D]の定義
•編集回数Dの時の対角線k上でのyの最大値
編集回数が1増加すると隣の対角線に移れる
31
逆にk=iの時、どこから移るのが一番良いか考えてみよう
32
k=iに移る前はk=i-1, i+1上かつ、編集回数が1つ少ない
k=i-1, k=i+1のどちらから移った方が得か考える
33
V[k, D]の求め方
34
• V[k,D]はV[k+1, D-1]とV[k-1, D-1]より求まる
• ① Aの座標を求める
• V[k+1, D-1] or V[k-1, D-1]+1の大きい方がAのy座標の値になる。
• xの座標はk=y-xにより求まる
• ② Aから斜めに可能な限り移動するk
Y
x
k-1
k+1
!"#$%&'()%*
!"#)%&'()%*
!"#&'(*
編集距離+1
編集距離+1+
,
k=0k=-1k=-2k=-3 k=1
k=3
k=4
k=2
35
D=0
Y
x
V[0, 0]
k=0k=-1k=-2k=-3 k=1
k=3
k=4
k=2
36
D=1
Y
x
V[0, 0]
V[-1, 1]
V[1, 1]
k=0k=-1k=-2k=-3 k=1
k=3
k=4
k=2
37
D=2
Y
x
V[0, 0]
V[-1, 1]
V[1, 1]
V[-2, 2]
V[0, 2]
V[2, 2]
k=0k=-1k=-2k=-3 k=1
k=3
k=4
k=2
38
D=3
Y
x
V[0, 0]
V[-1, 1]
V[1, 1]
V[-2, 2]
V[0, 2]
V[2, 2]
V[-3, 3]
V[-1,3]
V[1,3]
V[3, 3]
Wu’s algorithmO(NP) algorithm
39
Δ=N-Mと定義すると最終到達点は必ずk=Δ上
k=Δの対角線を中心に考える
40
N=7
M=6
k=0k=-1k=-2k=-3 k=1
k=3
k=4
k=2
41
Δ=1
k=Δ
最善でも編集距離D=Δk=0,1,・・・Δの範囲で点Gに到達できるか
42
Δ
k=Δ
S
G
点Gに到達できない場合は探索範囲を広げる探索範囲を広げた量をPで表す
43
ΔS
G
p=1
k=Δ
Pの値は迂回経路の量も示し、D = Δ + 2P の関係が成り立つ
44
ΔS
G
p=2
k=Δ
45
•編集回数DとPの関係
•D = Δ + 2P (P迂回した分、戻ってくる必要あり)
•fp[k, p]の定義
• P=pにおいて対角線k上におけるyの最大値
Myersのアルゴリズム同様にk=i上での点を決める際
どこから移ると得か、考える
46
k=Δの対角線を中心に考え、k=Δから遠い対角線上の点から順に決定していく
47
48
ΔS
G
p
1.外側から内側に向かってfpを算出2.最後にk=Δ上での位置を求める
fp[k,p]の求め方
49
• 1aの領域内(-p ≦ k < Δ)
• k=Δに近づく方向はy方向
• fp[k-1,p]+1, fp[k+1,p-1]の大きい方が移動先のy座標。k=y-xによりx座標が求まる。
• 斜めに移動できるだけ移動する
• 1bの領域内(Δ < k ≦ p)
• k=Δに近づく方向はx方向
• fp[k+1,p], fp[k-1,p-1]+1の大きい方が移動先のy座標。k=y-xによりx座標が求まる。
• 斜めに移動できるだけ移動する
• 2の領域(k=Δ)
• fp[k-1,p]+1, fp[k+1,p]の大きい方が移動先のy座標。k=y-xによりx座標が求まる。
• 斜めに移動できるだけ移動する
!S
G
p
1a
1b
2
Y
x
k=0k=-1k=-2k=-3 k=1
k=3
k=4
k=2
50
P=0
fp[0, 0] fp[1, 0]みんかん
んじん
み か ん せ い じ んY
x
k=0k=-1k=-2k=-3 k=1
k=3
k=4
k=2
51
fp[0, 0]
fp[1, 0]
fp[-1, 1] fp[0, 1]
fp[1, 1]
fp[2, 1]
P=1
みんかん
んじん
み か ん せ い じ んY
x
参考文献
52
• 文書比較アルゴリズム
• http://hp.vector.co.jp/authors/VA007799/viviProg/doc5.htm
• diff(1), diff(2), diff(3)
• http://www.slash-zero.jp/archives/program/466
• http://www.slash-zero.jp/archives/program/468
• http://www.slash-zero.jp/archives/program/476
• Diff
• http://www.slideshare.net/cubicdaiya/diff-2660306
• diff with C++
• http://labs.unoh.net/2008/11/diff_with_c.html