본 포스팅은 텍스트 전처리에 관한 중요성과 텍스트 전처리를 위한 방법들에 대해 알아보도록 하겠습니다.
1. 텍스트 전처리란?
"Garbage in Garbage out"이라는 말이 있듯이 모델의 입력으로 양질의 데이터를 주지 않으면 아무리 성능이 좋은 모델이라도 우리가 원하는 좋은 결과를 얻을 수 없게 된다. 정형데이터나 이미지 데이터와 마찬가지로 텍스트 데이터도 모델의 입력으로 넣기 위해서 여러 전처리 과정이 필요하다. 텍스트 데이터의 여러 전처리 방법을 살펴보기 전에 텍스트 데이터 전처리가 중요한 이유에 대해 먼저 살펴보자.
위의 그림을 보면 데이터 사이언스 분야에서 가장 지루하지만 가장 많은 시간은 할애하는 작업이 데이터 전처리 작업임을 볼 수 있다.
또한 초거대 언어모델(Large Language Model)의 등장 이후에도 데이터 전처리의 중요성을 강조하는 논문이 계속 나오고 있으며, LLM 훈련 단계에 해당하는 6단계 중 4단계가 데이터 전처리에 해당할 정도로 데이터 전처리는 매우 중요한 작업이다.
텍스트 데이터 전처리란 컴퓨터가 텍스트 데이터를 이해할 수 있도록 하는 Data Preprocessing 방법으로, HTML 태그, 특수문자, 이모티콘 제거, 정규표현식, 불용어(Stopwords), 어간추출(Stemming), 표제어추출(Lemmatizing) 등이 있다.
어간추출과 표제어추출은 예외 상황을 최소화하여 컴퓨팅 연산에 효율성을 부여하는 부분으로 밑에서 더 자세하게 살펴보도록 하겠다.
1. 토큰화(Tokenization)
텍스트 데이터 전처리 방법 중 우선 토큰화에 대해 살펴보도록 하자.
토큰화는 코퍼스(corpus)데이터에서 토큰(token)이라 불리는 단위로 나누는 작업을 말하며, 여기서 토큰은 주로 의미 있는 단위로 토큰을 정의한다. 토큰이 되는 기준은 어절, 단어, 형태소, 음절, 자소 등 상황에 따라 다를 수 있으며 주로 Character-based Tokenization, Word-based tokenization, Subword-based tokenization을 사용한다. 이를 위한 라이브러리로는 NLTK(Natural Language Tool Kit)과 한국어 텍스트 데이터 전처리를 위한 KONLPY가 있다.
토큰화의 방법으로는 단어 토큰화, 문장 토큰화로 나눌 수 있고 각각에 대해 알아보도록 하겠다.
단어 토큰화는 토큰의 기준을 단어(word)로 하는 경우 단어 토큰화라고 한다. 다만 여기서 단어(word)는 단어 단위 이외에도 단어구, 의미를 갖는 문자열로 간주되기도 한다. 간단한 예시로 구두점(Punctuation) 단위로 토큰화하는 예시를 살펴보자.
"Hello, World!" 라는 문장이 주어지고, 구두점 단위로 토큰화한다고 생각하면 "Hello", ",", "World", "!"와 같이 간단하게 토큰화할 수 있다. 하지만 구두점을 기준으로 토큰화하는 간단한 방법으로는 여러 문제가 있을 수 있다.
토큰화 작업을 단순하게 구두점을 제외하고 공백을 기준으로 나누는 작업이라고 간주할 수는 없는데, 그 이유는 다음과 같다.
코퍼스에 대한 정제 작업을 진행하다 보면, 구두점조차도 하나의 토큰으로 분류하는 경우가 있는데 다음 예시를 살펴보자.
단어 자체에 구두점을 갖고 있는 경우가 있는데 "Ph.D", "AT&T" 등을 예시로 들 수 있다. 또 특수문자의 달러($)나 슬래쉬(/)를 예로 들어보면 $100.00과 같이 돈을 의미하기도 하고, 2024/02/29와 같이 날짜를 의미할 수도 있기 때문이다.
또한 줄임말과 단어 내에 띄어쓰기가 있는 경우도 있는데 토큰화 작업에서 영어권 언어의 apostrophe(')는 압축된 단어를 다시 펼치는 역할을 하기도 한다. "we're" 은 "we are"의 줄임말이며 "what're"은 "what are"의 줄임말이다. 여기서 re를 접어(clitic)이라고 하며, 단어가 줄임말로 쓰일 때 생기는 형태를 말한다. "New York"이라는 단어와 "rock n roll"이라는 단어를 보면 이 단어들은 중간에 띄어쓰기가 존재한다. 사용 용도에 따라서 하나의 단어 사이에 띄어쓰기가 있는 경우에도 하나의 토큰으로 봐야 할 수 있으므로, 토큰화 작업을 저러한 단어를 하나로 인식할 수 있는 능력도 가져야 한다.
이번에는 문장 단위로 토큰화 하는 방법에 대해 알아보도록 하자. 이 작업은 갖고 있는 코퍼스 데이터 내에서 문장 단위로 토큰화하는 작업을 뜻하는데 때로는 문장 분류(sentence segmentation)이라고 부르기도 한다. 그렇다면 어떻게 문장 단위로 토큰화할 수 있을까?
이 경우도 단순히 마침표(.) 물음표(?), 느낌표(!) 와 같은 구두점(Punctuation) 단위로 나누면 되는 것일까? 물음표와 느낌표는 문장 구분을 위한 꽤 명확한 구두점이 될 수 있지만 마침표는 그렇지 않다. 다음과 같은 예시를 살펴보자.
"IP 192.168.56.31 서버에 들어가서 로그 파일 저장해서 aaa@gmail.com로 결과 좀 보내줘. 그 후 점심 먹으러 가자."
다음과 같은 문장이 있을 때 문장 단위로 올바르게 나눈다면 문장의 마지막 단어로 "결과 좀 보내줘."와 "먹으러 가자."로 나뉘는 것이 맞을 것이다. 하지만 단순히 마침표 단위로 문장을 나누게 된다면 IP 주소를 나타내는 부분과 이메일 주소를 나타내는 부분에서 문장이 나누어지기 때문에 올바르게 나누어지지 않게 된다. 이처럼 단순히 구두점을 기준으로 나누는 것보다 조금 더 세밀한 알고리즘이 요구된다. 하지만 NLTK와 KONLPY 라이브러리를 통해 조금 더 세밀한 방법으로 토큰화할 수 있다.
다음으로는 한국어에서 토큰화가 더 어려운 이유를 알아보도록 하자. 영어에서는 단어 단위로 띄어쓰기를 하기 때문에 단순히 띄어쓰기 단위로 토큰화를 수행한다고 해도 "New York"과 같은 합성어나 "he's"와 같은 줄임말에 대한 처리만 잘 해준다면 꽤 괜찮은 성능을 낼 수 있다. 하지만 한국어에서는 단순히 띄어쓰기 단위로 토큰화를 진행하기엔 부족하다. 그 이유는 언어적 특성에서 차이가 나는데 한국어는 조사, 어미 등을 붙여서 말을 만드는 교착어에 해당하기 때문이다. 예를 들어 '그'라는 단어 하나에도 '그가', '그에게', '그를' 등 여러 조사를 붙여서 새로운 말을 만들어내기 때문에 영어와 같이 단순히 띄어쓰기를 기준으로 토큰화하는 것이 아닌 조사를 분리하기 위한 형태소 단위의 토큰화가 필요하다.
또 다른 이유로는 띄어쓰기가 잘 지켜지지 않는다는 점이다. "지금이렇게띄어쓰기를하지않아도이글을보시는여러분들은이해하실수있을겁니다." 다음 예시와 같은 띄어쓰기가 지켜지지 않은 문장을 보아도 한국어는 이해할 수 있지만 "Tobeornottobethatisthequestion"다음과 같은 영어 문장은 이해하기 어렵다. 따라서 한국어 코퍼스에는 띄어쓰기가 잘 지켜지지 않은 문장들이 다수 존재하기 때문에 한국어 데이터 전처리가 훨씬 더 어렵다.
2. 정제(Cleaning)
텍스트 정제는 코퍼스 내에서 토큰화 작업에 방해가 되거나 의미가 없는 부분의 텍스트, 노이즈를 제거하는 작업을 뜻한다. 주로 토큰화 전 후에 반복적으로 수행하게 되며 대표적인 정제 방법으로는 불용어(Stopwords) 제거가 있다. 불용어는 문장에서 자주 등장하지만 실제 의미 분석을 하는 데는 크게 기여하지 않는 단어를 뜻하며 "I, my, me" 등과 같은 조사 접미사가 주로 불용어에 해당한다.
또한 영어에서는 글자 단위를 기준으로 정제하기도 하는데 영어 단어는 평균 6~7글자 정도로 1글자에 해당하는 영어는 주로 "a"와 같은 관사와 I"와 같은 주어가 제거되기 때문에 글자수를 기준으로 제거하는 방법도 자주 사용된다. 하지만 한국어의 경우 한자어가 많고 글자 하나에 함축적인 의미를 포함하는 경우가 많다. 예를 들어 "용"이라는 단어는 영어에서 "dragon"으로 쓰인다. 따라서 한국어는 글자수를 기준으로 정제하는 방법을 많이 사용하지는 않는다.
3. 정규화(Normalization)
대표적인 텍스트 데이터 정규화 방법으로는 어간추출(Stemming)과 표제어추출(Lemmatizing)이 있다.
어간 추출은 어형이 변형된 단어로부터 접사 등을 제거하고 그 단어의 어간을 분리하는 것으로 대표적으로 포터 스태머 알고리즘이 존재한다. 예시로 "formalize -> formal", "allowance -> allow", "electricical -> electric", "먹었다(ate), 먹을(will eat) -> 먹다(eat)"으로 변환시키는 것이 어간추출에 해당한다.
표제어 추출은 품사 정보가 보존된 형태의 기본형으로 변환하는 것을 의미한다. 표제어 추출의 가장 섬세한 방법은 형태학적 파싱이 있다. 표제어 추출의 예시로 "cats -> cat(어간) + s(접사)", "Dies -> die", "Watched -> watch", "Has -> have"로 변환시키는 것이 표제어 추출에 해당한다.
'Deep Learning > NLP' 카테고리의 다른 글
BERT와 ELECTRA 비교 (0) | 2024.03.12 |
---|---|
BERT와 SpanBERT 비교 (0) | 2024.03.11 |
BERT와 RoBERTa 비교 (1) | 2024.03.11 |
Transformer 등장 이전의 자연어처리 Backbone 모델 (0) | 2024.03.03 |
자연어처리 개요 (1) | 2024.02.28 |