Announcement

Collapse
No announcement yet.

Problem 2 Sätze miteinander zu vergleichen (tricky!!!)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    hast du ne idee?

    Comment


    • #17
      Beitrag 7 & 11
      Christian

      Comment


      • #18
        du ich steh echt aufm Schaluch weiß im Moment nicht wie du das meinst.

        Comment


        • #19
          Trotzdem mit Levenshtein untersuchen oder wie meinst du das?

          Comment


          • #20
            Hab das mit der Synchronisation verstanden. Funktioniert das auch wenn ein Wort vergessen wurde?
            Oder muss ich an dieses Problem wieder anders herangehen?

            Comment


            • #21
              Nun, entsprechende Software erkennt, ob eine Datei fehlt.....das geht auch
              Christian

              Comment


              • #22
                @ 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


                • #23
                  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


                  • #24
                    noch was vergessen will vorher überprüfen ob beide gleich lang sind.
                    und erst wenn Arrlist1.length=arrlist2.length dann soll er Position für position vergleichen

                    Comment


                    • #25
                      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


                      • #26
                        Hoffe so ist es besser!

                        Comment


                        • #27
                          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
                          Als Pseudo-Code heißt das dann:
                          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
                          Die ArrayList ist in dieser Situation völlig überflüssig, weil der Vergleich genauso auch mit den String-Arrays funktioniert. Im Gegenteil: Die ArrayList weiß nichts davon, dass sich in ihr Strings sammeln, sondern du müsstest zusätzlich konvertieren; ein String kann direkt als String verwendet werden.

                          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


                          • #28
                            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();
                            
                                            }
                                        }
                                    }
                                }
                            bei der roten Anweisung sagt er mir ArgumentOutOfRangeException wie kann ich das vermeiden?

                            Comment


                            • #29
                              ... 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ürgen
                              Zuletzt editiert von Jürgen Thomas; 30.03.2009, 10:23. Reason: "max - 1" als Obergrenze für Arrays ist nicht ganz korrekt.

                              Comment


                              • #30
                                Danke für die schnelle Antwort.
                                nehme deine Ratschläge schon ernst werde sie auch noch umsetzen aber mir geht es erstmal nicht um die Performance.
                                Soll nur ein Testprogramm sein um zu ermitteln wie ich das Thema lösen kann.

                                Comment

                                Working...
                                X