Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1300to1304
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Ähnlichkeit von Strings messen

Ähnlichkeit von Strings messen
20.02.2013 14:17:15
Strings
Hallo,
ich habe in zwei Zellen Strings, deren Ähnlichkeit ich messen möchte. Beispiel:
HEIDELBERGER DRUCKMASCHINEN WEB-SOLUTIONS CEE GES.M.B.H.
Heidelberger Druckmaschinen WEB-Solution CEE Ges.m.b.H
Unterschiede sind hier die Groß-/Kleinschreibung, das fehlende "s" bei Solutions sowie der fehlende Punkt am Ende des zweiten Strings. Der eine String ist immer in Großbuchstaben, der andere nicht.
Meine Überlegung war nun, wie folgt vorzugehen:
1. Umwandlung des einen Strings in Großbuchstaben
2. Trennung der beiden Strings in die einzelnen Zeichen
3. Aufsteigende Sortierung der einzelnen Zeichen für jeden String
4. Paarweise Vergleich der einzelnen Zeichen. Wenn das erste Zeichen des kürzeren Strings irgendwo im längeren String gefunden wird, gibt es einen Punkt, und das Zeichen wird aus dem Bestand der Vergleichsdaten gelöscht. Entsprechend für alle weiteren Zeichen.
5. In meinem Beispiel würden alle 54 Zeichen des kürzeren Strings in den 56 Zeichen des längeren Strings gefunden werden. Der Stringvergleich ergäbe also 54 von 56 möglichen Punkten. Damit wäre der zu berechnende Index 54/56. Der Index wäre immer zwischen 0 und 1 und die Ähnlichkeit umso größer, je näher der Wert an 1 ist. Bei Identität der Strings wäre der Wert 1.
5a. Alternativ wäre es auch möglich, auszuzählen, wie oft welches Zeichen im kürzeren String vorkommet und das mit einer Auszählung der Zeichen im längeren String zu vergleichen.
Beispiel: 1. AAABCCCC 2. AAAACCDDDD
Gemeinsam sind AAA und CC, d.h. die Ähnlichkeit ist 5/10 oder 0,5.
Meine Fragen: Hat jemand Erfahrungen mit einer solchen Aufgabenstellung? Ist die Herangehensweise grundsätzlich geeignet? Wie könnte man das in VBA lösen?
Ich habe die Aufgabe hier vereinfacht dargestellt. Konkrete geht es darum, dass in 2 Tabellen zu mehreren Hundert "Objekten" je drei Strings abgelegt sind (Name, Land, Ort) anhand derer die Ähnlichkeit gemessen werden soll. Wenn ich für den Namen (so.) eine Lösung habe, kann ich das aber übertragen.
Danke im voraus
Martin

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Ähnlichkeit von Strings messen
20.02.2013 14:19:12
Strings
Hi,
wurde gerade eben behandelt, hier der Link:
https://www.herber.de/forum/messages/1300051.html
du findest da Lösungen für phonetische, mathematische und sonstige Ähnlichkeiten von Strings.
Grüße,
Klaus M.vdT.

AW: Ähnlichkeit von Strings messen
21.02.2013 12:45:03
Strings
Hallo Klaus,
vielen Dank für den Hinweis. Das ist ein ziemlicher Zufall, am Wochenende hatte ich noch die Recherche bemüht und nicht gefunden. Das Stichwort "Levenshtein-Distanz" war sehr gut, ich denke damit komme ich weiter.
Vielen Dank und Gruß
Martin

Danke für die Rückmeldung! owT.
21.02.2013 12:48:39
Klaus
.

Anzeige
Levenshtein-Distanz mit benutzerdef. Funktion
21.02.2013 13:23:10
mpb
Hallo,
und schon gibt es ein Problem. Mit diesem im Internet aufgeschnappten Code kann ich für zwei Strings die Levenshtein-Distanz berechnen:
Function levenshtein(a As String, b As String) As Integer
Dim i As Integer
Dim j As Integer
Dim cost As Integer
Dim d() As Integer
Dim min1 As Integer
Dim min2 As Integer
Dim min3 As Integer
If Len(a) = 0 Then
levenshtein = Len(b)
Exit Function
End If
If Len(b) = 0 Then
levenshtein = Len(a)
Exit Function
End If
ReDim d(Len(a), Len(b))
For i = 0 To Len(a)
d(i, 0) = i
Next
For j = 0 To Len(b)
d(0, j) = j
Next
For i = 1 To Len(a)
For j = 1 To Len(b)
If Mid(a, i, 1) = Mid(b, j, 1) Then
cost = 0
Else
cost = 1
End If
' Since Min() function is not a part of VBA, we'll "emulate" it below
min1 = (d(i - 1, j) + 1)
min2 = (d(i, j - 1) + 1)
min3 = (d(i - 1, j - 1) + cost)
'            If min1 

Für einen Vergleich von Texten in den Zellen D2 und B2 funktioniert das auch einwandfrei. Ich möchte aber den Text in der Zelle D2 "nacheinander" mit den Texten in den Zellen B2:B82 vergleichen und von den 81 berechneten Distanzen nur den Minimalwert zurückgeben, also eine Arrayfunktion, die sinngemäß so aussieht:
{=MIN(levenshtein(D2; B2:B82))}
Wie müsste ich den obigen Code (für eine allgemeine, nicht nur auf mein Beispiel bezogene Lösung) anpassen? Bin z.Z. etwas eingerostet... ;-)
Gruß
Martin
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige