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