Page 1 of 1

Texte/Strings vergleichen.

Posted: 21 Feb 2018, 06:41
by Gucky_87
Halloliho,

bezugnehmend auf meinen Post 'Straßen- und Ortsnamen korrekt schreiben' fiel mir ein, dass ich vor etlichen Jahren schon einmal (ich denke in einem uralt AHK Forum) eine Ähnliche Frage gestellt und es entstand in Zusammenarbeit mit einigen User dort ein Script, mit dem man die Ähnlichkeit 2er Strings beurteilen, bzw. ermitteln konnte.

Leider ist dieses Script weder im Netz auffindbar, noch habe ich selber es noch irgendwo gespeichert.
Ich hatt es in irgendein Tool eingebaut, kann mich aber nicht mehr so wirklich erinnern.

Daher habe ich nach langer Suche nun beschlossen, quasi neu anzufangen. Grundlage für mein Script war damals, so weit ich mich einnern kann, de Ermittlung der Levenshtein-Distanz. Ich habe bisher folgenden Code, der auch gut funktioniert:

Code: Select all

DLDist(s, t)
{
    StringLen, m, s
    StringLen, n, t
    If m = 0
        Return, n

    If n = 0
        Return, m

    d0_0 = 0
    Loop, % 1 + m
        d0_%A_Index% = %A_Index%

    Loop, % 1 + n
        d%A_Index%_0 = %A_Index%
    
    ix = 0
    iy = -1
    Loop, Parse, s
    {
        sc = %A_LoopField%
        i = %A_Index%
        jx = 0
        jy = -1
        Loop, Parse, t
        {
            a := d%ix%_%jx% + 1, b := d%i%_%jx% + 1, c := (A_LoopField != sc) + d%ix%_%jx%, d%i%_%A_Index% := d := a < b ? a < c ? a : c : b < c ? b : c
            If (i > 1 And A_Index > 1 And sc == tx And sx == A_LoopField)
                d%i%_%A_Index% := d < c += d%iy%_%ix% ? d : c
            
            jx++
            jy++
            tx = %A_LoopField%
        }
        ix++
        iy++
        sx = %A_LoopField%
    }
    Return, d%m%_%n%
}
Mein Ansinnen ist es, eine Routine zu erstellen, die z.B. einen Prozentwert (0.00 - 100.00) ausgibt, der direkt etwas darüber aussagt, wie ähnlich sich String 1 und String 2 sind.

Vielleicht kann mir ja jemand helfen.

Gucky.

Re: Texte/Strings vergleichen.

Posted: 21 Feb 2018, 06:52
by gregster
nnnik hat da auch was gebastelt: https://autohotkey.com/boards/viewtopic.php?f=6&t=39112
Und dann gibt es noch andere alte Threads: https://cse.google.com/cse?cx=010629462 ... gsc.page=1
(als Referenz; wenn ich dich richtig verstehe, funktioniert dein Code ja schon)

Re: Texte/Strings vergleichen.

Posted: 21 Feb 2018, 07:06
by gregster
Naja, die maximale Levenstein-Distanz ist ja die Länge des längeren Strings, die minimale Null bei Gleichheit der Strings. Da dürfte sich ja mit der konkreten Distanz ein Prozentwert errechnen lassen... aber macht es Sinn, hier relative Werte zu errechnen? Kommt wahrscheinlich auf den konkreten Anwendungsfall an.

Re: Texte/Strings vergleichen.

Posted: 21 Feb 2018, 08:09
by Gucky_87
Der Code, den ich oben gepostet habe, funktioniert so weit.
Problematisch wird es nur im Zusammenhang mit Wörtern, die (typisch für z.B. Straßen- und Orstnamen) FAST ähnlich sind.

Z.B. Otto-Mueller-Ring 81 => Otto Müller Ring 82
oder Willy-Brandt-Pl.2 => Willy-Brand-Platz 2

Jeder Mensch 'sieht', dass es die selbe Adressbezeichnung ist. Für den PC aber ist ja jede Abweichung etwas völlig anderes.
In meinem Konkreten Fall z.B. geht es darum, Adressen und Orte aus Dateinamen auszulesen und diese mit Strings aus anderen
Quellen zu vergleichen.

Dazu habe ich noch keinen konkreten Code, bastle aber daran herum. Ich ersetze z.B. von vorne herein alle Sonderzeichen (Bindestriche, Kommas, Punkte, etc.) durch Leerzeichen, sodass ich eine Basis bekomme, die aus reinen Wörtern besteht.
Dann wandle ich alle Wörter in Großbuchstaben, um die einzelnen Vergleiche einfacher zu gestalten.

Nach meinem Beispiel bleibt dann etwa "WILLYBRANDTPLATZ' übrig, in welchem "WILLYBRANDTPL" ja enthalten ist.
Was aber, wenn z.B. jemand es weiter abkürzt, sodass von "W.Brandt-Pl." dann "WBRANDTPL" übrig bleibt?
Wie könnte man daraus einen Ähnlickkeitswert ermitteln?

Gucky.

Re: Texte/Strings vergleichen.

Posted: 21 Feb 2018, 08:52
by Gucky_87
Ich habe jetzt einige Links aus der o.g. Suchliste ausprobiert unf bin H I E R gélandet. Diese Compare Routine scheint sehr brauchbar zu sein.
Ich denke, daraus lässt sich für meine Zwecke etwas sinnvolles häkeln.

Danke für die Hilfe, falls aber noch jemand Ideen dazu hat, immer her damit, ich lerne gerne dazu.

Gucky.