home *** CD-ROM | disk | FTP | other *** search
- (**** Adressenvergleich mit Fuzzy Logic ****)
- (**** auf Basis der Levenshtein-Funktion ****)
- (**** Autor : JÜrg Michael, Hannover ****)
- (**** Datum : 21. August 1993 ****)
-
- type adresse = record
- vorname: maxstring;
- name : maxstring;
- strasse: maxstring;
- gebtag : string[2];
- gebmonat: string[2];
- gebjahr: string[4]
- end;
-
- function adressenvergleich (var adr1, adr2: adresse): boolean;
- (**** adr1 = zu prƒfende Anschrift ****)
- (**** adr2 = Adresse, die gesucht wird ****)
- (**** (enthèlt evtl. Wildcards) ****)
- (**** (analog zu Wort und Muster ****)
- (**** der Levenshtein-Funktion) ****)
-
- var i,k,punkte: integer;
- ln,lv,ls: integer;
- begin
- (**** Vorauswertung : Wildcards in ****)
- (**** Name, Vorname und Straºe zèhlen ****)
- (**** (ln,lv,ls = zulèssige Fehler) ****)
- i := 0;
- ln := length (adr2.name);
- for k := 1 to ln do
- begin
- if (adr2.name[k] = ╒*╒) or (adr2.name[k] = ╒?╒)
- then i := i+1
- end;
- ln := (ln-i) div 5;
-
- i := 0;
- lv := length (adr2.vorname);
- for k := 1 to lv do
- begin
- if (adr2.vorname[k] = ╒*╒) or (adr2.vorname[k] = ╒?╒)
- then i := i+1
- end;
- lv := (lv-i-1) div 2;
- if (lv > 3) then lv := 3 else if (lv < 0) then lv := 0;
-
- i := 0;
- ls := length (adr2.strasse);
- for k := 1 to ls do
- begin
- if (adr2.strasse[k] = ╒*╒) or (adr2.strasse[k] = ╒?╒)
- then i := i+1
- end;
- ls := (ls-i-1) div 3;
- if (ls > 4) then ls := 4 else if (ls < 0) then ls := 0;
-
- (**** Anschriften vergleichen ****)
- (**** (4 Punkte sind erforderlich) ****)
- punkte := 0;
- i := WLD (adr1.name, adr2.name, (** ╒*╒, **) ln);
-
- if (i <= ln) then
- begin
- (**** Vorname prƒfen ****)
- if (adr1.vorname = ╒╒) or (adr2.vorname = ╒╒)
- then
- begin
- i := lv;
- punkte := punkte + 1
- end
- else
- begin
- i := WLD (adr1.vorname, adr2.vorname, (** ╒*╒, **) lv);
- if (i <= lv-2) then punkte := punkte + 2
- else if (i <= lv) then punkte := punkte + 1
- end;
-
- (**** Geburtstage vergleichen ****)
- if (adr1.gebtag = adr2.gebtag) and (adr1.gebtag <> ╒╒)
- then punkte := punkte + 1;
- if (adr1.gebmonat = adr2.gebmonat) and (adr1.gebmonat <> ╒╒)
- then punkte := punkte + 1;
- if (adr1.gebjahr = adr2.gebjahr) or (adr1.gebjahr = ╒╒)
- or (adr2.gebjahr = ╒╒) then punkte := punkte + 1
- end;
-
- if (punkte >= 2) then
- begin
- if (lv+ls <= 1)
- and ((adr1.gebjahr = ╒╒) or (adr2.gebjahr = ╒╒))
- then punkte := punkte + 1;
-
- (**** Straºenname prƒfen ****)
- if (adr1.strasse = ╒╒) or (adr2.strasse = ╒╒)
- then punkte := punkte + 1
- else
- begin
- k := WLD (adr1.strasse, adr2.strasse, (** ╒*╒, **) ls);
- if (k <= ls-2) then punkte := punkte + 2
- else if (k <= ls) then punkte := punkte + 1;
- if (i = lv-1) and (k = ls-1) then punkte := punkte + 1
- end
- end;
- if (punkte >= 4) then adressenvergleich := true
- else adressenvergleich := false
- end;
-