文書比較
MATSUURA Satoshi
matsuura@is.naist.jp




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


     2
どの部分に文字を追加し、
どの部分の文字を削除するか
   見極めること


      3
ラジオ→ラジコンの例
         ラジオ
  共通-ラ   ラジオ
  共通-ジ   ラジオ
  削除-オ   ラジ
  追加-コ   ラジコ
  追加-ン   ラジコン
         ラジコン
          4
diffに関する基礎用語

• Levenshtein   Distance (編集距離)

 • 追加、削除の合計数

• LCS   (Longest Common Subsequence)
 • 最長共通部分列

• SES   (Shortest Edit Script)
 • 最小の変換手順

                                 5
ラジオ
                    LCS: ラジ
SES
      共通-ラ   ラジオ
      共通-ジ   ラジオ
      削除-オ   ラジ
                    編集距離: 3
      追加-コ   ラジコ
      追加-ン   ラジコン
             ラジコン

              6
Edit Graphの作成




      7
問題設定

みんかんじん




みかんせいじん


   8
各文書をx,y方向に並べ格子を作る
                    Y

        み   か   ん       せ   い   じ   ん

    み
    ん
x   か
    ん
    じ
    ん
                    9
共通の文字が交差する点を探す
                     Y

         み   か   ん        せ   い   じ   ん

    み
    ん
x   か
    ん
    じ
    ん
                     10
共通の文字が存在する点(x,y)へは
点(x-1, y-1)から移動することを可能とする
                    Y

        み   か   ん        せ   い   じ   ん

    み
    ん
x   か
    ん
    じ
    ん
                    11
点S→点Gへの最小経路を求める
                     Y

    S    み   か   ん        せ   い   じ   ん

    み
    ん
x   か
    ん
    じ
    ん
                                          G
                     12
編集距離、LCS、SESが求まる
                 つまり、diffが求まる
                                   Y

             み        か        ん       せ     い     じ    ん
        共通
    み
          削除
    ん
                 共通
x   か                                                       削除
                          共通
    ん                              追加      追加
                                                 共通
    じ
                                                       共通
    ん
                                   追加
                                                                 13
diffアルゴリズム

Edit Graph上でどのような
手順で最短経路を求めるか


        14
動的計画法




  15
• 原点から順次コストを計算していく

 • x+y=1,   2, 3・・・方向に計算していく

 • 要はダイクストラ法


• O(MN)

 • M、N:   比較対象の各文字列長

 • マス目の数に比例してコスト計算が必要


                   16
Y

            み   か         ん       せ      い   じ   ん
            1


        1   0
    み
    ん
x   か
    ん
    じ
    ん
                n コスト確定       n コスト未確定
                                                     17
Y

            み   か   ん       せ   い   じ   ん
            1   2


        1   0
    み
        2
    ん
x   か
    ん
    じ
    ん
                                            18
Y

            み   か   ん       せ   い   じ   ん
            1   2   3


        1   0   1
    み
        2   1
    ん
        3
x   か
    ん
    じ
    ん
                                            19
Y

            み   か   ん       せ   い   じ   ん
            1   2   3       4


        1   0   1   2
    み
        2   1   2   1
    ん
        3   2   1
x   か
        4
    ん
    じ
    ん
                                            20
Y

            み   か    ん       せ   い   じ   ん
            1    2   3       4   5


        1   0    1   2       3
    み
        2   1    2   1
    ん
        3   2    1
x   か
        4   3
    ん
        5
    じ
    ん
                以下、繰り返し                      21
動的計画法の改善案




    22
• 編集回数に着目

• D=1,   2, 3・・・と増やしていく

• 通過済みの経路は通らない

• 通過済みの経路を通ると編集回数が必ず増加




                  23
Y

          み   か   ん       せ   い   じ   ん
    D=0

     み
     ん
x    か
     ん
     じ
     ん
                                          24
Y

          み   か   ん       せ   い   じ   ん
    D=1

     み
     ん
x    か
     ん
     じ
     ん
                                          25
Y

          み   か   ん       せ   い   じ   ん
    D=2

     み
     ん
x    か
     ん
     じ
     ん
                                          26
Y

          み   か   ん       せ   い   じ   ん
    D=3

     み
     ん
x    か
     ん
     じ
     ん
                                          27
Myers’ algorithm
  O(ND) algorithm




         28
k=y-xの線を引くと
    み   か   ん      せ      い      じ     ん

み
ん
か                                          k=4


ん                                          k=3


じ                                          k=2


ん
            k=-3   k=-2   k=-1   k=0   k=1
                                                 29
• 編集回数Dと対角線kの関係

 • D=iの時、kの範囲は   -i ≦ k ≦ i

• V[k,   D]の定義

 • 編集回数Dの時の対角線k上でのyの最大値




                 30
編集回数が1増加すると
隣の対角線に移れる


     31
逆にk=iの時、どこから
移るのが一番良いか
  考えてみよう


     32
k=iに移る前はk=i-1, i+1上
かつ、編集回数が1つ少ない

k=i-1, k=i+1のどちらから移っ
   た方が得か考える
          33
V[k, D]の求め方
•   V[k,D]はV[k+1, D-1]とV[k-1, D-1]より求まる
                                                                             Y
•   ① Aの座標を求める
                                                                        !"#$%&'()%*
    •   V[k+1, D-1] or V[k-1, D-1]+1の大きい方が
        Aのy座標の値になる。                                                 編集距離+1


                                             x                 編集距離+1
    •   xの座標はk=y-xにより求まる                         !"#)%&'()%*            +
                                                                                              k+1

                                                                                           !"#&'(*
•   ② Aから斜めに可能な限り移動する
                                                                                       ,
                                                                                              k

                                                                                 k-1




                                                                                                     34
Y

D=0
      V[0, 0]




 x                                               k=4

                                                 k=3

                                                 k=2



                k=-3       k=-2   k=-1   k=0   k=1
                                                       35
Y

D=1
      V[0, 0]


                      V[1, 1]




 x                                                    k=4

                                                      k=3
                V[-1, 1]

                                                      k=2



                   k=-3         k=-2   k=-1   k=0   k=1
                                                            36
Y

D=2
      V[0, 0]


                            V[1, 1]


                                        V[2, 2]

 x                                                               k=4


                V[-1, 1]                                         k=3
                                       V[0, 2]

                                                                 k=2
                            V[-2, 2]



                           k=-3        k=-2       k=-1   k=0   k=1
                                                                       37
Y

D=3
      V[0, 0]



                           V[1, 1]

                                                             V[3, 3]
                                           V[2, 2]


 x                                                                             k=4
                           V[-1, 1]       V[0, 2]

                                                                               k=3

                V[-2, 2]                        V[-1,3]                        k=2

                V[-3, 3]                                                           V[1,3]


                       k=-3               k=-2            k=-1         k=0   k=1
                                                                                            38
Wu’s algorithm
 O(NP) algorithm




        39
Δ=N-Mと定義すると
 最終到達点は必ずk=Δ上
k=Δの対角線を中心に考える


      40
N=7
      Δ=1



                   k=Δ
M=6                                      k=4

                                         k=3

                                         k=2



            k=-3   k=-2   k=-1   k=0   k=1
                                               41
最善でも編集距離D=Δ
    k=0,1,・・・Δの範囲で点Gに到達できるか
S    Δ


                    k=Δ




               42             G
点Gに到達できない場合は探索範囲を広げる
       探索範囲を広げた量をPで表す
S     Δ   p=1


                     k=Δ




                43         G
Pの値は      回経路の量も示し、
        D = Δ + 2P の関係が成り立つ
S   Δ        p=2


                        k=Δ




                   44         G
• 編集回数DとPの関係

 •D   = Δ + 2P (P迂回した分、戻ってくる必要あり)

• fp[k,   p]の定義

 • P=pにおいて対角線k上におけるyの最大値




                  45
Myersのアルゴリズム同様に
 k=i上での点を決める際
どこから移ると得か、考える

       46
k=Δの対角線を中心に考え、
k=Δから遠い対角線上の点か
  ら順に決定していく

      47
1.外側から内側に向かってfpを算出
    2.最後にk=Δ上での位置を求める
S    Δ     p




               48        G
fp[k,p]の求め方
•   1aの領域内(-p ≦ k < Δ)

    •   k=Δに近づく方向はy方向                                           Y
                                                   S   !        p
    •   fp[k-1,p]+1, fp[k+1,p-1]の大きい方が移動先のy座
        標。k=y-xによりx座標が求まる。
                                                                    1b
    •   斜めに移動できるだけ移動する

•   1bの領域内(Δ < k ≦ p)
                                               x           1a
    •   k=Δに近づく方向はx方向                                               2
    •   fp[k+1,p], fp[k-1,p-1]+1の大きい方が移動先のy座
        標。k=y-xによりx座標が求まる。                                               G

    •   斜めに移動できるだけ移動する

•   2の領域(k=Δ)

    •   fp[k-1,p]+1, fp[k+1,p]の大きい方が移動先のy座標。
        k=y-xによりx座標が求まる。

    •   斜めに移動できるだけ移動する
                                                                         49
Y

              み      か   ん           せ      い      じ     ん
    P=0


     み
          fp[0, 0]        fp[1, 0]

     ん
x    か                                                       k=4


     ん                                                       k=3


     じ                                                       k=2


     ん
                         k=-3        k=-2   k=-1   k=0   k=1
                                                                   50
Y

          み          か      ん            せ           い      じ     ん
    P=1
          fp[0, 0]

     み
                              fp[1, 0]

     ん                                    fp[2, 1]

x    か                                                                k=4


     ん                   fp[-1, 1]       fp[0, 1]
                                                                      k=3


     じ                                                                k=2


     ん                                                                  fp[1, 1]

                            k=-3         k=-2        k=-1   k=0   k=1
                                                                                   51
参考文献
•   文書比較アルゴリズム

    •   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

                                                    52

文書比較 (diff)