Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1256to1260
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

Ähnliche Begriffe anzeigen

Ähnliche Begriffe anzeigen
Jenny
Hi Ihr,
ich habe eine Tabelle mit ausschließlich Text relativ vielen Daten und dazu ein Suchmakro, das diese nach verschieden wählbaren Kriterien durchsucht. Der Suchbegriff wird dabei in Zelle E2 eingegeben.
Wie ich nach "beginnt mit", "endet mit", "enthält", "entspricht" etc. suche und entsprechende Filte über das Makro umsetze weiss ich.
Was ich bisher nicht gefunden habe, ist eine Möglichkeit, sich auch Begriffe anzeigen zu lassen bzw. darauf hinzuweisen, die um einen Buchstaben vom eingegebenen Suchbegriff abweichen.
Ich kenne das von vielen Webseiten (wie z.B. Wikipedia), wo man in solchen Fällen Einträge wie "Ähnliche Begriffe" oder "Meinten Sie..." erhält.
Geht so etwas auch irgendwie in Excel oder VBA ?
Gibt es hier übehaupt irgendeine Möglichkeit, die dem nahe kommt ?

LG und vielen Dank Euch im Voraus - schöne Feiertage,
Jenny
Kölner Phonetik
09.04.2012 01:18:24
CitizenX
Hi,
dies könnte dir vlt als Basiscode dienen..
Code kommt in ein allgemeines Modul

    '******************************************
    '*         CitizenX 30.01.2012            *
    '*----------------------------------------*
    '*    code to compare german strings,     *
    '*       with or without numbers.         *
    '*      based on "Kölner Phonetik"        *
    '*                                        *
    '******************************************
    
Option Explicit
'Set compare options,choose whether..
Private Enum CompareOptions
    bln_ignoreDelimiter = False '...you want to ignore delimiters
    bln_ignoreNumbers = False '...you want to ignore numbers
End Enum
Private Regex As Object
Sub CompareStrings()
    Dim strCompare As String, strTarget As String
    Dim str_Delimiter As String, strPattern As String
    Set Regex = CreateObject("Vbscript.Regexp")
    
    'Set allowed delimiters
    str_Delimiter = " ;,.-_\/"
    
    'Set Targetstring
    strTarget = "Müller1478"
    
    'Set Comparestring
    strCompare = "Myhler1478"
    
   '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   'setting regex-pattern in order of selected options
    strPattern = Create_Pattern(str_Delimiter)
    
    'convert targetstring
    strTarget = ConvString(strTarget, strPattern)
    
    'convert comparestring
    strCompare = ConvString(strCompare, strPattern)
    'output
    MsgBox strCompare = strTarget
    
    Set Regex = Nothing
End Sub
Private Function Create_Pattern(ByVal str_Delimiter) As String
    Dim n As Byte, strDeli As String
    
    'prepare delimiters for regex_pattern
    For n = 1 To Len(str_Delimiter)
        strDeli = strDeli & "\" & Mid$(str_Delimiter, n, 1)
    Next
    'combine regex_pattern in order of selected options
    Create_Pattern = "[^a-zßäüö" & _
                IIf(CompareOptions.bln_ignoreNumbers, "", "0-9") & _
                IIf(CompareOptions.bln_ignoreDelimiter, "", strDeli) & "]"
                
End Function
Private Function ConvString(ByVal strCom As String, ByVal str_Pattern As String) As String
    Dim Groups, Member
    
    'setting groups ,don't change the order!
    Groups = Array( _
             "0:^[äüöaeijyou]", _
             "4:^(ca|ch|ck|cl|co|cq|cr|cu|cx)", _
             "8:sc|cs|zc|cz|dc|ds|dz|tc|tsc|ts|tz|kx|qx", _
             "4:ca|ch|ck|co|cq|cu|cx|g|k|q", _
             "8:c|s|z|ß", _
             "48:x", _
             "2:td|dt|[dt]", _
             "3:f|v|w|ph", _
             "5:l", _
             "6:mn|nm|[mn]", _
             "7:r", _
             "1:bp|pb|[bp]", _
             " :[äüöaeijyouh]")
            
    With Regex
         'compare whole string
         .Global = True
         'ignore upper/lower case
         .ignoreCase = True
         'remove double letters only
         .Pattern = "([^0-9])(\1)+": strCom = .Replace(strCom, "$1")
         'remove special character
         .Pattern = str_Pattern: strCom = .Replace(strCom, "")
    For Each Member In Groups
        'setting groups
        .Pattern = Split(Member, ":")(1)
        'replace match
         strCom = .Replace(strCom, Trim(Split(Member, ":")(0)))
    Next
    End With
    
    ConvString = strCom
End Function

Anzeige
AW: Kölner Phonetik
09.04.2012 10:33:32
Jenny
Hallo CitizenX,
vielen vielen Dank dafür ! :-)
Ich muss mir das erstmal in Ruhe ansehen, um es zu verstehen und melde mich dann gerne nochmal.
LG bis dahin,
Jenny
Soundex
09.04.2012 10:28:22
ransi
Hallo Jenny
Kölner Phonetic kennst du ja jetzt schon.
Da gibts aber noch mehr.
z.B. Soundex
Schau es dir mal an:
Tabelle1

 ABCD
1  Soundex2
2BasicPasicB220P220
3BasicBeisigB220B220
4BasicBasikB220B220
5BasicBäsicB220B220
6BasicBesickB220B220
7    

Formeln der Tabelle
ZelleFormel
C2=soundex2(A2)
D2=soundex2(B2)


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Function Soundex2(text As String) As String
    Dim strResult$, strOneChar$, intCode%, intLastCode%, intIndex%, intCount%
    
    ' Ergebnis vorbelegen
    strResult = UCase(Left(text, 1)) & "000"
    
    intCount = 2
    For intIndex = 1 To Len(text)
        strOneChar = LCase(Mid(text, intIndex, 1))
        If strOneChar Like "[aeiouywhäöü]" Then
            intCode = 0
        ElseIf strOneChar Like "[bfpv]" Then
            intCode = 1
        ElseIf strOneChar Like "[cgjkqsxzß]" Then
            intCode = 2
        ElseIf strOneChar Like "[dt]" Then
            intCode = 3
        ElseIf strOneChar = "l" Then
            intCode = 4
        ElseIf strOneChar Like "[mn]" Then
            intCode = 5
        ElseIf strOneChar = "r" Then
            intCode = 6
        Else
            intCode = -1
        End If
        If intCode <> -1 Then
            ' keine doppelte intCodes zulassen
            If intCode <> intLastCode Then
                ' Vokale (0) und das 1. Zeichen nicht schreiben, wohl aber in intLastCode übernehmen
                If intCode > 0 And intIndex > 1 Then
                    Mid(strResult, intCount, 1) = intCode
                    intCount = intCount + 1
                    If intCount > 4 Then Exit For
                End If
                intLastCode = intCode
            End If
        End If
    Next intIndex
    
    Soundex2 = strResult
End Function



ransi
Anzeige
AW: Soundex
09.04.2012 10:37:12
Jenny
Hallo ransi,
vielen Dank dafür ! :-)
Ich glaube, das ist genau, wonach ich gesucht hatte, bin mir aber nicht ganz sicher, ob ich es richtig verstanden habe.
Heißt das, dass hier jedem Begriff eine Zahl entspricht und ähnliche Begriffe im Idealfall die gleiche Zahl besitzen ?
Kannst Du mir vielleicht den Hintergrund noch etwas erklären, damit ich weiss, worauf ich achten muss ?
Zur Erklärung:
Meine Tabelle enthält nur Text und jeder Eintrag kommt nur einmal vor.
LG und vielen Dank nochmal,
Jenny
Soundex auf Wiki
09.04.2012 10:47:50
ransi
HAllo
Heißt das, dass hier jedem Begriff eine Zahl entspricht und ähnliche Begriffe im Idealfall die gleiche Zahl besitzen ?
Jep, genau.
Schau mal hier:
Soundex ist einfach nachzuvollziehen.
http://de.wikipedia.org/wiki/Soundex
ransi
Anzeige
AW: Soundex auf Wiki
09.04.2012 12:23:01
Jenny
Hallo ransi,
wollte nur nochmal eine Rückmeldung nach Abschluss des Testens gebe:
Es funktioniert perfekt, absolut genial und einfach - bin total begeister ! :-)
LG
Jenny
AW: Soundex
09.04.2012 11:14:44
Jenny
Hallo ransi,
genial - genau danach hatte ich gesucht ! :-)
Das klappt perfekt und ist sogar relativ einfach zu verstehen.
Vielen vielen Dank - ist echt eine riesen Hilfe !
LG und Dir noch einen schönen Tag,
Jenny
Noch eine Möglichkeit: Levenshtein-Distanz
10.04.2012 10:07:32
Martin
Hallo Jenny,
auch wenn du bereits eine Lösung gefunden hast möchte ich dir eine weitere Möglichkeit vorstellen, bei der du die Toleranz variabel einstellen kannst:
Function mp(s1 As String, s2 As String) As Double
Dim t As String
Dim I As Long, n As Long
'ensure s1 is shorter string - remove if undesired
If Len(s1) > Len(s2) Then
t = s1
s1 = s2
s2 = t
End If
n = Len(s1)
I = 1
t = s1
'eliminate chars from s1 that aren't in s2
Do While I  0 Then
I = I + 1
Else
t = Left(t, I - 1) & Mid(t, I + 1)
n = n - 1
End If
Loop
mp = mpr(t, s2) / CDbl(Len(s1))
End Function
'call this only from mp() and recursively to give the
'number of chars in s1 matching chars in order in s2
Private Function mpr(ByVal s1 As String, s2 As String) As Long
Dim I As Long, n1 As Long, p As Long, q As Long, m As Long
n1 = Len(s1)
q = 1
'find each char from s1 in substrings of s2 to
'the right of the previously matched char in s2
For I = 1 To n1
p = InStr(q, s2, Mid(s1, I, 1))
If p > 0 Then q = p + 1 Else Exit For
Next I
If I > n1 Then
'if the For-loop above completed, i = n1 + 1 AND all
'chars in s1 were found in s2 in order, so all done
mpr = n1
Else
'no joy, time for recursion with substrings of s1
For I = 1 To n1
m = mpr(Left(s1, I - 1) & Mid(s1, I + 1), s2)
If m > mpr Then mpr = m 'store longest match found
If mpr = n1 - 1 Then Exit For 'if longest substring matches, all done
Next I
End If
End Function
Aufruf mit:
If mp(String1, String2) > 0.75 Then
Mit 0.75 ist die prozentuale Ähnlichkeit festlegbar, also 1 entspricht 100%.
Viele Grüße
Martin
Anzeige
AW: Noch eine Möglichkeit: Levenshtein-Distanz
10.04.2012 10:18:32
Jenny
Hallo Martin,
wow, das ist klasse, v.a. weil ich gerade dabei war, eine solche Toleranz manuell in meine Soundex-Funktion einzubinden - da ist das hier auf jeden Fall eine große Hilfe ! :-)
Ich werds mir auf jeden Fall ansehen und mal ausprobieren, womit ich am besten klar komme !
LG und vielen vielen Dank nochmal - einen schönen Tag noch,
Jenny
Allgemeine Ergänzung zum Thema "Phonetische Suche"
10.04.2012 10:29:57
Martin
Hallo Jenny,
die von CitizenX und Ransi vorgeschlagenen Lösungen sind "Phonetische Suchen". Das heißt, dass zwei Wörter nach ihrem Klang ausgewertet werden (Beispiel: Meier und Meyer). Die von mir vorgeschlagene Levenshtein-Distanz wertet hingegen die prozentuale Übereinstimmung der Buchstaben aus. Der Soundex-Algorithmus hat den Nachteil, dass der erste Buchstabe übereinstimmen muss, "Karla" und "Carla" würden also nicht als übereinstimmend erkannt werden. Mehr Infos findest du unter http://de.wikipedia.org/wiki/Phonetische_Suche
Viele Grüße
Martin
Anzeige
AW: Allgemeine Ergänzung zum Thema "Phonetische Suche"
10.04.2012 10:39:02
Jenny
Hallo Martin,
vielen Dank - das war mir beim Testen auch schon als kleiner Schönheitsfehler aufgefallen.
Zum Verständnis:
Wenn man Deinen Code verwendet, würden dann z.B. "Straße", "Strasse" und "Strase" als 100% übereinstimmend gewertet oder bedeutet hier wirklich jeder Buchstabe gleich eine Abweichung ?
Falls das als Abweichung gewertet wird, kann man sagen, wie viel dann ein Buchstabe mehr ausmachen würde ?
Verstehe ich es richtig, dass dann z.B. Strasse eine Abweichung von 16% gegenüber Straße bedeutet, da es ein Buchstabe mehr und das Vergleichswort relativ kurz ist ?
LG und vielen Dank nochmal
Jenny
Anzeige
AW: Allgemeine Ergänzung zum Thema "Phonetische Suche"
10.04.2012 11:05:20
Martin
Hallo Jenny,
zunächst ein kleiner Screenshot:
Userbild
Ganz richtig war meine Erklärung nicht: "Strase" und "Strasse" wird als 100% übereinstimmend erkannt, weil alle Buchstaben aus "Strase" in "Strasse" sind. Ich lasse eine Ähnlichkeit von 0,75 zu, aber die Zahl sollte je nach Anwendungsgebiet sicherlich angepasst werden. Eine zu kleine Zahl liefert zu viele Fehltreffer, eine zu hohe Zahl findet zu wenig Übereinstimmungen.
Falls es dich interessiert:
Ich verwende die Levenshtein-Distanz für eine Laufserie seit etwa 1,5 Jahren in Excel und bin sehr glücklich damit. Jeweils ca. 400 Läufer melden sich selbst für sechs verschiedene Läufe an oder werden von Vereinsmitgliedern angemeldet. Da passieren natürlich eine Menge Eingabefehler bei der Online-Anmeldung. Da es eine Gesamtwertung gibt, muss Excel nun jeden einzelnen Läufer in allen Ergebnislisten finden und die Ergebnisse auswerten (http://springer-sport.de/Gesamtwertung2011-6.pdf). Seit Verwendung der Levenshtein-Distanz bleibt mir eine Unmenge an nachträglichen Korrekturen erspart.
Viele Grüße
Martin
Anzeige
AW: Allgemeine Ergänzung zum Thema "Phonetische Suche"
10.04.2012 11:14:54
Jenny
Danke, Martin - das ist super hilfreich ! :-)
Die 16% sind also richtig, sofern es sich um unterschiedliche Buchstaben handelt - verstehe.
Da muss ich jetzt mal ein bisschen damit spielen - soweit sieht es aber auf jeden Fall sehr gut aus !
LG und einen schönen Tag noch,
Jenny
...um auf deine Frage noch zu antworten...
10.04.2012 11:23:48
Martin
Hallo Jenny,
ich hatte vergessen deine Frage zu beantworten: Im Prinzip hattest du mit den 16% Abweichung recht, denn 83,33 Prozent übereinstimmung bedeuten 16,6 Prozent Abweichung. Allerdings wird diese Abweichung nicht ausschließlich mit der Anzahl der Buchstaben ermittelt (sonst würde "Strasse" nicht mit "Strase" 100%ig übereinstimmen). Es wird vielmehr die prozentuale Findung des einen Wortes in dem anderen Wort gesucht. Mal ein Negativbeispiele: Straße und Straßenbahn werden als identisch erkannt, weil das Wort "Straße" in "Straßenbahn" steckt. Eventuell solltest du hier noch einen Längenvergleich des Textes vornehmen.
Bei meiner Anwendung (gerade bei sporadischer Verwendung von zweitem Vornamen) ist das oben genannte Negativbeispiel natürlich ein Positivbeispiel.
Hier noch eine andere Quelle:
http://www.phpgangsta.de/meinten-sie-eingaben-verbessern-mit-levenshtein-und-soundex
Viele Grüße
Martin
Anzeige
AW: ...um auf deine Frage noch zu antworten...
10.04.2012 12:17:42
Jenny
Hallo Martin,
vielen Dank dafür.
Wirklich ein super interessantes Thema, das jede Menge Alternativen bietet - wer hätte das gedacht.
Ich werde auf jeden Fall alle Vorschläge behalten, da alle je nach Bedarf sehr gut sind.
Für meinen Fall habe ich mich nun für die Soundex-Version entschieden und habe dort einfach den Buchstabenabgleich per Formel ausgeschaltet, so dass auch ähnliche Begriffe mit unterschiedlichem Anfangsbuchstaben angezeigt werden - das ist in meinem Fall hier momentan die Lösung, mit der ich am besten arbeiten kann.
LG und nochmal vielen Dank an alle - schönen Nachmittag noch, :-)
Jenny
Anzeige
AW: ...nur noch als Nachtrag...
10.04.2012 14:57:15
Jenny
...nur noch als Nachtrag zur Info: :-)
ich verwende jetzt folgende Lösung:
- Soundex-Funktion als Basis, inkl. der Umlaute ä, ö, ü und ß.
- per Formel werden dann bestimmte Soundex-Codes gleichgestellt, z.B. für Anfangsbuchstaben, die bei mir (d.h. im Englischen) in der Regel gleich oder ähnlich klingen, z.B. B und P, D und T, V und W etc.
Das klappt wirklich gut und liefert in meinem Fall äußerst brauchbare Ergebnisse.
Die Variante mit der Toleranzgrenze gefällt mir allerdings auch gut und werde ich demnächst noch einmal separat ausprobieren.
LG und einen schönen Tag noch
Jenny
hier mal ein Bsp
10.04.2012 11:12:42
CitizenX
Hi, Jenny,
nur zur Vollständigkeit die Kölner Phonethik als Formel umsesetzt.
In der Formel hast du die Möglichkeit den Vergleich zu Verfeinern.
Wenn Du auf den Formelassi gehst kannst du im Formelbereich "StrDelimiter" die erlaubten Texttrenner mit angeben.
im Feld "BlnIngDelimiter" Wahr/Falsch" angeben ob Texttrenner ignoriert werden sollen ,
und bei"BlnIngNumbers" mit angeben ob Numerische Werte mit in den Vergleich mit einbezogen werden sollen.
https://www.herber.de/bbs/user/79718.xls
Grüße
Steffen
AW: hier mal ein Bsp
10.04.2012 12:18:07
Jenny
Hallo Steffen,
vielen Dank dafür.
Wirklich ein super interessantes Thema, das jede Menge Alternativen bietet - wer hätte das gedacht.
Ich werde auf jeden Fall alle Vorschläge behalten, da alle je nach Bedarf sehr gut sind.
Für meinen Fall habe ich mich nun für die Soundex-Version entschieden und habe dort einfach den Buchstabenabgleich per Formel ausgeschaltet, so dass auch ähnliche Begriffe mit unterschiedlichem Anfangsbuchstaben angezeigt werden - das ist in meinem Fall hier momentan die Lösung, mit der ich am besten arbeiten kann.
LG und nochmal vielen Dank an alle - schönen Nachmittag noch, :-)
Jenny

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige