Texte/Strings vergleichen.

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Texte/Strings vergleichen.

Re: Texte/Strings vergleichen.

Post by Gucky_87 » 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.

Re: Texte/Strings vergleichen.

Post by Gucky_87 » 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.

Re: Texte/Strings vergleichen.

Post by gregster » 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.

Re: Texte/Strings vergleichen.

Post by gregster » 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)

Texte/Strings vergleichen.

Post by Gucky_87 » 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.

Top