![]() |
Anzeige:
|
|
|||||||
| Dlls, Includes, Units & Prozeduren Alles zu den Themen Dlls, Includes, Units & Prozeduren |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.02.2009
Ort: Wien, Österreich
Beiträge: 1.078
|
Unscharfe String-Vergleiche
===================== Es ist nicht ganz einfach, Eingaben mit Tippfehlern vom Computer trotzdem erkennen zu lassen. Der Levenshtein-Algorithmus erlaubt zumindest, einfache Preller bzw. Auslassungen zu erkennen. Etwas besser ist bei Datenbanken die SOUNDEX-Funktion, die allerdings meist für Englisch optimiert ist. Das Gelbe vom Ei ist der Original-Levenshtein jedenfalls noch nicht. Es fehlt z.B. eine Änderung der Kostenbewertung (Variable cost&) in Abhängigkeit von möglichen Hörfehlern (y,ü,i,j ; sh sch ; t d ; p b; k g; h _ ), und vieles anderes mehr. Hier mal eine Basis zum rumspielen: Code:
'### Alpha Version Code für Paule´s PC Forum ###
'### P. Specht Nov.2010; XProfan 11a Interpreter ###
WindowTitle "Levenshtein-Distanz (Stringvergleich)"
Cls @rgb(200,200,100)
proc LD ' Compute Levenshtein-Distance
parameters s$,t$
s$=lower$(s$):var m&=len(s$)
t$=lower$(t$):var n&=len(t$)
declare d&[m&,n&],i&,j&,cost&,mi&,c&
case m& = 0 : return n&
case n& = 0 : return m&
i&=0 : while i&<=m& : d&[i&,0]=i& : inc i& : endwhile
j&=0 : while j&<=n& : d&[0,j&]=j& : inc j& : endwhile
i&=1
WHILE i&<=m&
j&=1
While j&<=n&
cost&=1
case Mid$(s$,i&,1)=Mid$(t$,j&,1):cost& = 0
mi&=d&[i&-1,j&]+1
c&=d&[i&,j&-1]+1
case c&<mi& : mi&=c&
c&=d&[i&-1,j&-1]+cost&
case c&<mi& : mi&=c&
d&[i&,j&]=mi&
inc j&
EndWhile
inc i&
ENDWHILE
return d&[m&,n&]
Endproc
' Input Loop
declare str1$,str2$
While 1
Locate 10,10 : print "String1 = ";
Locate 12,10 : print "String2 = ";
Locate 14,10 : print "Ergebnis = ";
Locate 10,21 : input str1$ : case str1$="" : End
Locate 12,21 : input str2$
Locate 14,21 : Print LD(str1$,str2$)
WaitInput
EndWhile
END
__________________
Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,XPSE,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB2:USB3 |
|
|
|
|
|
|
#2 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 02.09.2009
Ort: Bayern
Alter: 36
Beiträge: 148
|
Ein sehr guter Algorithmus in diesem Bereich, der vor allem mit deutschen Wörtern sehr gut funktioniert, ist die sogenannte "Kölner Phonetik".
Kölner Phonetik ? Wikipedia
__________________
˙˙˙ɯnɹ ɥɔsןɐɟ sǝןןɐ ˙˙˙ɹnʇɐʇsɐʇ ǝnǝu ssıǝɥɔs |
|
|
|
|
|
#3 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 06.02.2009
Ort: Coswig
Alter: 27
Beiträge: 1.159
|
Hm, ok, aber wie errechne ich dann die Ähnlichkeit zweier Wörter, die ich in Zahlenkolonnen umgewandelt habe?
__________________
XProfan-Profi (XProfan X2+XPIA) http://jacdelad.bplaced.net http://jacdelad.square7.ch |
|
|
|
|
|
#4 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.02.2009
Ort: Wien, Österreich
Beiträge: 1.078
|
@commänder: Danke - Super Hinweis!
@Jaq: A) Beziehst du Dich jetzt auf Levenshtein (Die Zahl die da rauskommt ist eine Art Verwandtschaftsmaß zwischen zwei Worten): Du setzt einfach einen Treshold level und prüfst das Ergebnis, ob diese zulässige Fehlergrenze überschritten ist oder nicht. @Alle: B) Wenns es um "Kölner Phonetik" geht: Meine Umsetzung ist noch immer nicht fertig, weil ich die Resultate erst an offiziellen Ergebnissen verifizieren möchte (man blamiert sich ja nicht sonderlich gerne). Sinn des Kölner Verfahrens ist es, ein Filter darzustellen, das die Eingabeinterpretation gewissermaßen schwerhörig macht. Da sich Vokale in unterschiedlichen Dialekten oft verändern, werden sie z.B. mit "0" kodiert und, wenn sie nicht am Anfang stehen, einfach weggelassen. Zischlaute wiederum landen in Klasse "3", etc etc. Achtung: Es sind keine Zahlen, die dabei rauskommen, weil die scheinbar aus Ziffern bestehenden Vergleichsmuster eine führende Null kennen (Wenn nämlich Vokale als erstes Zeichen stehen) - sämtliche Math-Packages würden führende Nullen klarerweise wegschneiden. Weiters haben Integer-Zahlen eine begrenzte Stellenzahl, der Kölner Algorithmus aber nicht, was allgemein als Vorteil gegenüber Soundex() ins Treffen geführt wird. Wenn man das Ergebnis aber doch unbedingt als Zahl speichern will (meine Überlegungen gingen auch zuerst in diese Richtung), könnte man führende Nullen eventuell als negatives Vorzeichen speichern und dann alles Modulo (höchste Integerzahl/2) nehmen (Vorsicht, Rechte Dritter!). Es bleibt eine Frage der zeitlichen Performance, ob man die Vergleichsdatenbank um eine Spalte "Klingt wie ..." erweitert und nach Aufrufhäufigkeit index-sortiert (das setzt halt zu Beginn u.U. eine Vorab-Berechnung voraus), oder ob man das ganze "fliegend" hält. Die Übereinstimmung der erzeugten Muster ist dabei das Kriterium (in Google kommt da z.B. die Meldung "Meinten Sie ....?"). Eine Fehlerschwelle gibts dabei nicht, die ist - optimiert für die Deutsche Sprache - in den Kölner Algorithmus gewissermaßen schon eingebaut. Ich hoffe, das klang jetzt nicht anmaßend Gruss
__________________
Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,XPSE,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB2:USB3 Geändert von p. specht (11.11.2010 um 00:37 Uhr) |
|
|
|
|
|
#5 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.092
|
Klang es nicht.
Ist wohl nur die Frage, ob man das in einer annehmbaren Geschwindigkeit realisieren kann...
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
|
#6 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 06.02.2009
Ort: Coswig
Alter: 27
Beiträge: 1.159
|
Ich bezog mich auf die Kölner Phonetik. Da kommt am Ende eine Zahlenschlange raus, die ich unmöglich mit "=" oder so vergleichen kann.
__________________
XProfan-Profi (XProfan X2+XPIA) http://jacdelad.bplaced.net http://jacdelad.square7.ch |
|
|
|
|
|
#7 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.02.2009
Ort: Wien, Österreich
Beiträge: 1.078
|
Die Ziffern sind Gruppenzugehörigkeitsbezeichner für die einzelnen Laute (Phoneme) eines Wortes. Es entsteht eine Ziffernzeichen-Schlange ("String"). Das selbe machst du für die Einträge Deiner Datenbank, somit hast du einen Suchstring und Vergleichsstrings.
Und die kann man mit "=" vergleichen, oder etwa nicht?
__________________
Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,XPSE,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB2:USB3 Geändert von p. specht (11.11.2010 um 15:38 Uhr) |
|
|
|
|
|
#8 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 06.02.2009
Ort: Coswig
Alter: 27
Beiträge: 1.159
|
Ja schon, aber wenn ein Wort eine Ziffer mehr hat, dann kann ich den String nicht so einfach vergleichen, aber sie sind sich ziemlich ähnlich.
__________________
XProfan-Profi (XProfan X2+XPIA) http://jacdelad.bplaced.net http://jacdelad.square7.ch |
|
|
|
|
|
#9 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.02.2009
Ort: Wien, Österreich
Beiträge: 1.078
|
Jaq hat recht: Mit dem Original-Levenshtein kann man nur Tippfehler ausbügeln, während das Kölner Verfahren nur Hörfehler ausbügelt. Sucht man ein Verfahren, daß beides gleichzeitig kann, ist man in Deutsch mit dem PHONEM-Algorithmus gut bedient. PHONEM funktioniert so, daß vor einem Levenshtein-Vergleich Buchstabengruppen austauscht werden: ph wird f, p wird b, t wird d etc., also (fast) gemäß den Regeln, die auch dem Kölner Algorithmus zugrunde liegen.
__________________
Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,XPSE,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB2:USB3 Geändert von p. specht (13.11.2010 um 09:29 Uhr) |
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Hash-Algorithmus MD6 aus SHA-3-Wettbewerb zurückgezogen | Info | Sicherheitsmeldungen von heise.de | 0 | 02.07.2009 13:50 |
| Stringvergleich | Busti | C/C++, Visual C++, Visual C++.NET | 2 | 24.11.2005 10:41 |