티스토리 뷰

예제 대화문


자연어 대화라고 해서 문자만 사용하는 것이 아니라 숫자도 많이 사용하며 경우에 따라 즉석에서 간단한 계산을 해야 하는 때도 있다. 우리의 일상 대화를 보면 나이, , 몸무게, 걸음 수, 수면시간, 집주소, 전화번호, 버스번호 등 숫자로 표현되는 단어가 많으며 특히 가격이나 할인폭 등은 대화하는 도중에 실시간으로 계산을 해야 하기도 한다.

위에 제시한 대화 예제는 나이를 묻고 답하는 상황인데 나이는 숫자이지만 문자숫자(text number)로 많이 표현하는 개념이라 연산을 하기 위해서는 먼저 아라비아 숫자로 변환하는 것이 필요하다. 예를 들어 사용자가 아래 중 어느 하나로 입력하더라도 “17”이라는 숫자로 캐치해 낼 수 있어야 한다.

 

A.     열일곱 살 이에요

B.     십칠 세 에요

C.     17살 이에요

 

첫째로 생각할 수 있는 방안은 패턴 매칭 이전에 사용자 입력문에서 문자숫자를 아라비아 숫자로 변환하는 것이다. 전처리를 한 후에 패턴 매칭을 하면 사용자가 문자숫자로 입력하더라도 CS내부에서 숫자로 인식하게 되어 사칙 연산이나 그 밖의 필요한 연산을 할 수 있게 된다. 이렇게 하기 위해서는 다음의 3단계를 거치면 된다. 1단계는 스크립트의 내에서 다음과 같이 replace 명령어로 변환할 내용을 명시해 주는 것이다.

 

D.     replace: 열일곱 17

E.     replace: 열일곱살 17

F.      replace: _일곱 17

G.     replace: _일곱_17

H.     replace: 열일곱_17

 

위의 D명령어는 사용자 입력문 중에 열일곱이라는 단어가 있으면 “17”로 전환하라는 뜻이다. 위의 F, G, H는 사용자가 어떻게 띄어쓰기를 하든 열 일곱으로 인식하기 위해서 준비한 것인데 채팅 상황에서는 종종 띄어쓰기가 무시되므로 열일곱이라고 붙여 쓰든 열 일곱이라고 띄어 쓰든 모두 수용할 수 있도록 준비한 것이다. 2단계는, CS에게 패턴 매칭 이전에 전처리 단계 때 이 변환을 적용하라고 명시해 주는 것이다. 이는 소스화일의 압축을 해제하면 나오는 harry폴더 내의 simplecontrol.top 파일의 세 번째 줄에 #DO_PRIVATE를 추가함으로써 가능하다. 이 지시자가 있으면, CSTopic 폴더 내에 private1.txt가 있는가 살피고 있다면 그 내용을 전처리 단계에서 적용한다. 3단계는 패턴을 다음과 같이 작성하는 것이다.

 

I.      concept: ~나이 ( 10 11 12 13 14 15 16 17 18 19 20 )

J.      u: ( _~나이 ) _0<19 , 수능 준비를 하는군요.

 

이 룰은 앞서의 룰들과 두 가지 점에서 다른데, 먼저 패턴에 새로운 명령어 언더바(_)가 있다는 점이다. 이 명령어의 사용법은 41절에서 자세히 설명하기로 하고 이곳에서는 그 의미만 읽어 보기로 하겠다. 언더바는 사용자가 입력한 단어를 잠시 저장해 놓으라는 단기 저장 명령어로, 위 예제의 경우는 사용자가 입력한 단어 중에 컨셉 “~나이에 포함된 단어가 있다면 그 단어를 단기 저장 변수에 저장해 놓으라는 의미이다. 예를 들어 사용자가 열일곱살이라고 입력했다면, 이는 “17”로 변환될 것이고 이 숫자 “17”“~나이컨셉에 포함되어 있으므로 CS는 이를 단기 저장 변수에 잠시 저장해 두게 될 것이다.

두 번째 다른 점은 출력문 앞에 조건식이 있고 그 조건식에 역시 처음 보는 “_0”이 있다는 점이다. 숫자 앞에 언더바(_)가 붙으면 단기 저장 변수의 내용을 의미하는데 숫자 “0”가장 첫 번째로 저장한 변수의 내용을 뜻한다. 지금의 경우 “17”_0의 내용이 된다.

결론적으로, 만약 사용자가 열일곱 살 이에요이라고 입력했다면 위의 3단계를 거쳐서 그 값이 19보다 작다고 결론 내리게 되고 따라서 수능 준비를 하는군요가 출력된다.

그런데 replace를 사용하는 방법의 단점은 사용자가 최초에 입력한 입력형(original input)을 잃어버리게 된다는 점이다. CS의 장점 중 하나가 입력형과 기본형을 늘 유지하면서 적재적소에 번갈아 사용할 수 있다는 점인데 위의 replace 명령은 사용자의 입력형을 전처리 단계에서 변환시키기 때문에 그 장점을 살릴 수 없게 된다.

입력형을 살리고 싶다면 canon 명령을 쓰는 방법이 있다. 이 방법도 3단계로 나눠서 진행하는데 1단계는 먼저 단어를 사전에 등록하는 단계이다.

 

K.     concept: ~나이 NOUN ( 열일곱 열_일곱 열일곱살 열_일곱살 열_일곱_)

L.      canon:

열일곱 17

_일곱 17

열일곱살 17

_일곱살 17

_일곱_17

 

Kconcept을 선언할 때 NOUN 이라는 지시자를 사용하고 있다. 37절에서 잠깐 언급하였듯이 concept이라는 선언자와 NOUN, VERB, ADJECTIVE 등의 품사 지시자가 함께 사용되면 보조 사전에 단어를 등록하는 기능을 수행한다.[1]

2단계에서는 canon 명령어로 입력형과 기본형을 지정해 준다. canon 명령어의 형식은 37절에서 보인 것처럼 ^canon(활용형 기본형)도 가능하나, 대량의 데이터가 반복될 경우 위의 룰I와 같은 형식이 더 효율적이다. canon명령어가 성공적으로 수행되면 Topic 폴더 내에 canon1.txt 파일을 생성한다. 그리고 이 파일은 별도의 지시가 없어도 CS가 자동으로 참조하기 때문에 추가 작업은 필요 없다. 마지막 3단계는 위에서 작성한 룰F와 룰G를 사용해서 사용자 입력문과 매칭시키는 것이다.[2]

canon 명령어를 사용해서 문자숫자를 매칭하면 사용자가 입력한 최초의 형태를 보존하면서동시에 필요한 사칙 연산을 모두 수행할 수 있다는 장점이 있다. 반면 기본형에 대응시킬 문자숫자를 모두 사전(dictionary)에 등록해야 한다는 수고로움이 생긴다. 각 자의 선호에 따라 결정할 사안이지만 입력형과 기본형을 유지할 수 있는 canon 명령어를 사용하는 것이 정석이라 하겠다.

나이 외에 문자숫자를 숫자로 바꿔야 하는 중요한 예는 천원, 만원 등과 같이 돈을 세는 경우와 첫번째, 두번째 등과 같이 순서를 매기는 서수, 21세기, 시월 등과 같은 날짜표기 등이 있다.




[1] 이 지시자의 완전한 목록은 소스화일과 함께 오는 ChatScript System Variables and Engine-defined Concepts.pdf 파일에 있다.

[2] 이곳에서는 문자숫자를 취급하기 위한 기본 원칙을 설명하였는데, 이를 실제 사용하기 위해서는 조사가 붙은 형태로 등록하고 변환하여야 한다. 이에 대해서는 58절에서 추가 설명하겠다.



댓글
댓글쓰기 폼