Texte/Strings vergleichen.

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Gucky_87
Posts: 376
Joined: 03 Jul 2014, 05:09

Texte/Strings vergleichen.

21 Feb 2018, 06:41

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.
Last edited by Gucky_87 on 21 Feb 2018, 07:56, edited 1 time in total.
User avatar
gregster
Posts: 9224
Joined: 30 Sep 2013, 06:48

Re: Texte/Strings vergleichen.

21 Feb 2018, 06:52

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)
Last edited by gregster on 21 Feb 2018, 07:21, edited 1 time in total.
User avatar
gregster
Posts: 9224
Joined: 30 Sep 2013, 06:48

Re: Texte/Strings vergleichen.

21 Feb 2018, 07:06

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.
User avatar
Gucky_87
Posts: 376
Joined: 03 Jul 2014, 05:09

Re: Texte/Strings vergleichen.

21 Feb 2018, 08:09

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.
User avatar
Gucky_87
Posts: 376
Joined: 03 Jul 2014, 05:09

Re: Texte/Strings vergleichen.

21 Feb 2018, 08:52

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.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 18 guests