티스토리 뷰
스크립트를 작성하는 시점에는 사용자가 씨엘을 좋아한다고 할 지 박봄을 좋아한다고 할지 알 수 없다. 따라서 출력문을 위와 같이 만들려면, 사용자가 말한 것을 실시간으로 저장해서 사용해야 한다. 먼저 패턴을 작성해 보면,
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)를 호출하고 있으므로 저장해 두었던 사용자 입력 단어를 출력하게 되는데, 이때 _0는 CS가 기본형(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 직접 본 적도 있어요?
컨셉은 제3장 6절에서 설명했듯이 다른 컨셉을 구성요소로 가질 수 있기 때문에, 다른 컨셉을 포함하는 더 큰 범위의 새로운 컨셉을 쉽게 만들 수 있다. 이제 사용자가 씨엘, 박봄, 산다라, 민지 등 어떤 멤버를 얘기하더라도 정확하게 대응이 가능하다.
위의 룰 J는 다음과 같이 좀 더 간결하게 작성할 수도 있다.
I. ( _*1 _0?~투애니원멤버) _0 투애니원 콘서트에서 보셨어요?
대화의 전후 문맥상 사용자가 가수 이름을 대답하는 상황이라고 가정하자. 위의 패턴은 사용자가 입력한 단어를 받아서(_*) 임시 저장하고 그 저장한 값을 불러서(_0) ~투애니원멤버에 속하는지 확인하고 있다. ? (물음표) 연산자는 앞에 있는 요소가 뒤에 있는 집합에 속하는가를 조사하라는 명령어이다. 조사해서 맞다면 매칭에 성공하고 출력문을 출력할 것이다. 이 출력문을 본 사용자는 “사람 이름을 말했는데 그 소속팀을 이야기하네” 하고 놀랄 수 있을 것이다.
[1] 단어가 사전에 등록되지 않은 상태에서 기본형을 사용하려 하면 CS는
un-known word 에러를 보여준다. 사전에 등록되지
않았기 때문에 기본형을 알 수 없기 때문이다. 사전에 등록하거나 입력형(어포스트로피를 붙인 형태)을 사용하여야 한다.
'4장. 응용 대화 가르치기' 카테고리의 다른 글
6. 사용자가 동일 질문을 반복해 올 때 (0) | 2016.05.18 |
---|---|
5. 같은 말 반복하지 않기 (0) | 2016.05.18 |
4. 숫자 계산하기 (0) | 2016.05.17 |
3. 모를 때만 질문하기 (0) | 2016.05.16 |
2. 대화 내용을 오래 기억하기 (1) | 2016.05.14 |
- Total
- Today
- Yesterday
- 한글챗봇 우리말챗봇 인공지능챗봇 ai챗봇
- 소프트봇 채터봇
- Chatscript AI 인공지능 챗봇 chatbot
- chatscript chatbot 챗봇 한국어챗봇 ai 인공지능
- 한국어챗봇
- 챗봇개발 채팅로봇 한국챗봇
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |