패턴 연산자는 패턴이 사용자 입력문에서 발견된다면 어떻게 발견되어야 하는지, 위치는? 순서에 상관없이? 어느 하나만? 단어의 일부만? 등등에 대해 정의하는 도구이다. 이 도구를 잘 활용하면 적은 룰로 다양한 변이를 모두 매칭시킬 수 있기 때문에 연산자의 특징을 잘 익혀두어야 한다. 3장과 4장에서 설명했던 연산자 및 일부 제외했던 연산자들을 이곳에서 다시 한 번 정리하기로 하겠다.
① 사용자 입력문의 형태
사용자가 입력한 문장의 형태가 무엇이냐에 따라 그에 맞춰 반응할 수 있는 s: ?: !: u:의 4가지의 룰타입이 있다. 각각 순서대로 평서문, 의문문, 감탄문, 어느 것이든 상관없음을 의미하는데 보통 대화창에서는 의문부호(?)나 느낌표(!) 등을 생략하는 경우가 많기 때문에 문장 부호에 의존해서 룰타입을 작성하는 것은 바람직하지 않다고 할 수 있다. 영문버전의 경우는 CS엔진이 POS Tagging과 Parsing을 통해 문장부호가 없더라도 의문문인지 평서문인지, 동의하는 것인지 힐난하는 것인지 등을 구별할 수 있으나, 한국어에 대해서는 POS Tagging이나 Parsing을 할 수 없기 때문에 오로지 사용자가 입력한 문장부호에 의존해야 한다. 그리고 이는 바람직하지 않으니 우리말에서는 가급적 u: 타입을 사용할 것을 추천한다.
② 동일한 패턴이 여러 토픽에 존재
동일한 패턴을 가진 룰이 여러 토픽에 중복되어 있어도 상관없다. 예를 들어 자동차 토픽과 여행토픽에 u: ( 경주 근처의 한옥 호텔은 어디에 있어요) 라는 동일한 패턴이 있어도 상관없다.
③ 존재 여부의 확인
가. 패턴매칭이란 간단히 말하면 특정 단어나 컨셉이 사용자 입력문에 존재하는가를 확인하는 것이다.
나. 사용자 변수가 존재하는지(=정의 되었는지)는 호출해 보면 알 수 있다.
l u: ($myvar help) 이 룰은 사용자 변수 $myvar를 호출함으로써 값이 존재하는지 확인하고 있다. 만약 $myvar가 앞쪽 어디에선가 정의 되었고, 즉 값을 할당 받았고 그리고 사용자가 help라는 단어를 입력하면 매칭이 된다.
다. 시스템 변수는 말 그대로 시스템이 직접 관리하고 유지하는 변수이기 때문에 값이 존재하는지 별도로 확인할 필요는 없고 필요할 때 호출해서 사용하면 된다. 시스템 변수의 완전한 목록은 함께 딸려오는 ChatScript System Variables and Engine-defined Concepts에 있다.
라. 단기기억 변수는 호출하는 것 만으로 값의 존재여부를 묻는 것이 된다
l u: ( _{사과 오렌지} _0 ) 단기 변수 _0이 패턴에서 호출되었는데, 이는 _0의 값이 존재하는가를 확인하는 것이다. _0의 값이 존재하려면 사용자가 사과나 오렌지를 입력했어야만 변수에 저장이 되므로 결과적으로 사용자가 사과 또는 오렌지라고 입력했을 때만 이 룰은 매칭이 된다.
마. ?(물음표)가 단독으로 사용되면 의문문 인지를 확인하는 것이고 !?(느낌표에 뒤이어 물음표)는 의문문이 아닌가를 확인하는 것이다. 예를 들면,
l u: ( ? ) 제 질문에 답하실 차례인데 왜 질문을 하세요?
l u: ( !? ) 저는 잘 모르는 내용이에요. 다른 얘기하실까요?
④ 그룹핑
가. ( ) 괄호 : 괄호 안에 포함된 모든 단어들이 반드시 순서대로 발견되어야 한다.
나. [ ] 꺽은 괄호 : 꺽은 괄호 안에 포함된 단어들 중 하나가 발견되면 되는데, 앞에서부터 순서대로 매칭을 시도해 오다가 매칭이 되면 그 이후의 단어는 추가 매칭 여부를 조사하지 않고 끝낸다.
다. << >> 이중 꺽쇠 : 이중 꺽쇠 안에 포함된 단어들이 순서와 상관없이 발견되기만 하면 된다. 순서 없이 매칭시키기 때문에 이중 꺽쇠 안에 와일드카드 *를 포함시키는 것은 의미가 없다.
라. { } 활괄호 : 활괄호 안에 있는 포함된 단어들 중 하나와 매칭이 되거나 어느 하나와도 매칭이 안되어도 된다.
⑤ 와일드카드
가. * (애스터리스크) : 어떤 단어와도 매칭이 되며 그 개수도 상관없다.
나. *~2 : 어떤 단어와도 매칭이 되는데 매칭되는 단어 개수는 0개 ~ 2개까지 가능하다.
다. *3 : 사용자 입력문에서 현재의 매칭시작 위치로부터 단어 3개를 매칭한다. 만약 현재의 매칭시작 위치가 문장 끝이라면 더 이상 단어가 없을 것이므로 매칭에 실패한다.
라. *-2 : *3와 방향이 반대이다. 즉 현재 매칭시작 위치로부터 문장 앞방향으로 단어 2개를 매칭한다.
⑥ 부분 와일드카드
가. 집* : 집에, 집의, 집으로, 집까지 등 집으로 시작하는 모든 단어와 매칭
나. 2집* : 숫자를 명시하면 총글자수를 그 숫자에 맞춰 매칭시킨다. 2집*으로 작성하면 총글자수가 2개인 “집에”, “집의” 등이 매칭된다.
다. *집 : 술집, 떡집, 고깃집 등 집으로 끝나는 모든 단어와 매칭
라. 노.방(가운데 마침표) : 마침표는 단 한 글자를 매칭시키는 와일드카드이다.
⑦ 복합명사
겹 따옴표로 묶거나 _(underbar)로 묶거나 띄어쓰기를 하지 않아야 한 단어로 취급한다.
l “내가 제일 잘 나가”
l 내가_제일_잘_나가
l 내가제일잘나가
⑧ 사용자 입력단어 저장하기
패턴에 열거한 단어 앞에 _(underbar)를 붙이면 사용자가 입력한 단어 중 매칭된 단어를 단기저장 변수에 기억시킨다
⑨ 관계식
가. 관계식을 작성할 때는 관계식 전체에 걸쳐 빈칸이 없어야 한다.
나. 관계 연산자에는 ==, !=, <, >,< =, >=, ?, !? 등이 있다. 이 중에서 ?와 !?에 대해서만 추가 설명을 하면
다. u: ( $var? ) 사용자 입력문에 $var에 저장된 값이 존재하는가?
라. ? 왼쪽 항목이 오른쪽 항목 내에 존재하는가?
l u: ( _[ 사과 배 포도] _0?~사은품) 사용자가 사과 배 포도 중에 하나를 입력하면 그 단어가 첫번째 단기기억 장소(_0)에 저장된다. 그 값이 ~사은품 컨셉에 존재하는가, 즉 ~사은품의 멤버인가를 테스트 하고 있다.
마. u: ( ? ) 사용자 입력문이 의문문인가? à 이때는 관계 연산자가 아님
⑩ 예약어 매칭
CS엔진이 사용하는 예약어를 자연어로 처리하여 사용자 입력문과 매칭시키고자 할 때는 그 예약어 앞에 백슬래쉬를 쓴다
l u: ( << \[ * \] >> ) 예약어인 꺽은 괄호를 예약어의 기능으로 사용하지 말고 사용자 입력문의 입력단어와 매칭하라는 룰
l u: ( \! ) !는 “not”의 기호로 사용되는 예약어 인데 그 앞에 백슬래쉬를 씀으로써 자연어 느낌표로 매칭하라는 뜻이다. 즉 사용자 입력문에 느낌표가 있다면 이 룰이 매칭된다.
⑪ 함수의 호출
가. 함수는 ^(윗꺽쇠)로 시작해서 호출한다. ^respond( ), ^lastused( )
나. 함수에는 시스템 함수와 사용자 정의 함수(매크로)가 있다.
다. 많이 사용되는 함수에는 reuse( ), respond( ), refine( )이 있다.
아래에 자주 사용하는 reuse함수와 outputmacro의 특장점을 비교해 놓았다.
⑫ 콘트롤의 위치
가. < (왼쪽 꺽쇠) : 왼쪽 꺽쇠는 매칭의 시작점을 사용자 입력문의 맨 앞으로 이동시키라는 명령어이다.
나. > (오른쪽 꺽쇠) :오른쪽 꺽쇠는 사용자 입력문의 가장 마지막 단어와 매칭을 시도하라는 명령어이다
예를 들어,
u: (<제 * 입니다>)
'제'는 문장의 첫 단어여야 하고 '입니다'는 문장의 마지막 단어여야 한다는 뜻이다. 따라서 위의 룰은 "제 이름은 민서 입니다"와 매칭이 된다.