Seite 1 von 2
[gelöst] String A ungefähr wie String B
Verfasst: 14.10.2007 21:01
von scholly
moin, moin...
Ich würde in meine App gerne einen kleinen Sicherheitscheck einbauen, damit nich aus Dusseligkeit zusätzliche Daten zu einem falschen Datensatz hinzugefügt werden.
Der Titel des Films sei In einem Land vor unserer Zeit -8- Der erste Schnee.
Auf CD/DVD könnte der Filename aber anders/flasch geschrieben: In einem Land vor unserer Zeit -VIII - Der erste Schne.avi.
Oder abgürzt sein: IeLvuZ 8 - Der erste Schnee.
Kennt jemand eine Funktion/Prozedure, die mir nicht sagt, daß die beiden nicht gleich sind, sondern daß nur eine Übereinstimmung von x % besteht ?
mdv... scholly
Verfasst: 14.10.2007 21:03
von milan1612
Da gibt es in der Tat einen Algorithmus, schau mal hier:
http://de.wikipedia.org/wiki/Levenshtein-Distanz
Re: String A ungefähr wie String B
Verfasst: 14.10.2007 21:04
von Andreas_S
scholly hat geschrieben:Kennt jemand eine Funktion/Prozedure, die mir nicht sagt, daß die beiden nicht gleich sind, sondern daß nur eine Übereinstimmung von x % besteht ?
Kann mir nicht vorstellen das es soetwas gibt...
Musst du schon selbst machen...
//Edit:
tja

Verfasst: 14.10.2007 21:05
von milan1612
Hier hab ich eine VB Implementation gefunden, muss halt übersetzen:
http://www.merriampark.com/ld.htm#VB
Verfasst: 14.10.2007 21:28
von scholly
Puh... starker Tobak fürn Anfänger....
Mal sehn ob ich damit was basteln kann...
Verrätst Du mir vielleicht, warum Deine Antworten
so schnell kamen ?
Danke... scholly
Verfasst: 14.10.2007 21:28
von STARGÅTE
ich habe eins in PB geschrieben:
Code: Alles auswählen
Procedure.f Splitten(Str$, String$)
Prozent.f
l = Len(Str$)
If l > 1
Links$ = Mid(Str$, 1, Int(l/2))
Rechts$ = Mid(Str$, Int(l/2)+1, Len(Str$))
If FindString(String$,Links$,1)
Prozent + 0.5
Else
Prozent + 0.5*Splitten(Links$, String$)
EndIf
If FindString(String$,Rechts$,1)
Prozent + 0.5
Else
Prozent + 0.5*Splitten(Rechts$, String$)
EndIf
Else
If FindString(String$,Str$,1)
Prozent + 1
EndIf
EndIf
ProcedureReturn Prozent
EndProcedure
Procedure.f StringVergleich(String1$, String2$)
ProcedureReturn Splitten(String1$, String2$)
EndProcedure
Debug StringVergleich("Wort", "Wort")
Debug StringVergleich("Wort", "Mord")
Debug StringVergleich("In einem Land vor unserer Zeit -VIII - Der erste Schne.avi", "In einem Land vor unserer Zeit -8- Der erste Schnee")
Debugger :
1 = 100% Übereinstimmend
0 = 0% keine Übereinstimmung
EDIT:
Das Programm ist aber nicht sehr zuverlässig: Denn bei "ABCD" und "DCBA" erhalte ich auch 1.00, da ja alle Zeichen rine vorkommen...
Ich werde also noch weiter dran verbessern
Verfasst: 14.10.2007 21:54
von scholly

Ich fall vom Glauben ab
STARGÅTE hat geschrieben:ich habe eins in PB geschrieben:...
Das Programm ist aber nicht sehr zuverlässig: Denn bei "ABCD" und "DCBA" erhalte ich auch 1.00, da ja alle Zeichen rine vorkommen...
Ich werde also noch weiter dran verbessern

Ich hab zwar noch keinen Praxistext machen können, weil das hier so schnell ging und ich nebenbei Snooker kucke, aber in der Realität sieht das eher so aus:
Ich/man legt eine CD/DVD ein und wählt dann aus den vorhandenen Filmen den aus, für den in der DB Daten fehlen.
Zumindest bei mir ist es bei Spielfilmen sehr unwahrscheinlich, daß auf einem Medium welche sind, deren Namen sich ähnlich anhören (Debug > 0.5

).
Bei Konzerten, Musik-Videos oder Dokus könnte das aufgrund des längeren Filenamens eher sein, aber ich werde das mal mit nem schicken Requester zur Kenntnis bringen und dann ist der Anwender hoffentlich wach
Wenn ich könnte, würde ich jetzt Dankbarkeits- oder Anerkennungspunkte vergeben
Danke, das Ihr das Forum zu dem macht, was (nicht nur) ich so schätze.
immernoch verblüfft... scholly
Verfasst: 14.10.2007 22:39
von HeX0R
Also so schwer war der VB-Code ja nun wirklich nicht.
Das hättest du bestimmt auch hingekriegt:
Code: Alles auswählen
;*******************************
;*** Get minimum of three values
;*******************************
Procedure.l Minimum(a.l, b.l, c.l)
Protected mi.l
mi = a
If b < mi
mi = b
EndIf
If c < mi
mi = c
EndIf
ProcedureReturn mi
EndProcedure
;********************************
;*** Compute Levenshtein Distance
;********************************
Procedure.f LD(s.s, t.s)
Protected m.l = Len(t), n.l = Len(s), i.l, j.l, s_i.s, t_j.s, cost.l, Result.f
; Step 1
If n = 0
If m = 0
ProcedureReturn 100
Else
ProcedureReturn 0
EndIf
EndIf
If m = 0
ProcedureReturn 0
EndIf
Dim d.l(n, m)
; Step 2
For i = 0 To n
d(i, 0) = i
Next i
For j = 0 To m
d(0, j) = j
Next j
; Step 3
For i = 1 To n
s_i = Mid(s, i, 1)
; Step 4
For j = 1 To m
t_j = Mid(t, j, 1)
; Step 5
If s_i = t_j
cost = 0
Else
cost = 1
EndIf
; Step 6
d(i, j) = Minimum(d(i - 1, j) + 1, d(i, j - 1) + 1, d(i - 1, j - 1) + cost)
Next j
Next i
; Step 7
Result = (m - d(n, m)) / m
ProcedureReturn Result * 100
EndProcedure
Debug LD("Wort", "Wort")
Debug LD("Wort", "Mord")
Debug LD("abcd", "dcba")
Debug LD("In einem Land vor unserer Zeit -8 - Der erste Schnee", "In einem Laind vor unserer Zeit -8 - Der erste Schnee")
Verfasst: 14.10.2007 22:52
von scholly
HeX0R hat geschrieben:Also so schwer war der VB-Code ja nun wirklich nicht.
Das hättest du bestimmt auch hingekriegt:
Mag sein, aber STARGÅTE war zu schnell

Verfasst: 15.10.2007 22:52
von mk-soft
@Hexor,
Sehr gut zu verwenden
Code: Alles auswählen
Debug LD("In einem Land vor unserer Zeit -8 - Der erste Schnee", "Ein Land vor unserer Zeit -8 - Der erste Schnee")
Immer noch knap 90% Treffer.