<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[devshare.de - Zwei Textversionen vergleichen]]></title>
	<link rel="self" href="http://www.devshare.de/feed/atom/topic/37427/"/>
	<updated>2003-08-01T17:05:11Z</updated>
	<generator>PunBB</generator>
	<id>http://devshare.de/topic/37427/zwei-textversionen-vergleichen/</id>
		<entry>
			<title type="html"><![CDATA[Re: Zwei Textversionen vergleichen]]></title>
			<link rel="alternate" href="http://devshare.de/post/37689/#p37689"/>
			<content type="html"><![CDATA[<p>Hi Matho,</p><p> bin grad unterwegs, deshalb nur ein kurzer Blick nach devshare und eine kurze Antwort:</p><p> 1. Die Versionskontrolle ist nochmal ein anderer Schuh. Wahrscheinlich wird es so laufen, dass es nur eine Linie an Veränderungen geben wird und dass (bestimmte) registrierte Benutzer einen Artikel eine bestimmte Zeit auschecken können, währen der dieser dann nicht bearbeitet werden kann. Andere Benutzer erhalten dann, falls sie z.B. V.5 editieren, zwischenzeiltlch jemand jedoch das gleiche getan hat und V.6 bereits existiert einen Hinweis usw. - wie auch immer, daru geht es hier nicht. Gegeben sind zwei Texte, einer aus dem anderen entstanden, womöglich auch beide grundverschieden...</p><p> 2. Die Darstellung der Änderungen liegt nicht innert eines HTML-Formulars und ist auch erstmal kein Thema.</p><p> 3. Hinzugefügte und entfernte Buchstaben und Passagen lassen sich natürlich leicht darstellen, verschobene schon schwieriger. Da kommt es darauf an herauszufinden, was mehr taugt. Im Prinzip ist es im obigen Beispiel egal, ob die Wörter als korrigiert oder die Sätze als vertauscht markiert werden. Wichtig ist einfach, dass man gut erfassen kann, was sich geändert hat und hier mach ich auch Schluß... bis nächste Woche...</p><p> Basti</p>]]></content>
			<author>
				<name><![CDATA[Basti]]></name>
				<uri>http://devshare.de/user/2346/</uri>
			</author>
			<updated>2003-08-01T17:05:11Z</updated>
			<id>http://devshare.de/post/37689/#p37689</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Zwei Textversionen vergleichen]]></title>
			<link rel="alternate" href="http://devshare.de/post/37613/#p37613"/>
			<content type="html"><![CDATA[<p>Moin basti,</p><p> wie soll der Ablauf sein und was genau ist gewünscht?</p><p> Ich hatte gedacht:</p><p> 1.) Gegeben ist ein Ausgangstext X</p><p> 2.) X wird gelesen (von wem ?) und gegebenenfalls geändert (von wem ?)</p><p> 3.) Nun haben wir Version X_1 (wenn nur eine Person Änderungen vornehmen darf),<br /> bzw. verschiedene Versionen von X_1 (wenn mehrere Personen Änderungen vornehmen dürfen).</p><p> Wie ich&#039;s verstanden hatte, soll nun diese Version X_1 insofern aufbereitet werden,<br /> daß die am Prozess Beteiligten möglichst auf den ersten Blick erkennen können, welche<br /> Änderungen stattgehabt haben.</p><p> 4.) Schritte 2.) und 3.) wiederholen sich, bis wer(?) mit dem Ergebnis zufrieden ist.</p><p> Wobei hier wichtig wäre, den Arbeitsablauf zu synchronisieren, sodaß nicht jemand<br /> anfängt, Version X_1n zu ändern, während schon längst Version X_3 aktuell ist, aber<br /> das wär sozusagen andre Baustelle.</p><p> Aber zunächst: Ist das so richtig? Dein Interesse ist wesentlich die sinnvolle<br /> Darstellung der Änderungen in Punkt 3.) ?</p><p> ------------------------------------------</p><p> Sodann - nimm einfach mal das alte Beispiel des durcheinandergeratenen Kochrezepts:</p><p> X -&gt;</p><p> Rezept:</p><p> Braten Sie das Hühnchen</p><p> Schlachten und rupfen Sie das Hühnchen</p><p> Fangen Sie das Hühnchen</p> <br /><p> X1 -&gt;</p><p> Rezept:</p><p> Fangen Sie das Hühnchen</p><p> Schlachten und rupfen Sie das Hühnchen</p><p> Braten Sie das Hühnchen</p><p> ------------------------------------------</p><p> Problem:</p><p> Wenn man, wie vorgeschlagen, nach den längsten zusammenhängenden Blöcken sucht,<br /> und sich dann die Änderungen ausgeben läßt, erhält man folgerichtig die<br /> beiden äusseren Zeilen, während die mittlere gleichbleibt.</p><p> Tatsächlich geändert haben sich aber nur die Worte &#039;Fangen&#039; und &#039;Braten&#039;.</p><p> Das würde für dieses Beispiel bedeuten, daß dem (wie aufgebauten) Html-Formular<br /> eine Information über die gewünschte Darstellung der Änderung mitgegeben werden<br /> müsste (vor allem dann, wenn auch nach etwaigen kleineren Tippfehlern gesucht<br /> werden soll).</p><p> Nach wie vor grübelnd</p><p> matho</p>]]></content>
			<author>
				<name><![CDATA[matho]]></name>
				<uri>http://devshare.de/user/780/</uri>
			</author>
			<updated>2003-07-25T11:17:28Z</updated>
			<id>http://devshare.de/post/37613/#p37613</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Zwei Textversionen vergleichen]]></title>
			<link rel="alternate" href="http://devshare.de/post/37593/#p37593"/>
			<content type="html"><![CDATA[<p>Hi Matho,</p><p> danke für die Ausführung.</p><p> Ja, die Änderungen zu verfolgen würde die Sache (Zuordnung) vielleicht vereinfachen, die Daten werden jedoch per HTML-Formular eingegeben...</p><p> Ansonsten können wir ja vielleicht mal andersherum drangehen:<br /> Wie wäre denn eine geeignete Darstellung der Veränderungen? Ausgangsbasis ist dabei ein Artikel zur Online-Präsentation, alo Überschrift, ev. Teasertext, und dann (in Relation zu Printmedien-Texten) viele kurze Absätze, zum Teil mit unterüberschriften, dazu Listen, Tabellen und Bilder und Lins natürlich.</p><p> Basti</p>]]></content>
			<author>
				<name><![CDATA[Basti]]></name>
				<uri>http://devshare.de/user/2346/</uri>
			</author>
			<updated>2003-07-24T10:49:25Z</updated>
			<id>http://devshare.de/post/37593/#p37593</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Zwei Textversionen vergleichen]]></title>
			<link rel="alternate" href="http://devshare.de/post/37578/#p37578"/>
			<content type="html"><![CDATA[<p>N&#039;abend basti,</p><p> ja, da sind wir uns einig, die Wahl der Programmiersprache ist zunächst nebensächlich, das<br /> hattest Du ja selbst schon gesagt, und ich hab Dir eigentlich bloß zugestimmt.<br /> Ich hatte das nun in python gemacht, weil ich annahm, daß auch jemand, der damit gar nicht<br /> umgeht, das erstmal ohne grosse Worte verstehn kann.<br /> Das script sucht nach möglichst langen Übereinstimmungen der beiden strings, und das tut es<br /> auf etwas &#039;unsaubere&#039; Art: es benutzt dazu einfach Ausnahmen:</p><p> Die Zeilen in der inneren while-Schleife:<br /> </p><div class="codebox"><pre><code>             try:
                 i = index(s2, s1[a:o])
                 ve = [i, a, len(s1[a:o]), s1[a:o]]
             except:
                 s = s1[a:o-1]
 </code></pre></div><p> <br /> heißen schlicht nichts anderes als: <br /> Versuche, in string s2 bei wachsendem o fündig zu werden - wenn das nicht mehr<br /> klappt (except), nimm den letzen gültigen Treffer - s = s1[a:o-1]</p><p> ve ist quasi eine Rückversicherung, falls nämlich beide strings von einer<br /> beliebigen stelle bis zum Ende gleich sind, wird ja keine exception ausgelöst,<br /> obwohl etwas gefunden wurde - deshalb meinte ich: &#039;unsauber&#039;....</p><p> Also schon in etwa Dein Vorschlag, erst mal nach den grösseren Einheiten zu<br /> schauen, mit dem Unterschied, daß ich Einheit als tatsächlich identisch <br /> angenommen habe.</p><p> Aber das ist zunächst nicht wichtig, ich wollte lediglich aufzeigen,<br /> wie man sich so einem Problem im ersten Schritt nähern könnte.</p><p> Im Zuge dieser Annäherung bin ich dann auf ein paar Sachen gekommen, bei denen ich,<br /> wie gesagt, momentan nicht so recht wüsste, wie man damit umzugehen hat.</p><p> Da wären zB. doppelte Vorkommen eines substrings in beiden strings, bei denen sich <br /> während einer Änderung beide Positionen gleichzeitig geändert haben.<br /> So ein Fall könnte zB. relativ leicht eintreten bei einer Besprechung eines<br /> Zitats, das halt des öfteren in verschiednen Kontexten wiederholt wird.</p><p> Desweiteren könnte ich nicht behaupten, einen irgendwie sinnvollen Begriff einer<br /> möglichen Klassifizierung von Stringunterschieden zu haben. Ich empfinde das Thema<br /> als schon ziemlich kompliziert.</p><p> Ich war zwischenzeitlich auf die Idee verfallen, texte und deren Änderungen in<br /> einer spezifischen Umgebung stattfinden zu lassen, wo beispielsweise die<br /> Möglichkeit bestünde, sämtliche Editorereignisse aufzuzeichnen, um sodann<br /> die jeweiligen Änderungen mit einer Kennmarke zu versehen - so in dem Stil:<br /> dieser substring wurde durch ein &#039;cut&#039; entfernt, durch dieses und jenes &#039;paste&#039; <br /> geändert, und dann durch ein weiteres &#039;paste&#039; wieder eingefügt, wobei gleichzeitig<br /> ein andrer substring (teilweise) überschrieben wurde... uswusfetcpp.....<br /> Aber das ist natürlich käse. Zum einen wär das schon ziemlich hirnverschwurbelnd,<br /> zum andern hätte man dann zwar ein hübsche Sammlung der stattgehabten Änderungen,<br /> aber die wären zum Zweck der Darstellung größtenteils überflüssig (wenn nicht gar<br /> hinderlich), weil man ja tatsächlich &quot;nur&quot; die Änderungen von Anfangszustand zum<br /> relativen Endzustand haben möchte. Und damit wär man wieder so klug wie zuvor,<br /> soll heißen - in meinem Fall - eher weniger.</p><p> Natürlich gibt&#039;s ne ganze Menge intressanter Sachen im Umfeld dieses Problems -<br /> Wenn du mal unterm Stichwort &#039;relevanz&#039; ein bißchen rumsuchst, wirst Du sehr spannende <br /> und schlaue Sachen entdecken (wenn&#039;s Dich intressiert, kann ich Dir auch ein paar links<br /> posten). Allerdings ist mir nichts bekannt, das mich jetzt bei diesem konkreten<br /> Problem entscheidend weiterbringen täte.</p><p> Im Falle der einfachen Einfügung (Bsp. G_1N) hat man ja das gewünschte Ergebnis<br /> recht leicht, aber das ja eben ein sehr spezieller Fall.<br /> Was mir fehlt, ist, ich beginnne mich zu wiederholen, eine einigermaßen<br /> schlüssige Vorstellung der Klassifizierung der möglichen Unterschiede.</p> <br /><p> gruß</p><p> matho</p>]]></content>
			<author>
				<name><![CDATA[matho]]></name>
				<uri>http://devshare.de/user/780/</uri>
			</author>
			<updated>2003-07-23T19:51:53Z</updated>
			<id>http://devshare.de/post/37578/#p37578</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Zwei Textversionen vergleichen]]></title>
			<link rel="alternate" href="http://devshare.de/post/37576/#p37576"/>
			<content type="html"><![CDATA[<p>Hi Leute,</p><p> @st2: Python, nicht Perl...</p><p> @matho:<br /> Ich hab mir dein Posting jetzt länger nicht angeschaut, weil ich nicht an deinen Code wollte. Jetzt hab ich ihn mir doch mal genauer angesehen und es gibt für mich einfach zu viele Stellen, wo ich mir zusammenreimen müsste, was da genau passiert, etwas, das du dir vielleicht unschwer vorstellen kannst, weil du mit der Semantik ja vertraut bist.</p><p> Aber du schreibst selbst, dass die Programmiertechnik (womit du, wenn ich dich richtig verstehe eben das Umsetzen in eine bestimmte Programmiersprache meinst) hier erstmal nebensächlich ist und insofern bitte ich dich, einfach mit Worten zu beschreiben, was dein Vorgehen ist.</p><p> Natürlich spielt die Sprache aber dennoch eine Rolle, da sie die Werkzeuge zur Verfügung stellt und da lohnt es natürlich zu schauen: Was gibt es schon, was muss ich selber machen.</p><p> Basti</p>]]></content>
			<author>
				<name><![CDATA[Basti]]></name>
				<uri>http://devshare.de/user/2346/</uri>
			</author>
			<updated>2003-07-23T18:50:31Z</updated>
			<id>http://devshare.de/post/37576/#p37576</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Zwei Textversionen vergleichen]]></title>
			<link rel="alternate" href="http://devshare.de/post/37513/#p37513"/>
			<content type="html"><![CDATA[<p>kann mir das jemand in php kritzeln? (*Keine Ahnung von Perl hab*)</p>]]></content>
			<author>
				<name><![CDATA[sometimes2]]></name>
				<uri>http://devshare.de/user/2431/</uri>
			</author>
			<updated>2003-07-22T07:38:39Z</updated>
			<id>http://devshare.de/post/37513/#p37513</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Zwei Textversionen vergleichen]]></title>
			<link rel="alternate" href="http://devshare.de/post/37510/#p37510"/>
			<content type="html"><![CDATA[<p>Moin basti,</p><p> ich denke, es geht weniger um ein programmiertechnisches Problem,<br /> als vielmehr um ein logisches (zumindest soweit ich&#039;s momentan begreife).<br /> Zunächst einmal könnte man ja sagen: suche alle substrings, die in<br /> beiden strings identisch sind.<br /> Wenn die Identitaeten gefunden sind, vergleiche die jeweils wieder mit<br /> den beiden Eingabestrings, und pinsel alles, das nicht übereinstimmt, bunt an -<br /> im ersten string lila, im zwoten tschidscheringrün.<br /> Das kann man mit ein paar Schleifen machen, mit Rekursionen, unter<br /> Zuhilfenahme von Stringfunktionen oder regexes, oder von allem etwas,<br /> ad libitum.<br /> Nun gibt es aber diverse Arten denkbarer Unterschiede &lt;=&gt; Gleichheiten.<br /> In Deinem Beispiel geht es um Einfügungen. Möglich sind aber auch zB.<br /> Verdopplungen (oder auch mehrfache Wiederholungen) oder, wie bereits<br /> erwähnt, Umstellungen, oder Kombinationen aus allem.<br /> Während der Fall der einfachen Einfügung relativ leicht zu behandeln ist,<br /> (im folgenden der Vergleich von a und b), ist der Vergleich<br /> von c und d schon etwas unklarer. Ich habe da den substring Ubbu_ubbu,<br /> gemeinerweise in beiden zu vergleichenden strings doppelt vorkommend.<br /> Was ist nun unter &#039;Unterschied&#039; zu verstehn? Das hängt, soweit ich das<br /> sehn kann, davon ab, was man unter &#039;Unterschied&#039; verstehn möchte bzw. in<br /> Abhängigkeit der jeweiligen Aufgabenstellung verstehen muß/soll.</p><p> Ich habe das folgende Beispiel in python gemacht, einfach deshalb,<br /> weil mir a) php nicht so geläufig ist, und b) python-scripts beinah wie<br /> pseudo-code gelesen werden können (wenn man sich python nicht runterladen <br /> möchte und einfach ausprobieren). Ich denke, Du wirst damit keine<br /> Verständnisschwierigkeiten haben:</p><p> </p><div class="codebox"><pre><code># coding: utf-8
 from string import *
 
 a = &quot;&quot;&quot;
     Aber das währe doch nicht nötig gewesen.
     Es ist nämlich so, daß hier alles automatisch erledigt wird,
     aber das wissen Sie ja.
     &quot;&quot;&quot;
 
 b = &quot;&quot;&quot;   
     &#039;Aber das wäre doch nicht nötig gewesen&#039;, antwortete er.
     &#039;Es ist nämlich so, dass hier alles automatisch erledigt wird,
     aber das wissen Sie ja.&#039;
 &quot;&quot;&quot;
 
 ####################################
 
 c = &quot;&quot;&quot;hjmmn,,.,....oo
     Aber das währe doch nicht nötig gewesen.
     Ubbu_ubbu
     Es ist nämlich so, SSSSSSSSSSSSdaß hier alles automatisch erledigt wird,
     aber das wissen Sie ja.Ubbu_ubbu
     nmoziooppp
     &quot;&quot;&quot;
 
 d = &quot;&quot;&quot; qweeeeee  
     &#039;XXXXXXnötig gewesen&#039;, antwortete er. nqwnenrtnnn65656Ubbu_ubbu5656
     &#039;Es ist nämlich so, dass hier alles automatisch erledigt wird,
      aber das wissen Sie ja.&#039;Aber hmurgknurgldas wäre doch nicht 
      8iiljk..%%%%%%%%%%Ubbu_ubbu%%%%%%%%%
 &quot;&quot;&quot;
 
 ###################################################################
 
 def V(s1, s2, d = 0):   # d soll 0 oder -1 sein
     v, ve, a = [[0, 0, 0, &#039;&#039;]], [0, 0, 0, &#039;&#039;], 0  
     if len(strip(s1)) &lt;= len(strip(s2)): s1, s2 = map(strip, (s1, s2))
     else: s1, s2 = map(strip, (s2, s1))
     while a &lt; len(s1):
         o, iq = a + 1, 0
         while o &lt; len(s1):
             try:
                 i = index(s2, s1[a:o])
                 ve = [i, a, len(s1[a:o]), s1[a:o]]
             except:
                 s = s1[a:o-1]
                 for j in v:
                     if find(j[3], s) &gt; d: iq = 1
                 if len(s) and not iq: v.append([i, a, len(s), s])                    
                 else: iq = 0
                 break
             o += 1
         a += 1
         if v[-1][0] &lt; ve[0] and find(v[-1][3], ve[3]) &lt; 0: v.append(ve)   
     return v[1:]
 
 def N(n):
     for i in range(len(n)):  #eine moegliche normalisierung, wenn keine         
         try:                 #vertauschungen vorliegen
             if n[i][0] &gt; n[i+1][0]: n.remove(n[i])  
         except: pass 
     return n[n.index(min(n)):n.index(max(n))+1]
 
 print &#039;n___________________________G1_______________________________n&#039;
 
 G1 = V(a, b)
 for i in G1: print i
 print &#039;n___________________________G1_N_____________________________n&#039;
 
 G1_N = N(V(a, b))
 for i in G1_N: print i
 print &#039;n___________________________G2_______________________________n&#039;
 
 G2 = V(c, d)
 G2.sort() # eine moeglichkeit, sich nen ueberblick zu verschaffen
 for i in G2: print i
 print &#039;n______________________aus die maus__________________________n&#039;
 
 </code></pre></div> <br /><p> Das erzeugt die Ausgabe:</p> <br /><p> </p><div class="codebox"><pre><code> 
 ___________________________G1_______________________________
 
 [1, 0, 11, &#039;Aber das wxe4&#039;]
 [18, 11, 1, &#039;h&#039;]
 [12, 12, 27, &#039;re doch nicht nxf6tig gewesen&#039;]
 [55, 39, 6, &#039;.n    &#039;]
 [62, 45, 21, &#039;Es ist nxe4mlich so, da&#039;]
 [85, 67, 65, &#039; hier alles automatisch erledigt wird,n    aber das wissen Sie ja&#039;]
 
 ___________________________G1_N_____________________________
 
 [1, 0, 11, &#039;Aber das wxe4&#039;]
 [12, 12, 27, &#039;re doch nicht nxf6tig gewesen&#039;]
 [55, 39, 6, &#039;.n    &#039;]
 [62, 45, 21, &#039;Es ist nxe4mlich so, da&#039;]
 [85, 67, 65, &#039; hier alles automatisch erledigt wird,n    aber das wissen Sie ja&#039;]
 
 ___________________________G2_______________________________
 
 [10, 15, 5, &#039;n    &#039;]
 [10, 60, 5, &#039;n    &#039;]
 [10, 74, 5, &#039;n    &#039;]
 [22, 4, 1, &#039;n&#039;]
 [22, 46, 13, &#039;nxf6tig gewesen&#039;]
 [36, 5, 1, &#039;,&#039;]
 [36, 6, 1, &#039;,&#039;]
 [36, 8, 1, &#039;,&#039;]
 [42, 13, 1, &#039;o&#039;]
 [42, 14, 1, &#039;o&#039;]
 [51, 7, 1, &#039;.&#039;]
 [51, 12, 1, &#039;.&#039;]
 [51, 59, 1, &#039;.&#039;]
 [69, 65, 9, &#039;Ubbu_ubbu&#039;]
 [69, 179, 9, &#039;Ubbu_ubbu&#039;]
 [88, 79, 19, &#039;Es ist nxe4mlich so, &#039;]
 [93, 44, 3, &#039;t n&#039;]
 [97, 2, 1, &#039;m&#039;]
 [97, 3, 1, &#039;m&#039;]
 [97, 194, 1, &#039;m&#039;]
 [101, 0, 1, &#039;h&#039;]
 [101, 31, 1, &#039;h&#039;]
 [111, 113, 43, &#039; hier alles automatisch erledigt wird,n    &#039;]
 [151, 152, 27, &#039;    aber das wissen Sie ja.&#039;]
 [156, 21, 9, &#039;ber das w&#039;]
 [170, 97, 2, &#039; S&#039;]
 [175, 1, 1, &#039;j&#039;]
 [179, 20, 5, &#039;Aber &#039;]
 [195, 25, 6, &#039;das wxe4&#039;]
 [201, 32, 14, &#039;re doch nicht &#039;]
 [227, 9, 2, &#039;..&#039;]
 [227, 10, 2, &#039;..&#039;]
 [227, 11, 2, &#039;..&#039;]
 
 ______________________aus die maus__________________________
 
 
 </code></pre></div><p> Aufgelistet werden die beiden offsets, die Länge des gemeinsamen substrings, <br /> und eben jenner.<br /> Wie Du in Liste G2 unter zB. den Einträgen Ubbu_ubbu sehn kannst, habe ich<br /> jetzt nur nach dem niedrigsten index im zwoten string suchen lassen,<br /> eben aus oben erwähntem Grund: wenn man auch nach andern indices sucht,<br /> welche Änderung im zwoten string wäre welcher Stelle im ersten string <br /> zuzuordnen? Und daraus ergibt sich die Frage: Wenn verschiedene Änderungen<br /> vorliegen, welche ist bezüglich des Originals einerseits und im Vergleich<br /> zueinander andrerseits als Änderung aufzufassen, und welche &#039;Änderung&#039; ist<br /> gar keine, sondern eigentlich &#039;gleichgeblieben&#039;.<br /> Vermutlich sollte man einen &#039;willkürlich&#039; festzusetzenden Bezugspunkt wählen,<br /> an dem dann die anderen Punkte nach Bedarf gemessen werden.</p><p> Naja, vielleicht bringt&#039;s Dich ja auf ein paar klügere Gedanken als mich.</p><p> gruß</p><p> matho</p>]]></content>
			<author>
				<name><![CDATA[matho]]></name>
				<uri>http://devshare.de/user/780/</uri>
			</author>
			<updated>2003-07-22T03:02:31Z</updated>
			<id>http://devshare.de/post/37510/#p37510</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Zwei Textversionen vergleichen]]></title>
			<link rel="alternate" href="http://devshare.de/post/37440/#p37440"/>
			<content type="html"><![CDATA[<p>Ich denke, es wäre sinnig, vom Großen ins Kleine zu gehen. D.h., zunächst mal z.B. Absätze miteinander zu vergleichen und anhand der Ähnlichkeit der Absätze schonmal eine Zuordnung vorzunehmen (z.B. mit <a href="http://de.php.net/manual/en/function.similar-text.php">similartext()</a> oder so). Die gleichen Absätze sind schonmal okay (wobei die Reihenfolge dieser ja eigentlich auch noch eine Rolle spielt), dann gibt es welche, die anhand der Ähnlichkeit als zusammengehörig erkannt werden und es gibt harausgenommene und hinzugefügte.</p><p> Wenn die Ähnlichkeits-Routine gut ist, dann kann man hier schon die beiden letzteren Absatz-Klassen (gelöschte und hinzugefügte) entsprechend verbuchen, aber das dürfte garnicht so einfach sein...</p><p> Die zusammengehörigen, also ähnlichen, aber dennoch unterschiedlichen Absätze knöpft man sich dann nach dem gleichen Muster satzweise vor usw.</p><p> Basti</p>]]></content>
			<author>
				<name><![CDATA[Basti]]></name>
				<uri>http://devshare.de/user/2346/</uri>
			</author>
			<updated>2003-07-20T13:29:46Z</updated>
			<id>http://devshare.de/post/37440/#p37440</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Zwei Textversionen vergleichen]]></title>
			<link rel="alternate" href="http://devshare.de/post/37439/#p37439"/>
			<content type="html"><![CDATA[<p>Hi Mamphil,</p><p> der Sinn ist es, wie bei einem <a href="http://c2.com/cgi/wiki">Wiki</a> Änderungen an Textdokumenten verfolgen zu können. Schau mal z.B. hier:</p><p> <a href="http://alt.thetinfoilhat.com/tiki-pagehistory.php?page=HomePage&amp;diff=20">http://alt.thetinfoilhat.com/tiki-pageh &#133; mp;diff=20</a></p><p> Dort wird eine Version x einer Page mit der aktuellen Version verglichen bzw. eben nur gegenübergestellt.</p><p> Hier wäre es ja zum Bep. schön, wenn die einzelnen Abschnitte parallel dargestellt werden würden. Dann sehe ich im Block &quot;News&quot; die zeile &quot;The demo site is here help you.&quot;, wobei in der aktuellen Version das fehlende &quot;to&quot; ergänzt wurde. Nun wär&#039;s ja nett, wenn dieses einfach grau hinterlegt wäre, damit der verantwortliche Redakteur nicht lange suchen muss, was denn nun verändert wurde.</p><p> Hier:</p><p> <a href="http://alt.thetinfoilhat.com/tiki-pagehistory.php?page=HomePage&amp;diff2=20">http://alt.thetinfoilhat.com/tiki-pageh &#133; p;diff2=20</a></p><p> ist sowas ja ansatzweise verwirklicht, wobei es ja eben nett wäre, die beiden Ansichten in eine zu bringen.</p><p> Und nun zu deinem Ansatz:<br /> Ich seh da eben einige Schwierigkeiten.<br /> Nehemen wir mal an, wir bearbeiten so und zwar Buchstabenweise meine beiden Beispieltexte oben:</p><p> Text A:<br /> &quot;Das währe aber nicht nötig gewesen. Es ist nämlich so, dass hier alles automatisch erledigt wird aber das wissen Sie ja&quot; </p><p> Text B: <br /> &quot;Aber das wäre doch nicht nötig gewesen&quot;, antwortete er. &quot;Es ist nämlich so, dass hier alles automatisch erledigt wird, aber das wissen Sie ja.&quot; </p><p> &quot;D&quot; und &quot;A&quot; sind unterschiedlich. Weder kann in Text A ein &quot;A&quot; gefunden wurden, noch konnte in Text B ein &quot;D&quot; gefunden werden.</p><p> Folglich wurde das &quot;A&quot; hinzugefügt und das &quot;D&quot; entfernt.</p><p> Wie weiter? Schauen wir mal, ob noch mehr außer dem &quot;D&quot; entfernt wurde:</p><p> Suche &quot;a&quot; in Text B usw. Das geht ganz gut bis zu dem falschen &quot;h&quot; in &quot;währe&quot;, denn dieses wird nun in dem &quot;nicht&quot; von Text B gefunden. das folgende &quot;r&quot; findet er dann in &quot;antwortete&quot; und schon haben wir den Faden verloren.</p><p> Das ganze mit Wörtern:<br /> &quot;Das&quot; != &quot;Aber&quot;, &quot;währe&quot; fehlt, &quot;aber&quot; fehlt, &quot;nicht&quot;, &quot;nötig&quot; und &quot;gewesen&quot; findet er dann exakt und den Rest auch. Jetzt könnte man ja quasi die gefundenen Übereinstimmungen mal &quot;weglegen&quot; und nur noch den Rest untersuchen:</p><p> &quot;Das währe aber&quot;</p><p> und:</p><p> &quot;Aber das wäre doch&quot;, &quot;antwortete er&quot; und &quot;aber das wissen Sie ja&quot;</p><p> Klar: Keine Wortübereinstimmungen: Ersteres wurde gelöscht, die 3 Teile in Text B eingefügt.</p><p> ...Schonmal nicht schlecht, wobei hier z.B. die Satzzeichen ignoriert wurden und eigentlich ist das so übersichtlicher, als wenn z.B. das &quot;D&quot; von &quot;Das&quot; und das &quot;h&quot; von &quot;währe&quot; hervorgehoben würden. </p><p> ..mal sehen..</p><p> Basti</p>]]></content>
			<author>
				<name><![CDATA[Basti]]></name>
				<uri>http://devshare.de/user/2346/</uri>
			</author>
			<updated>2003-07-20T12:22:08Z</updated>
			<id>http://devshare.de/post/37439/#p37439</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Zwei Textversionen vergleichen]]></title>
			<link rel="alternate" href="http://devshare.de/post/37435/#p37435"/>
			<content type="html"><![CDATA[<p>Hallo!</p><p> Ich könnte mir das nach einem solchen Schema vorstellen:</p><p> Immer einen Buchstaben (wenn es Buchstaben-genau sein soll, ansonsten z. B. auch immer ein Wort) vergleichen. Wenn es gleich ist, ist natürlich alles ok. Wenn es einen Unterschied gibt, müsste man es einfach markieren. </p><p> Bei einem Unterschied muss dann (wahrscheinlich bei beiden Texten) solange gesucht werden, bis die Fortsetzung der Zeichenkette des einen im anderen Text wieder auftaucht. Damit bekommt man heraus, ob etwas hinzugefügt wurde.</p><p> Wenn etwas weggenommen wurde, bekommt man es durch den Gegenvergleich heraus. &lt;-- doof ausgedrückt. Nochmal: Wenn in Text 1 etwas weggenommen wurde und das neue &quot;Text 2&quot; heißt, ist das so, als ob in &quot;Text 2&quot; etwas dazugekommen ist und das neue &quot;Text 1&quot; heißt. Das meine ich mit andersherum.</p><p> Vielleicht hilft das schon? Ich sehe zwar nicht so ganz den Sinn, aber das macht ja nichts &lt;img src=&quot;/forum/images/graemlins/smile.gif&quot; alt=&quot;&quot; /&gt;</p><p> Mamphil</p>]]></content>
			<author>
				<name><![CDATA[Mamphil]]></name>
				<uri>http://devshare.de/user/342/</uri>
			</author>
			<updated>2003-07-20T09:12:16Z</updated>
			<id>http://devshare.de/post/37435/#p37435</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Zwei Textversionen vergleichen]]></title>
			<link rel="alternate" href="http://devshare.de/post/37434/#p37434"/>
			<content type="html"><![CDATA[<p>Nein, es geht nicht um ein CVS, was ja Dateien in verschiedenen Versionen verwaltet etc., sondern allenfalls um einen kleinen Teil, der eben die Unterschiede zwischen zwei Texten dokumentieren soll.</p><p> Gegeben sind also zwei Texte und die Info: Text B ist aus Text A entstanden.</p><p> Ich hab so keinen rechten Ansatz...</p><p> Kein Problem wäre wohl folgendes:<br /> - gleiche Wortketten identifizieren;<br /> - kleine Änderungen innerhalb einer Wortkette identifizieren (Rechtschreibfehler) - wobei das schon wieder einige Probleme aufwirft;<br /> - herausgenommene Wörter &quot;finden&quot;;<br /> - ...?</p><p> Basti</p>]]></content>
			<author>
				<name><![CDATA[Basti]]></name>
				<uri>http://devshare.de/user/2346/</uri>
			</author>
			<updated>2003-07-19T20:12:20Z</updated>
			<id>http://devshare.de/post/37434/#p37434</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Zwei Textversionen vergleichen]]></title>
			<link rel="alternate" href="http://devshare.de/post/37431/#p37431"/>
			<content type="html"><![CDATA[<p>Du meinst ein CVS?<br /> Hm.. Gute Idee, mal sehen, wer sich meldet &lt;img src=&quot;/forum/images/graemlins/smile.gif&quot; alt=&quot;&quot; /&gt;</p>]]></content>
			<author>
				<name><![CDATA[sometimes2]]></name>
				<uri>http://devshare.de/user/2431/</uri>
			</author>
			<updated>2003-07-19T18:34:11Z</updated>
			<id>http://devshare.de/post/37431/#p37431</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Zwei Textversionen vergleichen]]></title>
			<link rel="alternate" href="http://devshare.de/post/37427/#p37427"/>
			<content type="html"><![CDATA[<p>Hi,</p><p> hat jemand von euch Lust auf folgendes kleines Projekt:</p><p> Es geht darum, eine Funktion zu erstellen, die zwei Versionen eines Textes vergleicht und die Änderungen ausspuckt.</p><p> Das ganze soll dann in PHP programmiert werden und so ausgegeben werden, dass die beiden Texte auf einer HTML-Seite in je einer (Tabellen-)Spalte nebeneinander stehen und links in der alten Version alle gelöschten Teile farbig hinterlegt sind und rechts entsprechend die hinzugefügten Teile hinterlegt sind. Vielleicht könnte man dann noch bei jedem Absatz eine neue Tabellenzeile einfügen, so, dass die Texte weitgehend parallel dargestellt werden.</p><p> Mal ein beipiel:</p><p> TextAlt:<br /> &quot;Das währe aber nicht nötig gewesen. Es ist nämlich so, dass hier alles automatisch erledigt wird aber das wissen Sie ja&quot;</p><p> TextNeu<br /> &quot;Aber das wäre doch nicht nötig gewesen&quot;, antwortete er. &quot;Es ist nämlich so, dass hier alles automatisch erledigt wird, aber das wissen Sie ja.&quot;</p><p> Ein wünschenswertes Erbenis wäre dann als Anzeige des alten Textes:<br /> &quot;<strong>D</strong>as wä<strong>h</strong>re <strong>aber</strong> nicht nötig gewesen<strong>.</strong> Es ist nämlich so, dass hier alles automatisch erledigt wird aber das wissen Sie ja&quot;</p><p> Und der als neuer Text käme:<br /> &quot;<strong>Aber d</strong>as wäre <strong>doch</strong> nicht nötig gewesen<strong>&quot;, antwortete er. &quot;</strong>Es ist nämlich so, dass hier alles automatisch erledigt wird<strong>,</strong> aber das wissen Sie ja.&quot;</p><p> ..oder vielleicht gibt es noch tauglichere Darstellungsformen, um Veränderung gut erfassen zu können.</p><p> Basti</p>]]></content>
			<author>
				<name><![CDATA[Basti]]></name>
				<uri>http://devshare.de/user/2346/</uri>
			</author>
			<updated>2003-07-19T13:34:12Z</updated>
			<id>http://devshare.de/post/37427/#p37427</id>
		</entry>
</feed>

