문자열 간의 최단거리 찾기
 

***Scenario:데이터 활용시 사람간의 매칭 기능을 만드려고 참고한 내용

(주관식 설문지를 작성할경우) 예를들어 혈액형을 입력하라고 하자.
A임, A형,  A형임,

이 3답변은 실질적으로 같은답변이지만 단순히 Like 를 사용해서 쿼리를 작성할경우 찾을 수 가 없다.

그렇다면 어떻게 하면 3개의 답변이 비슷하다고 가정 할 수있을까?? 원래는 DAO에서 모든 데이터를 불러온다음 자료구좋에 넣어 파싱을 해서 검색을 하려고했다.

그러나 오버헤드가 너무 클 것같았다. 고민하던중 다음과 같은 포스팅을 찾을 수있엇다


두 개의 문자열 사이에 유사도가 가까울수록 같은 계열의 값으로 판단할 수 있을것이다.

이러한 기능을 수행하려면 모든 데이터 값들간의 조인이 일어나야하는데 사용자 정의 함수를 사용하면

최적화 되지 않는 경우가 많기 때문에 프로젝트에서 결과값을 얻기 쉽지가 않다.

Oracle 11g에서의 new feature가 있는데 아주 유용한 기능으로 소개하기로 한다.

DROP TABLE match_tab;

CREATE TABLE match_tab (
  id   NUMBER,
  col1 VARCHAR2(50),
  col2 VARCHAR2(50),
  CONSTRAINT match_tab_pk PRIMARY  KEY (id)
);

INSERT INTO match_tab VALUES (1, 'Peter Parker', 'Pete Parker');
INSERT INTO match_tab VALUES (2, 'Peter Parker', 'peter parker');
INSERT INTO match_tab VALUES (3, 'Clark Kent', 'Claire Kent');
INSERT INTO match_tab VALUES (4, 'Wonder Woman', 'Ponder Woman');
INSERT INTO match_tab VALUES (5, 'Superman', 'Superman');
INSERT INTO match_tab VALUES (6, 'The Hulk', 'Iron Man');

INSERT INTO match_tab VALUES (11, '환자입원일시', '환자입원일');
INSERT INTO match_tab VALUES (12, '슈퍼맨', '슈퍼 맨');
INSERT INTO match_tab VALUES (13, '슈퍼맨', '슈퍼맨');
INSERT INTO match_tab VALUES (14, '슈퍼맨', '아이언맨');
INSERT INTO match_tab VALUES (15, '동창생', '도차생');
INSERT INTO match_tab VALUES (16, '일반 환자 격리', '일반환자격리');
INSERT INTO match_tab VALUES (17, '트러블 메 이 커', '트메이크');

COMMIT;

SELECT col1,
       col2,
       UTL_MATCH.edit_distance(col1, col2) AS ed,
       UTL_MATCH.edit_distance_similarity(col1, col2) AS eds,
       UTL_MATCH.jaro_winkler(col1, col2) AS jw,
       UTL_MATCH.jaro_winkler_similarity(col1, col2) AS jws
FROM   COMP_TABLE
ORDER BY id;

우리가 눈여겨 볼만한것은 유사도입니다. EDS, JWS

영문과 한글일때의 유사도의 차이는 조금 다르지만 문자열에 대한 유사도를 찾을수 있는

좋은 기능입니다.

잘만 응용하면 좋은 TIP이 될수 있을것입니다.


출처:http://www.dator.co.kr/newyemac/894089


+ Recent posts