flashnfantasy: Unterschiede zwei Strings in HTML darstellen

Etwas, was mich schon lange interessiert:

logChanges2HTML("Der Text hat eine Feher", "Der Text hatte zwei Fehler")

soll umgewandelt werden in zB.:

Der Text hat<b>te</b> <b>zwei</b><strikethrough>eine</strikethrough> Fe<b>l</b>her

Bisher war meine Idee, eine Art Zuordnungsliste aller Wörter zwischen Alt und Neu zu machen.
Aber nach einigen Fehlschlägen will ich mal nachfragen, ob jemand da einen bewährten Algorithmus kennt.

  1. hmm... wiki(pedia) verwendet so etwas,...

    ist vllt. nicht die beste idee, aber wenn sonst keine vorschläge kommen kannst ja mal im code von wiki nachschauen,...

    --
    Auch ein Charmed fan? Zitatsammlung auf Deutsch/Englisch
    1. genau das ist mein Ziel, eine Art Wikipedia.

      Aber eigentlich ist das nur der Anfang, ich will sowas wie eine CVS haben.
      Mein Szenario ist ja, daß (ich gebe den Autoren mal Buchstaben)

      A den Artikel erstellt,
      B den Artikel fortschreibt,
      C den Artikel versaut,
      D den Artikel erneut ergänzt.

      Also etwas, womit man von B auf D aufsetzen kann...
      Schon jetzt zeichnet sich ab, daß ich eine sehr umfangreiche algorithmische Bibliothek brauche.

      1. Hi,

        genau das ist mein Ziel, eine Art Wikipedia.

        Aber eigentlich ist das nur der Anfang, ich will sowas wie eine CVS haben.

        Du bist Dir schon darüber im Klarem, das mir hier die Frage schier auf der Zunge brennt, warum Du nichts Fertiges nimmst?

        Schon jetzt zeichnet sich ab, daß ich eine sehr umfangreiche algorithmische Bibliothek brauche.

        Nein, eigentlich nicht, da es natürlich auch Brute-Force funktioniert. Eine sehr schnelle Methode, da Du dazu das Dateisystem selber nutzen kannst, aber natürlich mit dem Nachteil behaftet extrem viel Speicher zu verbrauchen. In einem Zeitalter mit Festplattenpreisen von rund 50 Eurocent das Gigabyte zwar fast schon überlegenswert aber das soll ja nicht Sinn der Übung sein, oder?
        Also müssen die Datenmengen verkleinert werden. Intuitiv würde man einfach nur die Differenzen zwischen den einzelnen Versionen festlegen und speichern. Das kann man linear machen (A\B, B\C, C\D) oder auf Kosten der Datenmenge alle Differenzen gleichzeitig festlegen und speichern (A\B, A\C, A\D, B\C, B\D, C\D).
        Ein Problem dabei ist die nicht voraussehbare Größe der Differenzen. Wenn zwei oder gar mehrere sich streiten und dabei immer wesentliche Teile ändern, dann schnellt der Speicherverbrauch schnell in die Größenordnung des Brute-Force. Die Sicherheitsmaßnahme bei Wikipedia und anderen dagegen ist der händische Eingriff. Der ist dort aber hauptsächlich dazu da Streitereien auf Kosten des Benutzers einzudämmen, weniger dazu die Datenmenge klein zu halten.
        Das kann man ja schließlich je nach Art der Daten und des Streites auch selber. Meist ist es ja mehr oder weniger ein C&P-Krieg. Ein Vergleich der Versionen würde das ergeben.
        Es ist allerdings recht rechenintensiv jedesmal mit allen Versionen zu vergleichen. Eine Prüfsumme würde das erleichtern. Da die meisten Prüfsummen jedoch exakte Gleichheit erfordern und bereits zuschlagen wenn auch nur ein Buchstabe geändert wird ist eine etwas andere Methode nötig. Wenn man davon ausgeht, das bei normalen Texten, was auch immer das sein mag, bei kleinen Änderungen die Wortstellung und Interpunktion kaum bis gar nicht geändert wird kann man das benutzen:
        a) durch Extraktion aller "is(w)space()" Zeichen
        b) durch Extraktion aller "is(w)punct()" Zeichen
        c) a + b
        Die so extrahierten Zeichen werden in der Reihenfolge des Fundes aneinandergereiht und entweder direkt benutzt oder in einen Hash komprimiert. Das direkte Benutzen hat den Vorteil, das kleinere Änderungen über die Edit-Distanz o.ä. festgelegt und dann je nach Schwere auch ignoriert werden können. Die Kompression in einen Hash hat wiederum den Vorteil, das diese Hashes in einem Bloomfilter vorgehalten werden können und so mit einer gewissen aber einstellbaren Wahrscheinlichkeit festgestellt werden kann, ob die fragliche Version irgendwo in den 2.593 vorherigen Versionen schon einmal vorkommt. Dieser Vorteil wirkt sich also erst bei vielen Versionsnummern wirklich aus. Bei Problemen mit "Crosspostings" würde übrigens ein globaler Bloomfilter hilfreich sein.

        Es gibt da diverse Verfeinerungen und teilweise auch andere Methoden, insbesondere bei den Differenzen, aber es sollte ja nur ein recht grober Aufriß sein, damit Du weißt, wo Du ansetzen kannst. Sei kreativ!

        so short

        Christoph Zurnieden

        1. Hi Christoph,

          erstmal danke...

          ich habe mir den Text mal rauskopiert und werde ihn versuchen komplett zu verstehen.
          ---
          Warum nichts fertiges ?

          • ich habe nichts gefunden.
          • und ich würde dann schon gerne ein eigenes Programm schreiben.

          Kürzlich habe ich gelesen, daß ein Wikipedia-Projekt der Los-Angeles-Times gescheitert ist (an der Unvernunft bzw. Boshaftigkeit einiger weniger). Und das Problem sehe ich grundsätzlich - daß Artikel einfach kaputtgemacht werden.

          Natürlich mache ich mir Gedanken über ein 'Blooming', also ein Auseinanderdriften in verschiedene Versionen, die irgendwann einfach nicht mehr zusammengeführt werden können.

          Deswegen überlege ich, ob man auch sowas wie ein Reparieren durch eine frühere Version zu ermöglicht und ein Zusammenführen unterschiedlicher Texte.

          Inzwischen bin ich bei der Gen-Technik angelangt:
          zB. Passagen nicht gelöscht, sondern abgeschaltet.
          Vielleicht gelingt damit ein Reparieren besser ?

          Gruß,
          Flash

          1. Hi,

            Warum nichts fertiges ?

            • ich habe nichts gefunden.

            Naja ... ;-)

            • und ich würde dann schon gerne ein eigenes Programm schreiben.

            Gut, das ist ein Argument.

            Kürzlich habe ich gelesen, daß ein Wikipedia-Projekt der Los-Angeles-Times gescheitert ist (an der Unvernunft bzw. Boshaftigkeit einiger weniger).

            Wenn ich das richtig mitbekommen habe waren die schlicht überfordert. Denn: Wikipedia schafft es ja. Ist zwar mühselig und arbeitsintensiv, aber es funktioniert in ausreichendem Maße.

            Und das Problem sehe ich grundsätzlich - daß Artikel einfach kaputtgemacht werden.

            Das ist aber kein technisches Problem also auch nicht durch Einsatz von Technik lösbar. Das läßt sich nur mittels Administration in die Schranken weisen.

            Natürlich mache ich mir Gedanken über ein 'Blooming', also ein Auseinanderdriften in verschiedene Versionen, die irgendwann einfach nicht mehr zusammengeführt werden können.

            Dann hast Du eben keine zwei Versionen mehr, sondern zwei verschiedene Dokumente mit der Versionsnummer 0.

            Deswegen überlege ich, ob man auch sowas wie ein Reparieren durch eine frühere Version zu ermöglicht und ein Zusammenführen unterschiedlicher Texte.

            Wie soll das funktionieren? Nein, keine rhetorische Frage, mich interessiert wirklich, was Du Dir darunter vorstellst.
            Denn der Ausdruck "Reparatur" suggeriert ja, das etwas beschädigt ist. Was fehlt ist eine präzise Definition von "beschädigt".
            Auch das Zusammenführen bedarf präziser Erklärung. Was möchtest Du wie zusammenführen?

            Inzwischen bin ich bei der Gen-Technik angelangt:
            zB. Passagen nicht gelöscht, sondern abgeschaltet.
            Vielleicht gelingt damit ein Reparieren besser ?

            Auf die Gefahr hin mich zu wiederholen: was genau möchtest Du warum und wie reparieren?

            so short

            Christoph Zurnieden

            1. Hi Christoph,

              zuerst zum schwierigsten Thema, der Reparatur kaputter Wiki-Texte:
              ich erinnere mich da an verschiedene Vorlesungen aus der Informations- und Codierungstheorie bei denen es darum ging, den Informationsbedarf zu ermitteln, um Daten rekonstruierbar zu machen.

              Spätestens dann, wenn man drei Versionen vorliegen hat, gibt es sowas wie eine 'Mehrheitsentscheidung', das Problem ist jetzt eigentlich eine Quantifizierung der Mehrheit bei Texten.

              Und da habe ich jetzt bereits einen praktischen Test gemacht. Ich habe eben jenen Artikel der Los-Angeles-Times in seine Wortbestandteile zerlegt (also Satzzeichen etc. rausgeschmissen).
              Anschliessend habe ich die Häufigkeit einzelner Wörter gezählt.
              Auch da mit dem angenehmen Ergebniss, daß viele Wörter nur ein einzigesmal vorkommen.

              Aufgrund solcher Wörter will ich jetzt Sequenzen erkennen, d.h. Teiltexte, in denen sich die Häufigkeit der Wörter nicht unterscheidet.
              Meine Idee ist es jetzt, zwischen zwei oder mehreren Texten die Sequenzen zu vergleichen, und ihre Wahrscheinlichkeit, daß sie richtig sind (gemessen an der Anzahl ihres Vorkommens in den unterschiedlichen Texten).
              Eventuell kriege ich so auch mit, wann ein Text mutwillig zerstört wird (die Häufigkeit der Wörter ändert sich dann sehr stark).

              Vielleicht werde ich bald bereits erste Ergebnisse meiner Idee haben.
              ---
              Klar ist, daß sowas wie eine Wiki eine Kontrolle braucht.
              Und das kann aber einer bestimmten Größe eine feste Redaktion nicht mehr alleine schaffen. Ich denke mal, daß neben bestimmten Spam-Algorithmen vorallem das wachsame Auge andere Nutzer hier zum Erfolg beiträgt.
              Aber über Ergonometrie und das menschliche Verhalten mache ich mir ehrlich gesagt noch keine Gedanken - solange die Technik noch nicht steht.

              Gruß,
              Mathias

              1. Hi,

                zuerst zum schwierigsten Thema, der Reparatur kaputter Wiki-Texte:

                Und wiederum meiner Frage: was ist "kaput", bitte definiere diesen Ausdruck. Wenn Du das gemacht hast, kommt der Rest normalerweise ganz von alleine.

                ich erinnere mich da an verschiedene Vorlesungen aus der Informations- und Codierungstheorie bei denen es darum ging, den Informationsbedarf zu ermitteln, um Daten rekonstruierbar zu machen.

                Ja, aber brauchst Du das jetzt schon? Du weißt ja noch nicht einmal _was_ Du _woraus_ rekonstruieren möchtest!

                Spätestens dann, wenn man drei Versionen vorliegen hat, gibt es sowas wie eine 'Mehrheitsentscheidung', das Problem ist jetzt eigentlich eine Quantifizierung der Mehrheit bei Texten.

                Das hat zwar jetzt nichts mit Rekonstruktion zu tun, aber: ja, das kann man so machen. Macht zwar hier keinerlei Sinn, aber es geht.
                Denn: Dein Problem der Quantifizierung ist gar keines sondern eines der Qualität und somit sind wir wieder bei der Frage, was Du als "kaput" definierst.

                Beispiel warum eine Mehrheitsentscheidung bei Texten keinen Sinn macht wenn die Texte Sinn machen sollen:

                A) Der Ball ist rot.
                B) Der Ball ist grün.
                C) Der Ball ist blau.

                Mehrheit: "Der Ball ist."
                Der Sinn wurde also verändert.

                A) Der Ball ist rot.
                B) Der Ball ist grün.
                C) Der Ball ist rot.

                Mehrheit: "Der Ball ist rot"
                Es wurde lediglich eine Mehrheit festgestellt. Ob der Ball rot oder auch nur ist bleibt fraglich.

                Es ist also noch die Bedingung von Nöten, das Lügner und der Wahrheit verpflichtete statistisch bunt verteilt sind. Diese Verteilung ist im Voraus festzustellen und in die Mehrheitsfindung einzuarbeiten. Problem: wenn es Menschen sind, die diese Texte eingeben ist es kein technisches Problem mehr. Was bei Meßgeräten funktioniert tut's selten beim Homo S. S.

                Und da habe ich jetzt bereits einen praktischen Test gemacht. Ich habe eben jenen Artikel der Los-Angeles-Times

                (Keinen Link?)

                Auch da mit dem angenehmen Ergebniss, daß viele Wörter nur ein einzigesmal vorkommen.

                Ja, das war durchaus zu erwarten, nicht ungewöhnlich sowas.

                Eventuell kriege ich so auch mit, wann ein Text mutwillig zerstört wird (die Häufigkeit der Wörter ändert sich dann sehr stark).

                Und was bitte unterscheidet eine mutwillige Zerstörung von einer mutwilligen Korrektur? Die können beide den gleichen Umfang haben. Du setzt hier etwas willkürlich voraus, das der Ursprungstext zumindest im Grobem korrekt war und nur noch kleinerer Korrekturen bedarf. Was, wenn der Ursprungstext davon handelt, das die Erde eine Scheibe ist, es ausführlich beweist und das, was Du mit Deiner Methode als Zerstörung betrachtest diesen Sachverhalt korrigiert? Was, wenn der Scheibenweltler [sic!] ein paar Freunde hat und somit eine Mehrheit? Schon bist Du wieder bei einem nichttechnischem Problem.

                Das einzige, was dabei hilfreich ist, ist die Tatsache das jemand aus der Menge herausschaut und näherer Betrachtung bedarf. Diese nähere Betrachtung muß jedoch händisch erfolgen, das kannst Du mit technischen Mitteln nicht lösen.

                Vielleicht werde ich bald bereits erste Ergebnisse meiner Idee haben.

                Es ist etwas zu aufwendig (es ist ja für jede Version ein Lexikon zu bauen und auch noch vorzuhalten), eine Graphen-Differenz sollte reichen (oder auch ein LCS wie Ratcliff/Obershelp o.ä.).
                Ich würde aber trotzdem vorschlagen, die von mir erwähnten unscharfen Prüfsummen zu benutzen, da etwas weniger zu vergleichen ist, keine Lexika zu bauen und vorzuhalten sind und vor allem: sie sind gut genug.

                BTW: was Du vorhast ist eine Kategorisierung in zwei Sparten. Das entspricht in Art und Funktion einem Spamfilter. Die entsprechende Literatur ist jedoch bereits Legion, deshalb auch gar nicht erst der Versuch Links zu listen ;-)
                Aber das bedeutet natürlich auch, das alle Deine und auch meine Versuche dahingehende bereits bei den Spammern bekannt sind. Selbst wenn Du Deine Methoden geheim hältst so können sie sie doch selbst mit Brute-Force recht schnell herausfinden, da alle Methoden und auch deren Kombination einen bestimmten "Fingerabdruck" hinterlassen.

                so short

                Christoph Zurnieden

                1. Hi Christoph;

                  den nächsten Text, den ich mir für genaueres Lesen rauskopieren werde, vorallem werde ich mir mal 'LCS wie Ratcliff/Obershelp' reinziehen, denn davon habe ich noch nie was gehört.
                  Werde mal googeln dazu...
                  ---
                  Du hast vollkommen recht wenn du sagst, daß ich eine grundsätzlich unsichere Basis habe, die nicht ausreichen wird, korrekte von unkorrekten Aussagen zu unterscheiden.
                  Mehr noch:

                  a) Der Ball ist eckig
                  b) Der Ball ist eckig
                  c) Der Ball ist rund

                  Setzt man hier eine Mehrheitsentscheidung an, so wird die Korrektur rausgeschmissen.
                  Mir ist vollkommen klar, daß es einen vollkommenen Automatismus nicht geben kann. Es reicht mir, wenn ich eine automatische Hilfe habe -allein schon das Rausfinden, was sich geändert hat gegenüber dem Vorgängertext ist schon eine große Erleichterung.

                  Leider bin ich da noch nicht wesentlich weiter gekommen. Und wahrscheinlich werde ich erst morgen eine Routine haben, die zwei Texte miteinander vergleichen kann, das ganze wird eine HTML-Seite sein mit eingebauten JS.
                  Würde dich die Seite interessieren ? Ich könnte sie hier als Textfile einstellen.

                  ---
                  Hier der Link zum Artikel:
                  http://www.spiegel.de/netzwelt/netzkultur/0,1518,362008,00.html

                  1. Hi,

                    Mir ist vollkommen klar, daß es einen vollkommenen Automatismus nicht geben kann. Es reicht mir, wenn ich eine automatische Hilfe habe -allein schon das Rausfinden, was sich geändert hat gegenüber dem Vorgängertext ist schon eine große Erleichterung.

                    Ja. Mehr kannst Du auch gar nicht tun. (Zumindest in absehbarer Zeit nicht).
                    Aber weil der Nutzen eines Triggers "Obacht: es hat sich sprunghaft sehr viel in Artikel XZ geändert!" über etwas Bequemlichkeit kaum hinausgeht (falls Du nicht gerade einige tausend oder mehr Artikel zu verwalten hast, dann ist sowas natürlich unabdingbar) darf es auch nicht viel kosten. Damit fallen alle komplexen Algorithmen hinten raus, es muß etwas einfaches sein.

                    Leider bin ich da noch nicht wesentlich weiter gekommen. Und wahrscheinlich werde ich erst morgen eine Routine haben, die zwei Texte miteinander vergleichen kann, das ganze wird eine HTML-Seite sein mit eingebauten JS.

                    Mit Javascript? Na, da hätte ich doch 'was für Dich.

                    Bis auf die beiden ersten Funktionen ist alles sehr komplex und damit recht lahm. Das ist aber nur natürlich und läßt sich nach aktuellem Stand der Forschung auch nicht verbessern.

                    Die oben erwähnten unscharfen Prüfsummen (nur Latin-1, reicht aber normalerweise):

                    function whitesum(_Value){
                      var val    = _Value;
                      var sumstr = "";
                      var regex  = /[ \t\v\r\n]/; // fehlt &nbsp;

                    for(var i=0;i<val.length;i++){
                        if(regex.test(val[i])){
                          sumstr += val[i];
                        }
                      }
                      return sumstr;
                    }

                    function punctsum(_Value){
                      var val = _Value;
                      var sumstr = "";
                      var regex  = /[.,;!?¡¿]/; // fehlt so einiges

                    for(var i=0;i<val.length;i++){
                        if(regex.test(val[i])){
                          sumstr += val[i];
                        }
                      }
                      return sumstr;
                    }

                    Und einmal eine Edit-Distanz (Damerau-Levenshtein):
                    Basierend auf dem C-code von Lorenzo Seidenari, Portierung nach Javascript ist von mir.

                    function Minimum(a, b, c) {
                      var minimum = a;
                      if(b < minimum)
                        minimum = b;
                      if(c < minimum)
                        minimum = c;
                      return minimum;
                    }
                    function levenshtein(s, t) {
                      var n = s.length
                      var m = t.length;
                      var i,j,cost;
                      var d = new Array();

                    if((n+m) == 0) return -1;
                      // Step 1
                      if( (n*m) == 0){
                        return ((n == 0)?n:m);
                      }
                      for(i=0; i <= n; i++){
                        d[i] = new Array();
                      }
                      // Step 2
                      for(i = 0; i <= n; i++) {
                        d[i][0] = i;
                      }
                      for(j = 0; j <= m; j++) {
                        d[0][j] = j;
                      }
                      // Step 3
                      for(i = 1; i <= n; i++) {
                        // Step 4
                        for(j = 1; j <= m; j++) {
                          cost = ((s.charAt(i - 1) ==  (t.charAt(j - 1)))?0:1);
                          // Step 6
                          d[i][j] = Minimum (d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1] + cost);
                        }
                      }

                    // Step 7
                      return d[n][m];
                    }

                    Gibt's auch in Gewichtet, falls das benötigt wird. Die gewichtete Version ist auch nicht nur ganz von mir (Die Implementation natürlich nur, nicht die Idee ;-) sondern auch noch auf die übliche Methode Speicheroptimiert.

                    Die folgende Implementation des Ratcliff/Obershelp Algorithmus ist eine 1:1 Übersetzung aus C. Er ist deswegen höchstwahrscheinlich noch schneckenartiger in der Ausführung als die Komplexität eh schon beschreibt!

                    /*
                      Ratcliff/Obershelp Pattern Recognition
                      Algorithm as described in the July 1988 issue
                      of Dr. Dobbs Journal.

                    Translation of the C-code of Steve Grubb <linux_4ever@yahoo.com>
                      (The original program ist from 1999, thus the email address might
                       be not the one you are looking for) by me czurnieden@gmx.de

                    The original C-code is GPL, so is this.

                    This program is free software; you can redistribute it and/or modify
                       it under the terms of the GNU General Public License as published  by
                       the Free Software Foundation; either version 2 of the License, or
                       (at your option) any later version.

                    This program is distributed in the hope that it will be useful,
                       but WITHOUT ANY WARRANTY; without even the implied warranty of
                       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                       GNU General Public License for more details.

                    You should have received a copy of the GNU General Public License
                            along with this program; if not, write to the Free Software
                       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA

                    */
                    function memcmp(s,slen,t,tlen,size){

                    if(s.substring(slen,(slen + size)) < t.substring(tlen,(tlen + size))){
                         return -1;
                       }
                       if(s.substring(slen,(slen + size)) > t.substring(tlen,(tlen + size))){
                         return 1;
                       }
                       else{
                         return 0;
                       }
                    }
                    // some global variables

                    var tcnt = 0.0;

                    function longest_substring(s,slen,t,tlen,SubString){
                      var i,j,size=1;

                    SubString["o2"] = -1;
                      for(i=0;i<=(slen-size);i++){
                        for(j=0; j<=(tlen-size); j++){
                          var test_size = size;
                          while(1){
                            if((test_size<=(slen-i))&&(test_size<=(tlen-j))){
                       if(memcmp(s,i,t,j, test_size) == 0){
                         if((test_size > size) || (SubString["o2"] < 0)){
                           SubString["o1"] = i;
                           SubString["o2"] = j;
                           size = test_size;
                         }
                         test_size++;
                       }
                       else
                         break;
                    }
                    else
                       break;
                          }
                        }
                      }
                      if(SubString["o2"] < 0){
                        SubString["len"] = 0;
                      }
                      else{
                        SubString["len"] = size;
                      }
                    }

                    function rsimil(s,slen,t,tlen){

                    if(slen == 0 || tlen == 0){
                        return;
                      }

                    var SubString = new Object();
                      SubString["o1"]  = 0;
                      SubString["o2"]  = 0;
                      SubString["len"] = 0;

                    longest_substring(s,slen,t,tlen, SubString);

                    if(SubString["len"] != 0){
                        var delta1, delta2;
                        tcnt += SubString["len"] << 1;

                    rsimil(s,SubString["o1"],t,SubString["o2"]);

                    delta1 = SubString["o1"] + SubString["len"] ;
                        delta2 = SubString["o2"] + SubString["len"] ;

                    if((delta1<slen)&&(delta2<tlen)){
                          rsimil(s.substring(delta1, s.length), slen - delta1,
                                 t.substring(delta2, t.length), tlen - delta2);
                        }
                      }
                    }

                    function simil(s,t){
                      var tlen = 0.0;
                      var slen = s.length;
                      var tlen = t.length;

                    if((!s || slen <= 0) || (!t || tlen <= 0)){
                        return 0.0
                      }

                    tcnt = 0.0;
                      tlen = slen + tlen;

                    rsimil(s,slen,t,tlen);

                    return (tcnt/tlen);

                    }

                    Würde dich die Seite interessieren ? Ich könnte sie hier als Textfile einstellen.

                    Höchstens als Link bitte, danke.

                    so short

                    Christoph Zurnieden

  2. Hallo flashnfantasy.

    logChanges2HTML("Der Text hat eine Feher", "Der Text hatte zwei Fehler")

    soll umgewandelt werden in zB.:

    Der Text hat<b>te</b> <b>zwei</b><strikethrough>eine</strikethrough> Fe<b>l</b>her

    Hier würde ich dir die dafür vorgesehenen Elemente <del> und <ins> empfehlen.

    Aber nach einigen Fehlschlägen will ich mal nachfragen, ob jemand da einen bewährten Algorithmus kennt.

    Das Einzige, was mir da in den Sinn kommt, ist array_diff(), vielleicht kannst du damit etwas anfangen.

    Gruß, Ashura

    --
    Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
    30 Days to becoming an Opera8 Lover -- Day 19: Notes
    Meine Browser: Opera 8.01 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
    [Deshalb frei! - Argumente pro freie Software]
    1. Hi Ashura,

      Das Einzige, was mir da in den Sinn kommt, ist array_diff(), vielleicht kannst du damit etwas anfangen.

      Das geht nicht...
      Es werden ja die Indezes verglichen, und da würde ein eingefügtes Wort bedeuten, daß alle nachfolgenden Wörter nicht mehr stimmen.

      Nimmst du die Wörter hingegen als Index (und die Anzahl als Argument ?), dann hast du vielleicht eine Aussage, was sich geändert hat, aber nicht wo...

      Bin gerade was sehr komplexes am Ausprobieren:

      • erzeuge eine Liste von beiden Texten nur mit den Wort- und Zahlenelementen, lasse Satzzeichen, Leerzeichen etc. weg
      • erzeuge eine Liste mit allen Wörtern, die in beiden Texten vorkommen (nimm dazu die erste Liste)
      • erzeuge Ankerpunkte mit den Wörtern, die in beiden Texten nur einmal vorkommen. Falls es solche Wörter nicht gibt, muß ich mir einen Alternativalgorithmus ausdenken...
      • ausgehend von solchen Ankerpunkten ordne die folgenden Wörter zu, dazu werden beide Wörter und der Abstand zu den Ankerpunkten gemessen. Es werden die Wörter zugeordnet, bei denen die Differenz der Abstände am geringsten ist...
        -...

      Gruß,
      Flash