Absatz Übereinstimmung mit Python

8

Hintergrundinformationen

Ich habe ein Python-Skript, das Word-Dokumente mit dem docx -Modul generiert. Diese Dokumente werden basierend auf einem Protokoll erstellt und dann gedruckt und als Datensätze gespeichert. Das Protokoll kann jedoch rückwirkend bearbeitet werden, sodass die Belegsätze überarbeitet werden müssen und diese Revisionen verfolgt werden müssen. Ich überarbeite nicht wirklich die Dokumente, sondern erzeuge eine neue, die den Unterschied zwischen dem, was gerade im Protokoll ist, und dem, was bald in dem Protokoll sein wird, anzeigt (das Protokoll wird aktualisiert, nachdem die überarbeitete Datei gedruckt wurde). Wenn eine Revision stattfindet, verwendet mein Skript diff_match_patch , um eine Markierung dessen zu generieren, was sich mit der folgenden Funktion geändert hat:

%Vor%

docx kann Text entweder als Zeichenketten oder als Tupel verwenden, wenn eine Formatierung von Wort zu Wort erforderlich ist, also [siehe zweites Aufzählungszeichen in "Einige Dinge, die Sie beachten sollten]]

%Vor%

erzeugt

  

Hallo mein Name ist Brad

Das Problem

diff_match_patch ist ein sehr effizienter Code, der den Unterschied zwischen zwei Texten findet. Leider ist es ein wenig zu effizient, daher ersetzt redundant durch dune in

  

re dun ant e

Das ist hässlich, aber es ist gut für einzelne Wörter. Wenn jedoch ein gesamter Absatz ersetzt wird, sind die Ergebnisse vollständig nicht lesbar. Das ist nicht in Ordnung.

Früher habe ich das angesprochen, indem ich den gesamten Text in einen einzigen Absatz zusammengefasst habe, aber das war weniger als ideal, weil es sehr unübersichtlich wurde und immer noch ziemlich hässlich war.

Die Lösung bisher

Ich habe eine Funktion, die das Revisionsdokument erstellt. Diese Funktion erhält eine Liste von Tupeln, die wie folgt aufgebaut sind:

%Vor%

Also ist das Dokument als

eingerichtet %Vor%

Ich nehme an, um das Problem zu lösen, muss ich eine Art von Übereinstimmung zwischen Absätzen tun, um sicherzustellen, dass ich nicht zwei völlig separate Absätze differiere. Ich gehe auch davon aus, dass die Übereinstimmung davon abhängt, ob Absätze hinzugefügt oder entfernt werden. Hier ist der Code, den ich bisher habe:

%Vor%

Bisher habe ich geplant, etwas wie difflib zu verwenden, um einen Absatzabgleich durchzuführen. Aber wenn es einen besseren Weg gibt, dieses Problem zu vermeiden, ist das ein ganz anderer Ansatz, das ist auch großartig.

Einige Dinge, die Sie beachten sollten:

  • Ich verwende Python 2.7.6 32-Bit unter Windows 7 64-bit
  • Ich habe einige Änderungen an meiner lokalen Kopie von docx vorgenommen (das heißt, den Strike durch Formatierung hinzufügen). Wenn Sie also diesen Code testen, können Sie nicht replizieren, was ich in diesem Zusammenhang mache

Beschreibung des gesamten Prozesses (mit den Überarbeitungsschritten in Fettdruck):

1) Der Benutzer öffnet das Python-Skript und verwendet die GUI, um Informationen zu einem sogenannten Zustandsbericht (CR) hinzuzufügen

  

HINWEIS: Ein vollständiger CR enthält 4 Teile, die alle von verschiedenen Personen ausgefüllt wurden. Aber jeder Teil wird einzeln gedruckt. Alle 4 Teile sind   zusammen im Protokoll gespeichert

2) Wenn der Benutzer fertig ist, werden die Informationen in einem Protokoll (unten beschrieben) gespeichert und dann als .docx Datei

gedruckt

3) Das gedruckte Dokument wird signiert und gespeichert

4) Wenn der Benutzer einen Teil des CR revidieren möchte, öffnet er die GUI und bearbeitet die Informationen in jedem der Felder. Ich bin nur besorgt über einige der Felder in dieser Frage, und das sind die mehrzeiligen Textsteuerelemente (die zu mehreren Absätzen führen können)

5) Sobald der Benutzer mit der Revision fertig ist, generiert der Code die Tupel-Liste, die ich im Abschnitt "Solution So Far" beschrieben habe, und sendet diese an die Funktion, die das Revisionsdokument generiert / p>

6) Das Revisionsdokument wird erstellt, gedruckt, signiert und zusammen mit dem Originaldokument für diesen Teil des CR gespeichert.

7) Das Protokoll wird vollständig neu geschrieben, um die überarbeiteten Informationen zu enthalten

Das Protokoll:

Das Protokoll ist einfach eine riesige dict , die alle Informationen auf allen CRs speichert. Das allgemeine Format ist

%Vor%

Das Protokoll speichert keine früheren Versionen einer CR. Wenn eine CR überarbeitet wird, werden die alten Informationen überschrieben (was wir für das System wollen). Wie ich bereits erwähnt habe, wird jedes Mal, wenn das Protokoll bearbeitet wird, das Ganze neu geschrieben. Um an die Informationen im Log zu kommen, habe ich import it (da es immer im selben Verzeichnis wie das Skript lebt)

    
wnnmaw 30.01.2014, 20:34
quelle

2 Antworten

1

Versuchen Sie, die post-diff Aufräumoptionen zu verwenden, die diff_match_patch, das oben erwähnt wurde, insbesondere die diff_cleanupSemantic -Funktion auschecken, die verwendet werden soll, wenn die diff-Ausgabe für Menschen lesbar sein soll.

Bereinigungsoptionen werden NICHT automatisch ausgeführt, da diff_match_patch mehrere Bereinigungsoptionen bietet, aus denen Sie auswählen können (abhängig von Ihren Anforderungen).

Hier ist ein Beispiel:

%Vor%

Ausgabe:

%Vor%

Wie Sie sehen können, ist das erste diff optimal, aber unlesbar, während das zweite diff (nach der Bereinigung) genau das ist, wonach Sie suchen.

    
jdhildeb 07.02.2014, 21:10
quelle
0

Erwägen Sie die Verwendung von Git, um alle diese Revisionen zu verwalten, siehe GitPython für eine Python api, siehe auch Git (oder Hg) -Plugin für den Umgang mit Microsoft Word- und / oder OpenOffice-Dateien , wie man xmldiff verwendet und ein Element pro Zeile hat

    
Guy Gavriely 03.02.2014 16:04
quelle

Tags und Links