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*