Zusammenfassung
Erfahren Sie, wie Sie den Soundex-Algorithmus zum Suchen ähnlich lautender Namen verwenden.
Techniken
VBA
Voraussetzungen
Access 97 und höher
Beispieldateien
Soundex97.mdb, Soundex00.mdb
Suchfunktion mit phonetischem Vergleich
Martin Hoffmann, Düsseldorf; André Minhorst, Duisburg
Eine oft benötigte Funktion in einer Datenbank ist das Suchen nach bestimmten Daten. Dies lässt sich mit ein wenig Fleißarbeit leicht realisieren. Interessant wird es, wenn Sie die Suche mit zusätzlichem Komfort ausstatten möchten - etwa, indem Sie der Suchfunktion zusätzlich die Möglichkeit zum Suchen nach ähnlich klingenden Begriffen hinzufügen. Wie man das programmieren soll? Nun, das ist gar nicht schwer. Mit dem so genannten Soundex-Algorithmus erzeugen Sie aus Wörtern einen bestimmten Code, der nicht nur im Englischen, sondern auch im Deutschen verblüffend gute Ergebnisse liefert.
Der Soundex-Algorithmus
Knackpunkt der nachfolgend vorgestellten Suchfunktion ist der Soundex-Algorithmus, der aus einem Namen einen Code aus einem Buchstaben und drei Zahlen erzeugt. Der Algorithmus arbeitet nach den folgenden Regeln:
Das erste Zeichen ist der Anfangsbuchstabe des Begriffs.
Doppelte Buchstaben werden als einzelner Buchstabe betrachtet.
Die Vokale a, e, i, o und u und Umlaute werden genau wie y, w und h nicht beachtet, das scharfe s (ß) wird wie ein normales s behandelt.
Alle anderen Buchstaben werden in die in Tab. 1 angegebenen Zahlencodes umgewandelt, wobei bei zwei aufeinander folgenden Buchstaben mit gleichem Code der zweite verworfen wird.
Das Codieren erfolgt von links nach rechts. Sind vier Zeichen inklusive dem ersten Buchstaben erreicht, spielen die folgenden Buchstaben keine Rolle mehr. Reichen die relevanten Buchstaben hingegen nicht für einen Code von vier Zeichen aus, werden die restlichen Stellen mit der Ziffer 0 aufgefüllt.
Buchstabe |
Soundex-Code |
B, F, P, V |
1 |
C, G, J, K, Q, S, X, Z |
2 |
D, T |
3 |
L |
4 |
M, N |
5 |
R |
6 |
Tab. 1: Buchstaben und die entsprechenden Soundex-Codes
Quellcode 1: Diese Funktion liefert den Soundex-Wert für eine Zeichenkette.
Public Function Soundex(sfName As String) As String
On Error GoTo Soundex_err
'(c) mdb Solution 1998 (Dirk Bauer)
Dim sfSoundex(3) As String
Dim sfZeichen(2) As String, sfZeichenCode(2) As String, _ sfNameNeu As String
Dim iAnzZeichen As Integer, i As Integer
Dim iPos As Integer, iZähler As Integer
'Zeichenkette in Großbuchstaben umwandeln
'und Blanks entfernen
sfName = Trim(UCase(sfName))
'Umlaute und Sonderzeichen ersetzen
iPos = 1
sfNameNeu = ""
For i = 1 To Len(sfName)
sfZeichen(0) = Mid(sfName, iPos, 1)
Select Case Asc(sfZeichen(0))
Case 192, 193, 194, 195, 196, 197, 198: 'Ä, Á...
sfNameNeu = sfNameNeu & "AE"
Case 210, 211, 212, 213, 214, 216: 'Ö...
sfNameNeu = sfNameNeu & "OE"
Case 217, 218, 219, 220: 'Ü...
sfNameNeu = sfNameNeu & "UE"
Case 223: 'ß
sfNameNeu = sfNameNeu & "SS"
Case Is < 65: 'Sonderzeichen
sfNameNeu = sfNameNeu
Case Else: 'Zeichen ohne Änderung übernehmen
sfNameNeu = sfNameNeu & sfZeichen(0)
End Select
iPos = iPos + 1
Next i
sfName = sfNameNeu
'Doppelte Zeichen entfernen
iPos = 1
sfNameNeu = ""
For i = 1 To Len(sfName)
sfZeichen(1) = Mid(sfName, iPos, 1)
sfZeichen(2) = Mid(sfName, iPos + 1, 1)
If sfZeichen(1) <> sfZeichen(2) Then
' Zeichen 2 ist NICHT doppelt, also schreiben...
sfNameNeu = sfNameNeu & sfZeichen(1)
End If
iPos = iPos + 1
Next i
sfName = sfNameNeu
'Benachbarte Zeichen auf identischen Zifferncode prüfen
iPos = 1
sfNameNeu = ""
For i = 1 To Len(sfName)
sfZeichen(1) = Mid(sfName, iPos, 1)
sfZeichen(2) = Mid(sfName, iPos + 1, 1)
'Code-Ziffer der beiden Zeichen ermitteln
sfZeichenCode(1) = Soundex_CodeZiffer(sfZeichen(1))
If sfZeichenCode(1) <> "KeinCode" And i <> Len(sfName)
'1. Zeichen hat einen Code, also 2. Zeichen prüfen
sfZeichenCode(2) = Soundex_CodeZiffer(sfZeichen(2))
Beispiel: Bei der Suche nach dem Nachnamen "Meier" gibt Access in der Regel nur die Personen aus, bei denen die Schreibweise des Namens exakt identisch ist. Mit der Soundex-Suche werden auch Namen wie Mayer, Maier oder Meyer zurückgeliefert, da diese den gleichen Code haben.
Der Code für alle Varianten lautet M600 - M ist der erste Buchstabe, a, y, i und e fallen aus der Wertung, also bleibt nur noch das r, das dem Zahlenwert 6 entspricht. Da keine weiteren Buchstaben vorhanden sind, wird der Code mit zwei Nullen aufgefüllt.
|