• Offizieller Beitrag

    Wenn man in AutoIt ein Wort in einem Text sucht, nimmt man normalerweise StringInStr dafür oder bastelt etwas mit StringRegExp.

    Das ist meistens ausreichend und auch schnell genug.

    Wenn man allerdings eine "unscharfe" Suche möchte, wird es kompliziert und langsam. Die sogenannte Levenshtein-Distanz (oder in Prozent umgerechnet) gibt die Ähnlichkeit zweier Wörter zurück.

    In AutoIt ist die Funktion aber sehr zeitaufwändig und wenn man einen größeren Text durchsuchen will, dauert es sehr lange.

    Da ich die Levenshtein-Distanz bereits in Nim übersetzt habe, dachte ich mir, das kann ich dann doch auch für AutoIt zur Verfügung stellen (als DLL).

    Die Suche habe ich dann auch gleich in Nim geschrieben, so wird es noch etwas schneller.

    Edit 03.10.2020:

    Ich habe den Nim-Quellcode jetzt dahingehend geändert, dass gleich alle Fundstellen (als String) zurückgegeben werden.

    Das hat den Vorteil, dass bei sehr vielen Fundstellen nur ein DllCall von AutoIt aus erforderlich ist. Im Worstcase-Fall (Suchbegriff: ein Buchstabe und Null Prozent) würde sonst für jedes Wort ein Dll-Call nötig sein, was recht zeitaufwändig ist.

    Edit 06.10.2020:

    Die Nim-interne Funktion zur Berechnung der Levenshtein-Distance editDistanceAscii() ist deutlich effektiver, als die von mir konvertierte Funktion. Die Laufzeit des Beispiels schrumpft somit von vorher 238ms auf nunmehr 66ms.

    Ich finde, das ist eine neue Version wert. :)

    Der Nim-Sourcecode sieht so aus (zum compilieren des Codes als Dll den Compiler folgendermaßen aufrufen: nim c -d:release --app:lib FuzzySearch.nim

    Für die, die kein Nim installiert haben, habe ich die DLL bereits compiliert mit ins ZIP-Archiv (Anhang) gepackt.

    Das AutoIt-Beispiel sieht dann so aus:

    Wichtig ist noch, dass ihr das AutoIt-Script als 64-Bit-Version ausführt #AutoIt3Wrapper_UseX64=y, weil Nim eine 64-Bit-DLL erstellt.

    Alle Quellcodes und den Beispieltext (BGB mit 207336 Wörtern) findet ihr im ZIP-Archiv.

  • Vielen Dank :thumbup:

    Immer gut so etwas im Köcher zu haben, selbst wenn man es momentan nicht benötigt.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hah, das ist ja super ^^

    Da fühle ich mich gleich schlecht, dass ich soetwas ähnliches in der SB nachgefragt habe, ich wollte damit nicht veranlassen, dass mir jemand die Arbeit abnimmt, sondern nur nachfragen ob es sowas gibt :S

    Vielen Dank ;)

    lg

    M

    • Offizieller Beitrag

    Da fühle ich mich gleich schlecht, dass ich soetwas ähnliches in der SB nachgefragt habe,

    Ich gebe zu, dass Deine Frage in der SB den Ausschlag dafür gab, aber ich finde, dass man sowas in AutoIt durchaus mal gebrauchen kann.

    Und es war eine Übung, um in Nim zu programmieren. :)

    Im Übrigen ist das Ganze wirklich schnell. Bei mir dauert die Suche (so wie im Beispiel) nur rund 280ms. Bei 207336 Wörtern ist das nicht schlecht, denke ich.

    Müsste man mal mit purem AutoIt vergleichen... ^^

  • Ich habe deine Dll so kompiliert: nim c -d:release -o:FuzzySearch.dll FuzzySearch.nim

    Doch leider funktioniert es so nicht... die Version aus dem Zip-Archiv läuft aber bei mir.

    AutoIt3.exe ended.rc:-1073741819

    Edit:

    Hat sich aufgehangen, weil die Datei bgb.txt nicht gefunden wurde... mit läuft es... obwohl ich eine etwas andere Größe nach dem Kompilieren habe.

    FuzzySearch.dll 135.675 Bytes ; meine Version

    FuzzySearch.dll 126.753 Bytes ; deine Version

    Einmal editiert, zuletzt von Bitnugger (2. Oktober 2020 um 16:30)

    • Offizieller Beitrag

    Müsste man mal mit purem AutoIt vergleichen...

    Aus Neugier habe ich das mal getan:

    AutoIt: 120976 ms

    AutoIt mit Nim-Dll: 238 ms

    Zeitfaktor: mehr als das 500fache bei purem AutoIt.

    AutoIt mit Nim-Dll, wie oben, nur mit "Richtlinie" als Suchwort:

    Testscript (AutoIt) hier:

    • Offizieller Beitrag

    Das solltest du in deinem ersten Post und auch in dem Nim-Script vermerken.

    Ich hab's mal oben eingefügt. Danke!

    Passend zu diesem Thema ist evtl. auch dies hier: https://de.wikipedia.org/wiki/Hamming-Abstand

    Nicht ganz!

    Die Levenshtein-Distanz unterscheidet sich etwas vom Hamming-Abstand.

    Siehe hier: https://de.wikipedia.org/wiki/Levenshtein-Distanz

    Zitat


    Die Levenshtein-Distanz kann als Erweiterung des Hamming-Abstands angesehen werden, welcher sich auf Ersetzungen beschränkt und daher nur Zeichenketten gleicher Länge bemessen kann.

  • Nicht ganz!

    Die Levenshtein-Distanz unterscheidet sich etwas vom Hamming-Abstand.

    Ja, schon klar... das bedeutet aber doch nicht, dass es nicht zum Thema passt... wenn es denn - so wie du selbst zitiert hast - als Erweiterung des Hamming-Abstands angesehen werden kann... ;)