[gelöst] String A ungefähr wie String B

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

[gelöst] String A ungefähr wie String B

Beitrag 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
Zuletzt geändert von scholly am 17.05.2008 14:02, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Da gibt es in der Tat einen Algorithmus, schau mal hier: http://de.wikipedia.org/wiki/Levenshtein-Distanz
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Re: String A ungefähr wie String B

Beitrag 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 :?
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Hier hab ich eine VB Implementation gefunden, muss halt übersetzen:
http://www.merriampark.com/ld.htm#VB
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Beitrag 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")
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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 ;)
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten