Soundex und Kölner Phonetik

Transcription

Soundex und Kölner Phonetik
News
Artikel
Foren
Join
Projekte
List
Links
Random
Über Redscope
Previous
Next
Startseite › Foren › ETL & Base SAS
Soundex und Kölner Phonetik
9 February, 2009 - 10:05 — HansKneilmann
Hallo zusammen,
es gab hier im Forum einen Beitrag zum Thema unscharfer Vergleich von Namens-Strings.
Im Laufe der Diskussion kam die Sprache auf den Soundex-Algorithmus, den SAS-Base als BaseFunktion bietet.
Leider wurde der Soundex-Algorithmus für Englisch entwickelt. Über die Wikipedia-Suche zum
Begriff Soundex sind wir damals auf die Kölner Phonetik gestossen.
Da wir zu dieser Zeit einen Praktikanten hatten, wurde er an die Aufgabe Kölner Phonetik mit SASBase gesetzt.
Hier ist das Ergebnis:
data namen;
length name $99;
name="chaussee"; output;
name="breschnew"; output;
name="meyer"; output;
name="meier"; output;
name="wikipedia"; output;
name="meyr"; output;
name="david"; output;
name="schnitzeltag"; output;
name="hampelmann"; output;
name="zickenalarm"; output;
name="polizei"; output;
name="polizist"; output;
name="polizeimann"; output;
name="clear"; output;
name="karo"; output;
name="Müller-Lüdenscheidt"; output;
name="schweden"; output;
name="chaussee schatz chaussee"; output;
name="mama"; output;
name="britney spears"; output;
name="bewährten superzicken"; output;
run;
%macro phonetik(infile=, outfile=);
data step1;
set &infile.;
length wert $99;
wert="";
do ii=1 to length(trim(name));
xx=upcase(substr(name,ii,1));
if ii ne 1 then do;
xxm1=upcase(substr(name,ii-1,1));
end;
else do;
xxm1=" ";
end;
if ii ne length(trim(name)) then do;
xxp1=upcase(substr(name,ii+1,1));
end;
if xx=" " and ii=1 then do;
put "ERROR: 1. Character darf nicht leer sein!!!";
end;
else if xx in ("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") then do;
wert=compress(wert)||xx;
end;
else if xx in ("A", "E", "I", "O", "U", "J", "Y", "H", "-", "Ä", "Ö", "Ü", " ") then do;
wert=compress(wert)||"0";
end;
else if xx in ("B") then do;
wert=compress(wert)||"1";
end;
else if xx in ("P") and xxp1 ne "H" then do;
wert=compress(wert)||"1";
end;
else if xx in ("P") and xxp1 eq "H" then do;
wert=compress(wert)||"3";
end;
else if xx in ("D", "T") and xxp1 in ("C", "Z", "S") then do;
wert=compress(wert)||"8";
end;
else if xx in ("D", "T") and xxp1 not in ("C", "Z", "S") then do;
wert=compress(wert)||"2";
end;
else if xx in ("F", "V", "W") then do;
wert=compress(wert)||"3";
end;
else if xx in ("G", "K", "Q") then do;
wert=compress(wert)||"4";
end;
else if xx in ("C") and xxm1 eq " " and xxp1 in ("A", "H", "K", "L", "O", "Q", "R", "U", "X") then do;
wert=compress(wert)||"4";
end;
else if xx in ("C") and xxm1 eq " " and xxp1 not in ("A", "H", "K", "L", "O", "Q", "R", "U", "X") then do;
wert=compress(wert)||"8";
end;
else if xx in ("C") and xxm1 in ("S", "Z", "ß") then do;
wert=compress(wert)||"8";
end;
else if xx in ("C") and xxp1 in ("A", "H", "K", "O", "U", "X") then do;
wert=compress(wert)||"4";
end;
else if xx in ("C") and xxp1 not in ("A", "H", "K", "O", "U", "X") then do;
wert=compress(wert)||"8";
end;
else if xx in ("X") and xxm1 in ("C", "K", "Q") then do;
wert=compress(wert)||"8";
end;
else if xx in ("X") and xxm1 not in ("C", "K", "Q") then do;
wert=compress(wert)||"48";
end;
else if xx in ("L") then do;
wert=compress(wert)||"5";
end;
else if xx in ("M", "N") then do;
wert=compress(wert)||"6";
end;
else if xx in ("R") then do;
wert=compress(wert)||"7";
end;
else if xx in ("S", "Z", "ß") then do;
wert=compress(wert)||"8";
end;
end;
run;
data step2;
set step1;
length cleanwert $99;
cleanwert="";
do ii=1 to length(wert);
xx=substr(wert,ii,1);
if ii ne 1 then do;
xm1=substr(wert,ii-1,1);
end;
else do;
xm1="";
end;
if ii ne length(trim(wert)) then do;
xp1=substr(wert,ii+1,1);
end;
if xx="" then do;
put "ERROR: 1. Character darf nicht leer sein!!!";
end;
else if xx eq xp1 then do;
cleanwert=compress(cleanwert)||xx;
ii+1;
end;
else do;
cleanwert=compress(cleanwert)||xx;
end;
end;
run;
data step3;
set step2;
kphoneticcode=compress(cleanwert,'0');
run;
proc sort data=step3 out=&outfile.;
by name;
run;
%mend phonetik;
%phonetik( infile=namen, outfile=step4 );
proc print data=step4;
var name kphoneticcode;
run;
An dieser Stelle noch einmal ein dickes Lob und Danke schön an unserem Praktikanten David Lahr
!!!
Gruß
Hans Kneilmann, SSI (Schäfer Shpp GmbH)
Anhang
koeln_phonetik.sas
Foren:
ETL & Base SAS
Log in or register to post comments
Größe
4.3 KB