hast du ne idee?
Announcement
Collapse
No announcement yet.
Problem 2 Sätze miteinander zu vergleichen (tricky!!!)
Collapse
X
-
@ Christian
habs immer noch nicht geschafft ne Lösung zu finden.Bin jetzt mal von den Worten weg und will meinen Eingegebenen Satz mit dem originalen ähnlich wie es google macht vergleichen um satzfehler zu finden und dann erst an die Worte an sich gehen.
Glaubst du so könnte es funktionieren?
Im Grunde will ich über Schleifen abfragen wo es anfängt nicht mehr Übereinszustimmen.Stichwort Mustererkennun.
Sag mir mal bitte deine Meinung
Comment
-
Hier mal etwas Code will jetzt die Arraylisten vergleichen Position für position vergleichen ob an der jeweiligen Position (0x mit 0y ,1x mit 1y usw.)eine übereinstimmung ist.
Code:using System; using System.Collections.Generic; using System.Collections; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace Testapp { static class MinEditDistanz //Levenshtein Algorithmus zu Bestimmung der MIN-Edit-Distanz { public static int Compute(string s, string t) { int n = s.Length; int m = t.Length; int[,] d = new int[n + 1, m + 1]; if (n == 0) { return m; } if (m == 0) { return n; } for (int i = 0; i <= n; d[i, 0] = i++) { } for (int j = 0; j <= m; d[0, j] = j++) { } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { int cost = (t[j - 1] == s[i - 1]) ? 0 : 1; d[i, j] = Math.Min( Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), d[i - 1, j - 1] + cost); } } return d[n, m]; } } //*** class Program { static void Main() { int abr =0; //Variable für Schleifenabbruch while (abr < 10) { string x = Console.ReadLine(); //Einlesen 1.String string y = Console.ReadLine(); //Einlesen 2.String string X = Regex.Replace(x, "(\\s+)", " "); //Doppelte Leerzeichen Entfernen string Y = Regex.Replace(y, "(\\s+)", " "); int d = MinEditDistanz.Compute(X, Y); //Levenshteinvergleich string[] sX = X.Split(' '); //Stringsplit string[] sY = Y.Split(' '); ArrayList sXList = new ArrayList(); //Strings in Arraylist speichern foreach (string s in sX) sXList.Add(s); ArrayList sYList = new ArrayList(); foreach (string s in sY) sYList.Add(s); //*** int sXcount = sXList.Count; //Variable für Arraylistlänge int sYcount = sYList.Count; Console.WriteLine(sXcount+" Wörter im 1.Satz!"); Console.WriteLine(sYcount+" Wörter im 2.Satz!"); if (sXcount == sYcount) //Vergleich Arraylänge {Hier will ich jetzt Element für Element bei gleichem Index miteinander vergleichen und ausgeben ob sie übereinstimmen Console.WriteLine("Die Min-Edit Distanz beträgt:"); Console.WriteLine(MinEditDistanz.Compute(X, Y)); //Gibt Levenshtein Distanz aus if (d > 0 && d < 5) //Vergleich der beiden Strings Console.WriteLine("Die Wörter sind ähnlich"); else if (d == 0) Console.WriteLine("Wort ist richtig geschrieben!"); else Console.WriteLine("Wörter sind nicht ähnlich!"); //*** } else Console.WriteLine("Die Sätze Sind unterschiedlich lang!!!"); abr++; } Console.WriteLine("Zum Abbrechen Enter Drücken!"); //Abbruch Console.ReadLine(); } } }
Zuletzt editiert von filer; 26.03.2009, 17:46.
Comment
-
Ist das dein Ernst, dass wir diesen unformatierten Text interpretieren sollen? Gehe schnellstens auf den vorigen Beitrag mit "Editieren", dann auf "Erweitert", füge (soweit nötig) Einrückungen ein, markiere den Code-Bereich, drücke auf den #-Button und dann auf "Speichern". So ist es eine Zumutung.
Übrigens sind alle unspezifizierten Listen nicht mehr sinnvoll. Benutze statt ArrayList unbedingt List<string>.
Schließlich: kannst du etwas beschreiben, was dabei nicht funktioniert (es ist schließlich gegenüber der früheren Problembeschreibung eine wesentlich neue Situation eingetreten)?
Jürgen
Comment
-
Offensichtlich ist es jetzt erheblich besser lesbar; bitte mach das künftig gleich so.
Noch ein Wunsch: Schreib Kommentare über oder unter die betreffende Zeile, damit man sie sofort sieht und nicht ständig scrollen muss.
Der "Mangel" liegt darin, dass du die rot geschriebene Arbeitsanleitung nicht in Code übersetzt.
Hier will ich jetzt Element für Element bei gleichem Index miteinander vergleichen und ausgeben ob sie übereinstimmen
Code:bearbeite beide Listen mit Index von 0 bis Maximum berechne die Distanz des Elements der einen Liste vom entsprechenden Element der anderen Liste übernimm das Ergebnis Ausgabe der aktuellen Werte
Nur zur Sicherheit (ich weiß jetzt nicht mehr, was du alles schon an Code gezeigt hast): Ein Element eines Arrays kann mit Index benutzt werden, z.B. sX[x1]. Es gibt nicht nur die foreach-Schleife, sondern auch for, while, do-while.
Das sollte als Hinweise reichen. Jürgen
Comment
-
Code:using System; using System.Collections.Generic; using System.Collections; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace Testapp { static class MinEditDistanz //Levenshtein Algorithmus zu Bestimmung der MIN-Edit-Distanz { public static int Compute(string s, string t) { int n = s.Length; int m = t.Length; int[,] d = new int[n + 1, m + 1]; if (n == 0) { return m; } if (m == 0) { return n; } for (int i = 0; i <= n; d[i, 0] = i++) { } for (int j = 0; j <= m; d[0, j] = j++) { } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { int cost = (t[j - 1] == s[i - 1]) ? 0 : 1; d[i, j] = Math.Min( Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), d[i - 1, j - 1] + cost); } } return d[n, m]; } } //*** class Program { static void Main() { int abr = 0; //Variable für Schleifenabbruch while (abr < 10) { string x = Console.ReadLine(); //Einlesen 1.String string y = Console.ReadLine(); //Einlesen 2.String string X = Regex.Replace(x, "(\\s+)", " "); //Doppelte Leerzeichen Entfernen string Y = Regex.Replace(y, "(\\s+)", " "); string[] sX = X.Split(' '); //Stringsplit string[] sY = Y.Split(' '); ArrayList sXList = new ArrayList(); //Strings in Arraylist speichern foreach (string s in sX) sXList.Add(s); ArrayList sYList = new ArrayList(); foreach (string s in sY) sYList.Add(s); //*** int sXcount = sXList.Count; //Variable für Arraylistlänge int sYcount = sYList.Count; Console.WriteLine(sXcount + " Wörter im 1.Satz!"); Console.WriteLine(sYcount + " Wörter im 2.Satz!"); if (sXcount == sYcount) //Vergleich Arraylänge { int iX = 0; int iY = 0; while (((iX <= sXcount) && (iY <= sYcount))) { string s = sXList[iX].ToString(); //Object aus Arraylist in String convertieren string t = sYList[iY].ToString(); int d = MinEditDistanz.Compute(s, t); //Levenshteinvergleich Console.WriteLine(d); int f=0; if (d != 0) Console.WriteLine("Sie haben {0} Fehler gemacht!", f = f + d); else Console.WriteLine("richtig"); iX++; iY++; } abr++; } else { Console.WriteLine("Die Sätze sind unterschiedlich lang!"); } Console.WriteLine("Zum Abbrechen Enter Drücken!"); //Abbruch Console.ReadLine(); } } } }
Comment
-
... Benutze eine for-Schleife mit einer Variablen, die für beide Listen verwendet wird. Oder (wenn du unbedingt while mit zwei Variablen haben willst) benutze den "kleiner"-Vergleich; du musst daran denken, dass in C# Arrays und Listen immer von 0 bis "max gleich Länge minus 1" gehen.
So, das ist meine letzte Antwort zu diesem Thema. Wenn du Vorschläge zur wesentlichen Vereinfachung (String-Array statt ArrayList, for-Schleife) nicht übernehmen willst, verliere ich die Lust.
JürgenZuletzt editiert von Jürgen Thomas; 30.03.2009, 10:23. Reason: "max - 1" als Obergrenze für Arrays ist nicht ganz korrekt.
Comment
Comment