Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Java > Allgemeine Java-Programmierung > Algorithmus zum finden von Differenzen in zwei Texten
Antwort
 
Themen-Optionen
Alt 10.04.2005, 12:25   Nach oben    #1
Erfahrener Benutzer
 
Benutzerbild von Gottzilla
 
Registriert seit: 02.02.2005
Beiträge: 515
Standard Algorithmus zum finden von Differenzen in zwei Texten

ich brauche einen Algorithmus um zwei Texte auf Differenzen zu überprüfen. D. h. es muss nicht nur beachtet werden, ob der Buchstabe an einer gewissen Stelle ein anderer ist, wie an der selben Stelle im Vergleichstext, sondern es muss auch noch beachtet werden, wenn ein Buchstabe zu viel und zu wenig ist. Und dann soll wieder ab dort weitergemacht werden, ab wann der Text wieder korekt ist. Denn sonst ist ja z. B. bei nem vergessenen Buchstaben der komplette restliche Text falsch. Hat da jemand eine Ahnung?ich brauche einen Algorithmus um zwei Texte auf Differenzen zu überprüfen. D. h. es muss nicht nur beachtet werden, ob der Buchstabe an einer gewissen Stelle ein anderer ist, wie an der selben Stelle im Vergleichstext, sondern es muss auch noch beachtet werden, wenn ein Buchstabe zu viel und zu wenig ist. Und dann soll wieder ab dort weitergemacht werden, ab wann der Text wieder korekt ist. Denn sonst ist ja z. B. bei nem vergessenen Buchstaben der komplette restliche Text falsch. Hat da jemand eine Ahnung?
Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.04.2005, 14:21   Nach oben    #2
Benutzer
 
Benutzerbild von 3qualizer
 
Registriert seit: 29.05.2004
Beiträge: 45
Standard

Diff (1) wäre ein Ansatz. Allerdings afaik nur Zeilenweise.

(1) http://www.bmsi.com/java/#diff
__________________
Jabber: melsi@amessage.de
3qualizer ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.04.2005, 16:05   Nach oben    #3
Erfahrener Benutzer
 
Benutzerbild von Gottzilla
 
Registriert seit: 02.02.2005
Beiträge: 515
Standard

Weißt du wie das funktioniert (also die Vorgehensweise)? Hast du damit schonmal gearbeitet?
Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.04.2005, 21:05   Nach oben    #4
Sym
Chefkoch-Mod
 
Benutzerbild von Sym
 
Registriert seit: 30.05.2004
Beiträge: 433
Standard

Ist ein Text immer korrekt und der andere evtl. fehlerhaft? Oder können auch beide Texte fehlerhaft sein? Evtl. sogar komplett unterschiedlich?
__________________
Denk mal darüber nach...

Lars

ACHTUNG: wenn ich von Klassen spreche, könnte ich auch deren Instanzen meinen.
www.linuxforen.de +++ www.macuser.de +++ www.mrunix.de +++ www.lmprojects.de
Sym ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.04.2005, 10:41   Nach oben    #5
Erfahrener Benutzer
 
Benutzerbild von Gottzilla
 
Registriert seit: 02.02.2005
Beiträge: 515
Standard

Nein, einer ist immer korrekt und der andere kann fehlerhaft sein.
Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.04.2005, 14:39   Nach oben    #6
Erfahrener Benutzer
 
Benutzerbild von Gottzilla
 
Registriert seit: 02.02.2005
Beiträge: 515
Standard

Hab mir da jetzt mal was zusammengebaut ... nur funktioniert das nicht immer. Kann da mal jemand drüberschauen?

PHP-Code:
 static int differenz(String str1String str2)  {
  
  
str1 str1.replaceAll("\n"" \n") + " ";
  
str2 str2.replaceAll("\n"" \n") + " ";
  
int str1F 0
  
int str2F 0
  
int fehler 0
  
int lange 0
  
boolean fertig false
  if (
str1.length() <= str2.length()) { 
   
lange str1.length(); 
  } 
  else { 
   
lange str2.length(); 
  }
  try {
   for (
int i 0lange && fertig == falsei++) { 
    if (
str1.charAt(str1F) != str2.charAt(str2F) && fertig == false) { 
     
int soweit 0
     
int test1 str1F
     
int test2 str2F
     
fehler++; 
     while (
fertig == false && str1.charAt(test1) != str2.charAt(test2)) { 
      
soweit++; 
      if (
test1 lange && test2 lange) {
       if (
str1.charAt(test1) != str2.charAt(test2) && fertig == false) { 
        for (
int durch 0durch != soweitdurch++) { 
         
test1++; 
         
test2++; 
        } 
       }
      }
      if (
test1 lange && test2 lange) {
       if (
str1.charAt(test1) != str2.charAt(test2) && fertig == false) { 
        
test1 str1F
        
test2 str2F
        for (
int durch 0durch != soweitdurch++) { 
         
test1++; 
        } 
       }
      }
      if (
test1 lange && test2 lange) {
       if (
str1.charAt(test1) != str2.charAt(test2) && fertig == false) { 
        
test1 str1F
        
test2 str2F
        for (
int durch 0durch != soweitdurch++) { 
         
test2++; 
        } 
       }    
      } 
      if (
test1 >= lange || test2 >= lange) {
       
fertig true;
      }
     }
     
str1F test1;
     
str2F test2;
    }
    
str1F++; 
    
str2F++;
    if (
str1F >= lange || str2F >= lange) { 
     
fertig true
    }
   } 
  }
  catch (
Exception e) {
   
System.out.println(e);
  }
  return 
fehler
 } 
[edit] Hab mal den aktuellen Code eingefügt ...
Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.04.2005, 18:12   Nach oben    #7
Benutzer
 
Benutzerbild von 3qualizer
 
Registriert seit: 29.05.2004
Beiträge: 45
Standard

Zitat:
Zitat von Hobbit_im_Blutrausch
Weißt du wie das funktioniert (also die Vorgehensweise)? Hast du damit schonmal gearbeitet?
Mit dem "Konsolen-Diff" von GNU/Linux arbeite ich jeden Tag (*patch-aholic ist* *g*).
Die Java-Variante die ich verlinkt hab, hatt ich noch nicht anschauen können... denk aber das sie ähnlich funktioniert:
Zitat:
I have translated the GNU Diff algorithm to a Java class.
__________________
Jabber: melsi@amessage.de
3qualizer ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 14.04.2005, 11:42   Nach oben    #8
Erfahrener Benutzer
 
Benutzerbild von Gottzilla
 
Registriert seit: 02.02.2005
Beiträge: 515
Standard

Danke, aber ich benutze nur nicht gerne Classen die ich nicht wenigstens Verstehe. Deswegen würde ich gerne den Algorithmus verstehen. Der Code ist aber so unverständlich (man siehe allein die Variablennamen) geschrieben, dass ich mich da wahrscheinlich nur wenn gar nichts anderes geht einlesen werde.
Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.04.2005, 10:52   Nach oben    #9
Erfahrener Benutzer
 
Benutzerbild von Gottzilla
 
Registriert seit: 02.02.2005
Beiträge: 515
Standard

So, hab mal ein bisschen weiter geforscht und habe das hier http://www.igi.tugraz.at/oaich/animations/lcs/lcs.html gefunden. Das scheint so auch wunderbar zu funktionieren. Also versuch ich es gerade nachzubauen. Bin im Moment so weit, dass ich das 2 Dimensionale Array mit Werten befülle. Die Werte stimmen auch, bis ein Buchstabe vergessen oder zuviel ist. Wie kann ich meinen Code erweitern, dass das mit Berückstichtig wird? Oder habe ich gar komplett den falschen Ansatz? Hier mein aktueller Code:

PHP-Code:
public class diffTest 
    
   public static 
void main(String[] args) { 
       
      
String str1 "Fehlt"
      
String str2 "Fehlt"
      
int fehler 0
      
int stelle 1
      
int[][] check = new int[str1.length() + 1][str2.length() + 1]; 
      for (
int a 0str1.length() + 1a++) { 
         
check[a][0] = 0
      } 
      for (
int a 0str2.length() + 1a++) { 
         
check[0][a] = 0
      } 
      for (
int a 1str1.length() + 1a++) { 
         for (
int b astr2.length() + 1b++) { 
            if (
str1.charAt(1) == str2.charAt(1)) { 
               for (
int c bstr2.length() + 1c++) { 
                  
check[a][c] = - (stelle 1); 
               } 
               for (
int c astr1.length() + 1c++) { 
                  
check[c][a] = - (stelle 1); 
               } 
            } 
            else { 
               for (
int c bstr2.length() + 1c++) { 
                  
check[a][c] = stelle
               } 
               for (
int c astr1.length() + 1c++) { 
                  
check[c][a] = stelle
               } 
               
stelle++; 
            } 
            
str2.length() + 1
         } 
      } 
      for (
int a str1.length(); >= 0a--) { 
         for (
int b 0str2.length() + 1b++) { 
            
System.out.print(check[a][b]); 
         } 
         
System.out.println(); 
      } 
   } 

Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.04.2005, 11:08   Nach oben    #10
Erfahrener Benutzer
 
Benutzerbild von Gottzilla
 
Registriert seit: 02.02.2005
Beiträge: 515
Standard

Hab jetzt eine Denk ich verwertbare Ausgabe, nur weiß ich nicht wie ich sie auswerte. Mein aktueller Code:

PHP-Code:
public class diffTest 
    
   public static 
void main(String[] args) { 
        
      
String str1 "Fehler"
      
String str2 "Fehler"
      
int fehler 0
      
int[][] check = new int[str1.length()][str2.length()]; 
      for (
int a 0str1.length(); a++) { 
         for (
int b 0str2.length(); b++) { 
            if (
str1.charAt(a) == str2.charAt(b)) { 
               
check[a][b] = 1
            } 
         } 
      } 
      for (
int a str1.length() - 1>= 0a--) { 
         for (
int b 0str2.length(); b++) { 
            
System.out.print(check[a][b]); 
         } 
         
System.out.println(); 
      }     
   } 

In diesem Beispiel wird

000001
010010
000100
001000
010010
100000

ausgegeben. D. h. dass alles richtig ist, da von rechts oben diagonal bis links unten alles mit 1ern voll steht. Nur wie werte ich das in anderen Fällen am Besten aus? könne ja auch z. B. so dastehen:

Fehler => Fdhler

000001
000010
000100
001000
000010
100000

oder so:

Fehler => Fler

0001
0010
0100
0000
0010
1000

usw.
Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.04.2005, 20:06   Nach oben    #11
mic_checker
Gast
 
Beiträge: n/a
Standard

Ich poste mal den Link zur aktuellen Seite im andern Forum, damit die die es interessiert auf dem aktuellen Stand sind:
http://www.java-forum.org/de/viewtop...6313&start=105

Viel Spaß beim Lesen der Seiten
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.04.2005, 22:10   Nach oben    #12
mic_checker
Gast
 
Beiträge: n/a
Standard

Hier noch der Link zu dem ganz gut funktionierenden Algorithmus:
http://www.java-forum.org/de/viewtopic.php?t=17114
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.04.2005, 14:03   Nach oben    #13
Erfahrener Benutzer
 
Benutzerbild von Gottzilla
 
Registriert seit: 02.02.2005
Beiträge: 515
Standard

Ah, ich hasse diese Verlinkungen . Und da ich sowieso seit gestern krank geschrieben bin und nichts besseres zu tun habe:

PHP-Code:
 class Levenshtein 
 static 
int diff(String origString eing) { 
  
int matrix[][] = new int[orig.length() + 1][eing.length() + 1]; 
  for (
int i 0orig.length() + 1i++) { 
   
matrix[i][0] = i
  } 
  for (
int i 0eing.length() + 1i++) { 
   
matrix[0][i] = i
  } 
  for (
int a 1orig.length() + 1a++) { 
   for (
int b 1eing.length() + 1b++) { 
    
int right 0
    if (
orig.charAt(1) != eing.charAt(1)) { 
     
right 1
    } 
    
int mini matrix[1][b] + 1
    if (
matrix[a][1] + mini) { 
     
mini matrix[a][1] + 1
    } 
    if (
matrix[1][1] + right mini) { 
     
mini matrix[1][1] + right
    } 
    
matrix[a][b] = mini
   } 
  } 
  return 
matrix[orig.length()][eing.length()]; 
 } 

Gottzilla ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort