무엇이 한국어 자연어 처리를 더욱 어렵게 만들까?

지금부터는 한국어의 자연어 처리가 어려운 이유를 살펴봅니다.

교착어

한국어는 교착어에 속합니다. 어순이 중요시되는 영어나 중국어와 달리 어근에 접사가 붙어 의미와 문법적 기능이 부여됩니다(굴절어의 경우에는 형태 자체가 변하므로, 어근과 접사가 분명하게 구분되는 교착어와 다릅니다). 교착어와 굴절어, 고립어의 특징은 다음 표와 같습니다.

다음 테이블에서 교착어의 무시무시함을 볼 수 있습니다. 원형이 ‘잡다’일 경우 파생될 수 있는 다양한 형태를 간단히 정리해보았는데요. 테이블은 가능한 조합의 일부만 표현한 것인데도 이미 지면이 모자랄 정도로 다양한 형태가 파생되어 나오는 것을 볼 수 있습니다. 이러한 특징은 파싱parsing, 형태소 분석POS tagging부터 언어 모델에 이르기까지 한국어 자연어 처리를 훨씬 어렵게 만드는 이유 중 하나입니다. 또한 접사가 붙어 같은 단어가 다양하게 생겨나므로 하나의 어근에서 비롯된 비슷한 의미의 단어가 매우 많이 생성됩니다. 이들을 모두 다르게 처리할 수는 없으므로, 추가적인 분절을 통해 같은 어근에서 생겨난 단어를 처리합니다.

따라서 접사에 따라 단어의 역할이 정의되기 때문에, 상대적으로 어순은 중요하지 않습니다. 다음은 4개의 단어가 나타날 수 있는 모든 조합을 적은 것입니다. ‘간다’가 ‘밥을’ 뒤에 붙어 수식할 때를 제외하면 모두 같은 의미의 문장이 됩니다.

띄어쓰기

애초에 동양권에서는 띄어쓰기가 근대에 들어서면서 도입된 것이므로 띄어쓰기에 맞춰 발전해온 언어라 보기는 어렵습니다. 띄어쓰기에 대한 표준이 계속 바뀌어 왔기 때문에 사람마다 띄어쓰기를 하는 것이 다를뿐더러, 심지어는 띄어쓰기가 아예 없더라도 해석이 가능하기도 합니다. 결국, 앞에서처럼 추가적인 분절을 통해 띄어쓰기를 정제해주는 과정이 마찬가지로 필요합니다.

평서문과 의문문

물론 한국어에도 의문문을 나타낼 수 있는 접사가 있습니다. 예를 들어 ‘점심 먹었니’라고 하면 굳이 물음표가 붙지 않더라도 의문문인 것을 알 수 있습니다. 하지만 많은 경우 영어 등의 언어와는 달리 한국어는 의문문과 평서문이 같은 형태의 문장 구조를 가지는 것이 사실입니다. 따라서 마침표나 물음표가 붙지 않으면 알 수 없는 경우가 많습니다. 특히 음성 인식의 결과물로 나오는 텍스트의 경우에는 더욱 어렵습니다.

주어 생략

영어는 기본적으로 명사가 굉장히 중요시됩니다. 정말 특별한 경우를 제외하고는 주어가 생략되는 경우가 없습니다. 하지만 한국어는 동사를 중요시하고 대신 주어가 자주 생략됩니다. 인간은 문맥 정보를 잘 활용하여 생략된 정보를 메꿀 수 있지만, 컴퓨터는 그럴 수 없습니다. 따라서 앞에서 살펴본 평서문과 의문문의 예에서도 볼 수 있듯이 한국어는 주어가 생략되는 경우, 컴퓨터는 누가 점심을 먹었고 누구에게 점심을 먹었냐고 물어보는지 알 수 없습니다. 따라서 기계번역을 비롯하여 문장의 정확한 의미를 파악하기가 매우 어려워집니다.

한자 기반의 언어

한국어는 한자의 영향을 많이 받은 언어다 보니 다음 표와 같이 한자의 조합으로 이루어지는 단어들이 많습니다. 이러한 단어들은 각 글자가 의미를 지니고 있고 그 의미들이 합쳐져 하나의 단어의 뜻을 이룹니다. 영어도 마찬가지입니다. ‘water’와 같이 잉글로색슨족의 언어가 기원인 단어가 아니라면, 라틴어 기반의 단어들은 각기 뜻을 가진 서브워드sub-word들이 합쳐져서 하나의 단어의 의미를 이루게 됩니다.

하지만 문제는 한글이 한자를 대체하면서 생겨났습니다. 한자는 ‘표어 문자’입니다. 문자 하나당 하나의 단어를 나타냅니다. 읽는 소리는 같을지라도 형태와 그 뜻은 다릅니다. 하지만 이것을 ‘표음 문자’인 한글로 표현하면서 ‘정보의 손실’이 생겨버렸습니다(사실 표음 문자가 가장 발달한 글자의 형태입니다). 인간은 이러한 정보의 손실로 생겨난 모호성의 문제를 문맥을 통해 효과적으로 해소할 수 있지만 컴퓨터는 그렇지 못합니다. 따라서 다른 언어에 비해 중의성 문제가 더 가중되어 버렸습니다.

이후 전처리에 관한 4장에서 다루겠지만, 다음 표에서 볼 수 있듯이 마지막까지 서브워드 단위로 분절할 경우 중의성 문제가 더욱 가중되어 버립니다.

예를 들어 ‘문제점(問題點)’이라는 단어가 ‘문(問, 물을 문) 제(題, 제목 제) 점(點, 점 점)’이라고 각각 분절되었습니다. 하지만 ‘결제(決濟)’의 ‘제(濟, 건널 제)’도 있고 ‘제공(提供)’의 ‘제(提, 끌 제)’도 있을 겁니다. 그런데 신경망에서 ‘제’라는 토큰은 결국 임베딩 벡터로 변환되겠지요. 따라서, 임베딩 벡터는 ‘제(題, 제목 제), 제(濟, 건널 제), 제(提, 끌 제)’ 세 개 이상의 모든 의미에 대해서 하나의 글자를 가지고 임베딩하려 할 것이고, 결국 원래 각각의 의미가 임베딩되어야 하는 벡터의 평균값으로 애매하게 임베딩될 것입니다. 사실, 굳이 신경망을 통한 단어 임베딩의 예를 들지 않더라도, 전통적인 자연어 처리 방식에서도 헷갈릴 것 또한 자명한 사실입니다.

Last updated