티스토리 뷰

 

사전은 대화의 출발점이다. 사전에 등재되지 않은 단어를 토픽의 키워드로 사용하면 토픽이 활성화 되지 않기 때문이다. 사전에 등재되지 않는다고 에러가 되지는 않지만 CS내부적으로는 그 단어를 제외하고 처리하기 때문에 그 단어가 입력되었을 때 토픽이 활성화 되지 못하게 된다. 당연히 룰 매칭도 일어나지 않는다. 따라서 :build를 할 때 토픽 키워드에 등재한 단어가 not known word 라는 경고를 받게 되면 반드시 단어 등재를 해야 한다.

단어를 사전에 등재하는 방법은 두 가지가 있는데 하나는 내장되어 있는 기본사전이나 보조사전에 등재하는 방법, 또 하나는 사용자가 만드는 사용자사전에 등재하는 방법이다.



기본 사전은 텍스트로 만들어진 사전을 이진화일로 만든 것이기 때문에 탐색속도가 매우 빠르다는 장점이 있다. 이 기본 사전에 새로운 단어를 등재하려면 다음과 같이 두 단계를 거쳐야 한다.

1단계는 기초가 되는 사전 자료를 텍스트 파일로 만드는 단계이고 2단계는 DICT/English 폴더 아래의 dict.bin 화일과 facts.bin 파일 두 개를 삭제한 후 “:build 0” 명령어로 사전을 다시 만드는 단계이다. 따라서 먼저 기초 사전자료를 텍스트 파일로 만들어야 하는데, 이는 다음과 같은 3가지 이유로 신중하게 결정할 것을 권한다. 첫째 사전 형식에 맞춰 단어를 직접 입력해야 하는데 사전 형식이 알려져 있지 않고 둘째, 단어를 입력하는 과정에서 입력 오류가 발생할 가능성이 높다. 셋째 사전자료의 파일이름은 영어알파벳이나 숫자 한 글자로 되어 있어야 하는데 이미 다 사용되어 남은 것이 없다. 따라서 기존의 파일을 열어 맨 뒤에 이어 쓰기를 해야 하는데 이는 CS가 업데이트 될 때마다 다시 재작업을 해야 한다는 뜻이 된다.[1]

이런 이유로 새로운 단어는 사용자 사전에 등록하는 것이 바람직하다. 사용자 사전은 원천이 되는 기초자료를 사용자가 가지고 있기 때문에 CS가 업데이트 되더라도 손쉽게 다시 만들 수 있고 만드는 방법도 명령어를 통하기 때문에 작성 오류의 확률이 낮다사용자 사전에 새로운 단어를 등재하는 방법은 아래와 같은 간단한 명령문으로 가능하다.

 

    사용자 사전에 단어를 등재하는 방법

concept 명령문에 품사 지정사를 함께 사용하면 [ ] 속 단어들을 사용자 사전에 지정된 품사로 등재한다.

 

concept: ~OOO MORE NOUN [ 단어 단어 단어 ]

 

위의 명령문에서 MORE를 쓴 이유는 동일한 컨셉이 이미 존재하는 경우를 대비해서 이다. 지정할 수 있는 품사는 NOUN 외에 VERB(동사), ADJECTIVE(형용사), ADVERB(부사) 등이 있다.[2] 이렇게 만들어진 사전은 Topic 폴더 내의 dict1.txt 파일이라는 이름으로 저장된다.

 

    기존의 전자사전을 이용하는 방법

언뜻 생각할 때 한글 사전은 국립국어원의 세종 전자사전[3]을 활용하면 되지 않을까 하고 생각하기 쉽다. 그러나 전통적인 사전에 등재된 단어와 우리가 일상 대화에서 사용하는 단어가 다르기 때문에 기존의 전자사전은 직접적으로 도움이 되지 못한다. 예를 들면, 전통적인 사전에는 백두산이라는 원형이 등재되어 있지만 일상 생활에서는 백두산은, 백두산이, 백두산에, 백두산까지등 조사가 붙은 형태로 사용된다. 사람은 쉽게 조사가 붙었구나하고 알지만 컴퓨터는 백두산 + 의 형태로 분리해 주어야 알아 듣는다. 그렇지 못하면 아무리 백두산이라는 단어가 있더라도 백두산은을 못 알아듣는다.

이런 이유로 그동안 컴퓨터에게 한국어를 알아 듣게 하기 위해 형태소 분석기를 이용해 왔다. 그러나 형태소 분석기는 아직 완벽하게 작동하는 것이 없는데다가 만약 CS에게 형태소 분석기를 적용하려면 CS의 소스화일을 수정해야 하는 노력이 뒤따라야 한다. 따라서 현 시점에서 CS에게 한국어를 알아듣게 하는 가장 좋은 방법은 어절 단위로 사전을 만드는 것이다. 장점은 형태소 분석이 불필요하고 즉각 사용할 수 있다는 점이다. 단점은 어절 단위 사전을 만드는데 많은 시간과 노력이 필요하며 사전의 크기가 커진다는 점이다.

 

 

    대규모 사용자 사전을 만드는 방법

 

단어를 몇 개 추가하는 정도가 아니라 대규모의 사전을 만드는 경우라면 사전을 만드는 과정과 챗봇을 만드는 과정을 분리하는 것이 바람직하다. 분리하지 않을 경우 챗봇의 내용을 수정할 때마다 사전 전체도 다시 만드는 중복 작업을 하게 되기 때문이다.

분리를 위해서는 소스화일의 위치와 설정화일을 아래와 같이 만들어 주면 된다.



 위와 같이 분리하여 만들기로 하였다면 사용자 사전도 기본사전과 보조사전으로 구별하는 것이 필요하다. 내용 수정이 빈번하지 않을 단어들은 기본사전으로 분류하여 harry/Dict 폴더 밑에 넣어 두어 필요한 경우에만 다시 만들고, 빈번하게 추가되고 변경될 단어들은 보조사전으로 분류하여 harry폴더 아래에 둠으로써 harry의 내용을 바꿀 때마다 함께 다시 만들도록 하는 것이다. concept 명령 뿐만 아니라 createfact, replace, canon 모두가 해당되며 이렇게 분리하여 만드는 것이 효율적이므로 이 방법을 적극 활용하는 것이 좋겠다.

 

 

    내장되어 있는 보조사전에 추가하는 방법

 

미리 만들어져 있는 보조사전은 LiveData 폴더에 있는 9개의 화일이다. 여기에 단어를 추가하려면 해당 파일을 열어서 직접 입력하면 된다. 화일 형식이 매우 단순하여 어렵지 않으며 입력 오류의 가능성도 낮다. 다만 9개의 파일 중 interjections.txt 파일만 제외하고 나머지는 replace 명령어로 만드는 것이 더 좋다. replace 명령어로 만들면 장차 CS를 업데이트 하더라도 덮어쓰지 않기 때문이다. interjections.txt 파일은 패턴 매칭을 할 때 별도로 처리하게 할 수 있기 때문에 이 파일은 그대로 이용하는 것이 좋겠다. 다만 CS를 업데이트할 때 마다 교체해 주어야 하는 번거로움이 있다. Interjections.txt 파일에 단어를 등록하는 방법에 대해서는 "담화표지자의 등록"에서 추가 설명하기로 한다.

 



[1] 그러나 수십 ~ 수백 개의 단어가 아니라 범용적인 사전을 만들 계획이고, 영어사전도 필요 없다면 DICT/English 폴더 아래의 모든 파일을 삭제하고 사용자가 만든 단어 사전으로 대체해도 된다. CS는 영어사전이 없어도 구동하는데 문제없다.

[2] 그 외에 AUX_VERB (조동사), PRONOUN_SUBJECT(주격 대명사), DETERMINER(관형사) 등 수 십 개의 세부 분류가 있다. 완전한 목록은 SRC폴더 아래의 dictionarySystem.h 파일에 있다.

[3] https://ithub.korean.go.kr/user/main.do

[4] 61절의 "CS 설치하기"에서 설명하였다.


댓글
댓글쓰기 폼