2013-12-19 4 views
0

에서 나는 구조화 된 데이터에 비정형 데이터를 매핑하는 방법을 알아야합니다.텍스트 매칭 - 구조화 된 데이터로 구조화되지 않은 데이터 - SAS 또는 R

나는 그들의 도시를 포함 고객의 주소가 변수가 있습니다. 예 델리의 도시의 이름은 양식 "델리", "델리" "DILLI", "델리 될 수 있습니다"나는이 주소에서 도시 이름을 감지하고있다 올바른 이름에 매핑해야 "델리 ". 나는 이것이 가장 쉬운 방법을하지 않을 수 있습니다 SAS에서 SAS 또는 R.

+0

잘못된 철자를 올바른 철자로 변경한다고 가정합니다. –

답변

0

에서 솔루션을 구현하기 위해 노력하고

, 그러나 당신의 도시 이름이 주소 문자열 내부에있는 경우이를 수행하는 한 가지 방법은 TRANWRD을 사용하는 것입니다 기능. 이것은 주소 변수 내부의 문자열을 대체 할 수 있습니다. 델리 예를 들어

tranwrd(variable, original_str, new_str); 

은 도시를 사용하여 : : 구문은 그것이 올바른 문자열을 대체하지 않도록 내가 원래 새로운 문자열을 모두 전후에 공백을 넣어

data city; 
    input address $1-30; 
    datalines; 
    1 Ocean drive, DEHLI 
    2 Peak road, DELI 
    45 Buck street DILLI 
    ;  
run; 
data change; 
    set city; 
    address = tranwrd(address,' DEHLI ',' DELHI '); 
    address = tranwrd(address,' DELI ',' DELHI '); 
    address = tranwrd(address,' DILLI ',' DELHI '); 
run; 

단어 안에 당신이 값을 보정하기 위해 수많은 잘못된 값이 일치하는 프로세스를 자동화하려고 시도하는 경우, 당신은 아마도 통해 함께 Hamming Distance 또는 Levenshtein distance를 기반으로 뭔가를 넣을 수

2

(예 : DELICIOUS 도로 DELHICIOUS 도로 변경됩니다) COMPGED function. 가능한 일치하는 구조화 된 값 각각에 대해 수동으로 입력 된 행의 점수를 계산 한 다음 가장 낮은 점수를 가진 행을 최상의 추측으로 유지하십시오. 이것은 아마도 100 % 정확하지는 않지만, 인간이 할 수있는 것보다 훨씬 빠른 속도로 잘 수행되어야합니다.

2

나는 그것이 자동화 된 방식에서 완전히 코드이 실용적인 의심,하지만 난 두 단계 접근 방식을 제안했다.

첫째, 가능한 일치를 식별합니다. 많은 잠재적 인 솔루션을 사용할 수 있습니다. 이것은 StackOverflow의 솔루션보다 훨씬 더 복잡하지만 당신은 이미 몇 가지 제안을 가지고, 당신은 SAS 함수와 호출 루틴 (COMPGED, SPEDIS, COMPLEV, COMPCOST, SOUNDEX 많은 설명하는 등 this paper로, 인터넷에 논문을 볼 수 있습니다 , COMPARE). 상당히 넓은 뇌졸중이 방법

사용 - 즉, 위음성에 잘못된 반응을 선호합니다. 단어를 일대일로 식별하는 데 집중하십시오. , original, translation의 데이터 집합을 구축

Delli, Delhi 
Deli, Delhi 
Dalhi, Delhi 

같은

그리고 시각적으로 파일을 검사하고 필요에 따라 수정을 (즉, 잘못된 반응을 제거). 이 데이터 집합을 일단

, 당신은 결과를 이용하기위한 몇 가지 옵션이 있습니다. 별도의 필드로 도시 이름이 이미 있거나 별도의 필드에 입력하거나 scan을 사용하여 쉽게 도시를 식별 할 수있는 경우 형식 솔루션을 사용할 수 있습니다.

data for_fmt; 
set translations; 
start=original; 
label=translation; 
fmtname='$CITYF'; 
*no hlo=o record as we want to preserve nonmatches as is; 
run; 

proc format cntlin=for_Fmt; 
quit; 

data want; 
set have; 
city_fixed=put(city,$CITYF.); 
run; 

쉽게 주소에 도시를 식별 할 수없는 경우, 다음 TRANWRD 솔루션은 아마 최고입니다 (즉, 주소 필드가없는 쉼표 또는으로 "10532 넬슨 DRIVE 델리"같은 것입니다). if 문을 많이 사용하지 않고 해시 기반 또는 배열 기반 솔루션을 구현할 수 있습니다. 데이터에이 문제가있는 경우 의견을 게시하고 나중에 솔루션에 추가하겠습니다.

관련 문제