Thema Datum  Von Nutzer Rating
Antwort
Rot Levenshtein distance with array
23.05.2024 14:52:18 Tom
NotSolved
24.05.2024 11:02:49 Mase
NotSolved

Ansicht des Beitrags:
Von:
Tom
Datum:
23.05.2024 14:52:18
Views:
152
Rating: Antwort:
  Ja
Thema:
Levenshtein distance with array

Hallo zusammen,

Ich stehe vor einem Problem. Vllt. kann mir einer weiterhelfen.

Ich möchte eine Art fuzzy search in VBA umsetzen. Die Idee ist 2 Strings miteinander zu vergleichen und die Levenshtein distance auszugeben. Bei einem Abgleich von 2 Strings ist das kein Problem. String 1 vergleichen mit String A.

Nun ist es so, dass ich einen String 1 mit einer Vielzahl von Strings (A,B,C,D,etc.) abgleichen und mir den Wert mit der geringsten Levenshtein distance ausgeben möchte.

String 1 = (String A, String B, String C, String D, etc.)

String 2 = (String A, String B, String C, String D, etc.)

String 3 = (String A, String B, String C, String D, etc.)

 

Der String (A;B;C;D,etc.) mit der geringsten Levenshtein distance soll dann ausgegeben werden. Im besten Fall noch zusätzlich den Wert der Levenshtein distance.

Eine Funktion/code der Levenshtein distance habe ich bereits (findet man einfach mit ein bisschen Suchen).

Mein Anatz wäre nun:

  • Die abzugleichen Strings (A,B,C,D,etc.) in ein array schreiben (die sollen nicht angepasst werden)
  • Dann einen Abgleich für jeden String, Zeile für Zeile durchführen (String 1,2,3)
  • Den Wert mit der geringsten Levenshtein distance ausgeben (neben den String 1,2,3) schreiben
  • Wenn es mehrere Treffer für die geringste Levenshtein distance gibt dann alle ausgeben 

 

Zielbild:

String 1 Bester Treffer aus dem Array (STRING A,B,C) Levenshtein distance  
ABC AB1 1  
1234 1345 3  
AAA AAA 0  
ABCD ABCE, ABCF 1  

 

Beispiel einer Funktion:

Option Explicit
Public Function Levenshtein(s1 As String, s2 As String)

Dim i As Integer
Dim j As Integer
Dim l1 As Integer
Dim l2 As Integer
Dim d() As Integer
Dim min1 As Integer
Dim min2 As Integer

l1 = Len(s1)
l2 = Len(s2)
ReDim d(l1, l2)
For i = 0 To l1
    d(i, 0) = i
Next
For j = 0 To l2
    d(0, j) = j
Next
For i = 1 To l1
    For j = 1 To l2
        If Mid(s1, i, 1) = Mid(s2, j, 1) Then
            d(i, j) = d(i - 1, j - 1)
        Else
            min1 = d(i - 1, j) + 1
            min2 = d(i, j - 1) + 1
            If min2 < min1 Then
                min1 = min2
            End If
            min2 = d(i - 1, j - 1) + 1
            If min2 < min1 Then
                min1 = min2
            End If
            d(i, j) = min1
        End If
    Next
Next
Levenshtein = d(l1, l2)
End Function

 

Ich hoffe ich habe mein Problem verständlich beschrieben.

Über jegliche Hilfe bin ich mehr als dankbar!

Beste Grüße und vielen Dank schon einmal.

Tom


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
Rot Levenshtein distance with array
23.05.2024 14:52:18 Tom
NotSolved
24.05.2024 11:02:49 Mase
NotSolved