文書比較 (diff)

52
文書比較 MATSUURA Satoshi [email protected] 1

Transcript of 文書比較 (diff)

文書の差分(diff)を求めるとは

2

どの部分に文字を追加し、どの部分の文字を削除するか

見極めること

3

4

ラジオ

ラジコン

ラジオラジオラジラジコ

共通-ラ

共通-ジ

削除-オ

追加-コ

追加-ン

ラジコン

ラジオ→ラジコンの例

5

diffに関する基礎用語

• Levenshtein Distance (編集距離)

•追加、削除の合計数

• LCS (Longest Common Subsequence)

•最長共通部分列

• SES (Shortest Edit Script)

•最小の変換手順

6

ラジオ

ラジコン

ラジオラジオラジラジコ

共通-ラ

共通-ジ

削除-オ

追加-コ

追加-ン

ラジコン

LCS: ラジ

編集距離: 3

SES

Edit Graphの作成

7

問題設定

みんかんじん

みかんせいじん

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アルゴリズム

動的計画法

15

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

以下、繰り返し

動的計画法の改善案

22

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