티스토리 뷰

CS는 영어대화를 목적으로 개발되었기 때문에 CS로 한국어 대화를 하기 위해서는 CS에게 한국어의 고유 특징을 추가해 주어야 한다. 이 장에서는 한국어의 특징을 CS에 반영하는 방법에 대해 알아볼텐데 먼저 CS에서 대화 관리를 어떻게 하는지 이해하는 것에서부터 시작하기로 한다.

 

(1)   CS의 대화 관리자 이해하기

 

대화 관리자(dialog manager)의 가장 중요한 임무는 사용자 의도를 파악하여 그에 맞는 대화를 진행하는 것이다. 이를 위해 CS의 대화 관리자는 사용자가 입력한 단어를 가장 중요한 기준으로 삼는다. 사용자가 입력한 단어야 말로 사용자가 무엇에 관해 이야기 하려는 지를 단적으로 보여준다고 생각하기 때문이다.

대화를 하는 중에 사용자가 새로운 단어, 새로운 화제를 입력하면 대화 관리자는 사용자 의도가 바뀌었다고 생각하고 그 단어에 일치하는 새로운 토픽을 찾는 것도 같은 맥락이다. 새로운 토픽을 찾으면 그 토픽 내에 사용자가 입력한 문장과 일치하는 룰이 있는가 다시 살피고 있다면 그 토픽으로 이동한다. 이제 이 새로운 토픽이 활성화되고 바로 직전 토픽은 대기상태(pending)가 된다. 만약 활성화된 토픽에 다음 번 사용자 입력문과 일치하는 룰이 없고 키워드가 일치하는 새로운 토픽도 없다면 대화관리자는 대기상태에 있던 토픽으로 되돌아 온다.

이와 같이 대화관리자는 토픽을 기준으로, 엄밀하게 이야기하면 토픽이 보유하고 있는 키워드 목록을 기준으로 대화를 관리해 나간다. 따라서 룰을 잘 작성하는 것 이전에 그 룰을 포함한 토픽이 활성화 될 수 있도록 하는 것이 더 중요하다. 그 토픽에 필요한 키워드를 빠짐없이 등재하도록 확인하는 것이 중요하다.

대화관리자가 어떤 토픽을 대기상태로 만드는 경우는 두 가지이다. 현재 그 토픽에서 룰을 실행하고 있거나 직전에 룰을 실행한 토픽이 대기상태가 된다. 챗봇이 룰을 실행한 후 사용자가 말할 차례가 되었을 때 사용자가 직전에 나눴던 주제와 동일한 주제로 대화를 해야 하는 것은 아니기 때문에 지금 막 룰을 실행했던 토픽도 대기상태가 되는 것이다. 대화 관리자는 대기상태에 있는 토픽의 목록을 자동으로 관리하고 있는데 첫번째 우선순위는 지금 막 룰을 실행한 토픽, 두번째 우선순위는 가장 최근에 룰을 실행한 토픽이다.

작성자는 이 대기상태 목록을 수정할 수 있는데, 첫번째 우선순위의 토픽은 시스템 변수 %topic에 할당되어 있으므로 어떤 토픽이 최상위 대기상태에 있는지 언제든 알 수 있고, 대기상태 목록에 추가하고 싶으면 ^addtopic(~토픽이름), 제거하고 싶으면 ^poptopic(~토픽이름)을 하면 된다. , 시스템토픽으로 선언되었거나 NoStay토픽으로 선언된 경우 대기토픽이 되지 않는다.

전형적인 대화 관리자의 대화 관리 순서는 다음과 같다. 그리고 함께 예제로 딸려 온 Harry의 관리 순서도 동일하다.

    먼저 사용자 입력문을 전처리 한다.

사용자가 입력한 문장에는 축약어, 사투리, 은어, 비어, 맞춤법이 틀린 단어 등이 포함되어 있을 수 있다. 따라서 토픽을 찾기 이전에 사용자 입력문을 가다듬을 필요가 있다.

가.   축약어, 사투리, 유행어, 은어 등은 표준어로 바꾼다. 이때 LiveData 폴더에 있는 9개의 파일이 사용된다.

나.   철자 교정 (영어)

다.   마침표, 물음표 제거

라.   담화표지자 분리. LiveData 폴더의 interjections.txt 파일에 포함된 단어는 모두 담화표지자로 처리된다.

마.   시간, 날짜, 숫자 등이 문자숫자로 입력되었다면 아라비아 숫자로 변환

바.   불필요한 단어 제외 (예를 들면 음…. )

사.   품사 부여 및 문장내에서의 성분 분석(주어, 목적어 등) ()

아.   입력문 각각의 단어에 해당하는 기본형을 찾아 기본형으로 문장 작성(예를 들어 나는 예쁜 꽃을 좋아해요라고 입력했다면 CS는 내부적으로 나 예쁘다 꽃 좋아하다의 기본형 문장을 만들어 이 두 개로 매칭을 시도. 단 각 단어의 기본형을 미리 등록해 놓아야 함.)

자.   각 단어가 어떤 컨셉에 속하는지 표시

이 과정이 끝나면 이제 해당 토픽과 룰을 찾는다.

    사용자 입력문에 해당하는 토픽 선정

사용자가 입력한 단어와 일치하는 키워드를 가장 많이 가진 토픽을 찾는다. 이는 사용자가 말하고 싶은 것이 무엇인지, 사용자가 무엇에 관해 말하고 싶어하는지를 가장 잘 보여주는 것이 사용자가 사용한 단어라고 보기 때문이다.

만약 동일한 키워드를 여러 토픽이 가지고 있다면 각 토픽별로 점수를 매겨서 가장 높은 점수를 받은 토픽부터 조사를 한다. 일치하는 키워드가 앞쪽에 있을수록, 일치하는 키워드의 개수가 많을수록, 일치하는 키워드의 철자 수가 길수록 높은 점수를 받는다.

    토픽을 찾은 후 그 토픽 내에서 매칭되는 룰을 찾는다.

가.   먼저 예상응답(rejoinder) 중에서 일치되는 룰이 있는가 찾는다. 없다면,

나.   응답(responder) 중에서 일치되는 룰이 있는가 찾는다. 없다면,

    키워드가 많이 일치하는 다음 번 토픽을 찾아 응답 중에서 일치하는 룰을 찾는다. 없다면,

    키워드가 없는 토픽 중에서 일치하는 룰이 있는가 찾는다. 없다면,

    현재 토픽 내에서 말걸기를 찾는다. 다 사용하고 없다면

    키워드가 많이 일치하는 다음 순위 토픽을 찾아 말걸기를 시도한다. 다 사용하고 없다면,

    임의의 토픽을 골라 말걸기를 시도한다.

 

위의 순서는 얼마든지 수정할 수 있다. 순서를 바꿀 수도 있고 생략할 수도 있다. 그러나 사람간의 대화를 생각해 볼 때 위의 순서는 상식적인 흐름이라 생각되므로 당분간은 그대로 사용하기로 하자. (영어라면 대응되는 룰이 없을 때 담화의 유형에 맞춰 적합한 답변을 할 수 있도록 만들어져 있으나 한국어에는 아직 이런 분석이 적용 안된다)

말걸기(gambit)에 대해서 추가 설명이 필요하다. 말걸기가 실행되는 때는 챗봇이 대화 주도권을 가졌을 때이다. 챗봇이 주도권을 가지는 경우는 작성자가 강제로 말걸기를 시키는 경우이거나 사용자 입력문과 일치하는 룰을 찾지 못하거나의 두 가지 경우이다. 작성자가 강제로 말걸기를 시키는 경우는 사용자가 로그인 한 직후가 대표적이다. 로그인을 한 후 사용자로부터 뭔가 입력을 기다리기 보다는 먼저 인사말을 건네는 것이 자연스런 대화를 시작할 수 있기 때문에 이 때는 챗봇에게 말걸기를 시키는 것이 좋다

예제로 함께 딸려 온 Harry 폴더에서 simplecontrol.top 파일을 열어 보면 5째줄에 ^addtopic(~introductions) 을 볼 수 있을 것이다. ~introductions 토픽을 대기상태에 올려 놓는데 현재는 아무런 입출력이 없는 상태이기 때문에 대기상태에 있는 유일한 토픽이 되고 그래서 이 토픽이 현재토픽이 된다. 현재토픽은 CS가 자동으로 관리하는데 %topic 이라는 변수에 저장하고 있다. 34째 줄을 보면 이 값을 작성자 변수 $$currenttopic에 할당하고 40째 줄에서 ^gambit($$currenttopic) 명령으로 이 토픽의 말걸기를 실행하도록 하고있다. introductions토픽에 가 보면 사용자가 말 한 적이 있으면, %input0보다 크면 예전에 대화했던 적이 있었던 것이므로 되돌아 온 것을 환영한다는 인사를 하고 (출력문에 back, again 등이 포함되어 있다) 그렇지 않다면 처음 대화하는 것이므로 만나서 반갑다는 두번째 말걸기가 실행되는 것이다.

말걸기가 실행되는 두번째 경우는 사용자 입력문과 일치하는 룰을 찾을 수 없을 때인데 이때는 첫째 현재 활성화된 토픽 내에서 아직 사용되지 않은 말걸기 중 가장 위쪽에 있는 말걸기를 실행한다. 사용하지 않은 말걸기가 없다면 사용자 입력문에 포함된 단어와 가장 근접한 토픽을 찾아 그 토픽 내에서 아직 사용되지 않은 말걸기를 실행한다. 여기에도 없다면 임의의 토픽을 골라 말걸기를 실행한다. 말걸기가 이와 같은 과정을 거쳐 출력되므로 챗봇의 말걸기는 새로운 화제를 던지는 셈이 된다. 사용자 입장에서는 다소 뜬금없다고 느낄 수도 있으므로 말걸기는 새로운 화제에 대한 약간의 설명을 곁들여 질문의 형식으로 작성하는 것이 자연스럽다.

사용자 입력문의 전처리 과정에서 철자 검사, 품사 분석 구문 분석은 영문에만 해당되므로 작동하지 못하도록 막아 놓는 것이 좋다. 엉뚱하게 분석하여 매칭을 못하게 하는 경우가 있기 때문이다. 이 기능을 끄기 위해서는 Harry폴더 아래의 simplecontrol.top 파일을 열어 3째줄에서 아래의 두 단어를 삭제하면 된다.

#DO_SPELLCHECK, #DO_PARSE

그런 후 #DO_PRIVATE 를 추가해 넣자. 이는 한국어의 특성에 맞도록 전처리 정보를 입력할테니 그 정보를 활용해서 전처리를 하라는 뜻이다. 최종 수정된 $cs_token의 모습은 다음과 같다.

 

$cs_token = #DO_INTERJECTION_SPLITTING | #DO_SUBSTITUTE_SYSTEM | #DO_NUMBER_MERGE | #DO_DATE_MERGE  | #DO_PROPERNAME_MERGE  | #DO_PRIVATE


이제 대화 관리자는 사용자 입력문을 전처리 할 때 위의 철자교정, 품사분석, 구문분석은 생략하고 대신 작성자가 한국어에 대해 알려 준 전처리 방법을 추가로 적용하게 될 것이다.

댓글
댓글쓰기 폼