Einzelnen Beitrag anzeigen

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, 18: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 18:54 Uhr)
  Mit Zitat antworten Zitat