FuzzyString-UDF - unscharfe Vergleiche von Strings und Suche in Arrays

  • Diese UDF beinhaltet Algorithmen zum unscharfen Stringvergleich und der damit verbundenen Ähnlichkeitssuche in String-Arrays.
    Sie bietet Funktionen zu zeichenbasierten Vergleichen, dem Vergleich der Phonetik der Wörter sowie dem Abstand von Zeichen auf einer Tastatur.

    Auf diese Art kann man Tippfehler erkennen, gleichklingende Wörter detektieren und andere Schreibweisen von Wörtern einbeziehen.

    Aktuell sind in der UDF folgende Funktionen enthalten:


    >>Download und Quellcode auf GitHub<<

  • Hi AspirinJunkie 👋 ,

    mal ganz abgesehen davon, dass ich beeindruckt bin von deinem akademischen Ansatz der UDF, die ich toll finde, nur ehrlich gesagt noch nie den Bedarf hatte etwaige Funktionen einzusetzen, Danke ich erstmal fürs Teilen auf GitHub 👍 .

    Beim anschauen und ausprobieren sind mir ein paar Kleinigkeiten aufgefallen, die mir u. a. auch die AutoIt Direktiven #AutoIt3Wrapper_AU3Check_Parameters verraten haben 😅 .

    • $iDistMin in Zeile 341 könnte ein Local vertragen (unkritisch)
      • das Gleiche für Zeile 691
    • unbenutzte optionale Paramter
      • $iDummy in Funktion _FS_Hamming kommt in der Funktion nie zum Einsatz => kann also weg (Zeile 378)
      • $iDummy in Funktion _FS_Soundex_distance kommt in der Funktion nie zum Einsatz => kann also weg (Zeile 421)
      • das Gleiche bei Zeile 495 und 571
      • sind sicherlich alles Überbleibsel bei der Entwicklung 🤔
    • Möchtest du vielleicht die magic number 9223372036854700000 als Global Const deklarieren (im obersten Bereich der UDF), die immerhin 6x genutzt wird? Nur eine Idee.
    • Möchtest du vielleicht Tidy das UDF Format anpassen lassen? Auch total unkritisch, es wäre nur dann einfach eine einheitliche Struktur über die ganze UDF hinweg.

    Aber nochmal: Krasse Sache, Danke 👍 .

    Viele Grüße
    Sven

  • Nachtrag:

    • Die example Skripte sind echt toll, Danke! Vielleicht habe ich doch ein Einsatzgebiet, mal schauen.
    • Wie bist du darauf gekommen, eine solche UDF zu erstellen würde mich interessieren?
  • Danke für den Hinweis.

    Das Au3Check habe ich ausgelassen. Das hätte ich natürlich tun sollen - war allerdings zu faul da mir schon das ganze dokumentieren tierisch auf den Sack ging. $iDistMin wird natürlich korrigiert.

    $iDummy muss unbedingt drin bleiben. Diese Funktionen werden als Callback-Funktionen in _FS_ArraySearchFuzzy() verwendet und erhalten beim Call 3 Parameter. Der Parameter heißt nicht umsonst so.

    Zur konstanten Int-Zahl: Was habt ihr alle damit? Im englischen Forum kam auch schon die Sprache darauf. Es ist einfach nur eine möglichst große Zahl gegen die verglichen wird. Die muss gar nicht über die Funktionen hinweg den gleichen Wert besitzen. Ich sehe daher nicht wirklich einen Vorteil hierfür eine zusätzliche globale Konstante einzuführen. Ihr aber offensichtlich schon. Verstanden habe ich es jedoch noch nicht.

    Tidy: Klar kann ich machen. Würde sich was gravierend an der Formatierung ändern? Kann ich morgen testen (bin grad auf Linux unterwegs)

    Wie bist du darauf gekommen, eine solche UDF zu erstellen würde mich interessieren?

    Weiß ich ehrlich gesagt nicht mehr genau. Ich kam aber darauf, dass eine Funktion für die unscharfe Suche in Arrays gut für die ArrayPlus-UDF wäre.

    Als ich mich dann tiefer in die Thematik eingelesen habe, hab ich festgestellt, dass die Thematik eine eigene UDF verdient.

  • da mir schon das ganze dokumentieren tierisch auf den Sack ging

    Kann ich mir vorstellen, absolut.

    $iDummy muss unbedingt drin bleiben. Diese Funktionen werden als Callback-Funktionen in _FS_ArraySearchFuzzy() verwendet und erhalten beim Call 3 Parameter. Der Parameter heißt nicht umsonst so.

    Das verstehe ich leider nicht. Was genau bringt der optionale Parameter, wenn er in der Funktion selbst keine Verwendung findet?

    Zur konstanten Int-Zahl: Was habt ihr alle damit? Im englischen Forum kam auch schon die Sprache darauf. Es ist einfach nur eine möglichst große Zahl gegen die verglichen wird. Die muss gar nicht über die Funktionen hinweg den gleichen Wert besitzen. Ich sehe daher nicht wirklich einen Vorteil hierfür eine zusätzliche globale Konstante einzuführen. Ihr aber offensichtlich schon. Verstanden habe ich es jedoch noch nicht.

    Du hast mir jetzt erklärt wofür diese "möglichst große Zahl" steht. Du hast auch aufgezeigt, dass es gar nicht die selbe große Zahl sein muss, welche 6x in den (zwei) Funktionen verwendet wird sondern auch eine andere jedes Mal sein könnte. => Genau das ist der Hintergrund von "magic numbers", man weiß nicht wieso, was sie darstellen soll und ob es genau diese sein muss etc. Man fragt sich ob man diese Zahl nicht auslagern kann usw. Daher wird allgemein "empfohlen", dass magic numbers mit sprechenden Namen verhindert werden sollten.

    Wenn es keine Konstante ist, was ich nun verstanden habe, würde ich persönlich folgendes tun: Local $iRandomBigNumber = 9223372036854700000 oder ähnliches. Dann ist klar für jeden weiteren Entwickler der sich die UDF ansieht, was sie bedeuten soll und das sie nicht konstant ist (sein muss).

    Weiß ich ehrlich gesagt nicht mehr genau. Ich kam aber darauf, dass eine Funktion für die unscharfe Suche in Arrays gut für die ArrayPlus-UDF wäre.

    Als ich mich dann tiefer in die Thematik eingelesen habe, hab ich festgestellt, dass die Thematik eine eigene UDF verdient.

    Du bist der Knaller 😂 , alles klar. Danke dir.

    Viele Grüße
    Sven

  • Das verstehe ich leider nicht. Was genau bringt der optionale Parameter, wenn er in der Funktion selbst keine Verwendung findet?

    Die ArraySearchFuzzy ist flexibel was die verwendete Distanzmetrik angeht. Die verschiedenen Metriken wählt man, indem man diese als Callbackfunktionen übergibt.

    Nun ist es jedoch so, dass manche der Algorithmen sich beschleunigen lassen, wenn man diesen mitteilt was der Grenzwert ist. Die Levenshtein-Funktion wäre so ein Beispiel. Das ist besonders wichtig für die Suche in einem Array. Daher muss diese der Callback-Funktion den Grenzwert auch übergeben (Parameter $iMax). Es gibt aber auch die Algorithmen die sich dadurch nicht beschleunigen lassen bzw. ich das nicht implementiert habe. Denen ist daher ein $iMax wurscht. Aber da sie als Callback-Funktion zusammen mit den $iMax-Funktionen verwendet werden habe ich nun die Wahl entweder den $iMax-Parameter auszulassen und daher die Arraysuche massiv zu verlangsamen oder alternativ den anderen Funktionen einfach nur einen funktionslosen Dummy-Parameter hinzufügen.

  • Hab's in das engl. Wiki aufgenommen :)

    Womit sich mir mal wieder die Frage stellt - kriegen wir sowas im dt. Forum demnächst auch? Das Addon ist ja installiert und der Menüpunkt ("Artikel") eingerichtet. Viel kann also nicht mehr fehlen ;)

  • Ahhh, jetzt habe ich es verstanden. Vielen Dank für die Erläuterung 🤝 , ergibt Sinn soweit.

    Aus deiner einen Funktion, drei zu machen ist keine Option oder? Also ich meine eine mit optionalen Parameter, eine ohne und eine die den eigentlichen Inhalt beinhaltet der dann von beiden Funktionen aufgerufen wird. Also damit du natürlich den Code nicht redundant (doppelt) hast. Somit wäre der Aufruf von einer oder der anderen Funktion (je nach Bedarf des Dummy param) gegeben und unter der Haube (als eine Abstraktionsebene tiefer), hast du den Code aufgeteilt.

    Naja, ist glaube ich over-the-top und unnötig 😅 .

  • war allerdings zu faul da mir schon das ganze dokumentieren tierisch auf den Sack ging.

    :rofl:

    Ernst gemeintes Angebot: Wenn du mal einen Ghost-Dokumentator brauchst, melde dich. Ich werde wahrscheinlich nicht zwingend alle Finessen erkennen und beschreiben können. Aber für das Grundgerüst sollte es reichen. Feinheiten und Korrekturen blieben dann noch für dich.

    Nicht dass ich wirklich scharf aufs Dokumentieren bin, aber besser kann man neue Dinge kaum lernen, als sie eigenständig beschreiben zu müssen.

  • Hab's in das engl. Wiki aufgenommen :)

    Well well water , fleißig und weitsichtig wie immer - vielen Dank 👍 .



    Für die die nicht wissen wo das engl. Wiki zu finden ist, 🔗 hier .

  • :)

  • Wenn du mal einen Ghost-Dokumentator brauchst, melde dich.

    Um mal meinen alten Prof zu zitieren: "Sind wir ehrlich - so ne Pampelarbeit ist eigentlich eher was für Frauen oder Kriminelle"...

    Danke dir aber wenn ich möchte, dass andere meine Funktionen nutzen und darüber hinaus auch so wie sie gemeint waren, dann komme ich schlicht nicht darum, das selbst zu dokumentieren.
    Da muss man sich halt zusammenreißen - gehört halt auch dazu.

    Aus deiner einen Funktion, drei zu machen ist keine Option oder?

    Dann haben wir Unübersichtlichkeit, Code-Redundanz und Komplexität mit dazugehöriger Fehleranfälligkeit dazugewonnen.
    Da bleibe ich ganz sicher bei der Variante wo ich 4 Parameter definiere von denen der User nie was mitbekommt.

  • Dann haben wir Unübersichtlichkeit, Code-Redundanz und Komplexität mit dazugehöriger Fehleranfälligkeit dazugewonnen.
    Da bleibe ich ganz sicher bei der Variante wo ich 4 Parameter definiere von denen der User nie was mitbekommt.

    Sehe ich nicht zwingend so, aber fair enough, klar bleib dabei. Danke nochmal für die Erläuterung warum du es so gemacht hast 🤝 .

    Viele Grüße
    Sven