Gestione dei cambiamenti
per documenti digitali
sul Web
Tesi di Laurea di:
MICHELE SCHIRINZI
Relatore: Chiar.mo Prof.
FABIO VITALI
Introduzione
“Un documento non può essere semplicemente pensato come una sequenza statica di
caratteri invariata nel tempo, ma è una struttura evolutiva a cui vengono aggiunte,
eliminate o modificate delle parti. Queste modifiche sono parte integrante del documento
stesso: è utile (se non fondamentale) poter ricostruire qualsiasi porzione di una qualsiasi
versione, così come era in un qualsiasi momento della storia del documento ”
[Nelson T.H.]
Un sistema che soddisfi questa definizione deve poter memorizzare tutti gli stati
di sviluppo intermedi(versioni) di un documento.
Possono esserci due modi per compiere questa operazione:
1. Memorizzare interamente ogni stato del documento.
2. Memorizzare i cambiamenti avvenuti fra una versione e la sua successiva.
Memorizzazione delle versioni
Nel primo caso immaginiamo di “fotografare” il documento in diversi momenti
del suo sviluppo e mantenere ordinatamente le varie “fotografie”.
Prima stesura del
documento
Questo è il
documento nella
sua versione
originale, la
prima stesura del
documento
Questo è il
documento nella
sua seconda
versione , la
seconda stesura
del documento
Questo è il
documento nella
sua terza
versione, la terza
stesura del
documento
Versione attuale del
documento
Questo è il
documento nella
sua versione
attuale, l’ultima
stesura del
documento
Nel secondo caso andiamo a memorizzare solo i cambiamenti avvenuti fra una
versione e la sua successiva (delta).
Prima stesura del
documento
Questo è il
documento nella
sua versione
originale, la
prima stesura del
documento
Delete(8)
Delete(15)
Insert(testo1)
Update(4,Ndelta)
Algoritmi di Diff.
Insert(testo4)
Delete(4)
Delete(9)
Insert(testo5)
• L’input consiste in due versioni
di uno stesso documento;
Versione del
documento
Diff
Versione del
documento
Insert(testo)
Insert(testo2)
Update(7,Ndelta)
Delete(12)
(Delta) Differenze
fra le due versioni
• Il risultato è un documento delta
che rappresenta i cambiamenti
avvenuti fra questi.
HML-diff: Un algoritmo di Diff
per documenti XML
Presentiamo ora un algoritmo ideato da noi per la ricerca dei cambiamenti fra
versioni all’interno del progetto IsaWiki.
L’algoritmo è stato implementato in PHP per essere usato all’interno del sistema
IsaWiki. Sono state realizzate la funzionalità di Diff, la ricostruzione di un
documento e la possibilità di visualizzare i cambiamenti fra due versioni.
L’algoritmo si divide in 4 passi principali:
1. Ricerca della massima parte invariata fra i documenti.
2. Ricerca delle parti spostate dei documenti (una parte è considerata spostata se
appare in punti diversi fra le due versioni rispetto alla parte più grande
rimasta invariata delle versioni).
3. Ricerca delle parti aggiornate dei documenti (una parte è considerata
aggiornata se appare nella stessa posizione fra le due versioni e differisce per
una certa quantità limitata da una costante).
4. Espressione delle informazioni rilevate nelle fasi precedenti.
Ricerca delle parti invariate
Il primo passo è serializzare i documenti XML.
La serializzazione avviene attraverso una visita in profondità con pre-ordine
degli alberi dei documenti.
Ogni elemento della sequenza è un valore hash che rappresenta un sottoalbero
dell’albero del documento.
1
2
3
7
8
4
9
sequenza
11
E1 E2
5
6
10
..
..
..
..
..
..
..
..
E11
Ricerca delle parti invariate
Applichiamo un algoritmo per trovare la LCS (Longest Common Subsequence)
fra le sequenze che rappresentano i documenti da confrontare.
L’algoritmo per trovare la LCS suppone che una LCS sia formata dalla
concatenazione ordinata di LCCS(Longest Common Continuous Subsequence).
Durante il calcolo della LCS possiamo usare i seguenti accorgimenti:
• Se S1[i]=S2[j] allora anche gli N elementi successivi a i e j saranno uguali, dove
N è il numero di nodi appartenenti al sottoalbero radicato nel nodo associato
all’elemento S1[i].
• Dividiamo gli elementi di una sequenza in classi, in modo da limitare i
confronti (Ha senso confrontare un nodo di testo con un nodo di testo).
Questa suddivisione può essere compiuta in tempo lineare all’atto della
creazione della sequenza.
Passi successivi
Una volta ottenute le parti uguali maggiori fra le due sequenze esaminiamo le
parti restanti per rifinire la qualità del delta.
Sequenza A
Sequenza B
In verde sono contrassegnate le parti uguali fra le due sequenze.
Espressione del delta
Raccolte tutte le informazioni delle fasi precedenti, consideriamo:
1. Se un nodo della sequenza A non è stato trovato in nessuna delle fasi
precedenti viene considerato cancellato
2. Se un nodo della sequenza B non è stato trovato in nessuna delle fasi
precedenti viene considerato inserito
3. I nodi mossi e i nodi aggiornati sono quelli trovati nelle rispettive fasi
Nell’espressione del delta vengono prima esplicitate tutte le operazioni di
cancellazione e aggiornamento, di seguito vengono esplicitate le operazioni di
inserimento.
Quest’ordine è importante perché ci garantisce di trovare dopo l’esecuzione
dell’ N-esima operazione, il documento nello stato in cui deve essere applicata
N+1-esima operazione.
Complessità e Qualità
L’algoritmo descritto ha una complessità di O(N * C * D) dove:
• N sono i numeri di nodi del documento A
• C la cardinalità media delle classi in cui vengono divisi gli elementi del
documento. C << N.
• D un valore proporzionale alle differenze fra i due documenti confrontati.
La qualità del delta ottenuto è buona in quanto oltre alle classiche operazioni di
inserimento e cancellazione descrive operazioni di:
• Move, riconosce parti del documento spostare fra le due versioni.
• Update, riconosce aggiornamenti di nodi Testo, Elemento, Commento.
Conclusioni
• Con la transizione del Web verso XML, sistemi di questo tipo assumono
un’importanza rilevante all’interno di CMS(Content Management System).
• Inoltre questi sistemi possono essere di supporto ad applicazione che usano i
nuovi standard basati su XML(DocBook, RSS, RDF, ecc..).
• In generale è un’utilità fondamentale all’interno di sistemi in cui è interessante
seguire lo sviluppo dei documenti in funzione del tempo, infatti permettono
un’analisi semplice e comoda dell’evoluzione di un documento.
Book
2
Chapter 7
Chapter
5
3
Title
8
Para
4
Text1
Text 2
13
11
Text 4
14
Text 5
match
Text 6
24
12
19 Chapter
15
Title
Para
9
6
Chapter
10
Title
1
Title
Img
Text 7
update
Para
Para
Title
25
17
16
22
20
Para
Chapter
18
21
23
Text 8
Text 9
Text 10
27
26
28
Text 11
Text 12
move
match
match
Book
5
2 Chapter
Chapter
Para
Title
3
4
Text 4
Para
10
9
Text 25
19 Chapter
Chapter
6
7
Text 2
24
12
8
Para
match
1
13
20
15
Title
11
14
16
Text 11
Text 6
Text 7
17
Img
22
Title
Para
Chapter
Para
18
21
23
Text 8
Text 9
Text 10
Title
25
26
Text 12
19
19
Chapter
oxfbng
Chapter
22
20
Title
qtrhky
Para
Title
23
21
qtrhky
21
Text 10 b5g43g
Text 9
22 eewgrt + b5g43g
20
eewgrt
oxfbng
Text 9
Para
19 oxfbng + eewgrt + b5g43g
23
Text 10 b5g43g
Chapter
bcnngh
bcnngh
22
20
Title
19 oxfbng + eewgrt + b5g43g
Chapter
21
Title
Para
Para
eewgrt + b5g43g
23
bcnngh Text 9
22
20
qtrhky
Text 10 b5g43g
eewgrt + b5g43g
qtrhky + bcnngh
21
Text 9
oxfbng + eewgrt + b5g43g + qtrhky + bcnngh
23
Chapter 19
Text 10 b5g43g
bcnngh
22
20
Title
Para
eewgrt + b5g43g
qtrhky + bcnngh
21
Text 9 bcnngh
23
Text 10 b5g43g
X=<A,B,F,H,F,G,T,R,K,W,E,S,D>
Y=<A,B,U,H,U,G,T,R,K,M,E,S,D>
X=<A,B,F,H,F>
X=<W,E,S,D>
Y=<A,B,U,H,U>
Y=<M,E,S,D>
LCCS
X=<F,H,F>
X=<>
Y=<U,H,U>
Y=<>
X=<F>
Y=<U>
Y=<U>
X=<>
Y=<M>
Y=<>
LCCS
LCCS
LCCS
<A,B>
X=<F>
X=<W>
<H>
<G,T,R,K>
<E,S,D>
LCS
Equa(x)
Move(x)
Nodi di T²
Update(x)
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
1
2
3
4
5
6
7
8
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
Nodi di T¹
l3
l2
1° Ciclo
l1
a
b
c
d
a
f
c
t
e
a
b
c
d
a
b
b
a
n
max1 = l2 = 4
a
f
c
t
a
b
c
d
l1
e
c
d
b
a
d
e
b
b
m
b
b
a
n
l3
l2
l3
2° Ciclo
l2
l1
a
b
c
d
a
f
c
t
e
a
b
c
d
a
max2 = l1 = 4
a
f
c
t
a
b
l1
c
d
e
c
d
b
a
d
l3
l2
e
b
b
m
HML-diff: Esempio
Confrontare file con 'Diff Doc'
Ora è possibile confrontare documenti in modo
rapido e preciso. “Diff Doc” è una potente
utility per confronti e correzioni di cartelle/file
di facile utilizzo. Permette infatti di confrontare
file di tutti i tipi, compresi MS Word/Excel,
PDF, RTF, Text, XML, HTML, Wordperfect e
altri.
Indipendentemente dal programma di editing
utilizzato (MS Word, WordPad, Visual Basic,
ecc), basta caricare i file originali e quelli
modificati, premere il tasto Refresh (Aggiorna)
(o F5), e il documento confrontato apparirà
immediatamente. E’ inoltre possibile
confrontare le cartelle per vedere esattamente
quali file sono cambiati, prima ancora di
effettuare il confronto.
“Diff Doc” può indicare le differenze fra i file in
due diverse schermate, “All in One”, o “Side by
Side”. Entrambe presentano dei vantaggi, per
passare da una all’altra basta un clic col mouse
(o premere F6). Infine, sono disponibili
numerosi report, incluso quello in HTML, in cui
vengono specificate le differenze
Aggiornamento
Aggiornamento
Invariato
Spostamento
Confrontare documenti con
'Diff Doc'
Ora è possibile confrontare documenti in modo
veloce e preciso. “Diff Doc” è una potente
utility per confronti e correzioni di cartelle/file
di facile utilizzo. Permette infatti il confronto di
file di tutti i tipi, compresi MS Word/Excel,
PDF, RTF, HTML, Wordperfect e altri.
“Diff Doc” può indicare le differenze fra i file in
due diverse schermate, “All in One”, o “Side by
Side”. Entrambe presentano dei vantaggi, per
passare da una all’altra basta un clic col mouse
(o premere F6). Infine, sono disponibili
numerosi report, incluso quello in HTML, in cui
vengono specificate le differenze
Indipendentemente dal programma di editing
utilizzato (MS Word, WordPad, Visual Basic,
ecc), basta caricare i file originali e quelli
modificati, premere il tasto Refresh (Aggiorna)
(o F5), e il documento confrontato apparirà
immediatamente. E’ inoltre possibile
confrontare le cartelle per vedere esattamente
quali file sono cambiati, prima ancora di
effettuare il confronto.
Nodo Inserito
Nodo update
A
A
B
B
B
A
A
A
B
B
B
A
B
A
A
B
B
Nodo Cancellato
A
Nodo Mosso
B
Scarica

Gestione dei cambiamenti per documenti digitali