티스토리 뷰
들어가며
본 글은 위키독스의 딥러닝을 위한 자연어처리의 텍스트 전처리 챕터와 파이썬 머신러닝 완벽 가이드의 8챕터의 내용을 정리한 글입니다.
텍스트 분석
머신러닝 알고리즘은 숫자형 피처 기반 데이터만 입력받을 수 있다. 그러나 텍스트는 비정형 데이터이기 때문에 텍스트에서 적절한 피처를 추출하는 것은 중요하다.
텍스트 분석의 수행 프로세스는 크게 다음과 같이 나타낼 수 있다.
- 텍스트 전처리(텍스트 정규화 작업)
- 피처 벡터화/추출
- ML 모델 수립 및 학습/예측/평가
텍스트 전처리
텍스트 자체를 바로 피처로 만들 수 없다. 따라서 크롤링 등으로 얻어낸 코퍼스 데이터가 필요에 맞게 전처리되지 않은 상태라면, 해당 데이터를 사용하고자하는 용도에 맞게 텍스트를 처리한다.
정제(Cleaning)
정제(Cleaning)은 텍스트에서 분석에 방해가 되는 불필요한 문자, 기호 등 노이즈 데이터를 사전에 제거하는 작업이다.
HTML, XML 태그나 특정 기호, 등장 빈도가 적은 단어, 길이가 짧은 단어(a, I, it, at, to etc.)를 제거한다. 또한 후술할 불용어(stop word) 제거도 한다.
불용어(Stop word)
불용어는 자주 등장하지만 분석을 하는 것이 있어서 큰 도움을 주지 않는 단어를 말한다. 가령 I, my, me, is, the, a, will, 조사, 접미사 같은 단어들은 문장에서는 자주 등장하나 실제 분석을 하는데는 거의 기여하는 바가 없는 경우가 있다.
이 불용어는 개발자가 직접 정의하거나 라이브러리에 내장 돼 있다.
NLTK(자연어 처리 라이브러리)를 통해 불용어 제거를 한 경우의 예시
불용어 제거 전 : ['Family', 'is', 'not', 'an', 'important', 'thing', '.', 'It', "'s", 'everything', '.'] 불용어 제거 후 : ['Family', 'important', 'thing', '.', 'It', "'s", 'everything', '.']
정규화(Normalization)
정규화(normalization)은 표현 방법이 다른 단어들을 통합시켜서 같은 단어로 만들어준다.
가령 USA와 US, uh-huh와 uhhuh는 형태는 다르나 같은 의미를 가진다. 정규화는 이러한 단어를 같은 단어로 취급하도록 하는 것이다. 후술할 어간 추출(stemming)과 표제어 추출(lemmatization)을 통해서도 표기가 다른 단어를 통합한다.
또 다른 정규화 방법으론 대, 소문자 통합이다. 영어 특정 상황에서만 대문자가 쓰이고 대부분 소문자기 때문에 소문자로 변환한다. 그러나 US와 us나 사람 이름과 같이 대소문자가 구분되어야 하는 경우는 변환되면 안된다.
정제 및 정규 작업은 토큰화 작업에 방해되는 부분을 배제시키기 위해 토큰화 전에 수행하지만 토큰화 작업 이후에도 여전히 남아있을 노이즈를 제거하기 위해 지속적으로 이루어지기도 한다.
어간 추출과 표제어 추출은 눈으로 봤을 때는 서로 다른 단어들이지만, 하나의 단어로 일반화 시킬 수 있다면 하나의 단어로 일반화시켜 문서 내의 단어 수를 줄인다.
표제어 추출(Lemmatization)
표제어(Lemma)는 기본 사전형 단어라는 의미이다. 표제어 추출은 단어로부터 표제어를 찾아가는 과정이다. 단어들이 서로 다른 형태를 가지더라도 그 뿌리 단어를 찾아가 단어의 개수를 줄일 수 있는지 판단한다. ex) am, are, is의 표제어는 be
표제어 추출하는 방법은 단어의 형태학적 파싱을 진행하는 것이다. 형태학이란 형태소로부터 단어들을 만들어가는 학문을 의미하고 형태소는 어간(stem)과 접사(affix)가 존재한다.
어간(stem) : 단어의 의미를 담고 있는 단어의 핵심 부분.
접사(affix) : 단어에 추가적인 의미를 주는 부분.
형태학적 파싱을 진행한다고 한다면 단어를 이 두 가지 구성 요소로 분리하는 작업을 만한다. ex) cats → cat(어간), -s(접사) 단, 꼭 두 가지로 분리되진 않는다.
표제어 추출을 정확하게 하려면 품사 정보를 알아야 한다. 만약 품사의 정보를 모른다면 has의 표제어를 have가 아닌 ha와 -s의 합성어로 오인할 수 있다.
어간 추출(Stemming)
어간 추출(stemming)은 말 그대로 어간(stem)을 추출하는 작업으로 형태학적 분석의 단순화 버전이라 볼 수 있다. 사전에 정의된 알고리즘에 따라 단어의 어미를 자른다. 어간 추출 알고리즘 중 하나인 포터 알고리즘을 이용한 예시를 살펴본다면 다음과 같다.
This was not the map we found in Billy Bones's chest, but an accurate copy, complete in all things--names and heights and soundings--with the single exception of the red crosses and the written notes.
어간 추출 전 : ['This', 'was', 'not', 'the', 'map', 'we', 'found', 'in', 'Billy', 'Bones', "'s", 'chest', ',', 'but', 'an', 'accurate', 'copy', ',', 'complete', 'in', 'all', 'things', '--', 'names', 'and', 'heights', 'and', 'soundings', '--', 'with', 'the', 'single', 'exception', 'of', 'the', 'red', 'crosses', 'and', 'the', 'written', 'notes', '.']
어간 추출 후 : ['thi', 'wa', 'not', 'the', 'map', 'we', 'found', 'in', 'billi', 'bone', "'s", 'chest', ',', 'but', 'an', 'accur', 'copi', ',', 'complet', 'in', 'all', 'thing', '--', 'name', 'and', 'height', 'and', 'sound', '--', 'with', 'the', 'singl', 'except', 'of', 'the', 'red', 'cross', 'and', 'the', 'written', 'note', '.']
한국어에서의 어간 추출
한국어는 아래 표와 같이 5언 9품사 구조를 가진다. 이 중 용언에 해당하는 동사와 형용사가 어간과 어미의 결합으로 구성된다.
어간(stem) : 용언(동사, 형용사)을 활용할 때, 원칙적으로 모양이 변하지 않는 부분. 활용에서 어미에 선행하는 부분. 때론 어간의 모양도 바뀔 수 있음(예: 긋다, 긋고, 그어서, 그어라).
어미(ending): 용언의 어간 뒤에 붙어서 활용하면서 변하는 부분이며, 여러 문법적 기능을 수행
또한 용언의 어간이 어미를 가지는 것을 **활용(conjugation)**이라 한다.
활용은 어간이 어미를 취할 때 어간의 모습에 따라 규칙 활용과 불규칙 활용으로 나뉜다.
규칙 활용은 어간이 어미를 취할 때 어간의 모습이 일정하다. ex) 잡(어간) + 다(어미)
따라서 단순하게 어미를 분리해주면 어간 추출이 된다.
불규칙 활용은 어간이 어미를 취할 때 어간의 모습이 바뀌거나 어미가 특수한 어미일 경우를 의미한다. ex) ‘듣-, 돕-, 곱-, 잇-, 오르-, 노랗-’ 등이 ‘듣/들-, 돕/도우-, 곱/고우-, 잇/이-, 올/올-, 노랗/노라-’와 같이 어간의 형식이 달라지는 일이 있거나 ‘오르+ 아/어→올라, 하+아/어→하여, 이르+아/어→이르러, 푸르+아/어→푸르러’와 같이 일반적인 어미가 아닌 특수한 어미를 취하는 경우
이와 같이 어간의 모습이 마뀌므로 좀 더 복잡한 규칙으로 어간을 추출하여야 한다.
더 자세한 내용은 이 포스트를 참고하면 좋을 것 같다.
토큰화(Tokenization)
코퍼스에서 용도에 맞게 토큰을 분류하는 작업을 토큰화(tokenization)라고 한다. 여기서 토큰은 토큰화 단위로 보통 단어나 문장과 같이 의미있는 단위로 정의한다.
예를 들어 Bag of Word와 같이 단어의 순서가 중요하지 않을 경우 단어 토큰화를 사용하고 문장이 가지는 시맨틱적인 의미가 중요하면 문장 토큰화를 한다. 다른 경우론 n-gram으로 단어 토큰화의 문맥을 무시하는 경향을 완화할 수 있다.
정제 과정으로 구두점(punctuation)을 제거하고 단어를 토큰으로 토큰화 한 예시
Time is an illusion. Lunchtime double so!
→ "Time", "is", "an", "illustion", "Lunchtime", "double", "so”
2-gram : ("Time", "is"), ( "is", "an"), ("an", "illustion"), … , ("double", "so”)
토큰화 방법은 데이터를 어떤 용도로 사용할 것인지에 따라 결정한다. 만약 다음과 같은 문장이 있다고 할 때
Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop.
‘가 들어간 Don’t와 Jone’s는 아래와 같은 경우로 토큰화할 수 있다.
- Don't
- Don t
- Dont
- Do n't
- Jone's
- Jone s
- Jone
- Jones
품사 태깅(Part-of-speech tagging)
영어에서 fly는 명사론 파리, 동사론 날다이다. 이렇듯 단어의 의미를 제대로 파악하기 위해선 해당 단어의 품사가 어떤 것인지 아는 것은 도움이 될 수 있다. 따라서 토큰화 과정에서 각 단어가 어떤 품사로 쓰였는지 구문을 해 놓기도 하는데 이를 품사 태깅(POS)라고 한다.
ex)
단어 토큰화 : ['I', 'am', 'actively', 'looking', 'for', 'Ph.D.', 'students', '.', 'and', 'you', 'are', 'a', 'Ph.D.', 'student', '.']
품사 태깅 : [('I', 'PRP'), ('am', 'VBP'), ('actively', 'RB'), ('looking', 'VBG'), ('for', 'IN'), ('Ph.D.', 'NNP'), ('students', 'NNS'), ('.', '.'), ('and', 'CC'), ('you', 'PRP'), ('are', 'VBP'), ('a', 'DT'), ('Ph.D.', 'NNP'), ('student', 'NN'), ('.', '.')]
Penn Treebank POG Tags에서 PRP는 인칭 대명사, VBP는 동사, RB는 부사, VBG는 현재부사, IN은 전치사, NNP는 고유 명사, NNS는 복수형 명사, CC는 접속사, DT는 관사를 의미한다.
한국어에서의 토큰화 특징
영어는 New York나 he’s같은 줄임말을 제외하면 띄어쓰기로 토큰화해도 대부분의 경우 단어 단위로 띄어쓰기가 이루어지기 때문에 단어 토큰화가 잘 작동한다. 그러나 한국어는 조사, 어미 등을 붙여서 말을 만드는 교착어이기 때문에 띄어쓰기로 토큰화하면 안된다.
예를 들어 그라는 주어나 목적어가 들어간 문장이 있을 때 그는 ‘그가’, ‘그에게’, ‘그를’, ‘그와’, ‘그는’과 같이 다양한 조사가 ‘그’라는 글자 뒤에 띄어쓰기 없이 붙는다. 따라서 어절을 뜻을 가진 가장 작은 말의 단위인 형태소 단위로 분리해 주어야 한다.
형태소에는 자립 형태소와 의존 형태소가 있다.
자립 형태소 : 접사, 어미, 조사와 상관없이 자립하여 사용할 수 있는 형태소. 그 자체로 단어가 된다. 체언(명사, 대명사, 수사), 수식언(관형사, 부사), 감탄사 등이 있다.
의존 형태소 : 다른 형태소와 결합하여 사용되는 형태소. 접사, 어미, 조사, 어간을 말한다.
ex)
• 문장 : 에디가 책을 읽었다
• ['에디가', '책을', '읽었다']
자립 형태소 : 에디, 책
의존 형태소 : -가, -을, 읽-, -었, -다
여기서 유추 해 볼 수 있듯 한국어에서 영어에서의 단어 토큰화와 유사한 형태를 얻으려면 어절 토큰화가 아닌 형태소 토큰화를 하여야 한다.
추가적으로 한국어는 영어보다 띄어쓰기가 잘 지켜지지 않아 영어보다 자연어 처리하기 어렵다.
'공부한 내용 정리 > 인공지능' 카테고리의 다른 글
llama2 다운 및 파인튜닝 (7) | 2023.08.07 |
---|---|
LLM 조사 (0) | 2023.08.07 |
[논문 리뷰]Hierarchical Attention Prototypical Networks for Few-Shot Text Classification (0) | 2023.05.19 |
추천 시스템 (0) | 2023.05.15 |
Text 분야에 적용된 Metric 기반 방법론 찾기 (0) | 2023.04.18 |