Collapse AllExpand All

부록 A. 토큰 기반 자동완성의 형태소 분석 방법

1. 검색엔진에 요청하여 형태소를 분석하는 방법

검색엔진에 형태소 분석을 요청하기 위해서는 검색 엔진의 IP와 컨트롤 포트를 설정 파일에 포함시켜야 한다.

$ cat akc-conf.0.rc
modes=t
crz.host=123.10.20.30
crz.port=5577

참고

이 방식의 경우 사전 파일 컴파일 시 각 키워드에 대해 검색엔진으로 형태소 분석을 요청하기 때문에 컴파일 시간이 매우 느리고 검색 엔진 성능에도 영향을 줄 수 있다. 따라서 사전 파일이 크거나 검색엔진 성능이 문제가 되는 상황에서는 아래의 방법을 사용하는 것이 바람직하다.

2. 이미 형태소 분석된 사전 파일을 이용하는 방법

위의 방법 (검색엔진에 요청하여 형태소를 분석하는 방법)은 컴파일 속도도 매우 느릴 뿐만 아니라 엔진의 성능에도 악영향을 미칠 수 있다. 또 다른 방법은 사전 파일에 형태소 분석 결과를 미리 포함시키는 것이다.

참고

이 방식의 경우에는 검색 엔진 Admin을 통해 사전 파일을 관리할 수 없다. 형태소 분석 함수인 KEYWORD_EX는 검색엔진 v4.2에서 지원된다.

검색엔진 v4.3 이상인 경우에는 KEYWORD_EX의 사용법이 변경되었으니 검색엔진의 매뉴얼을 참조한다.

예제

아래의 예제는 상품 볼륨의 제목으로 자동완성 사전을 만드는 예이다. 유사한 방식으로 사전 파일을 만들 수 있다. KQL 스크립트를 이용한다.

use volume product;

export records from product to ./product format prod_name="<__prod_name__>";

create volume temp;
use volume temp;

create table akc
(
title string null;
keyword string null;
Tag
keyword = KEYWORD_EX (title)
);

create gateway gw on akc to file system format title="<__prod_name__>";

import files ./product/0000 *.txt to akc through gw operation store;

export records from akc to ./akc.0 format title="<__title__>", keyword="<__keyword__>";

예제의 KQL을 실행시키면 akc.0 라는 디렉터리에 아래와 같이 형태소 분석을 포함하는 벌크 덤프 파일들이 생성된다.

참고

아래 예제의 akc.0 디렉터리 형식은 akc.[도메인번호] 이다.

$ find  akc.0 -type f -print
akc.0/0000/0000.txt
akc.0/0000/0001.txt
…
akc.0/0001/0000.txt
akc.0/0001/0001.txt
…

$ tree akc.0
akc.0
|-- 0000
|   |-- 0000.txt
|   |-- 0001.txt
`-- 0001
    |-- 0000.txt
    `-- 0001.txt

$ cat ./0000/0000.txt
<__title__>문명의 고향 티그리스 강을 걷다
<__keyword__>강 걷다 고향 문명 티그리스
<__title__>물질 영역의 초등과학 교재연구
<__keyword__>과학 교재 물질 연구 영역 초등
…

이제 덤프 파일을 포함하는 akc.0 디렉터리를 서비스 프레임워크 디렉터리의 사전 디렉터리로 이동시키고 설정 파일을 아래와 같이 수정한다.

$ cat akc-conf.0.rc
modes=t
prefixes=<__title__> <__keyword__>
charset=euc-kr

저장된 덤프 파일들의 인코딩에 따라 charset을 설정한다. 덤프 파일의 각 라인으로부터 키워드와 형태소분석결과를 구별하기 위해 prefixes를 설정한다. prefixes는 덤프 파일의 각 라인 앞에 있는 구분자이다. 설정 파일에는 공백으로 구분한다. 첫 번째는 자동완성 사전에서 검색할 문자열에 해당하는 prefix, 마지막은 형태소 분석 결과 라인의 prefix, 가운데는 메타 정보 라인의 prefix를 기술하면 된다.

예를 들어, 메타1, 메타2 정보가 추가된다면

prefixes=<__title__> <__meta1__> <__meta2__> <__keyword__>

와 같은 식으로 설정하면 된다.