1. 상대방의 말 잠시 기억하기


User> 저는 씨엘을 특히 좋아해요

Bot> 그럼 씨엘을 직접 본 적도 있어요?




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

룰A는 “씨엘을 좋아해요”, “저는 씨엘을 가장 많이 좋아해요”, “CL이 좋아” 등을 매칭


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

사용자가 말하는 씨엘을 변수로 저장

컨셉 앞에 _(under bar)를 붙이면 사용자가 컨셉 ~씨엘에 포함되어 있는 여러 단어 중에 한 단어를 입력할 경우 그 단어를 임시 변수에 저장한다.

룰이 유효할 때까지 이 변수도 유효

= 출력문이 출력될 때까지만 유효한 변수임





Match변수 

_(under bar)명령어로 저장되는 변수

사용자가 입력한 단어에 매칭되는 변수





_0

_0을 출력문에 포함시키면 이 변수에 보관해 둔 사용자 입력 단어가 함께 출력된다.


ex)

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


사용자가 ~씨엘 컨셉에 포함되어 있는 단어 중 어느 하나를 입력하면 매칭에 성공하고

그 단어를 첫번째 임시변수(0번 변수)에 저장한다

출력문에서는 첫번째 임시변수 (_0)를 호출하고 있으므로

저장해 두었던 사용자 입력 단어를 출력하게 되는데

이 때, _0는 CS가 기본형(canonical form)으로 바꾼 값이고





만약 사용자가 입력한 최초의 형태를 출력하고 싶으면  '(어퍼스트로피)를 붙여야 한다


ex)

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





여러개 저장하려면 _0, _1, _2 등으로 사용한다


ex)

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


"딸기, 사과, 포도, 수박을 좋아해요"라는 사용자의 말에

"그럼 수박, 사과, 딸기, 포도 중 길러 본 과일 있어요?"라는 챗봇의 질문을 가능하게 한다





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

사과, 배, 포도, 딸기 중의 어느 하나를 입력했을 경우에만 저장



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

사용자가 사과, 배, 포도, 딸기 중의 어느 하나를 입력하였다면 저장하고 입력 안했다면 저장 하지 않는다. 



F.      u: ( _*)

사용자가 입력한 것이 무엇이든 무조건 저장



G.     u: (_*1)

무엇을 입력하든 한 단어만 저장




이 단기 기억을 위한 장소는 0~19까지 총 20개가 있다.





투애니원 멤버를 하나의 컨셉으로 만들기

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

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



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










2. 대화 내용을 오래 기억하기





룰C의 말걸기는 $Concert에 값이 할당되었을 때만 참이 되며, 조건이 참일 때만 실행된다.





위 변수의 4가지 경우의 수


①    룰C의 앞쪽 어디에도 $Concert 변수가 없다 (거짓)

조건이 참인지 알아보려고 했는데 앞쪽 어느 대화에서도 $Concert라는 변수가 선언된 적도 사용된 적도 없다. 

즉 이곳에 처음 나타나는 변수이다. 

변수가 처음 언급되면 자동으로 null값 (=할당된 값 없음)을 갖게 되므로 위의 조건은 거짓이 되어 룰C는 실행되지 않는다.


②    룰 B가 실행되지 않았다 (거짓)

룰B가 실행되지 않았다면 $Concert 변수는 이곳에서 처음 선언된 것과 같은 상태 값을 가지고 있다. 

즉 선언될 때 자동으로 할당 받는 null 값을 가지고 있고 따라서 조건은 거짓이 된다.


③    룰 B가 실행되었다 (참)

룰B가 실행되면 $Concert에 Yes라는 값이 할당된다. 

즉 null 이외의 값을 가지고 있으므로 조건은 참으로 판명된다.


④    $Concert에 No라는 값이 할당되어 있다.(참)

이 경우도 조건은 참으로 판명된다. 

룰C의 조건식은 $Concert에 할당된 값이 무엇이냐는 구별하지 않고 값이 할당된 적이 있느냐만 구별하기 때문이다.







만약 값이 Yes일 때만 실행하도록 하고 싶으면 룰C의 조건문을 다음과 같이 수정하면 된다.


 

D.     t: ($Concert==Yes) 그런데 투애니원 콘서트에는 누구와 갔었어요?


E.     t: ($Concert!=No) 그런데 투애니원 콘서트에는 누구와 갔었어요?


 

이때 Yes와 No의 의미는 챗봇의 작성자가 임의로 정한 것으로 본인이 파악할 수 있으면 된다. 

여기서 주의할 점은 등호의 왼쪽과 오른쪽에 빈칸이 없어야 한다는 점이다. 좌우를 비교하는 관계식은 빈칸없이 붙여 써야 한다.

















3. 모를 때만 질문하기


A.     u: ( _*1 좋아*) 그렇군요. 저도 _0 좋아해요. $Favorite = _0


_언더바 명령어

사용자가 입력한 단어가 무엇이든 한 단어를 단기기억 변수에 저장


(_*1)

언더바가 붙은 와일드 카드에 숫자 1을 지정


저장한 후 출력문에서 _0에 의해 호출되어 사용자에게 출력된다

동시에 $Favorite에 사용자가 입력한 단어 저장


임시기억장소->장기기억장소로 옮기는 것







B.     t: (!$Favorite) 투애니원 멤버 중에 특별히 좋아하는 멤버가 있어요?

a: (~박봄) $Favorite = 박봄

a: (~씨엘) $Favorite = 씨엘

a: (~산다라) $Favorite = 산다라

a: (~민지) $Favorite = 민지





출처 : http://exagen.tistory.com/notice/63 [혼자 힘으로 한국어 챗봇 개발하기]



+ Recent posts