인공지능은 우리 삶에 빠르게 스며들고 있다. 많은 분야에서 인공지능을 접할 수 있다. 그중에서도 인공지능 스피커는 우리 삶에서 어렵지 않게 찾아볼 수 있다.

스마트폰에서도 각 제조회사별로 인공지능 비서를 탑재하고 있고 구글에서도 인공지능 비서 기능을 제공하고 있다. 영화 ‘아이언맨’이 막 개봉됐을 때만 해도 인공지능 비서는 먼 미래의 모습일 줄 알았지만 인공지능 시장이 빠르게 성장해 일반인들도 쉽게 접할 수 있는 기술이 됐다.

그러나 아직은 영화 속처럼 완벽하게 의사소통이 가능하지는 않다. 어떤 상황에서는 기가 막히게 우리의 말을 잘 이해하지만 다른 상황에서는 이해하지 못해 엉뚱한 답변을 내놓기도 한다. 그렇다면 인공지능 비서는 인간의 언어를 어떻게 이해하는 것일까? 어떤 방식으로 사람의 말을 이해하기에 상황에 따라 다른 답변을 하게 되는 것일까?

인공지능이 언어를 배우는 것은 인간이 언어를 배우는 과정과 어느 정도 유사하다. 우리가 영어를 처음 배울 때를 생각해 보면 제일 먼저 알파벳을 배우게 된다. 그 이후에 알파벳을 조합해 기본적인 단어들을 배운다. 이러한 단어들을 조합해 문장을 만들어가며 언어를 배우게 된다.

(출처=과학기술정보통신부)
(출처=과학기술정보통신부)

인공지능도 비슷. 언어의 작은 단위부터 차근차근 배워가게 된다. 하지만 차이점이 존재한다. 인공지능이 언어에서 배우는 가장 작은 단위는 알파벳이 아니라 단어다. 좀 더 정확하게 표현을 하자면 의미를 갖는 문자열을 기본 단위로 학습을 하게 된다. 의미를 갖고 있는 단어의 의미를 통째로 학습하는 것이다.

이렇게 인공지능이 학습하는 작은 단위를 ‘토큰’이라고 부른다. 토큰은 단어가 될 수도 있고 구, 문장이 될 수도 있다. 이렇게 작은 단위별로 말을 나누는 과정을 토큰화(tokenization)라고 한다.

우리가 인공지능에게 학습시킬 언어들을 모아둔 것을 ‘말뭉치(corpus)’라고 한다. 이렇게 말뭉치가 준비되면 토큰의 단위를 지정해 토큰화를 진행하게 된다. 보통 토큰화를 할 때 토큰 단위를 단어로 지정해 분류하게 된다. 그렇다면 길게 이어진 말뭉치에서 단어 기준으로 잘라내려면 어떻게 해야 할까?

먼저 영어를 살펴보면 우리가 영어로 된 지문을 읽을 때 어디서부터 어디까지가 한 단어인지 어떻게 알 수 있나? 가장 쉬운 방법은 띄어쓰기를 기준으로 단어를 구분하는 것이다. “I have a dog.”라는 문장을 단어 기준으로 잘라내려면 띄어쓰기를 기준으로 구분해 단어를 잘라낼 수 있습. 이런 예시가 아니더라도 웬만한 영어 문장들은 띄어쓰기를 기준으로 단어 구분이 가능하다.

하지만 예외사항이 존재한다. “Don’t be afraid, Mr. Kim’s cheese burger is nice”이라는 문장을 보면 이 문장을 띄어쓰기 단위로 분리하는 것은 어렵지 않다. 다만 Don’t와 Kim’s 이 두 단어를 잘 살펴봐야 한다.

우리는 앞서 의미를 가진 문자열을 단위로 토큰화를 진행한다고 했다. 그렇다면 Don’t와 같은 경우 어떻게 나눠야 할까? Do not의 축약형이기 때문에 Do, n’t 이렇게 두 개의 토큰으로 나눌 수도 있고 이미 하나의 단어처럼 활용되고 있기 때문에 Don’t 이렇게 하나의 토큰으로 구분할 수도 있다.

Kim’s도 마찬가지. 영어에서 ‘s는 네 가지의 뜻으로 구분될 수 있다. 소유격이나 소유대명사로 쓰일 수도 있고 is나 has가 축약된 형태가 될 수도 있다. 그렇기 때문에 이를 구분하기 위해서 Kim’s를 어떻게 토큰화시켜야 할지 고민을 해야 한다.

이렇기 때문에 어떻게 토큰화를 해야 인공지능이 잘 이해하는지에 대한 정답은 없다. 우리는 상황에 맞게 더 적합한 방식을 택하면 된다. NLTK에서는 영어 코퍼스를 토큰화시킬 수 있게 도와주는 도구를 제공한다. 여기서 word_tokenize와 WordPunctTokenizer 이렇게 두 가지 종류의 도구를 사용해볼 수 있다. 그렇다면 앞선 예시 문장을 이 도구들을 활용해 토큰화 시켜보자.

먼저 word_tokenize를 활용해 토큰화를 진행하면 다음과 같은 결과가 나온다. Don’t와 같은 경우 ‘Do’, ‘n't’으로 분리했고 Kim’s를 ‘Kim’, ‘'s’로 분리했다.

다음으로 WordPunctTokenizer와 같은 경우 Don’t를 ‘Don’, ‘'’, ‘t’ 이렇게 세 가지로 분리하고 Kim’s 역시 ‘Kim’, ‘'’, ‘s’ 세 가지로 분리했다.

또 cheese burger와 같은 경우 두 단어이지만 이미 한 단어와 같이 활용되는 단어들도 있다. 다른 예시로 New York, Mc Donald와 같은 경우 두 단어지만 따로 분리해서 의미를 보면 다르게 해석될 수 있다. 그렇기 때문에 이러한 예외사항들을 잘 구분해 토큰화를 진행해야 한다.

교착어란 어근과 접사에 의해 단어의 기능이 결정되는 언어의 형태를 교착어라고 한다. 좀 더 풀어서 설명하면 명사의 문법 관계를 표시하기 위해 조사를 사용하는 언어를 말한다. 대표적인 조사로 ‘는’, ‘을/를’, ‘이/가’, ‘와/과’, ‘에서’, ‘에게’, ‘로’, ‘조차’ 등이 있다. 앞선 예시에서도 ‘그’에 다양한 조사를 붙여서 여러 단어를 만든 것이다.

그럼 한국어는 어떻게 토큰화를 해야 할까? 토큰화는 의미 단위로 분리를 하는 것이기 때문에 한국어 역시 의미 단위로 분리시키는 기준이 있으면 된다. 한국어는 바로 형태소가 그 역할을 하게 된다.

형태소란 뜻을 가진 가장 작은 말의 단위를 의미한다. 형태소는 의미를 가진 가장 작은 단위이기 때문에 형태소보다 더 작게 나뉘면 뜻을 잃어버리게 된다. 그렇기 때문에 한국어는 형태소를 기준으로 토큰화를 진행할 수 있게 된다.

영어와 마찬가지로 한국어를 형태소 기준으로 토큰화할 수 있는 도구들이 다양하게 있다. 그중에 몇 가지를 소개해보자면 먼저 예시 문장을 “열심히 노동한 당신 연휴에는 여행을 가보아요”로 설정하고 토큰화를 해보자.

먼저 Open Korea Text가 있다. 이 도구는 트위터에서 개발해서 오픈한 한국어 형태소 분석기다. 성능이 빠르기 때문에 다량의 코퍼스를 분석할 때 시간적으로 많은 도움이 된다.

다음으로 서울대학교 IDS 연구실에서 연구하고 개발한 꼬꼬마가 있다. 각 형태소에 대한 품사를 잘 명시해 주는 특징이 있다.

그 외에도 카이스트 연구실에서 개발한 한나눔, Shineware에서 개발한 코모란이 있다. 이 도구들에 예시 문장을 넣어보면 각자 다른 방식으로 토큰화를 진행하는 것을 알 수 있다.

이처럼 인공지능이 언어를 인식하기 위해서는 입력받은 언어에 대해 먼저 이해가 충분히 이뤄져야 분석이 가능하다는 것을 알 수 있다. 또 언어마다 갖고 있는 특징이 다르기 때문에 서로 다른 방식으로 인공지능이 언어를 분석해야 한다.

지금까지 알아본 과정은 인공지능이 언어를 입력받기 위한 초기 단계다. 토큰화를 시작으로 더 다양한 방식으로 언어를 정제하고 이를 숫자로 바꾸는 과정을 거치게 되는데 결국 토큰화는 언어를 숫자로 바꾸는 첫 번째 단계인 셈. 시간이 지날수록 이러한 과정들을 늘려가고 효과적인 방법을 찾아가면서 예기치 못한 상황들을 대처해가는 것이다. 이러한 노력들을 통해 인공지능의 더 나아진 모습들을 기대한다.

저작권자 © 애플경제 무단전재 및 재배포 금지