티스토리 뷰

예제 대화문


스크립트를 작성하는 시점에는 사용자가 씨엘을 좋아한다고 할 지 박봄을 좋아한다고 할지 알 수 없다. 따라서 출력문을 위와 같이 만들려면, 사용자가 말한 것을 실시간으로 저장해서 사용해야 한다. 먼저 패턴을 작성해 보면,

 

A.     u: ( ~씨엘 *~2 좋아*)

 

위의 룰은 씨엘을 좋아해요”, “저는 씨엘을 가장 많이 좋아해요”, “CL이 좋아등을 매칭시킬 수 있다. 이제 이 룰에서 사용자가 말하는 씨엘을 변수로 저장해 보자. 이를 위해 _(under bar)명령어를 사용한다.

 

B.     u: ( _~씨엘 *~2 좋아*)

 

이렇게 컨셉 앞에 _(under bar)를 붙이면 사용자가 컨셉 ~씨엘에 포함되어 있는 여러 단어 중에 한 단어를 입력할 경우 그 단어를 임시 변수에 저장하도록 한다. 임시 변수라는 것은 이 룰이 유효할 때까지만 이 변수도 유효하다는 의미이며, 쉽게 말하면 출력문이 출력될 때까지만 유효한 변수라고 보면 되겠다. 출력문이 출력되어 이 룰이 사용되었음 표시가 되면 이 변수는 다른 룰을 위한 변수로 사용될 수 있기 때문에 다른 값으로 덮어 쓰이게 될 가능성이 높다그런 의미에서 임시변수라고 말하는 것이며 만약 한동안 다른 변수에서 사용 안한다면 이 값은 그때까지 보존된다.


_(under bar)명령어로 저장되는 변수는 Match변수라고 부르는데 사용자가 입력한 단어에 매칭되는 변수라는 의미이다. 이 변수는 _(under bar) 붙은 숫자로 호출하여 사용할 수 있다. 예를 들어 “_0” 와 같은 형식으로 호출할 수 있는데, _0을 출력문에 포함시키면 이 변수에 보관해 둔 사용자 입력 단어가 함께 출력된다.

 

A.     u: ( _~씨엘 *~2 좋아*) 그럼 _0 직접 본 적도 있어요?

 

C는 사용자가 ~씨엘 컨셉에 포함되어 있는 단어 중의 어느 하나를 입력하면 매칭에 성공하고 그 단어를 첫번째 임시변수(0번 변수)에 저장한다. 출력문에서는 첫번째 임시변수(_0)를 호출하고 있으므로 저장해 두었던 사용자 입력 단어를 출력하게 되는데, 이때 _0CS가 기본형(canonical form)으로 바꾼 값이고 만약 사용자가 입력한 최초의 형태로 출력하고 싶으면 어포스트로피를 붙여야 한다.[1]

 

B.     u: ( _~씨엘* *~2 좋아*) 그럼 ‘_0 직접 본 적도 있어요?

 

패턴에서 사용자가 입력한 단어를 여러 개 저장해 두었다면 저장해 둔 순서에 맞춰 _0, _1, _2 등으로 호출하여 사용할 수 있다.

 

C.     u: ( _*1 _*1 _*1 _*1 *~2 좋아*) 그럼 _3, _1, _0, _2 중 길러 본 과일이 있어요?

 

E딸기, 사과, 포도, 수박을 좋아해요.”라는 사용자 말에 그럼 수박, 사과, 딸기, 포도 중 길러 본 과일이 있어요?”라는 챗봇의 질문을 가능하게 한다. 출력문의 변수 순서는 일부러 바꿔 보았다.

다른 한편 이 매칭변수는 아래와 같이 다른 연산자와 결합해 사용할 수도 있다.

 

D.     u: ( _[ 사과 배 포도 딸기 ] )

E.     u: ( _{ 사과 배 포도 딸기 } )

F.      u: ( _*)

G.     u: (_*1)

 

F는 사과, , 포도, 딸기 중의 어느 하나를 입력했을 경우에만 저장하고, G는 사용자가 사과, , 포도, 딸기 중의 어느 하나를 입력하였다면 저장하고 입력 안했다면 저장 하지 않는다. 만약 사용자가 입력한 것이 무엇이든 무조건 저장하고 싶을 경우에는 룰H, 무엇을 입력하든 한 단어만 저장하고 싶을 때는 룰I를 사용하면 된다.

이 단기 기억을 위한 장소는 숫자 0에서 19까지 총 20개가 있으며 한 번의 주고 받는 말순서에서 통상 2~3개 정도를 사용할 것이므로 충분한 개수라고 보면 된다. 이제 위 룰C를 좀 더 일반화 시키기 위해 투애니원의 멤버들을 하나의 컨셉으로 만들어 보자.

 

H.     concept: ~투애니원멤버 [ ~씨엘 ~박봄 ~산다라 ~민지 ]

u: ( ! _~투애니원멤버 *~2 좋아*) 그럼 _0 직접 본 적도 있어요?

 

컨셉은 제36절에서 설명했듯이 다른 컨셉을 구성요소로 가질 수 있기 때문에, 다른 컨셉을 포함하는 더 큰 범위의 새로운 컨셉을 쉽게 만들 수 있다. 이제 사용자가 씨엘, 박봄, 산다라, 민지 등 어떤 멤버를 얘기하더라도 정확하게 대응이 가능하다.

위의 룰 J는 다음과 같이 좀 더 간결하게 작성할 수도 있다.

 

I.      ( _*1 _0?~투애니원멤버) _0 투애니원 콘서트에서 보셨어요?

 

대화의 전후 문맥상 사용자가 가수 이름을 대답하는 상황이라고 가정하자. 위의 패턴은 사용자가 입력한 단어를 받아서(_*) 임시 저장하고 그 저장한 값을 불러서(_0) ~투애니원멤버에 속하는지 확인하고 있다. ? (물음표) 연산자는 앞에 있는 요소가 뒤에 있는 집합에 속하는가를 조사하라는 명령어이다. 조사해서 맞다면 매칭에 성공하고 출력문을 출력할 것이다. 이 출력문을 본 사용자는 사람 이름을 말했는데 그 소속팀을 이야기하네하고 놀랄 수 있을 것이다.


예제 대화를 위한 스크립트


 



[1] 단어가 사전에 등록되지 않은 상태에서 기본형을 사용하려 하면 CSun-known word 에러를 보여준다. 사전에 등록되지 않았기 때문에 기본형을 알 수 없기 때문이다. 사전에 등록하거나 입력형(어포스트로피를 붙인 형태)을 사용하여야 한다. 



댓글
  • 프로필사진 도움감사합니다 : ( _*1 _*1 _*1 _*1 *~2 좋아*) 그럼 _3, _1, _0, _2 중 길러 본 과일이 있어요? 이부분이 이해가 안가는데

    _*1 에 사과를 _*사과 이렇게 써야한다는건지 _*1사과 이렇게 해야하는건지 둘다 해봤는데 출력이 그냥 unknown word, 1, 0, 2 이렇게 출력 되네요 ㅠㅠ
    2016.09.28 17:29
댓글쓰기 폼