brunch

You can make anything
by writing

C.S.Lewis

by 박성준 Jul 21. 2018

한국어를 위한 어휘 임베딩의 개발 -2-

한국어 자모의 FastText의 결합

이 글은 Subword-level Word Vector Representations for Korean (ACL 2018)을 다룹니다. 두 편에 걸친 포스팅에서는 이 프로젝트를 시작하게 된 계기, 배경, 개발 과정의 디테일을 다룹니다. 논문의 내용은 http://aclweb.org/anthology/P18-1226 에서 확인하실 수 있습니다. 


한국어를 위한 어휘 임베딩의 개발 (2) : 개발 동기과정결과 


들어가며 


먼저 한국어 데이터에 어떻게 FastText를 적용했는지를 다루기 전에, 한국어 임베딩을 시작하게 된 계기를 설명하고, 왜 이런 접근법을 사용하게 되었는지를 이야기해보려고 합니다. 사실, 논문에는 분량 제한 (타 분야와 달리, 대부분의 전산학 컨퍼런스 논문들은 놀랍게도 ‘최소’가 아닌 ‘최대’ 페이지 분량 제한이 있습니다) 때문에 이런 얘기를 쓸만한 공간이 모자랍니다. 대신, 우리가 무엇을 했고 이게 왜 새롭고 좋은 방법인지를 설명하는 것이 중요하기 때문에, 그러다보면 이런 구구절절한 설명은 별로 도움이 되지 않아서 주로 생략되곤 합니다. 

 

아마 한국어 자연어처리를 시도해보신 경험이 한 번이라도 있는 개발자/연구자 분들은 어느 정도 공감하시겠지만, SNS 등에서 수집한 ‘현실 세계의 한국어 텍스트’ 데이터에서 뭔가를 학습하거나 의미 있는 정보를 뽑아내는 일은 쉬운 일이 아닙니다. 한국어 텍스트 자료에 영미권 연구자들이 만든 자연어처리 기계학습 모델을 그대로 적용하면, 대부분의 경우 거의 작동하지 않는 경우가 많습니다. 특히, 한국어는 교착어로서 구문적 복잡성을 내재하고 있을 뿐만 아니라, 현실 세계에서 수집한 한국어 데이터에서는 수많은 의도적 오탈자, 띄어쓰기 오류 등, 다른 언어에서는 자주 발생하지 않는 문제들이 동시다발적으로 발생하기 때문입니다. 


일반적으로 이러한 어려움을 어떻게든 극복하기 위해서 여러 가지 방법들이 사용되는데, 규칙 기반(rule-based)의 접근법을 제외한 큰 방향성은 크게 두 가지로 볼 수 있습니다. 


형태소 분석을 이용해 어휘에서 의미적(semantic)인 부분이 아닌 것을 제거한 뒤 기계학습 기법 적용

어휘를 글자 수준으로 쪼개어 기계학습 기법 적용

첫 번째 방법의 장점은 한국어 어휘에서 구문적 특징을 대부분 제거함으로써, 코퍼스 상에서 등장하는 어휘의 종류를 획기적으로 줄일 수 있다는 것입니다. 하지만 단점 역시 구문적 특징을 제거하였기 때문에, 이 과정에서 원래 텍스트의 의미를 일부 잃어버릴 수 있다는 것입니다. 예를 들면, 한국어 문장은 조사 등에 따라서도 의미가 크게 바뀔 가능성이 있기 때문입니다. 또한, 대화 모델링과 같이 자연어 생성을 염두에 두는 경우 이러한 접근법은 현실적인 수준의 성능을 담보할 수 없는 경우가 많았습니다.

 

대신, 어휘를 글자 수준으로 쪼개어 기계학습 모델의 입력으로 활용하는 것은 위의 문제를 피해갈 수 있으며, 간단한 문제를 기계학습 기법으로 풀고자 할 때 좋은 방법입니다. 그러나 이 방법의 단점은 어휘 임베딩이라는 좋은 재료를 사용할 수 없다는 것입니다. 


대부분의 자연어 처리를 위한 인공신경망 모델의 경우, 학습해야하는 파라미터(trainable parameter)중 매우 큰 비중을 차지하는 것이 어휘 임베딩 레이어(embedding layer)입니다. 어휘 임베딩은 이 레이어의 적절한 초기값을 제공함으로써 모델의 성능을 높이는데, 적절한 초기값이 없을 경우 시스템의 성능이 떨어질 뿐만 아니라, 강력한 정규화(regularisation) 방법을 적용해도 학습할 때마다 수렴결과의 차이가 커져 안정적인 결과를 내지 못할 우려가 있는데, 이는 특히 확보한 데이터셋의 규모가 작을 때 매우 중요해집니다. 


물론, 이러한 단점들은 풀고자 하는 자연어 처리 과제에 적합한 수 억 단위의 한국어 문서가 있고, 활용할 수 있는 계산 자원이 넘쳐난다면 이런 이슈를 신경 쓸 필요가 전혀 없어집니다. 하지만, 그만한 양의 데이터를 확보하고 처리하는 것은 또 다른 종류의 어려움이 있고, 계산 자원의 제한이 없이 무언가를 시도할 수 있는 곳은 극히 일부이므로, 여기서 이러한 예외적인 경우는 논외로 하겠습니다.  

 




심리상담 대화 모델링을 위한 어휘 임베딩 


사실 이 프로젝트는 한국어 심리상담 자료에 기계학습기반 대화 모델링(conversation modeling) 기법을 적용하기 위해 시작되었습니다. 2015년 이후부터 등장하기 시작한 encoder-decoder (Seq2Seq) 모델 기반 대화 모델링 기법들은 자연어 생성 및 정보 인출(information extraction)에 탁월한 성능을 보인다는 것이 입증되었고, 지난 주 마무리된 ACL 2018에서 발표되고 있는 유관 모델들 또한, 이제는 encoder-decoder 모델을 기본적으로 차용하고, 거기에 Memory 구조 및 다양한 레이어 구조 및 연결관계를 추가하여 사용하고 있습니다. 이러한 모델들은 이제 어휘 임베딩의 사용을 당연하게 가정하고 따로 언급하지 않습니다. 

 

즉, 심리상담 대화 모델링을 위해서는 어휘 임베딩을 사용해야했지만, 데이터의 특성상 앞서 언급했던 기존 접근법을 사용하기 어려웠습니다. 형태소 분석 등을 이용해서 전처리를 수행하면 어휘에서 구문적 특징을 나타내는 부분이 제거되는데, 이는 특히 대화 속에서 표현되는 내용 뿐만 아니라 형식 또한 굉장히 중요하게 다루어지는 심리상담 영역에서 택할 만한 좋은 접근법이 아니었습니다. 


그렇다고 해서 글자 수준으로 쪼개어 어휘 임베딩을 사용하지 않고 기계학습 모델을 구성할 경우 성능을 담보할 수 없다는 문제가 있었습니다. 심리상담 대화록은 데이터의 특성상, ‘기계학습 모델을 적당히 적용해도 잘 학습될 만큼 충분히’ 큰 데이터 사이즈를 확보하는 것이 사실상 불가능에 가깝습니다. 특히 이러한 작은 데이터셋을 이용해서 유의미한 결과를 산출하기 위해서는 어휘 임베딩과 같은 좋은 외부 소스(out-of-domain)에 의존해야만 하는 것이 필수적이었습니다. 

 

그렇다면 이제 목표는 명확해졌습니다. 의미적 정보 뿐만 아니라 구문적 정보까지 잘 학습할 수 있는 한국어 어휘 임베딩이 그것입니다. 앞선 글에서 언급했듯이, 한국어 자료에 SGNS를 적용했을 때 구문적 특성을 제대로 학습하는 것이 매우 어려웠고, 이는 한국어가 교착어로써 구문적 변화가 매우 다양하기 때문이었습니다. 그리고 이러한 어휘 임베딩을 만들기 방향성은 크게 세 가지가 있다고 보았습니다. 


 



개발의 방향성 : SGNS vs CNN/RNN 

 

세 가지 방향성 중 첫 번째는, SGNS를 기반으로 하는 FastText를 적용하는 것입니다. 두 번째는 CNN이나 RNN을 활용하여 어휘 임베딩을 학습하는 인공신경망 모형을 새로 만드는 것, 마지막으로는 기존 어휘수준 임베딩에 구문적 특징을 학습 과정에서 추가하여 Word2Vec을 학습하는 것이었습니다. 


SGNS기반 FastText 적용

CNN/RNN 기반 인공신경망 모형 개발

Word2Vec을 구문적 특징과 함께 학습


그러나 마지막 방법은 어휘 임베딩의 퀄리티가 외부 자연어처리 도구의 성능에 영향을 받을 뿐만 아니라, 어휘보다 낮은 수준의 정보(subword-level information)를 활용하는 것이 여러모로 도움이 된다는 기존 연구 결과에 반하는 시도를 고집할 이유가 없었기 때문에 고려하지 않았습니다. 


반면, 첫 번째 방법인 FastText는 이미 다양한 언어에 적용되어, 어휘 수준(word-level) SGNS보다 어휘의 구문적 특징을 잡아내는데 탁월하다는 것을 보인 바 있습니다. 그렇기 때문에, 한국어와 FastText의 결합은 매우 자연스러운 일인데, 다양한 한국어의 문법적 규칙은 자모 단위에서 결정되는 경우가 많으므로, 한국어 어휘를 자모단위로 분해한 다음 FastText를 적용하는 것이 한 가지 방향성이었습니다. 


두번째 방향성은 한국어 자모에서 출발하여 글자를 조합하고, 글자를 어휘로써 조합하는 과정을 CNN으로 구현하고 (EMNLP 2017), CNN이 구성한 어휘 임베딩을 활용해 주변 맥락 단어를 학습하는 언어 모델(language model)로서의 RNN을 구현하는 방법이 있었습니다 (AAAI 2017). 일견 이 아이디어는 굉장히 그럴듯했지만, 이 접근법은 인공신경망 모델의 하이퍼파라미터를 어떻게 설정하냐에 따라서 성능이 매우 크게 좌우되었고, 대부분에 경우 Word2Vec에도 크게 밑도는 성능을 보여 이 방법들은 모두 기각되었습니다. 이 방향성을 포기하면서 얻을 수 있었던 인사이트는 아래와 같습니다. 

 

한국어 자모의 조합을 통해 글자를 생성하는 원리와, 글자를 조합하여 어휘를 생성하는 원리를 인공신경망으로 학습하는 것이 매우 어려웠습니다. 이는 단순히 한국어 어휘를 더 낮은 수준으로 쪼개고 나면, 그 재료만을 통해 원래 어휘에 담겼던 의미 혹은 구문적 특징을 완벽하게 환원시킬 수 없다는 사실을 간과한 것이었습니다. 


다시 말해서, 단일 자모나 글자를 보고서 그것이 들어간 어휘는 거의 무조건 어떤 의미 혹은 구문적 특징을 갖게 될 것이라고 예측하는 것이 어렵다는 말입니다. 특히, 단일 자모 그 자체는 음소로써 한글 글자를 발음하는 규칙만 내재할 뿐, 그것이 어휘의 의미적/구문적 정보를 갖고 있다고 보기 어렵습니다. 이렇게 되면, 자모나 글자의 조합의 원리를 학습하는 시도보다는, 이미 조합된 자모/글자의 n-gram별로 독자적인 파라미터를 갖게함으로써 이를 학습하는 것이 더 낫다는 결론에 다다르게 되는데, 이는 곧 FastText의 접근법이 됩니다. 


그렇다면 한 발 양보해서, 어휘를 구성하는 글자/자모의 n-gram 임베딩을 학습하는 SGNS(FastText)를 사용하되, 자모/글자의 조합 원리를 학습하는 CNN/RNN 레이어를 섞을 수 있지 않을까라는 의문이 들게 됩니다. 역시 그럴듯한 방향성이지만, 결론적으로는 이 방향도 현실적인 성능을 내기 어려워 기각되었습니다. 문제는 학습과정에서 발생했는데, SGNS의 학습과정을 가만히 살펴보면 이는 거대한 두 행렬 U, V의 파라미터 (보통 1억 개가 넘습니다) 중 극히 일부를 뽑아서(sampling), 아주 작은 배치(batch)를 이용해 업데이트를 하는 온라인 학습(online learning)에 가까운 모델입니다. 


이러한 모델에 자모/글자를 조합하는 CNN/RNN 스타일의 레이어를 모든 어휘가 공유하도록 만들 경우, 해당 CNN/RNN의 파라미터가 특정 배치(batch)에 과적합되는 현상을 막기가 어려우며, 이를 방지하기 위해 정규화(regularization)을 강력하게 적용할 경우, 해당 레이어가 담당해야 하는 역할을 거의 수행하지 못하고 별 의미없는 어휘 임베딩을 생성하곤 했습니다. 물론, 적당한 하이퍼파라미터 튜닝을 통해 어느 정도 결과를 얻을 수 있으나, 이 방법 역시 튜닝에 크게 의존하며, 대부분의 경우 Word2Vec에 크게 미치지 못하는 성능을 보여 이 방법들 또한 모두 기각되었습니다. 


 



한국어 버전의 FastText 


논문에는 들어가지 않은 수많은 시행착오 끝에, FastText식 접근법과 한글 자모 n-gram을 결합하기로 결정하고 다시 많은 실험을 진행했습니다. 오탈자 및 오류가 거의 없는 1) 한국어 위키피디아, 2) 한국어 뉴스 기사, 3) 세종 코퍼스를 기반으로 어휘 임베딩을 학습한 결과, 아래 소개될 방법이 1) 기존 Word2Vec, 그리고 2) 글자수준(character-level)의 정보만을 활용하는 FastText 성능을 뛰어넘는 (거의) 유일한 방법이 되었습니다. 그리고 이 방법이 갖는 큰 장점 중 하나는 학습 속도가 FastText와 거의 차이가 나지 않으며, 약 1억 개의 단어가 포함된 코퍼스를 학습하는데 걸리는 시간은 몇 시간이 채 되지 않다는 점입니다. 


이제 한국어 버전의 FastText를 설명하겠습니다. 이해의 편의를 위해 간단히 예시와 함께 하겠습니다. “먹었다”는 단어를 구성하는 글자를 초성, 중성, 종성 순으로 분해하여 순서대로 나열하면 다음과 같은 자모의 배열로 나타낼 수 있습니다. 

 

  ㅁ, ㅓ, ㄱ, ㅇ, ㅓ, ㅆ, ㄷ, ㅏ 

 

먼저, 이 배열에 두 가지 요소를 추가합니다. 한글의 글자는 초성, 중성, 종성으로 분해될 수 있는데, 이 중 종성이 없는 글자에 대해서는 종성의 부재를 나타내는 기호 ‘e’를 추가합니다. 이 기호는 사실 어떤 특수기호를 사용해도 무방합니다. 그리고 어휘의 시작과 끝을 나타내는 기호 <, >를 추가해서 아래와 같은 배열을 완성합니다. 

 

    <, ㅁ, ㅓ, ㄱ, ㅇ, ㅓ, ㅆ, ㄷ, ㅏ, e > 

 

이제 이 배열에 대해서 FastText (Subword Information Skip-Gram, SISG)를 적용하는데, 조금 다른 점은 글자 단위가 아닌 자모 단위에서 n-gram을 추출하는 것입니다. 두 가지 종류의 자모 n-gram을 고려합니다. 

 

첫 번째는 글자 수준 n-gram입니다. 종성이 없는 글자에 대해서 ‘e’를 추가했으므로, 모든 글자는 3개의 자모로 구성되는 규칙을 언제나 지킬 수 있기 때문에, 이 배열을 3의 배수(mod 1)로 자르면 자연스럽게 글자 수준의 n-gram들을 추출할 수 있습니다. 예를 들어, 글자 수준에서 1-gram(unigram)과 2-gram(bigram)을 추출한다면 아래와 같습니다. 

 

    (ㅁ, ㅓ, ㄱ), (ㅇ, ㅓ, ㅆ), (ㄷ, ㅏ , e), (ㅁ, ㅓ,ㄱ , ㅇ, ㅓ, ㅆ), (ㅇ, ㅓ, ㅆ, ㄷ, ㅏ, e) 

 

두 번째는 인접한 글자들 사이에서 걸쳐있는 자모 수준 n-gram입니다. 이러한 종류의 n-gram은 한국어 문법 규칙을 학습하기 위해 추가되었습니다. 예를 들어, 한국어 동사 원형을 과거 시제로 나타내기 위해서는 ‘-았’, ‘-었-‘이 추가되어야 합니다. 이러한 규칙은 글자 간의 자모 수준 n-gram (ㅆ, ㄷ, ㅏ, e)를 통해서 학습될 수 있을 것이며, 앞글자의 받침 유무에 따라서 달라지는 단어 (-율, -률) 등의 규칙 또한 학습될 수 있을 것입니다. 위의 “먹었다” 예시에서 이러한 3-gram(trigram)을 추출한다면 아래와 같습니다. 

 

    (<, ㅁ, ㅓ), (ㅓ, ㄱ, ㅇ), (ㄱ, ㅇ, ㅓ), (ㅓ ㅆ, ㄷ), (ㅆ, ㄷ, ㅏ), (ㅏ, e, >) 


이렇게 추출된 글자 및 자모 수준의 n-gram들은 “먹었다”라는 단어를 구성하는 하위 요소가 되며, 각 n-gram에는 고유한 벡터가 할당되어 학습됩니다. “먹었다”는 어휘의 임베딩은 이제 위에서 추출한 모든 n-gram의 평균벡터가 됩니다.  

 

정리하면, 이는 한국어 어휘를 자모수준의 배열로 만든 뒤, 적절한 글자 및 자모 수준의 n-gram을 추출하여 각 요소에 할당된 평균 벡터를 어휘 임베딩으로 구성하는 것입니다. 글자 수준 n-gram을 추출하는 것은 기존 FastText의 접근법과 동일하며, 여기에 인접한 글자의 자모수준 n-gram을 더하여 어휘 벡터로 구성합니다. 임베딩 학습을 위해서 알고리즘은 SGD가 사용되었고, 학습율(learning rate)는 linear decay 하도록 조정되었습니다. 결과적으로, 이러한 접근법은 FastText의 장점을 그대로 살리면서, 한국어 어휘의 구문적 특성을 좀 더 잘 학습할 것이라고 기대할 수 있습니다. 그 이유는 글자를 자모 수준으로 쪼개어 더 세부적인 수준에서 구문적 규칙을 학습할 수 있을 것이기 때문입니다.  

 

기존의 글자 수준으로만 분해했던 FastText와 비교하면, 한국어 어휘는 대부분 4글자 이내의 짧은 길이를 갖고 있는데, 여기에 영어에서 일반적으로 사용되는 3-6 gram으로 세팅한 뒤 이를 학습하면 이는 사실상 Word2Vec(word-level SGNS)과 크게 달라지는 점이 없을 것입니다. 즉, 조금 더 긴 n-gram을 학습하기 위해서는 한글 자모수준까지 내려가서 어휘보다 낮은 수준(subword)의 특징을 학습해야 FastText식 접근법이 제대로 작동할 것이라고 기대할 수 있는 것입니다. 



 



한국어 어휘 임베딩의 평가 

 

이제 학습한 어휘 임베딩이 잘 학습되었는지를 평가해야 하는데, 일반적으로 널리 사용되는 평가 과제(task)는 두 가지가 있습니다. 첫 번째는 어휘 유사도 평가 과제(word similarity task)입니다. 이 과제는 수 백개의 어휘 쌍에 대해서 1) 사람들이 두 어휘 간 유사도를 평가한 점수와, 2) 두 어휘의 각 임베딩 벡터를 이용해 코사인 유사도를 구한 값들을 이용해, 두 값들이 얼마나 유사한지 스피어만 상관계수를 구합니다. 

 

두 번째로는 어휘 유추 과제(word analogy task)입니다. 총 4개의 단어 쌍이 주어지는데, a:b = c:d의 형태로 주어집니다. 예를 들어, 왕:왕비 = 남자:여자 와 같은 형태의 단어들이 주어지면, 이 단어들에 대응되는 어휘 임베딩 벡터 연산을 이용해 임베딩이 이러한 유추 관계를 잘 학습했는지 확인하는 것입니다. 구체적으로, a + b - c의 연산을 통해 계산된 벡터가 학습된 벡터 d와 얼마나 가까운지 측정하기 위해 코사인 유사도(혹은 거리)를 계산하여 이를 평가합니다. 즉,  a + b - c를 통해 d를 구할 수 있는지 확인하여, 간단한 벡터 연산을 이용해 의미적/구문적 정보가 학습이 잘 되었는지를 판단하는 것입니다. 

 

그런데 2017년 말을 기준으로, 한국어에 대해 두 과제를 수행하기 위해 이미 개발된 문항들이 있는지를 조사한 결과, 영어 문항들의 번역본 이외에는 한국어를 위해 자체 개발된 평가 문항들이 존재하지 않았기 때문에, 두 평가 문항들을 처음부터 새로 개발하게 되었습니다. 


어휘 유사도 과제에 대해서는, WS-353 (353개의 단어 쌍)을 교차 번역하였고, 이 과정에서 일부 어휘는 좀 더 한국인들에게 익숙한 어휘로 교체되었습니다. 번역된 단어 쌍의 유사도는 14명에게 의해 평가되었고, 각 단어 쌍 별로 최대/최소 점수를 제거한 뒤 평균점수를 구했습니다. 영어 버전의 유사도 점수와의 상관계수는 .82로 매우 높은 상관관계를 보였습니다.  

 

어휘 유추 과제를 개발하는 데는 좀 더 많은 노력이 들었습니다. 널리 사용되는 Mikolov의 어휘 유추 과제 문제들은 한 두 가지 카테고리에 치중되어 있다는 비판이 있었을 뿐만 아니라, 구문적 특징을 평가하는 어떤 카테고리들은 한국어에서 사용이 불가능했습니다. 예를 들면, 주어가 3인칭 단수일 경우 동사에 s를 붙이는 형태와 같은 것들입니다. 그래서 Mikolov의 문항들 이후에 개발된 다른 문항들을 함께 참고하였고, 좀 더 많은 의미적 특징을 평가하는 영어 버전의 문항들을 (ACL 2016)을 참조하여 번역의 이견이 없는 문항들을 위주로 구성했습니다. 마지막 기타 카테고리에는 한국어 특유의 색채어들과 좀 더 다양한 의미적 특징을 평가할 수 있는 문항들이 포함되었습니다. 구문적 특징을 평가하는 문항들에 대해서는 카테고리부터 새로 만들었고, 자연어 처리 생성 과제에서 중요한 문법적 요소라고 생각되는 네 가지 차원(격, 시제, 태, 동사 변화)에 해당하는 문제를 개발했습니다. 마지막 카테고리는 한국어 특유의 높임법이 추가되었습니다. 카테고리 간, 그리고 의미적/구문적 문항 간 균형을 맞추기 위해 각 카테고리 별로 1,000개의 문항을 개발하였고, 총 10,000개의 문항이 최종 선정되었습니다. 아래는 카테고리별 문항 예시입니다. 
 

(의미적 차원 Semantic Dimensions)

  수도-국가(Capital-Country): 아테네: 그리스= 바그다드: 이라크 

  남성-여성(Male-Female): 왕자:공주= 신사:숙녀 

  이름-국적(Name-Nationality) : 간디: 인도= 링컨: 미국 

  국가-언어(Country-Language) : 아르헨티나: 스페인어= 미국: 영어 

  기타(Miscellaneous) : 개구리: 올챙이= 말: 망아지 


(구문적 차원 Syntactic Dimensions)

  격(case): 교수: 교수가 = 축구: 축구가 

  시제(tense) : 싸우다: 싸웠다= 오다: 왔다 

  태(voice) : 팔았다: 팔렸다 = 평가했다: 평가됐다 

  동사의 변화(verb form) : 가다: 가고= 쓰다: 쓰고 

  높임법(honorific) : 도왔다: 도우셨다 = 됐다: 되셨다 

 

사실, 문항 개발 과정에서 고려해야할 것들이 내용적인 부분 말고도 여러 가지 있었는데, 예를 들면 다음과 같은 것들입니다. 문항에서 등장하는 어휘가 지나치게 생소한 어휘가 아니어야 하며, 어떤 문항의 경우 복수정답이 있을 만한 가능성이 있었으며, 줄임 표현(-되었-을 -됐-으로 줄임)을 어느 정도까지 인정할 것인지 등의 이슈들입니다. 이러한 이슈를 좀 더 체계적으로 정리하고 문항들을 좀 더 정제하여 업데이트를 할 필요성이 있는데, 이 작업을 함께하고자 하시는 분이 있다면 환영합니다! 

 




실험 결과, 그리고 남은 이야기들 

 

새로 개발한 문항들에 대해서 한국어 자모수준과 FastText를 접목한 한국어 임베딩의 성능을 평가한 결과, 구문적 특징의 학습 정도는 매우 크게 개선되었음을 알 수 있었고, 의미적 정보는 카테고리 별로 조금 달랐으나, 전반적으로 개선되었다고 할 수 있었습니다. 또한, 어휘 임베딩을 사용하여 간단한 자연어 처리 과제를 수행한 결과, 이어지는 과제의 성능 개선에도 긍정적인 영향이 있었습니다. 다만, 기대했던 만큼의 성능 개선을 보이진 못했는데, 이는 논문에서 선택했던 영화리뷰에 대한 감성분석 과제에는 오탈자 등의 노이즈가 심할 뿐만 아니라, 구문적 특징이 아닌 의미적 특징을 잡아내는 것이 좀 더 중요한 과제였기 때문에 그랬을 것으로 생각하고 있습니다. 구체적인 성능과 관련된 숫자들은 논문에 많이 포함되어 있으므로, 자세한 수치가 궁금한 분은 이를 포스팅 가장 처음에 언급된 링크에서 확인하실 수 있습니다. 


이 과정에서 얻을 수 있었던 특기할만한 점이 몇 가지가 있었는데, 몇 가지를 기술하면 아래와 같습니다. 

 

신문 기사나 위키피디아 처럼 정제된 텍스트가 아닌 영화 리뷰와 같은 현실 한국어 텍스트를 대상으로 분류기를 학습할 경우, 위에서 언급했던 종성이 없을 경우 추가하는 기호 e를 오히려 포함시키지 않을 때 성능이 나아지는 경우가 간혹 있었습니다. 


한국어 어휘를 글자/자모 수준으로 분리하여 학습하는 것은, 일부 어휘의 의미적 특성을 학습하는데 큰 도움이 되지 않거나 가끔은 오히려 방해가 되기도 합니다. 어휘를 분해하여 이해할 수 있는 복합명사의 경우 이 방법은 의미적인 특징을 효과적으로 잡아내지만, 어휘를 분해해도 아무런 이득을 볼 수 없는 고유명사의 경우(예) 프랑스)는 오히려 어휘-수준(word-level)의 SGNS보다 성능이 떨어지기도 했습니다. 이는 FastText에서도 부분적으로 등장하는 부분인데, 아마 학습 과정에서 복합명사와 고유명사를 구별하여 n-gram을 추출하는 전략을 다르게 잡을 수 있다면 한국어 (뿐만 아니라 FastText가 산출한) 어휘 임베딩의 성능을 더욱 끌어올릴 수 있을 것으로 예상합니다.  


한국어 자모와 FastText를 결합하면 한국어의 구문적 특성을 매우 잘 잡아내기 때문에, 사실 감성분석과 같은 자연어 처리 과제보다는, 한국어 구문 분석(parsing), 품사 태깅(POS tagging) 과제와 같은 부분에서 눈에 띄는 성능 향상을 가져올 수 있으리란 기대를 하고 있습니다. 시간관계상 이러한 부분을 모두 실험해볼 수는 없었는데, 이 작업을 함께하고자 하시는 분이 있다면 저희들은 언제나 환영입니다. 


사용하는 인구의 비중이 전 세계적으로 적은 언어는, 자연어처리 분야에서 아무래도 관심 밖의 대상이 되기 마련인 것 같습니다. ACL 산하의 자연어처리 학회(ACL, NAACL, EMNLP, EACL)에서 한국어 자연어 처리를 주된 주제로 다룬 논문이 등장하기 시작한 것은 불과 몇 년 전부터였는데, 이는 동아시아 언어 중에서도 중국어와 일본어와 비교하면 아직 연구된 바가 적어 보입니다. 


한국어 자연어 처리 관련 논문은 한국인 뿐만 아니라, 동아시아 언어를 연구하는 여러 해외 연구자들 또한 관심있게 보는 영역입니다. 이번 ACL에서 해외를 비롯한 국내 연구자분들이 이번 결과를 관심있게 살펴보고 가셨고, 올해부터는 ACL 산하에서 아시아태평양 지역 챕터를 담당하게될 AACL 학회가 공식적으로 발족했음을 알렸습니다. 이러한 기회를 통해 좀 더 많은 분들이 한국어 자연어 처리에 더 관심을 갖는 계기가 되었으면 좋겠습니다.



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari