AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pseudo StringSimilarity() Funktion

Ein Thema von Aphton · begonnen am 7. Apr 2011 · letzter Beitrag vom 25. Mai 2011
Antwort Antwort
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#1

Pseudo StringSimilarity() Funktion

  Alt 7. Apr 2011, 17:22
Hiermit möchte meine noch nicht allzu durchtachte kleine Stringvergleichsfunktion vorstellen.
Der Algorithmus geht den kürzeren String durch und addiert auf das Ergebnis einen transformierten Positionsdifferenzwert hinzu. Hinzu kommt noch, dass auf Groß- & Kleinschreibung geachtet wird!

Hab mich nie wirklich mit ähnlichen Sachen beschäftigt; habs vor fünf Minuten gebraucht und da sich im Internet nichts Ähnliches finden ließ, dachte ich mir, warum nicht selbst schreiben.

Er erfüllt seine Pflicht ausreichend. Für Verbesserungsvorschläge stehe ich immer offen und würde darum eig. dringendst bitten!

Übrigens, je ähnlicher die Strings sind, desto näher ist das Ergebnis dem Wert 1 und je verschiedener, desto näher 0!

Delphi-Quellcode:
function StringSimilarity(Str1, Str2: String): Single;
var
  Str1Len, Str2Len: Integer;
  smallLen, bigLen: Integer;
  smallStr, bigStr: PString;
  i, p, f: Integer;
  equalLetterSize: Boolean;
begin
  Result := 0;
  Str1Len := Length(Str1);
  Str2Len := Length(Str2);
  if Min(Str1Len, Str2Len) = 0 then Exit;
  if Str1Len > Str2Len then
  begin
    bigStr := @Str1;
    smallStr := @Str2;
    bigLen := Str1Len;
    smallLen := Str2Len;
  end else
  begin
    smallStr := @Str1;
    bigStr := @Str2;
    smallLen := Str1Len;
    bigLen := Str2Len;
  end;
  for i := 1 to smallLen do
  begin
    equalLetterSize := True;
    p := Pos(smallStr^[i], bigStr^);
    if p = 0 then
    begin
      equalLetterSize := False;
      p := Pos(LowerCase(smallStr^[i]), Lowercase(bigStr^));
    end;
    if p = 0 then continue;
    bigStr^[p] := #0;
    f := 1;
    if not equalLetterSize then inc( f );
    Result := Result + (bigLen-Abs(i-p)) / (f*bigLen);
  end;
  Result := Result*4 / (bigLen*smallLen*Max(bigLen-smallLen, 1));
end;
Code:
  StringSimilarity( 'Abcd', 'Abcd' ) = 1
  StringSimilarity( 'Abcd', 'abcd' ) = 0.875
  StringSimilarity( 'Abcd', 'acbd' ) = 0.75
  StringSimilarity( 'Abcd', 'dcba' ) = 0.4875
  StringSimilarity( 'Abcd', 'A' )    ~ 0.333*
  StringSimilarity( 'Abcd', 'a' )    ~ 0.166*
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton ( 7. Apr 2011 um 17:54 Uhr)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

AW: Pseudo StringSimilarity() Funktion

  Alt 7. Apr 2011, 18:07
Du kommst 46 Jahre zu spät.
Levenshtein-Distanz
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Pseudo StringSimilarity() Funktion

  Alt 7. Apr 2011, 18:12
Boah, danke ^^
Endlich mal Stoff zum Lesen xD
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Pseudo StringSimilarity() Funktion

  Alt 7. Apr 2011, 19:13
Oder mit Fuzzy
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Pseudo StringSimilarity() Funktion

  Alt 8. Apr 2011, 09:42
Oder, wenn man auf phonetische Ähnlichkeit prüfen mag: Double Metaphone
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Pseudo StringSimilarity() Funktion

  Alt 8. Apr 2011, 10:09
Oder, wenn man auf phonetische Ähnlichkeit prüfen mag: Double Metaphone
Delphi-Referenz durchsuchenSoundEx wäre dafür etwas vergleichbares fertiges, oder?

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz