Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Tolleranter String-Vergleich (https://www.delphipraxis.net/26517-tolleranter-string-vergleich.html)

Florian H 24. Jul 2004 16:01


Tolleranter String-Vergleich
 
Hi,

ich habe 2 Strings und möchte prüfen, ob die beiden annährern das gleiche enthalten.
Also z.B. bei "Guten Tag" sollte der Alogrithmus erkennen, dass "Gutn Tag" fast das selbe ist.
Ich hab da erst an diesen einen Alog. gedacht der die abweichenden Zeichen in einem String zählt (Hallo und Holla --> 2) aber da wäre das PRoblem, dass wenn ein Buchstabe z.B. fehlt, alle nachfolgenden Zeichen falsch gewertet würden. Abgesehen davon habe ich dessen name vergessen :wall:

Viele Grüße
Florian

Chewie 24. Jul 2004 16:06

Re: Tolleranter String-Vergleich
 
Meinst du vielleicht Hier im Forum suchenLevenshtein Bei Google suchenLevenshtein

Das lustige an dem Namen ist, dass eine Suchmaschine ebendiesen Algorithmus anwenden muss, um was zu finden, weil kein Mensch das Wort richtig schreibt :mrgreen:

Florian H 24. Jul 2004 16:14

Re: Tolleranter String-Vergleich
 
ja genau den meine ich :) (wie soll ich mir sowas merken können ^^)
Der kann sogar das erkennen von "HAllo" und "xHAllo" = 1 richtig.

nur gibts das auch schon fertig als Delphi-Unit o.Ä.?

Google liefert leider fast nur PHP-Funktionsreferenzen...

Florian H 24. Jul 2004 16:30

Re: Tolleranter String-Vergleich
 
ok

Delphi-Quellcode:
unit Levenshtein;
//Objeto que calcula la distancia de Levenshtein entre 2 cadenas.
//Alvaro Jeria Madariaga. 04/10/2002
//barbaro@hotpop.com
interface
uses sysutils, Math;
type
  Tdistance = class(TObject)
  private
    function minimum(a, b, c: Integer): Integer;
  public
    function LD(s, t: string): Integer;
  end;

implementation

function Tdistance.minimum(a, b, c: Integer): Integer;
var mi: Integer;
begin
  mi := a;
  if (b < mi) then
    mi := b;
  if (c < mi) then
    mi := c;
  Result := mi;
end;

function Tdistance.LD(s, t: string): Integer;
var
  d: array of array of Integer;
  n, m, i, j, costo: Integer;
  s_i, t_j: char;
begin
  n := Length(s);
  m := Length(t);
  if (n = 0) then begin
      Result := m;
      Exit;
    end;
  if m = 0 then begin
      Result := n;
      Exit;
    end;
  setlength(d, n + 1, m + 1);
  for i := 0 to n do
    d[i, 0] := i;
  for j := 0 to m do
    d[0, j] := j;
  for i := 1 to n do
    begin
      s_i := s[i];
      for j := 1 to m do
        begin
          t_j := t[j];
          if s_i = t_j then costo := 0 else costo := 1;
          d[i, j] := Minimum(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i -1][j - 1] + costo);
        end;
    end;
  Result := d[n, m];
end;
end.
danke :)

FriFra 25. Jul 2004 16:05

Re: Tolleranter String-Vergleich
 
Soundex wäre auch eine Lösung für Dein Problem ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 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