티스토리 뷰

 

CS는 사용자 입력문이 들어오면 입력문과 패턴을 비교하는데 어떻게 비교할 것인지는 패턴내에 함께 기술되어 있는 명령어에 따른다. 예를 들어 사용자가 아래와 얘기한다고 가정해 보자.

 

a. 집에 간다

b. 이모네 집에 간다

c. 집에 간다 말하고 나왔다

d. 집으로 간다

 

이들 문장 중 앞의 a, b, c 세 개 문장은 아래의 룰로 모두 매칭시킬 수 있다. (논의의 초점을 패턴에 맞추기 위해 출력문은 생략하였다)


 

 

A는 패턴 내에 별도의 명령어가 없는 경우인데 이런 경우 패턴 내에 나열되어 있는 단어가 사용자 입력문에 순서대로 연속적으로 나타날 경우에만 매칭되었다고 판단한다. 따라서 a와 같이 입력문과 패턴이 같거나 bc처럼 패턴이 입력문 내에 포함될 경우 일치한다고 판단한다.

그러나 마지막 예문 d와는 매칭되지 않는데, 단어가 일치하지 않기 때문이다. 패턴에는 집에로 되어 있는데 입력문은 집으로로 되어 있기 때문이다. 이런 경우를 대비해서 단어의 일부에 와일드카드(*)를 사용할 수 있다.

 

B.     u: (* 간다)

 

이렇게 하면, “집에”, “집으로”, “집까지으로 시작하는 단어들 모두와 매칭시킬 수 있다. 이는 매우 유용한 기능으로 특히 한국어와 같이 명사+조사 또는 동사의 어미변화가 있는 언어에 꼭 필요한 기능이라 할 수 있다. 따라서 패턴에 명사+*” 또는 동사의 어근+*”의 형태로 작성하여 사용자 입력문을 어절 단위로 매칭시킬 수 있도록 이 표현방법을 기억해 두기로 하자.[1]

부분 와일드 카드는 단어의 앞에 붙일 수도 있다. 예를 들어 “*이라고 작성하면 우리집, 철수집, 강아지집 등 으로 끝나는 모든 단어와 일치시킨다. 만약 *를 사용하지 않고 .(마침표)를 사용하면 오직 한 단어만 와일드카드 형태로 매칭시킬 수 있다. 예를 들어 .”이라고 패턴에 작성하면 집에는 매칭되지만 집으로는 매칭되지 않는다.

 

앞서의 룰을 좀 더 일반화시켜 보기 위해 다음의 입력문을 생각해 보자

 

e. 집으로 뛰어서 간다

f. 집에 지하철을 타고 간다

 

이 입력문에는 간다라는 단어 사이에 다른 단어들이 있다. 이는 흔히 사용하는 일반적인 용법이기 때문에 룰은 이에 대비할 수 있어야 한다. 이제 단독으로 쓰이는 와일드카드를 패턴에 추가해 보자.

 

C.     u: (*  * 간다)

 

*가 단어의 일부로 사용되지 않고 단독으로 사용되면 그 자리에 어떤 단어라도 그리고 몇 개의 단어라도 올 수 있다는 뜻이 된다. 단어가 하나도 없어도 되고 여러 개가 와도 된다. 그래서 위의 룰Ce, f와 매칭될 뿐만 아니라 아래의 입력문 g와도 매칭된다. 집에간다사이에 어떤 단어가 몇 개가 와도 되기 때문이다.

 

g. 나는 집에 볼 일이 있다고 말하고 나와서 영화관으로 간다

 

이것은 의도하는 바가 아닐 것이다. 와일드카드를 쓰는 이유는 동일한 뜻을 상이하게 표현하는 사용자 입력문에 효율적으로 대응 하려는 것이지 모든 입력문과 매칭시키려는 것은 아닐 것이다. 위의 규칙 C는 다음과 같이 수정하면 잘못되는 매칭을 최소화 할 수 있다.

 

D.     u: (*  *~2 간다)

 

*~2의 의미는 단어가 없거나 하나이거나 두 개까지 어떤 단어가 와도 좋다이다. 즉 이 자리에 오게 될 단어 개수의 범위를 0~2로 지정하는 것이다. 매칭시키려는 단어가 명사나 동사일 경우 보통 그 앞에 형용사나 부사 등의 수식어가 올 수 있는데 이런 경우 단어 개수의 범위를 제한한 *~1 또는 *~2 등을 사용하면 매우 유용하다.

그런데 이 경우 아래의 h와도 매칭이 된다.

 

h. 집에 못 간다.

 

부정어 때문에 뜻이 완전히 달라졌는데, 이와 같이 뜻이 완전히 달라지는 특정 단어는 !(느낌표) 명령어를 써서 매칭에서 제외할 수 있다.

 

E.     u: (!못 집*  *~2 간다)

 

!(느낌표)는 뒤따르는 단어를 제외하라는 명령어로 위의 패턴은 이라는 단어가 사용자 입력문에 나타나면 안된다는 뜻이다. , 사용자 입력문에 이라는 단어가 있으면 매칭에서 제외하게 된다.

이제 a~h까지의 입력문 모두에 대응할 수 있는 패턴을 완성하였다. 다소 복잡해 보이지만 이 책을 다 읽을 때 쯤이면 위와 같은 표기들에 익숙해져 있을 것이다. 영어 알파벳을 처음 배울 때도 대문자와 소문자, 필기체와 인쇄체 등 그 다양한 변이에 당황해 했다가도 곧 익숙해 졌듯 컴퓨터에게 말을 가르치는 이 명령어들도 쉽게 익숙해 질 수 있을 것이다.

 

 



[1] 또 다른 해결책은 사전과 형태소 분석기를 도입하는 것인데 이는 뒤에서 다시 설명하기로 하겠다. 사전이 없는 경우에는 "어근+*"의 형태로 일부만 와일드카드를 쓰는 방법과 활용형 전체를 리스트로 작성하여 컨셉으로 만드는 방법이 있다. 만드는 방법과 각각의 장단점에 대해서도 뒤에서 설명하기로 하겠다.







댓글
댓글쓰기 폼