형태소 분석기 개발6


검색엔진 개발자 그룹에서 헐랭이님이 아주 좋은 글을 올려주셔서 블로그에 적어본다.
내가 형태소 분석기 전처리 부분에 대한 질문을 올려준것에 대한 답변을 주셨다.

아래와 같이 그대로 한다면
만일 “C++ 템플릿”을 겁색할 경우 “C, 템플릿”만 분리가 될거다.
그렇게 되면 잘못 검색되는 결과가 나오지만
아래 답글은 의미가 있는 글이다.
최소한 어떻게 처리하면 된다 하는 아이디어 제공이라고나 할까…

아무튼 아래 글을 보고 “아!”하는 느낌가지 받았으니 그 느낌을 살려서 설계를 해봐야 겠다.

지금 형태소 분석기 작업은 복합명사 부분에 있는데 생각을 깊이 하니 좀 복잡해지는 느낌이 든다.
현재로서는 4~8음절까지만 복합명사 분해를 하고자 하는데 먼저 복합명사 덩어리 자체를 분리해야는데
기존에 “체언 + 조사” 부분을 그대로 응용하면 안될거 같다.

그때는 정확한 체언을 얻기위해 사전써치를 늘렸는데 그러면 안될거 같구.(복합명사 자체는 사전에 없으니)
조사의 분리 예측이 가능한 최대 위치를 정해서 해야할거 같다는 생각이 든다.
아니면 조사 사전을 이용을 할까
하는 생각이 든다.최대 위치를 정한 다음에 조사 사전 써치를 하는 순서로…

블로그 글을 쓰다 보니 정리가 되는군.ㅋㅋㅋㅋ

이문제는 그렇게 하면 될거 같다.

그러면 아래글 주제인 전처리 문제는 …
함수 하나를 만들어서 입력 쿼리문장을 길이만큼 이터레이션 하면서 분석해 새로운 문자열로 만들어 주면 되겠다.
아니면 바로 공백을 기준으로 스테밍을 해버리는것도 좋구.

아무튼 헐랭이님께 감사드린다.


전처리에서 특수문자를 무시하고 싶으시다면,

입력 전체를 한번 치환 하는 ‘1:1 치환맵’을 사용하는 방법은 어떨까 싶습니다.

어떤 문자셋을 사용하시는지 모르겠지만,

만일 유니코드 즉 65536개의 문자셋을 사용하신다면,

이 1:1 치환맵은 뭐냐면 크기 65536개의 char 배열입니다.

만일 한글, 영어 외에는 모조리 공백처리 하겠다고 한다면

배열 인덱스 중에서 한글영역(0xAC00 ~ 0xD7A3), 영어영역(0x0041 ~ 0x007A) (주의! –> 요부분은 코드셋 매뉴얼이나 문자표 확인 하시길…)

외의 배열값에는 모조리 공백(‘ ‘)을 값으로 하는 겁니다.

즉 ‘검색엔진(Information’을 ‘검색엔진 Information’으로 변환하고자 한다면,

map[‘검’] = map[0xAC00] = ‘검’ //그대로

map[‘색’] = map[0xC0C9] = ‘색’ //그대로

..

..

map[‘(‘] = map[0x0028] = ‘ ‘ // 변환

..

..

이 방법은 사실 한자를 한글로 변환하는 방법을 응용한 것으로,

제 설명을 보고 이해가 안가신다면,

http://jinsuk.pe.kr/Unicode/Hanja2Hangul-kr.html
이 페이지를 참고해 보세요.

저 맵은 반자동으로 작성 하는 것이고, 이 맵을 어떻게 작성하느냐에 따라 전처리에서

다양한 치환이 가능합니다.

e.g. 한자 -> 한글 변환, 대소문자 변환, 특수 문자 치환….

CC BY-NC 4.0 형태소 분석기 개발6 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.