Laden...

Forenbeiträge von Sythus Ingesamt 166 Beiträge

27.07.2009 - 08:35 Uhr

Moin herbivore,

also der Lerneffekt für mich in diesem Forum ist echt der Wahnsinn:)

Wieder etwas neues und dazu noch sehr interessantes.
Habe mir natürlich sofort in Wikipedia angeschaut was das ist und festgestellt das es da verschiedene phonetische Algorithmen gibt. Hast du da einen bestimmten im Auge?

Mann könnte nachdem man die Strings in ein phonetisches Format umgewandelt hat Wörter wie Frau oder Herr einfach rauslesen sehe ich das richtig?
Allerdings würden ähnliche Strings im Vergleich auch einen Treffer geben
z.B.
Benni Meyer und Ben Meier

(doofes Beispiel aber so ähnlichkeiten kann es ja geben)
Und dann wäre der Vergleich mit dem Algorithmus eher Kontraproduktiv.
Außer man überprüft nachdem es einen phonetischen Treffer gab auch direkt nochmal die Hashwerte.

Danke für diese Idee.
Ich mache mir weiter Gedanken darüber.

Gruß
Sythus

26.07.2009 - 23:37 Uhr

Ja, die Emailadresse würde normalerweise auch reichen... wenn da nich das problem der Datenqualität wäre...
Die ist nunmal nicht in allen Datensätzen vorhanden...
Theoretisch müsste ich die Strings auf prozentuale Übereinstimmung testen und bei z.B. 90 Prozent Übereinstimmung die zwei verglichenen Strings als gleich ansehen.

Datenquelle 1
Vorname ; Nachname
Sarah ; Schmitt
Frau Heike ; Müller
Manfred ; Schuster

Datenquelle 2
Vorname ; Nachname
Sara ; Schmitt
Heike ; Müller
Manfred ; Schuster

Ich hoffe ihr könnt nachvollziehen was ich meine.

So wie ich es momentan umgesetzt habe finde ich eben nich alle Übereinstimmungen.
(im Beispiel oben eben nur Manfred Schuster - Sarah Schmitt und Heike Müller fallen aus dem Raster)

Ich hatte schon etwas geschrieben was Strings vergleicht und einen Prozentwert zurück gibt. Aber da hatte ich auch die 5-6h Rechenzeit
Bei 40 000 x 40 000 Datensätzen und pro datensatz 3 Vergleiche

Naja man kann ja nicht alles haben und die meisten Datensätze die ich suche finde ich ja 😄

gn8 + Grüße

26.07.2009 - 19:55 Uhr

das ist ne echt coole klasse:)
So werd ichs machen

Danke!! Find ich toll das du dir soviel Mühe machst. Ja macht so auf jedenfall mehr Sinn.

Viele Grüße

Sythus

26.07.2009 - 15:15 Uhr

perfekt!
Merci!!!

edit: komischerweise werdens dann aber weniger datensätze ?(

26.07.2009 - 14:52 Uhr

Danke ujr - ich wusste nicht das der index bedingung sein muss,wollte ihn nur ins result eintragen damit ich leichter an den ganzen datensatzkomme...

Es läuft nun soweit, ist allerdings nicht so genau...

Die Implementierung die cirka 5h dauert errechnet 647 Datensätze, die mit dem Hash allerdings nur 537

Die 5h Implementierung ist also genauer.
Ich nehme an das dass an der Groß und Kleinschreibung liegt. ( Die Daten sind auf beiden Seiten nicht 100 Prozentig gleich - also leider keine sauberen Daten )

Gibt es die Möglichkeit 2 String hashs zu vergleichen ohne Beachtung der Groß oder Kleinschreibung?

Danke und Grüße

26.07.2009 - 13:44 Uhr

Ich hatte grad wohl Scheuklappen vor den Augen
habe es nun mit einer for schleife gelöst



            for (int i = 0; i < emailS.Count; i++)
            {
                if((set1.Contains(vornameS[i]) && set2.Contains(nachnameS[i])) || set3.Contains(emailS[i]))
                {
                    results.Add(String.Join(";", ((string[])_suchanfragenUnique[i])));
                }
            }

Das dauert zwar 26 Millisekunden aber das werde ich wohl überleben

Danke an alle beteiligten, für eure Ideen, Vorschläge und Hilfen.

Viele Grüße

26.07.2009 - 12:58 Uhr

Ohja du hast Recht, das sind tatsächlich verschachtelte Schleifen...
Allein die erste Übereinstimmung wird mehrere tausend mal eingetragen.

mist 😠

Ich hab leider noch nich viel mit Hashs gemacht und weiß nun nicht wirklich wie ich das damit so umsetzen kann das es funktioniert X(

Hat jemand eine Idee? 😁
Ich werd jetzt erstmal ein bisschen die Doku zu Hashs und Generics durchblättern, vll find ich ja ne Lösung.

Ansonsten schonmal vielen Dank

26.07.2009 - 11:30 Uhr

Guten Morgen,

hehe herbivore, warscheinlich hast du recht ^^

Ich habe es heute nun gleich mal mit dem Beispiel von Flo probiert und stoße leider auf eine OutOfMemoryException.

Bei Abbruch steht result auf einer irrsinnig hohen zahl (results = Count = 134217728)
Soviele Daten gibt es garnicht^^

Wäre nett wenn jemand mal über meinen Code gucken könnte:)


        public void StarteZuordnung()
        {

            //erstellen von source1
            List<string> vornameS = new List<string>();
            List<string> nachnameS = new List<string>();
            List<string> emailS = new List<string>();
            List<string> portalS = new List<string>();
            List<string> id = new List<string>();

            //source1 listen füllen
            for (int i = 0; i < _suchanfragenUnique.Count; i++)
            {
                vornameS.Add(((string[])_suchanfragenUnique[i])[1]);
                nachnameS.Add(((string[])_suchanfragenUnique[i])[2]);
                emailS.Add(((string[])_suchanfragenUnique[i])[3]);
                portalS.Add(((string[])_suchanfragenUnique[i])[4]);
                id.Add(i.ToString());
            }
            Console.WriteLine("SuchanfragenListen erstellt!");

            //erstellen von source2
            List<string> vornameV = new List<string>();
            List<string> nachnameV = new List<string>();
            List<string> emailV = new List<string>();

            //source2 listen füllen
            for (int i = 0; i < _vermittlungsStammdaten.Count; i++)
            {
                vornameV.Add(GetValue((string)_vermittlungsStammdaten[i], 78));
                nachnameV.Add(GetValue((string)_vermittlungsStammdaten[i], 49));
                emailV.Add(GetValue((string)_vermittlungsStammdaten[i], 26));
            }
            Console.WriteLine("VermittlungsStammdatenlisten erstellt!");

            List<string> results = new List<string>();

            Stopwatch watch = new Stopwatch();
            watch.Start();

            //Hashs von source2 erstellen
            HashSet<string> set1 = new HashSet<string>(vornameV);
            HashSet<string> set2 = new HashSet<string>(nachnameV);
            HashSet<string> set3 = new HashSet<string>(emailV);


            //hier taucht die OutOfMemoryException auf
            results.AddRange(from a in vornameS
                             from b in nachnameS
                             from c in emailS
                             from i in id
                             where (set1.Contains(a) && set2.Contains(b)) || set3.Contains(c)
                             select i);

            watch.Stop();
            Console.WriteLine("Found matches: {0}", results.Count);
            Console.WriteLine("Duration: {0}", watch.ElapsedMilliseconds);


        }

Vielen dank schonmal,

Grüße,

Sythus

26.07.2009 - 00:04 Uhr

WoW Jungs ich bin begeistert ^^ Das is ja Irre 🙂

Danke euch und vorallem Flo für die Mühe, nu weiß ich auch direkt wie ichs anstelle. 👍

Vielen dank!!!!

Ich meld mich nochmal wenn ichs umgesetzte hab, so morgen früh oder so.

Sythus

25.07.2009 - 23:20 Uhr

Hallo,

danke für eure Antworten.

Also zur erklärung:

Ich habe 2 Datenquellen, jede hat ca 40 000 Datensätze bzw. Strings.

Es gilt nun für die Strings von Datenquelle 1 jeweils eine Übereinstimmung in der Datenquelle 2 zu finden.

Und das läuft natürlich in einer verschachtelten Schleife durch.

Das mit dem Länge vergleichen ist auch eine gutee Idee und werde ich ausprobieren.
Aber wieso meinst du muss man die Strings danach mit dem HashCode und dann auch noch mit dem echten Wert vergleichen? DAs ist ja dann ein Vergleich mehr.
Reicht der Hascode vergleich nicht aus?

Danke und Gruß 😃

25.07.2009 - 22:57 Uhr

Hey vielen dank,
klingt interessant...

sofern das vergleichen von 2 Hashcodes schneller geht als der 2er Strings aber davon geh ich aus.
Danke, das werde ich auch mal probieren:)

25.07.2009 - 22:34 Uhr

Hallo Christof, Hallo DerApfel,

erstmal vielen dank.

Ich muss die Strings leider einzeln vergleichen da ich von jedem Vergleich für sich das Ergebnis brauche. Ein Vergleich 2er Gesamtmengen bringt mir also leider nichts.

Ja, Apfel, sowas ist mir auch in den Sinn gekommen und werde ich auch versuchen, allerdings wärs natürlich toll wenn es noch andere tolle Möglichkeiten gäbe 😃

Gruß

25.07.2009 - 22:24 Uhr

Hallo,

ich habe das Problem das ich ca 225 000 000 Strings vergleichen muss und die Rechenzeit bei mehreren Stunden liegt...

Daran sind die Stringvergleiche schuld - ich habe schon alles Versucht

str1 == str2
string.compare(str1,str2);
und und und

allerdings nehmen die sich in der Geschwindigkeit nicht viel.
Gibt es eine Möglichkeit Strings schneller zu vergleichen?

Habe im Forum als auch bei Google dazu nicht wirklich was gefunden.

Danke und viele Grüße,
Sythus

10.07.2009 - 16:18 Uhr

Ja da hast du recht ^^
Danke euch...

Bin ja noch am lernen - mit der Zeit wird das schon werden.

Grüße

10.07.2009 - 15:50 Uhr

Hallo und vielen dank für deine Unterstützung 😃

Das Tutorial sowie ReadAllLines werde ich mir gleich mal anschauen.
Hatte vorher readLine(); benutzt und das war um ein vielfaches langsamer als wenn ich die Datei byteweise oder charweise einlese. Warum das so war weiß ich nicht.

Die Datei die ich einlesen muss hat circa 25000 Zeilen. Jede Zeile ist ein Datensatz in der Form

"Datum1;Datum2;Datum3;Datum4;Datum5 etc.pp."

Das heißt ich muss die Datei erst einmal in Datensätze und anschließend in Daten splitten.

Wenn du eine Lösung mit guter performance kennst, wäre das natürlich toll.

Ansonsten erstmal danke, ich schaue mir jetzt deine Anmerkungen an und melde mich dann wieder.

Grüße

//PS: readAllLines() passt leider nicht so wirklich da ich das laden der Datei in einer ProgressBar mit anzeigen will...

////PSPSPSP OMG!!! Wieso geht readAllLines() so schnell? Wie kann das in gegensatz zu den anderen Methoden sooooooo schnell gehen....

10.07.2009 - 14:57 Uhr

Hallo,

ich bin neu in C# und hoffe das ich hier richtig bin. Ich programmiere gerade eine WPF Anwendung. Ich weiß das dass hier kein reines Anfängerforum ist und ich entschuldige mich wenn mein Problem eine Anfängerfrage ist. Doch ich verstehe dieses Problem wirklich nicht - es macht fürmich keinen Sinn.

Ich habe eine sehr große Datei die ich einlesen muss. Ich habe es auf unterschiedliche Arten versucht.
Doch readLine() ist mir zu langsam, byteweise oder charweise die Datei einlesen geht bedeutend schneller.

nun habe ich aber das problem das die Zeilenumbrüche nicht mitgelesen werden.

Hier mein Code wie ich die Datei einlese:


StreamReader stream = new StreamReader(new FileStream(m_sUri, FileMode.Open));
char[] buff = new char[1000];
while (!stream.EndOfStream)                
{                     
    currentSize += stream.Read(buff, 0, buff.Length);                                 
    m_sFileContent += buff;
}

Wenn ich nun anschließend m_sFileContent mit


Console.WriteLine(Regex.IsMatch(m_sFileContent, "\r"));
oder
Console.WriteLine(Regex.IsMatch(m_sFileContent, "\n"));
oder
Console.WriteLine(Regex.IsMatch(m_sFileContent, "\n\r"));
oder
Console.WriteLine(Regex.IsMatch(m_sFileContent, "\r\n"));

teste bekomme ich überall ein FALSE. Das ist schlecht da ich die Datei nun zeilenweise in einem Array brauche.


 string[] splitPattern = new string[] { "\r\n" };
 m_sRows = m_sFileContent.Split(splitPattern, StringSplitOptions.None);

Ich wäre für jede Hilfe dankbar 😃

Grüße
Sythus