Rubrik: Variablen/Strings · Algorithmen/Mathematik | VB-Versionen: VB.NET | 09.10.07 |
SoundEx - Klasse (.NET) Schmidt, Schmitt oder Schmid - wie schreibt sich den nun der Name der gesuchten Adresse? Mit SoundEx ist das egal! | ||
Autor: Dieter Otter | Bewertung: | Views: 13.791 |
www.tools4vb.de | System: WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Kennen Sie das? Sie suchen anhand eines Namens nach einer Adresse in Ihrer Adress-Datenbank. Doch irgendwie finden Sie die Adresse nicht. Gesucht wurde nach dem Namen Schmitt - leider ohne Erfolg! Warum? Vielleicht schreibts sich der Name ja auch Schmidt oder Schmid. Also erneute suchen: Diesmal nach Schmidt - wieder kein Erfolg. Nun gut, es gibt ja auch noch Schmid - Volltreffer!
Leider wurden jetzt aber drei Suchvorgänge benötigt - alles kostbare Zeit, von der man meist nur wenig hat.
Irgendwie wünscht man sich, dass automatisch nach ähnlich klingenden Namen gesucht werden könnte. Dann würden in der Eregbnisliste alle Schmitts, Schmidts und Schmids stehen und man bräuchte nur den gesuchten Eintrag anklicken.
Ein Algorithmus muss her - und zwar einer, der die Namen so umsetzt, dass eben auch ähnlichklingende Namen gefunden werden.
Und hier ist er - der SoundEx-Algorithmus:
Public Class SoundEx ' Originalstring Private m_Name As String = ""
Public Sub New(ByVal sName As String) m_Name = sName End Sub
' SoundEx-Code zurückgeben Public ReadOnly Property [Get]() As String Get Return GetSoundEx(m_Name) End Get End Property
' SoundEx-Code erzeugen Public Shared Function GetSoundEx(ByVal sName As String) As String If sName.Length = 0 Then Return "" ' Originalstring in Großbuchstaben umwandeln ' und ß nach SS umwandeln sName = sName.ToUpper.Replace("ß", "SS") ' 1. Buchstabe Dim sCode As String = sName.Substring(0, 1) Dim sNumber As String = "" ' jedem weiteren Buchstaben wird nun ein ' numerischer Wert zugewiesen For i As Integer = 1 To sName.Length - 1 Select Case sName.Substring(i, 1) Case "B", "F", "P", "V" sNumber = "1" Case "C", "G", "J", "K", "Q", "S", "X", "Z" sNumber = "2" Case "D", "T" sNumber = "3" Case "L" sNumber = "4" Case "M", "N" sNumber = "5" Case "R" sNumber = "6" ' Alle anderen Buchstaben, Satzzeichen und ' Zahlen werden ignoriert End Select ' numerischen Wert nur verwenden, wenn dieser ' anders ist, als der vorige Wert If sCode.Length = 1 OrElse sCode.EndsWith(sNumber) = False Then sCode &= sNumber End If Next ' SoundEx-Code als Funktionsrückgabewert Return sCode End Function
End Class
Die SoundEx-Klasse kann wie folgt verwendet werden:
Dim sSoundEx As String = SoundEx.GetSoundEx("Name")
oder auch so...
Dim sSoundEx As String = New SoundEx("Name").Get
Welche Ergebnisse liefert der SoundEx-Algorithmus nun bei den Namen "Schmitt", "Schmidt" und "Schmid"?
Schmitt | S253 |
Schmidt | S253 |
Schmid | S253 |
Wie Sie sehen, liefern alle drei Namen das gleiche SoundEx-Ergebnis.
Wie verbindet man nun den SoundEx-Algorithmus mit einer Adress-Datenbank?
Hierzu fügen Sie der Datenbank-Tabelle einfach ein neues Feld hinzu und nennen
es SoundEx. Beim Speichern neuer, wie auch beim Ändern vorhandener Adressen müssen Sie jetzt zusätzlich den mit der SoundEx-Funktion ermittelten String mit abspeichern.
Dim SQL As String = _ "UPDATE Adressen SET Name = '" & sName & "', " & _ "SoundEx = '" & New SoundEx(strSuch).Get & "' " & _ "WHERE Id = ..." ...
Und wenn nun nach einem Namen gesucht wird, suchen Sie einfach (zusätzlich) innerhalb des SoundEx-Feldes:
Dim SQL As String = _ "SELECT * FROM Adressen WHERE Name = '" & strSuch & "'" & _ " OR SoundEx = '" & New SoundEx(strSuch).Get & "'" ...