일/Data Mining

SAS 2바이트 문자 매칭, kindex() vs kindexc()

LEEHK 2012. 9. 12. 14:57

> 요약

 

약 700만 키워드 대상, 34개 외로운  자모음을 부분매칭 하였다.

kindex 함수 : 8분 소요.

kindexc 함수 : 76분 소요.

 

왜인지 모르겠당 -_-

문자/문자열 매칭은 웬만하면 SAS 쓰지 말고, 꼭 필요할 경우 되도록 index/kindex 함수 쓰자.

 

 

 

> 상세

 

index합수와 indexc함수는 영어권 등 1byte 문자들을 위한 매칭이고,

kindex함수와 kindexc 함수는 한국/중국/일본 등 2byte 문자를 위한 매칭에 쓰는 함수다.

 

 

kindexc는 charcter 비교, kindex는 pattern 비교. 그 외에는 차이 없다고 알고 있었는데

최근 관련하여 삽질을 하나 하여 기록한다.

 

 

키워드 중 외로운 자모음 을 매칭하는데, 같은 작업을 하는 코드를 kindexc함수는 1줄, kindex 함수는 34줄로 쓴다. 그래서 기왕이면 짧게 쓰려고 kindexc 함수를 썼더니 시간이 너무 오래 걸리는거다. AC 나 파이썬 등으로 풀어가려다 혹시나 하고 kindex 함수를 사용하니 시간이 확 줄다. 어이없어 웹을 뒤져봐도 딱히 두 함수의 구현 방식 차이에 대해 나오지 않는다. 막연한 추측으로는.. kindex 함수는 그냥 생짜 매칭이고, kindexc 매칭을 위해서 내부적으로 별도의 인덱스를 생성하는건가...? 라고 의심 중이다.

 

 

> 코드

 

data charregfilter;
set testset;
    * 외로운 자모음 + 2q바이트 특수문자 제거 - 이렇게 하면 8분.  kindexc 함수 쓰면 외로운자모음만 1시간 11분. ;
 if kindex(comp_kword,'ㄱ') then output charregfilter; 
 else if kindex(comp_kword,'ㄴ') then output charregfilter; 
 else if kindex(comp_kword,'ㄷ') then output charregfilter; 
 else if kindex(comp_kword,'ㄹ') then output charregfilter; 
 else if kindex(comp_kword,'ㅁ') then output charregfilter; 
 else if kindex(comp_kword,'ㅂ') then output charregfilter; 
 else if kindex(comp_kword,'ㅅ') then output charregfilter; 
 else if kindex(comp_kword,'ㅇ') then output charregfilter; 
 else if kindex(comp_kword,'ㅈ') then output charregfilter; 
 else if kindex(comp_kword,'ㅊ') then output charregfilter; 
 else if kindex(comp_kword,'ㅋ') then output charregfilter; 
 else if kindex(comp_kword,'ㅌ') then output charregfilter; 
 else if kindex(comp_kword,'ㅍ') then output charregfilter; 
 else if kindex(comp_kword,'ㅎ') then output charregfilter; 
 else if kindex(comp_kword,'ㅏ') then output charregfilter; 
 else if kindex(comp_kword,'ㅑ') then output charregfilter; 
 else if kindex(comp_kword,'ㅕ') then output charregfilter; 
 else if kindex(comp_kword,'ㅗ') then output charregfilter; 
 else if kindex(comp_kword,'ㅛ') then output charregfilter; 
 else if kindex(comp_kword,'ㅜ') then output charregfilter; 
 else if kindex(comp_kword,'ㅠ') then output charregfilter; 
 else if kindex(comp_kword,'ㅡ') then output charregfilter; 
 else if kindex(comp_kword,'ㅣ') then output charregfilter; 
 else if kindex(comp_kword,'ㅢ') then output charregfilter; 
 else if kindex(comp_kword,'ㅚ') then output charregfilter; 
 else if kindex(comp_kword,'ㅘ') then output charregfilter; 
 else if kindex(comp_kword,'ㅝ') then output charregfilter; 
 else if kindex(comp_kword,'ㅟ') then output charregfilter; 
 else if kindex(comp_kword,'ㅐ') then output charregfilter; 
 else if kindex(comp_kword,'ㅒ') then output charregfilter; 
 else if kindex(comp_kword,'ㅔ') then output charregfilter; 
 else if kindex(comp_kword,'ㅖ') then output charregfilter; 
 else if kindex(comp_kword,'ㅙ') then output charregfilter; 
 else if kindex(comp_kword,'ㅞ') then output charregfilter;  

    * 외로운 자모음 제거. kindexc 함수를 쓰니 76분 소요 -_- ;
    * if kindexc(comp_kword,'ㄱ','ㄴ','ㄷ','ㄹ','ㅁ','ㅂ','ㅅ','ㅇ','ㅈ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ')>0  then output charregfilter;
    * else if kindexc(comp_kword,'ㅏ','ㅑ','ㅓ','ㅕ','ㅗ','ㅛ','ㅜ','ㅠ','ㅡ','ㅣ','ㅢ','ㅚ','ㅘ','ㅝ','ㅟ','ㅐ','ㅒ','ㅔ','ㅖ','ㅙ','ㅞ')>0  then output charregfilter;
 
run;