본문 바로가기
Language Basic

언어 처리 개요 및 토큰화

by mjk0618 2023. 10. 22.

딥러닝을 활용한 자연어 처리를 공부하고 여러 논문을 읽는 중, 언어 처리에 대한 언어학적 지식과 통계 개념을 학습하면 깊이 있는 이해에 도움이 되겠다는 생각이 들어 추가로 공부한 내용을 정리하려고 합니다. 앞으로 작성될 내용은 Dan Jurafsy와 James H. Martin의 저서 Speech and Language Processing를 바탕으로 정리한 내용을 포함합니다. 국내에는 음성과 언어 처리 2판이 번역되어 출간되었는데, 원문은 온라인에서 pdf 파일로 다운받아 볼 수도 있습니다. 본 게시글에서는 1장 소개와 3장 단어 및 변환의 내용 중 일부를 정리하였습니다.

 


음성 및 언어 처리 개요

기계 번역, 질의 응답 등의 과제를 수행하는 언어 시스템은 언어에 대한 넓고 깊은 지식이 필요합니다. 이러한 언어에 대한 지식의 종류는 다음과 같이 구분할 수 있습니다. 먼저, 개별 단어의 다른 변형들을 생성하고 인식하기 위해서 의미를 갖는 구성 요소로 분류되는 방식인 형태론(morphology) 지식이 필요합니다. 그리고 단어를 정렬하고 그룹화하는 데 필요한 지식은 통사론(syntax)에 대한 이해를 요구합니다. "How much Chinese silk was exported to Western Europe by the end of the 18th century?"와 같은 질문에 답하기 위해서는 어휘적 의미론(lexical semantics)구성적 의미론(compositional semantics)을 알아야 합니다. 또한 통사구조의 단어 관계(relationship of the words to the syntactic structure)에 대한 이해도 필요합니다. 예를 들어, by the end of the 18th century에서 by는 서술이 아닌 시간의 종료점임을 알아야 합니다. 화자가 문장을 사용함으로써 의도하는 행동의 종류에 대한 지식은 화용론(pragmatic)이나 담화론(discourse) 지식도 필요합니다. 만약 음성 시스템을 구축하려고 한다면 언어의 소리에 대한 지식인 음성학(phonetics)음운론(phonology)에 대한 지식도 필요할 것입니다.

 

언어 처리 과제의 대부분은 중의성(ambiguity)을 해결하는 것으로 볼 수 있습니다. 일부 입력이 여러 개의 대체 언어 구조를 구축할 수 있는 경우 중의적(ambiguous)이라고 하는데, 쉽게 말해서 한 문장이 여러 의미로 해석되는 경우를 말합니다. 예를 들어 I made her duck.이라는 구문을 살펴보겠습니다. 이 문장은 다음과 같이 다양하게 해석될 수 있습니다.

 

1. I cooked waterfowl for her. (나는 그녀를 위해 물새를 요리했다.)

2. I cooked waterfowl beloning to her. (나는 그녀의 물새를 요리했다.)

3. I created the (plaster) duck she owns. (나는 그녀가 소유한 (석고) 오리를 만들었다.)

4. I caused her to quickly lower her head or body. (나는 그녀가 머리나 몸을 빠르게 낮추게 했다.)

5. I waved my magic wand and turned her into waterfowl. (나는 마술 지팡이를 휘두르며 그녀를 물새로 만들었다.)

 

문장에서 duck과 her이라는 단어는 형태론, 통사론적으로 모호합니다. duck은 오리라는 명사가 될 수도, 몸을 낮추다라는 동사가 될 수도 있습니다. her은 대명사가 될 수도 있고, 소유대명사가 될 수도 있습니다. make라는 단어 또한 만들다 또한 요리하다라는 의미를 모두 가질 수 있어, 의미론적으로 모호합니다. 게다가 make는 타동사로써, 하나의 직접 목적어를 취할 수도 있고, 두 개의 목적어를 취할 수도 있기 때문에 통사론적으로도 모호합니다.

 

이처럼 언어는 중의성을 갖는 상황과 경우가 매우 다양한데, 언어 처리에서는 이런 문제를 해결하기 위한 모델과 알고리즘을 연구합니다.

 


 

단어 및 변환

언어 처리에서 파싱(parsing)이란 입력을 받아 언어 구조를 생성하는 것을 의미합니다. 구체적으로 foxes와 같은 단어가 구성 형태소인 fox와 -es로 분해되는 것을 인식하고 이 사실을 구조적으로 표현하는 것을 형태론적 파싱(morphological parsing)이라고 합니다. 정보 검색에서는 foxes가 복수라는 것을 굳이 알 필요가 없이 foxes를 fox로 매핑할 수도 있습니다. 이처럼 단어의 끝부분을 떼어내는 것을 어간 추출(stemming)이라고 합니다.

 

sang, sung, sing라는 단어는 모두 동사 sing의 변형인데, 여기서 sing은 단어의 일반적인 형태이며 단어의 기본형(lemma)이라고 부르며, 이 모든 단어에서 sing으로 매핑되는 것을 표제어 추출(lemmatization)이라고 합니다.

 

토큰화 또는 단어 분리(word segmentation)는 실행 중인 텍스트에서 단어를 분리하는 작업입니다. 영어에서는 단어들이 띄어쓰기(whitespace)로 구분되는 경우가 많지만, 항상 그런 것은 아닙니다. 예를 들어 New York와 rock n' roll은 띄어쓰기를 포함하고 있음에도 하나의 단어를 이룹니다.

 

형태소(morpheme)는 언어에서 최소한의 의미를 갖는 단위로 정의됩니다. 형태소는 어간(stem)과 접사(affix)로 구분합니다. 어간은 단어의 주요한 형태소로 주된 의미를 제공하며 접사는 다양한 종류의 추가적 의미를 갖습니다. 접사는 접두사(prefix), 접미사(suffix), 삽입사(infix), 외접사(circumfix)로 세분할 수 있습니다. 접두사와 접미사는 알다시피 단어의 앞과 뒤에 붙는 접사입니다.

 

외접사는 어간 앞과 뒤에 오며, 삽입사는 어간 안에 삽입됩니다. 영어에는 외접사가 없지만, 독일어에는 외접사가 존재합니다. 예를 들어 동사 sagen(말하다)의 과거분사는 gesagt(말했다)입니다. 어간의 시작에 ge-, 끝에 -t를 더해 형성된 것입니다. 반면에 단어 중간에 형태소가 삽입되는 경우는 필리핀에서 사용하는 타갈로그어(Tagalog)에서 흔히 발생합니다. 예를 들어 행동의 주체를 표시하는 삽입사 um은 타갈로그어의 어간 hingi를 차용해 humingi(요청하다)를 만듭니다.

 

영어는 여러 개의 접사를 연달아서 사용하는 경우가 없지만, 튀르키예어의 경우는 이런 경우가 종종 있습니다. 흔하지는 않지만 접사를 9, 10개까지 갖는 단어도 있습니다. 이처럼 접미사를 나열하는 경향이 있는 언어를 교착어(agglutinative language)라고 합니다.

 

형태소를 결합하여 단어를 만드는 방법은 크게 굴절(inflection), 파생(derivation), 조합(compounding), 접어(cliticization)으로 구분됩니다. 굴절은 단어의 어간과 문법적인 형태소의 조합으로, 원래의 어간과 같은 부류의 단어를 만들어내고 보통 수 또는 시제의 일치와 같은 어떤 통사적인 기능을 수행합니다. 예를 들어 현재형 기본 동사 do와 3인칭 단수형 does가 있습니다. 파생은 단어의 어간과 문법적인 형태소의 조합으로, 다른 부류의 단어를 생성하며 종종 예측이 어려운 의미를 갖기도 합니다. 조합은 여러 단어의 어간이 협치전 깃입니다. 접어화는 단어의 어간과 접어를 결합한 것입니다. 여기서 접어는 단어처럼 통사론적으로 작용하지만, 형태가 축소돼 다른 단어에 붙는 형태소입니다. 예를 들어 I've라는 단어의 형태소 've가 있습니다. 

 

영어의 굴절은 -s(단수, 복수), -ing(분사), -ed(과거 시제 또는 분사)와 같이 비교적 단순하지만, 파생은 상당히 복잡합니다. 종종 동사나 형용사에서 명사 파생어가 유래하는데, 이를 명사화(nominalization)라고 합니다. 예를 들어 computerize와 computetization이 있습니다. 반면에 명사와 동사에서 형용사가 파생될 수도 있는데, 한 예로는 computation에서 파생한 computational입니다. 영어의 파생이 굴절보다 복잡한 이유는 일반적으로 조어력이 약하기(less productive) 때문입니다.예를 들어 위 예시에서 -ation과 같은 명사화 접미사는 오직 -ize로 끝나는 동사에만 추가될 수 있습니다.

 

형태론에는 두 가지 종류가 있습니다. 먼저 단어가 연결된 형태소의 문자열로 구성되어 있는 연결형 형태론(concatenative morphology)가 있습니다. 그런데 많은 언어들은 형태소가 더 복잡한 방식으로 결합되는 비연결형 형태론(non-concatenative morphology)를 갖습니다. 

 

비연결형 형태론의 한 종류는 템플래틱 형태론(templatic morphology)과 어근 및 패턴형 형태론(root-and-pattern morphology)이 있습니다. 이는 일반적으로 아랍어, 히브리어 등 기타 셈어계(Semitic language)에서 나타나는 특성입니다. 예를 들어 히브리어에서 동사는 두 가지 요소인 어근과 템플릿으로 구성됩니다.

 

여기서 어근은 보통 세 개의 자음(CCC)으로 구성되며 기본적인 의미를 갖습니다. 그리고 템플릿은 자음과 모음의 순서를 부여하고, 그 결과로 생기는 동사의 태와 같은 의미론적 정보를 지정합니다. 예를 들어 learn, study를 의미하는 히브리어의 어근 Imd에 능동태 CaCaC 템플릿을 결합하여 he studied를 의미하는 lamad를 만들 수 있고, CiCeC 템플릿으로 he taught를 의미하는 limed를 생성할 수도 있습니다.

 

원문에서 CiCeC 템플릿을 설명할 때 intensive라는 어휘를 사용하였는데, 직역하면 강의의, 강조의라는 뜻을 갖습니다. 사전적 의미를 찾아보니 만들어지는 어근에 비해 더 강하고, 집중된 동작을 나타내는 형태라고 합니다. Intensive(강세)는 일반적으로 단어나 구 앞에 부사로 사용될 수도 있는데, 영국식 영어에서 흔히 사용되는 비속어 부사 bloody도 일종의 intensive adverb가 됩니다.

 


 

토큰화

언어 처리 시스템에서 실행중인 텍스트를 단어와 문장으로 나누는 것을 토큰화라고 합니다. 영어와 같은 언어에서 단어 토큰화는 단순히 띄어쓰기로 단어를 구분하는 것처럼 보일 수 있습니다. 하지만 모든 언어가 이런 작업을 수행하는 것은 아니며, 영어도 실제로는 그렇지 않습니다. 예를 들어 단순히 띄어쓰기로 단어를 세분화하면 (cents), (said,) , (posotive."), (Crazy?)와 같은 토큰도 생성될 수 있습니다. 구두점을 경계로 처리할 수도 있지만, Ph.D., 01/02/06, google.com과 같이 단어 내에 구두점이 존재하는 경우도 있습니다.

 

숫자 표현에서는 조금 더 복잡합니다. 쉼표는 원래 단어 경계에 나타나지만 숫자 표현에서는 자리를 구분하기 위해서 사용되기도 합니다. 그런데 숫자의 구두점 스타일도 다양한 형태를 띕니다. 예를 들어 영어와 다르게, 스페인어, 프랑스어, 독일어와 같은 유럽권 언어들은 소수점을 표시하기 위해서 쉼표를 사용하고, 세 자리 숫자에는 띄어쓰기 또는 마침표를 사용합니다.

 

토크나이저는 아포스트로피(apostrophe)로 표시된 축약형을 확장하는 데도 사용됩니다. 그런데 이는 book's cover과 같은 소유격 표시(genitive markers)나 what're you?와 같은 인용 어구 표시(quotative markers)와 같이 여러 형태로 사용되기 때문에 중의성 해결이 필요합니다. 참고로 토큰화는 개체명 인식(named entitiy recognition)이라고 부르는 태스크와도 밀접하게 관련이 있습니다.

 

단어 세분화(segmentation) 외에 문장 세분화 또한 텍스트 처리의 중요한 첫 단계입니다. 일반적으로는 구두점을 기준으로 문장을 구분합니다. 그런데 물음표와 느낌표는 비교적 명확한 구분자이지만, 마침표는 문장 경계와 약어 사이에서 중의적입니다. 예를 들어 Mr., Inc.등이 그렇습니다. 일반적으로 문장 토큰화는 마침표가 단어의 일부인지 문장의 경계인지를 결정하는 이진 분류기를 구축하는 방식으로 작동합니다. 참고로 자연어 처리 도구를 제공하는 파이썬의 nltk 패키지의 sent_tokenize도 이와 같은 방식으로 훈련되었습니다.

 

중국어, 일본어 및 태국어를 포함한 일부 언어는 띄어쓰기로 잠재적인 단어 경계를 표시하지 않습니다. 이 경우 대체 분할 방법이 사용됩니다. 중국어는 최대 부합(maximum matching, maxmatch)이라고 부르는 그리디 서치 알고리즘을 사용합니다. 단어 사전을 사용하여 문자열의 시작부터 어떤 포인터의 위치까지 일치하는 가장 긴 단어를 선택합니다. 이 과정을 반복하는데, 일치하는 단어가 없으면 하나의 글자를 하나의 단어로 선택합니다. 그런데 이런 방식은 unknown words나 unknown genres(신조어 등)를 처리하지 못한다는 문제가 있습니다.

 


 

최소 편집 거리

텍스트를 처리할 때는 철자 오류를 감지하고 수정해야 할 때도 있습니다. 예를 들어 graffe라는 단어를 수정하기 위해서는 giraffe, graf, craft, grail 등과 같이 가능한 모든 단어를 검색해야 합니다. 이러한 선택지 중에서 하나를 정답으로 선택하기 위해서는 요소와 표면 오차 사이의 거리 지표(distance metric)이 필요합니다.

 

원래 유사성을 포착하는 효과적인 알고리즘은 확률론을 사용해야 합니다. 그런데 이 해결책의 기초가 되는 더 간단한 알고리즘은 최소 편집 거리(minimum edit distance) 알고리즘입니다. 이는 문자열 사이의 거리를 기반으로 문자열이 서로 얼마나 비슷한지를 나타내는 척도입니다. 문자열 사이의 최소 편집 거리는 한 문자열을 다른 문자열로 변환하는 데 필요한 편집 작업의 횟수입니다. 편집 작업에는 삽입(insertion), 삭제(deletion), 대체(substitution)가 있습니다.

 

 

예를 들어, 위와 같이 intention과 execution의 최소 편집 거리는 5가 됩니다. 이처럼 세 가지 작업이 모두 1의 비용을 갖는 레벤슈타인(Levenshtein) 거리가 가장 단순한 방식이지만, 각각의 작업에 특정한 비용이나 가중치를 부여할 수도 있습니다. 대체를 허용하지 않는 버전도 존재하는데, 대체를 삭제 및 삽입 작업으로 취급합니다. 이 경우 위 예시에서는 레벤슈타인 거리가 5가 아니라 8이 됩니다.

 

최소 편집 거리는 동적 프로그래밍(dynamic programming)에 의해 계산됩니다. 이는 벨먼이 처음 도입한 알고리즘 유형으로 하위 문제의 솔루션을 결합해 문제를 해결하는 방식입니다. 즉, 동적 프로그래밍은 하위 문제에 대한 해결책을 적절하게 결합하여 큰 문제를 해결할 수 있다는 직관에서 출발합니다.

 


 

Human Morphological Processing

다양한 형태를 갖는 단어(multi-morphemic word)가 사람들의 생각으로 어떻게 표현되는지에 대한 심리 언어학(psycholinguistic) 연구를 간단하게 다루겠습니다. 언어 처리가 이토록 심오하고, 이렇게까지 미묘한 부분을 처리하는 시스템을 개발할 수 있구나라는 생각이 들었기에 공부한 내용 중에 가장 흥미롭다고 느꼈던 부분입니다. 

 

walk라는 단어와 변형된 형태인 walks, walked를 생각해보겠습니다. 세 가지 단어 모두 인간의 어휘 목록(vocabulary)에 존재할까요? 아니면 단순히 walk에 -s나 -ed를 덧붙일까요?

 

전체 목록 가설(full listing hypothesis)는 언어의 모든 단어가 형태론적 구조 없이 mental lexicon에 등재되어 있다고 생각합니다. mental lexicon은 간단히 머릿속에 존재하는 사전 정도로 생각하면 될 것 같습니다. 이 관점에서는 형태론적 구조는 epiphenomenon(부수적인 현상)일 뿐이며 위 예시의 각 단어는 모두 별도의 어휘로 수록되어 있다고 생각합니다. 그런데 이 가설은 튀르키예어처럼 복잡한 언어에는 적용할 수가 없습니다. 앞서 말했듯 경우에 따라 접사가 9~10개씩 연달아 붙는 경우도 있기 때문입니다.

 

최소 여분 가설(minimum redundancy) 가설은 구성 형태소만 사전에 표시되며 walks는 walk와 -s라느 개별 형태소에 접근하여 처리한다고 생각합니다. 말실수(speech errors)는 인간의 어휘가 적어도 어떤 형태론적 구조를 나타낸다는 증거입니다. 실제로 우리는 대화 도중 종종 단어나 소리의 순서를 혼동하기도 합니다. 예를 들어 easy enoughly(easily enough)와 같이 접사를 잘못 사용하는 말실수는 mental lexicon이 형태론적 구조의 일부 표현을 포함하고 있음을 암시합니다. 전체 목록 가설에서는 -ly를 하나의 형태소로 생각하는 것이 아니라 easily를 통째로 하나의 형태소로 생각할 것이기 때문에 이런 말실수를 설명할 수 없습니다. 

 

그런데 최근에는 두 가설 모두 사실이 아님을 암시하는 실험적 증거가 발견되었습니다. 모든 형태론적 관계가 아니라 일부 관계만이 mental lexicon에 포함된다는 것인데, 최소 여분 가설을 완전히 부정하지는 않고 일부 인정하는 것으로 보여지긴 합니다. 예를 들어 happiness와 happily와 같은일부 파생 형태는 어간인 happy와 별개로 저장되지만, 규칙적으로 변형되는 형태인 pouring은 어간인 pour과 구별되지 않는다는 것입니다. 이 실험은 반복적인 priming 실험을 통해 진행되었는데, 반복적 priming은 단어가 전에 보여진 경우 더 빨리 인식된다는 점을 이용합니다. 따라서 어떤 단어가 주어졌을 때 얼마나 빨리 어간을 인식하느냐에 따라서 형태론적 관계가 mental lexicon에 저장되는지 여부를 결정한다고 생각하는 가설입니다.

 


 

최근 딥러닝 및 NLP 관련 논문을 읽으며 언어 처리에 대한 배경지식이 많이 부족하다는 생각이 들어 추가로 공부한 내용을 정리하였습니다. 실제로 논문에서 다룬 내용이 다수 포함되어 있기도 하고, 원론적인 부분에 대해서 새롭게 알게 되는 내용이 많아서 매우 유익했습니다. 이제 책 전체의 1/10 정도를 공부하였기 때문에 앞으로도 다룰 내용이 많을 것 같고, 이를 통해 딥러닝과 자연어 처리에 대한 이해가 한층 더 깊어질 것이라고 기대됩니다. 추가로 공부하는 내용을 계속해서 정리할 예정입니다.

'Language Basic' 카테고리의 다른 글

N그램 언어 모델  (1) 2023.11.21

댓글