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:
milan1612 hat geschrieben:Da gibt es in der Tat einen Algorithmus, schau mal hier: http://de.wikipedia.org/wiki/Levenshtein-Distanz
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
milan1612 hat geschrieben:Da gibt es in der Tat einen Algorithmus, schau mal hier: http://de.wikipedia.org/wiki/Levenshtein-Distanz
...
Hier hab ich eine VB Implementation gefunden, muss halt übersetzen: http://www.merriampark.com/ld.htm#VB
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 :

Code: Alles auswählen

1.000000
0.500000
0.968750
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
:shock: Ich fall vom Glauben ab :shock:
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
:praise: :praise: :praise:
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 :allright:

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.