Deutsch
Quelltexte/ Codesnippets

String-Ähnlichkeit: Jaro-Winkler Algorithmus

 

p.specht

Der Jaro-Algorithmus ist ein Maß für gemeinsame Zeichen, die innerhalb von "nicht mehr als der halben Länge der längeren Zeichenkette" liegen, unter Berücksichtigung von Transpositionen (Verdrehungen). Winkler modifizierte diesen Algorithmus, um das Faktum zu berücksichtigen, dass Unterschiede am Anfang der Zeichenkette signifikanter sind als Unterschiede am Ende der Zeichenkette. Jaro und Jaro-Winkler eignen sich für den Vergleich kleinerer Zeichenketten wie Wörter und Namen.

Für weitere Stringähnlichkeitsvergleiche kennt man den Levenshtein-Algorithmus oder die Kölner Phonetik. Levenshtein zählt die Anzahl der Bearbeitungen (Einfügungen, Löschungen oder Substitutionen), die erforderlich sind, um eine Zeichenkette in die andere zu konvertieren.
Damerau-Levenshtein ist eine modifizierte Version, die Transpositionen auch als Einzelbearbeitung betrachtet. Obwohl die Ausgabe die ganzzahlige Anzahl der Bearbeitungen ist, kann diese standardisiert werden, um einen Ähnlichkeitswert durch eine Formel zu erhalten

In der Praxis ist es wichtig, eine Methode zu wählen, die der Art der Zeichenketten entspricht, die man vergleichen will. Manche Verfahre sind viel aufwändiger als etwa die Berechnung einer phonetischen Vorab-Kodierung. Von der Geschwindigkeit her ist die Reihenfolge: 1. Jaro, 2. Jaro-Winkler, 3. Levenshtein, 4. Damerau-Levenshtein, wobei zwischen schnellstem und langsamsten Algorithmus ein Faktor 2 bis 3 liegt..

WindowTitle "Jaro-Winkler String-Ähnlichkeit"
'Q: https://rosettacode.org/wiki/Jaro_distance#Pascal
'Thema: https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance
'Dissertation [Christen 2006]: Systemvergleich Jaro - Levenshtein
'https://users.cecs.anu.edu.au/~Peter.Christen/publications/tr-cs-06-02.pdf
'(D) Demo translation, 2018-10-28 by P.Specht, Vienna/EU
'Ohne jede Gewähr! No warranty whatsoever!
CLS:font 2
print format$("0.#######", JaroWinkler("DWAYNE","DUANE"))
print format$("0.#######", JaroWinkler("MARTHA","MARHTA"))
print format$("0.#######", JaroWinkler("DIXON","DICKSONX"))
print format$("0.#######", JaroWinkler("JELLYFISH","SMELLYFISH"))
' Solloutput:
' 0.822222
' 0.944444
' 0.766667
' 0.896296
waitinput
END

Proc JaroWinkler :parameters s1$,s2$

    declare l1&,l2&,match_distance&,matches&,i&,k&,trans&,gr&,kl&
    declare bs1&[255],bs2&[255]'max string length is here 255
    l1&=len(s1$):l2&=len(s2$)

    ifnot l1&:ifnot l2&:return 1:else:return 0:endif:endif

        match_distance&= if(l1&>l2&,l1&,l2&)\2-1
        '  matches&=0
        '  trans&=0

        Whileloop l1&:i&=&Loop

            gr&=i&-match_distance&
            kl&=i&+match_distance&

            whileloop if(1>gr&,1,gr&),if(kl&<l2&,kl&,l2&):k&=&Loop

                case bs2&[k&]:continue
                case mid$(s1$,i&,1)<>mid$(s2$,k&,1):continue
                bs1&[i&]=1:bs2&[k&]=1'1=true
                inc matches&:break

            endwhile

        endwhile

        casenot matches&:return 0
        k&=1

        whileloop l1&:i&=&Loop

            casenot bs1&[i&]:continue
            :whilenot bs2&[k&]:inc k&:endwhile
            case mid$(s1$,i&,1)<>mid$(s2$,k&,1):inc trans&
            inc k&

        endwhile

        trans&=trans&\2
        return ((matches&/l1&)+(matches&/l2&)+((matches&-trans&)/matches&))/3

    endproc

 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
29.05.2021  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.829 Betrachtungen

Unbenanntvor 0 min.
Erhard Wirth14.06.2024
p.specht21.11.2021
R.Schneider20.11.2021
Uwe Lang20.11.2021
Mehr...

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

p.specht (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie