Gurugail NLP/Dialogue System
NLP

Dialogue System

대화 시스템 (KGDC 2004)

본 글은 2004년 구본수 (perpet@hitel.net) 님이 그루게일에 올린 글을 활용하여 위키 형태로 옮긴 글임을 알려드립니다.


서론

자연언어 분야를 처음 접할 때 딱딱하고 지루한 것을 대화시스템이란 프로그램 소개를 통해 개발자들이 쉽게 다가갈 수 있는 계기가 되길 바란다.


1. 대화 시스템이란 무엇인가.

대화 시스템이란 인간이 사람과 채팅을 하듯이 컴퓨터와 채팅이 가능한 프로그램을 말한다. 대화 시스템은 사람처럼 사용자의 질문에 대답을 할 수 있으며 대답 또한 질문의 요점을 벗어나지 않고 마치 사람이 대답하듯이 말하는 것을 뜻한다.


2. 대화시스템의 분류

대화시스템은 발화이해의 관점,대화 주도권의 관점,대화모드의 관점으로 분류된다.

2-1. 발화 이해의 관점

일상대화에서 청자는 발화 자와 대화를 통해 발화자의 의도를 인식한다. 그러기 위해서는 현재 대화의 상황을 파악하고, 발화자의 대화가 어떤 상황에 맞는 전형적인 표현의 대화인지도 파악해야 하며 이것을 통해 청자는 발화자의 신념, 욕구, 의도 등을 인식해야 한다. 신념, 욕구, 의도 등을 인식하는 프로그램 모델을 구축하는 것은 매우 까다로우며 인간의 감성을 단순한 프로그램으로 모델링 한다는 것은 쉽지 않다. 다음에 소개되는 프로그램들 또한 이런 발화자의 신념, 욕구, 의도 등을 인식하지 못하며 단순한 질문에 응답만 하는 아주 기초적인 프로그램들이다.

2-2. 대화 주도의 관점

사용자와 시스템 중 어느 쪽이 주로 대화의 주도권을 가지고 있는가라는 관점에서 대화시스템을 3가지 방식으로 볼 수 있다.

첫 번째는 질문응답 시스템이며, 기본적으로 시스템은 사용자가 입력한 질문이나 요구를 이해하고,이에 수동적으로 시스템은 사용자가 입력한 질문이나 요구를 이해하고,이에 수동적으로 응답하는 거다.

두 번째는 사용자의 목적 달성을 위해 시스템이 보다 적극적으로 기여하는 상담 시스템이다. 사용자의 목적이나 계획을 이해하고,그 달성에 필요한 정보를 제공하거나 장해를 지적하기도 한다. 시스템은 때때로 사용자의 불명확한 의도를 파악하기 위해 질문을 하기도 하며 이로서 사용자가 의도하는 목적을 파악하여 적절한 대답을 제공한다.

세 번째는 시스템은 대화적 설명 시스템이며, 주로 시스템이 주도권을 가지고 어떤 설명을 한다. 단 시스템이 일방적으로 설명하는 것이 아니라, 사용자는 그 내용에 대해 불명확한 점을 반문하거나 보다 상세한 설명을 요구한다.

2-3. 대화 모드의 관점

보통, 인간끼리의 대화는 음성을 매개로 한다. 서로 마주 보고 대화하는 경우는, 시선이나 표정이나 동작 등에 의해서도 다양한 정보가 전달된다. 대화 시스템 또한 음성인식이나 그 외의 동작이나 시각적인 정보를 이용한 대화가 가능하다. 하지만 다음에 소개되는 대회시스템 프로그램은 단순한 텍스트 입력을 베이스로 한 프로그램들이다.


3. 대표적인 프로그램들 소개

3.1. 심심이

http://www.simsimi.pe.kr/

단순한 패턴 검색을 통해 특정 문장에서 특정 문장으로 응답하도록 만들어진 프로그램 이다. 이것은 가장 단순한 방법으로 프로그램은 전혀 융통성 없이 그냥 유저가 질문한 문장을 자신의 DB 정보에서 찾아 똑 같은 문장이 있는지 확인하고 있으면 해당하는 말을 응답하도록 설계되어있다.

3.2. Eliza

http://www.1cplusplusstreet.com/vb/scripts/ShowCode.asp?txtCodeId=5499&lngWId=3 http://elizatalk.sourceforge.net/

Eliza는 1970년대 말 Joseph Weizenbaum 이 만든, 심리치료사의 행동을 시뮬레이션 하는 인공지능 프로그램이다. 심리치료사는 비 지시적 질문과 중립적 응답을 통해 환자를 치료하는데, 이 프로그램은 환자가 키보드 입력을 통하여 문제를 호소하면, 화면에 적절한 응답을 표시함으로써 대화를 이끌어 나간다.

이 프로그램의 가장 큰 특징은 입력문장중이 들어오면 프로그램이 이미 예측한 문장형식인지 파악 후 적절한 변화를 통해 대답하도록 되여 있다. 예를 들어 프로그램이 이미 예측되어진 문장에 따른 응답패턴이 다음과 같이 입력문 : “너는 *을 *하니? ” 출력문 : “나는 *을 *해” 라고 인식되어있는 상황에서 사용자가 “너는 사과를 좋아하니” 라고 물어보면 대화시스템은 “나는 사과를 좋아해” 라고 응답할 것이다.이렇게 사용자가 기본적인 대화 패턴을 가지고 물어보면 대화 시스템은 이미 예측되어진 문장패턴을 찾고 거기에 맞는 응답패턴을 구성하여 대답한다. 이것은 가장 기본적인 로직을 설명한 것이고 좀더 융통성 있는 대답을 위해 여러 가지 방식으로 응답패턴을 분석하고 변환한다. Eliza 시스템 설명

다음은 Eliza 시스템을 구성하고 있는 파일들을 설명한다.

구성파일설명
syn.dict줄임 말이나 은어 등을 표준어로 바꾸는데 사용한다.
main.dict질문의 핵심어 및 문장 패턴의 정보를 가지고 있다.
Words 폴더단어를 카테고리 별로 묶어놓은 정보를 폴더 안에 파일 단위로 둠.

a 질문의 문장이 들어오면 syn.dict 파일을 이용해서 줄임 말이나 은어 등을 표준어로 바꾼다. b main.dict 파일에 있는 정보를 이용하여 유저가 말한 문장에서 핵심어나 질문패턴이 있는지 찾는다. c 찾은 핵심어나 질문패턴에서 가장 높은 우선순위를 가지고 있는 것을 응답 문으로 만든다. d 핵심어나 질문패턴이 발견되지 않으면 미리 준비되어있는 다른 대화 거리로 응답한다.

3.3 MegaHal

http://megahal.alioth.debian.org
Loebner Prize Contest : http://www.loebner.net/Prizef/loebner-prize.html

MegaHal 은 1996 년 Loebner Prize Contest(이하 LPC) 란 곳에서 소개되어졌다. LPC 란 누가 더 사람같이 생각하며 대화하는 프로그램을 만드는지 경연하는 곳이다. 여기서 MegaHal 이 Jason Hutchens 에 의해 소개되었다. MegaHal 의 핵심구조는 인간의 대화 내용을 마르코프 모형으로 데이터를 저장한후 사용자가 질문을 하면 질문의 핵심단어와 자신이 저장해둔 데이터를 조회한 후 거기서 가장 적절한 문장을 생성해 낸다.

Markov Model

간단하게 마르코프 모델이란 여러 기호(여기서는 단어) 들이 입력될 때 그 입력되는 기호들의 의존도를 수치로 표기하는 방식이다. 2차 마르코프 모델의 식은

P(c|a,b) = C(a,b,c) / C(a,b,*)

이다 .여기서 C(a,b,c) 는 과거에 기호열 a,b,c 가 관찰된 횟수를 의미하며, * 는 알파벳의 어떤 기호에도 부합하는 특별한 와일드카드 기호이다. 이식의 의미를 말로 풀자면, 열에서 기호 c가 a,b 문맥에서 나타나는 빈도를 a,b,c 가 나타난 빈도로 나누어서 정규화하는 것이다.

예를 들어

“사람들-은-술-을-좋아-한다” “사람들-은-밥-을-좋아-한다”

여기서 기호는 (사람들,은,술,밥,을,좋아,한다) 로 인식하고 이들 기호들간의 의존도를 수치로 가지고 있는 것이다. 만약 2차 마르코프 모델로 적용을 해서 “사람들-은” 이란 말 다음에 “술”이 올 수 있는 확률을 평가한다면 P(술 | 사람들,은 ) = C(사람들,은,술) / C (사람들,은,*) 이고 결국 0.5 = 1 / 2 가 된다.

MegaHal 이 마르코프를 적용하는 방식은

1. 미리 수많은 대화 내용을 4차 마르코프로 모델로 구성한다. 2. 입력한 단어들 중 핵심어들을 추출한다. 3. 핵심어들을 가지고 이미 구성한 마르코프 모델에 적용하여 여러 문장을 만든다. 4. 가장 높은 수치가 나온 문장을 응답문장으로 채택한다.

MegaHal 시스템 설명

다음은 MegaHal 을 구성하고 있는 파일들을 설명한다.

구성파일설명
MEGAHAL.BRN이미 학습한 대화내용을 마르코프 모델로 저장해둔 파일
MEGAHAL.TRNBRN 파일이 없으면 이 파일을 읽어 들여 학습을 시킨다. 파일 안에는 일상적인 대화내용들을 담아 놓는다.
MEGAHAL.DIC단어들을 순차적으로 나열해서 저장해 두었다. 프로그램이나 마르코프 모델은 직접 단어를 저장하지 않고 이 파일에 있는 단어순의 인덱스 값을 사용한다. 그러므로 사전에 단어를 추가할 시 마지막부터 추가해야 한다. 또한 새로 학습된 단어들은 자동적으로 이사전의 맨 뒤에 추가된다.
MEGAHAL.GRT보통 유저가 입력한 문장을 가지고 핵심어를 추출하여 응답하지만.처음에 MegaHal 먼저 인사를 해야 하기 때문에 미리 만든 첫인사 관련 핵심어 이다.
MEGAHAL.BAN유저가 입력한 문장을 핵심어로 반들 때 핵심어로서 사용하면 되지 않는 단어리스트를 가지고 있다. 보통 조사나 감탄사 등이 여기에 속한다.
MEGAHAL.SWP핵심어로서 가능한 단어지만 변환이 필요한 단어다 . 질문할 때의 단어가 핵심어로 채택되면 답변할 때의 단어로 변환이 필요한 단어들 가령“너”->”나”,“너희”->“우리” 등과 같은 것이다.
MEGAHAL.AUX핵심어에 보조어가 있으면 보조어로도 입력

사용자가 질문을 던지고 답변하게 되는 전 과정을 살펴보면.

A. 우선 BRN 파일과 DIC 파일을 읽어 자신이 이미 학습한 내용을 로딩한다.
B. BRN 파일이 없으면 TRN 파일을 읽어 대화내용을 학습한 후 BRN 파일과 DIC 파일

을 만든다.

C. 사용자가 입력한 질문 문장을 단어단위(키워드)로 분리한 후 BAN 파일을 이용해 키워드가 될 수 없는 것들은 제외시킨다. BAN 파일에는 보통 조사나 감탄사가 들어있다. 결국 키워드가 되는 것들은 보통 명사라고 보면 된다.
D. SWP 파일을 이용해 변환될 키워드가 있는지 분석한 후 변환을 시켜 최종 핵심어들로 구성한다. 위에서 제시했듯이 질문 형 문장의 “너”,“너희” 등의 단어들이 “나”,“우리” 등으로 변환된다.
E. 생성된 키워드를 가지고 이미 학습한 문장과 연결해서 새로운 응답 문을 만든다.
F. 새로 생성된 문장 중 가장 높은 확률 값을 가진 문장을 답변으로 응답한다.
G. 방금 전 유저가 질문한 문장을 전에 학습한 모델에 적용한다. 결국 유저가 말하는 것도 바로 학습시킨다.

4. Meghal 한국어 변환 (적용)

Megahal 다른 나라 버전으로 구성할 수 있는 시스템이란 점에서 한번쯤 한국어 버전을 만드는 것도 시도해 볼만하다. 하지만 한국어 버전으로 만들려면 몇 가지 추가적인 작업이 필요하다.

품사태깅

Megahal 은 문장의 구조를 마르코프 모델로 저장할 때 기본단위가 품사단위이다. 영어는 품사들이 뛰어 쓰기로 구분되어있어 프로그램이 그냥 뛰어 쓰기를 바탕으로 품사들을 나누면 된다. 하지만 한국어는 뛰어 쓰기로 한국어를 구분할 수 없다. 가령 “그들은 밥을 먹는다” 이것을 품사 태킹 하면 “그-들-은-밥-을-먹-는다” 이다. 우선 이렇게 세밀하게 태깅을 해야만 Megahal 좀더 창의적인 말을 만들어 낸다. 품사 태깅을 몇 십 페이지를 써서 설명해도 모자라기 때문에 여기서는 품사 태깅을 설명하지 않는다.(사실 잘모름-.-;) 품사 태깅에 관한 정보를 얻고 싶으면 세종계획(www.sejong.or.kr) 이나 한국어학회(http://www.koreanlinguistics.or.kr) 홈페이지에서 관련정보를 얻을 수 있을 것이다.

여기서는 간단한 방식으로 문장을 80-90% 태깅 하는 방법을 설명한다.

A 문장을 우선 뛰어 쓰기 단위로 분리한다.
B 뛰어 쓰기로만 구분되어진 단어를 사전과 비교한다.
C 우선 단어전체와 사전을 비교하고 없으면 맨 뒤부터 하나씩 제거 해서 비교하다가 사전과 일치하는 게 있으면 그 부분과 나머지를 분리 해여 태깅 한다.
D 나머지부분을 다시 같은 방법으로 태깅 한다.

예를 들어 “우리들은”을 위와 같은 방식으로 태깅 한다면 처음 “우리들은” 과 단어사전 데이터와 비교할 것이다 하지만 단어사전에는 “우리들은” 은 없을 것이다. 다음단계인 “우리들”로 다시 비교하고 이것도 존재하지 않기 때문에 결국 “우리”-”들은” 으로 태깅이 된다. 그럼 우선 “우리”라는 것은 태깅이 끝난 거고 나머지 “들은” 을 가지고 같은 방식으로 분석하면 “들”-“은” 으로 분석이 된다. 최종 태깅은 “우리-들-은”이 된다. 이런 식으로 단순하게 해도 어느 정도 품사들이 태깅이 되므로 호기심으로 Megahal 한국어 버전을 만들고 싶은 사람은 이렇게 시도해보기 바란다.

한국어 전자 사전

품사를 태깅 하거나 앞으로 좀더 융통성 있는 대화 시스템을 만들려면 국어 사전이 필요하다.국어 전자 사전은 세종계획(www.sejong.or.kr) 사이트 가면 어느 정도 데이터를 받을 수 있다.하지만 내가 접속할 당시 제대로 지원이 되지 않고 있었다. 그래서 공짜로 국어 사전 데이터를 얻을 수 있는 방법을 알아보다가 해결한 것이 인터넷 국어 사전이다. 요즘 여러 사이트에서 인터넷으로 국어 사전이 제공된다. 인터넷 사이트에서 제공되는 사전들의 주소들을 보면 사전의 인덱스 순으로 정렬 되여 있는 것을 볼 수 있을 것이다. 그러므로 자신이 직접 http 를 쿼리 하는 프로그램을 짜서 주소를 순차적으로 불러들여 자신이 원하는 데이터만 뽑아 사용하면 자신이 원하는 포맷의 국어사전을 만들 수 있을 것이다. 참고로 MegaHal 사용할 국어사전이라면 품사별로 국어사전 데이터를 구축하는 게 여러 가지로 편하다.

학습 문장

MegaHal 의 성능을 최대한 끌어들이려면 MegaHal 에 학습시키는 MEGAHAL.TRN 파일의 내용이 매우 중요하다. 여기에 드라마에 나오는 대사를 저장하여 학습을 시키면 MegaHal은 분명 드라마에 나온 대사들을 남발 할 것이다. 그러므로 학습시킬 더미 대화 파일을 무엇으로 선택할지도 나름대로 고민하기 바란다. 개인적으로 시도 했던 방법은 일반 인터넷 채팅 사이트에 접속해서 몇 십 분 동안 가만히 나두고 그 동안 다른 사람들이 애기한 내용을 갈무리 해서 이 내용을 가지고 학습을 시키는 방법이다. 아니면 일상적인 소재를 한 영화 대본을 구해서 그 대본을 가지고 학습을 시켜보면 나름대로 좋은 성과가 나오지 않을까 생각한다.

한국어에 적합한 n 차 마르코프 선택

영문 MegaHal 은 4차 마르코프 모델을 사용한다 차수가 높을수록 앞뒤 단어의 의존도를 높여준다 차수가 너무 높으면 학습한 문장으로 새로운 문장을 만들어 내는 문구가 기존 학습문장과 비슷해지고 차수가 낮을수록 새로운 문구를 만들어 낸다. 아마도 영문은 4차 마르코프가 가장 적당하다고 생각한 것 같다. MegaHal 한국어 버전을 만들게 되면 자신이 직접 차수를 높이거나 낮추어 봐서 가장 적당한 차수를 선택하기 바란다. 개인적으로 3차 마르코프를 선택 했다. 차수를 더 낮추어보니 앞뒤 문맥이 전혀 어울리지 않는 경우가 많이 생겼다.

개선 방향

MegaHal 수준의 대화 시스템을 생각하고 있다면 몇 가지 기능을 개선하므로 좀더 좋은 성능을 낼 수 있다. 가령 많은 사람들이 단순한 질문-답변 셋으로 구성된 심심이 프로그램에도 매우 놀라며 즐거워 한다.이것은 답변 문장이 이미 예측한 확실한 질문문장을 알기 때문에 가장 적절한 답변을 하기 때문이다. 하지만 일일이 모든 질문을 예측하지 못하기 때문에 그 한계가 있는 것이고 그것을 극복하고자 문장을 패턴으로 인식하는 방식을 생각하게 되는 것이다. 이런 것을 종합하여 대화 시스템 안에 심심이+Eliza+MegaHal 기능을 모두 넣어 유저가 입력한 질문문장을 심심이->Eliza->MegaHal 순으로 분석하여 가장 적절한 응답문장을 만들면 좀더 나은 답변이 나올 것이다. 또한 MegaHal 의 학습 시스템을 개선하여 한 차원 높은 대화 시스템을 만들 수 있다. MegaHal 의 마르코프 모델 학습은 그냥 순수한 단어들을 기호로 패턴을 인식하게 만든다. 가령 “나는 사과를 좋아해” “나는 과자를 좋아해”라는 것이 학습되면 MegaHal은

라고 학습된다. 만약 단어를 단어 그대로 인식하는 것이 아니라. 단어자체 특정 카테고리로 구분해서 좀더 나은 성능을 발휘하게 할 수 있다. 다시 말하면 단어로 인식하는 것뿐만 아니라 단어의 개념과 성질을 카테고리로 묶어서 표현한다면 MegaHal은 좀더 좋은 성질을 낼 수 있다. 성질상 “먹는 물질” 이란 카테고리가 있고 여기에 사과와 과자 가 포함되어있다면 MegaHal은

으로 인식될 수 있다. 이런 식으로 좀더 융통성 있는 구조로 잡아간다면 대화 시스템은 훨씬 더 똑똑하게 만들 수 있을 것이다. 그럼 카테고리를 어떻게 구성하고 발전시킬 수 있을까 자연언어학문을 좀더 탐구한다면 이미 여러 가지 방법이 나와있을 것이다. 개인적으로 생각한 방법은 이렇다.

A 우선 사람이 직접 카테고리를 나눌 수 있을 정도로 나눈다.
B 카테고리 안에 기본적으로 몇 개의 단어들을 넣어둔다.
C 학습용 더미 대화 내용을 읽어 들인다.
D 이미 개발자가 입력한 카테고리 정보에 의해 “나는-(먹는 것)-를-좋아해”라고 학습되어있고. 만약 새로운 학습문장에서 “나는 우유를 좋아해” 라는 문장이 들어오면 우유가 “(먹는 것)”란 카테고리 안에 없지만 문자 자체 “나는-(먹는 것)-를-좋아해”안에 우유가 쓰인 것을 알고 우유를 프로그램에서 자동으로 카테고리(먹는 것)에 넣는다.

여기서 애기한 몇 가지 기능개선만으로도 훌륭한 대화 시스템을 만들 수 있을 것이다.

* “을”,”를” 을 따로 인식되게 하지 않는 방법으로 이 둘을 특정 카테고리 (을,를 조사) 를 만들어 하나로 인식 시키는 것이 좋을 것이다.

5. 정리

현재 나와있는 몇 가지 대화 프로그램과 개선점을 설명하면서 일반 개발자들도 어느 정도 뛰어난 대화 시스템을 만들 수 있을 것이라고 생각한다.학문적으로 본다면 그렇게 높은 가치가 있는 것은 아니라고 생각한다. 왜냐면 앞에서도 설명했듯이 자연언어 분야에서의 대화시스템이란 컴퓨터가 발화자의 의도를 이해하고 있어야 하고, 때로는 정보를 얻으려고 질문을 던져 답변을 받아낼 수 있어야 한다. 이런 점에서 여기에서 제시한 프로그램은 단순하다고 봐야 할 것이다. 하지만 어려운 자연언어 분야에서의 대화 시스템을 단순하고 쉽게 접근하므로 개발자들이 관심을 가질 수 있는 좋은 기회였기를 바란다.만약 이 글을 읽는 개발자가 좀더 높은 수준인 발화자의 의도도 파악하고 질문도 해서 정보를 얻는 프로그램을 만들 생각을 한다면 개발하기 전에 자연언어분야를 어느 정도 공부를 하고 도전하기 바란다.

참고자료