텍스트 전처리를 통해 주어진 텍스트를 자연어 처리기법이 잘 적용될 수 있도록 사전에 가공할 수 있다.
텍스트 전처리 과정은 크게 토큰화, 정제 및 추출, 인코딩으로나눌 수 있다.
토큰화(Tokenization): 텍스트를 토큰(token)이라 불리는 단위로 나눈다
정제 및 추출(Cleaning, Stemming): 불필요한 단어 또는 문자를 제거한다
인코딩(Encording): 단어들을 숫자로 바꾼다
전처리를 하는 이유

예시로 위의 단어들은 전부 '모르다'라는 같은 뜻을 가지고 있다. 위의 단어들을 전부 NLP 과정에 입력한다면 메모리, 시간의 차원에서 효과적이지 않을 수 있다.
컴퓨터 및 컴퓨터 언어에서 자연어를 효과적으로 처리할 수 있도록 전처리 과정을 거칠 필요가 있다.
토큰화(Tokenization)
주어진 텍스트에서 토큰(token)이라 불리는 단위로 나누는 작업을 토큰화(tokenization)라고 한다. 토큰의 단위는보통 의미있는 최소한의단위로 토큰을 정의한다.
이는 문장에서 띄어쓰기나 구두점, 특수문자를 기준으로하여 간단하게 구현해볼 수 있다.
ex) I like JavaScript. → I / like / JavaScript
토큰화가 어려운 예시
띄어쓰기나 구두점, 특수문자만을 기준으로 토큰화를 하기에는 어려운 케이스들이 존재한다.
ex) 어제 삼성 라이온즈가 기아 타이거즈를 5:3으로 꺾고 위닝 시리즈를 거두었습니다.
라는 문장에서 5:3을 관점에 따라서 하나의 토큰으로 볼 수도 있고 5 / : / 3 세 가지의 토큰으로도 볼 수 있다. 이러한 요소들은 수동으로 예외처리 해주어야 하기에 인간의 직관이 필요로 하다.
위와 같은 예외적인 상황들에 대한 기준을 마련하기 위해 표준 토큰화 방법이 있으며 대표적으로는 Treebank Tokenization이 있다.
정제(Cleaning)
Cleaning을 통해 사용 목적에 맞추어 데이터의 노이즈를 제거할 수 있다.
1) 대문자 소문자 통합
영어권 언어에서 대문자는 문장 맨 앞 등과 같은 상황에 쓰이고, 대부분의 상황에서는 소문자가 쓰인다. 예시로 컴퓨터는 Language 라는 단어와 language라는 단어를 다르게 인식하기 때문에 소문자 변환을 사용하여, language를 찾는 질의(query)에서, 결과로서 Language도 찾을 수 있게 하여야 한다.
하지만 US(미국)와 us(우리)처럼 Cleaning하였을 때 뜻이 바뀌게 되는 경우도 있으므로 인간의 직관과 예외처리가 필요로 하다.
2) 출현 횟수가 적은 단어의 제거
때로는 텍스트 데이터에서 너무 적게 등장해서 자연어 처리에 도움이 되지 않는 단어들이 존재할 수도 있다. 예를 들어 입력된 메일이 정상 메일인지 스팸 메일인지를 분류하는 스팸 메일 분류기를 설계한다고 가정해보겠다. 이때 100,000개의 메일 데이터에서 총 합 5번 밖에 등장하지 않은 단어가 있다면 이 단어는 직관적으로 분류에 거의 도움이 되지 않을 것임을 알 수 있다.
하지만 무조건 출현 횟수와 중요도가 비례하지는 않으므로 이때에도 인간의 직관과 예외처리가 필요로 하다.
3) 길이가 짧은 단어, 지시(대)명사, 관사의 제거
영어권 언어에서는 길이가 짧은 a(n)과 같은 단어를 삭제하는 것만으로도 어느정도 자연어 처리에서 크게 의미가 없는 단어들을 제거하는 효과를 볼 수 있다고 알려져 있다. 즉, 영어권 언어에서 길이가 짧은 단어들은 대부분 대세에 해당되지 않는다. 하지만 한국어에서는 길이가 짧은 단어라고 삭제하는 이런 방법이 크게 유효하지 않는다.
4) 추출(Stemming)
추출 방법에는 대표적으로 어간 추출(Stemming)과 표제어 추출(Lemmmatization)이 있다.
어간추출(Stemming)
예시로 lectures라는 단어에 s가 있던 없던 전체 문장을 파악하는 데에는 크게 문제가 없기 때문에 어간(Stem)을 추출할 필요가 있다.
하지만 어간을 추출하였을 때 전체 문장의 의미가 달라질 수 있는 경우도 있기 때문에 이때에도 인간의 직관과 예외처리가 필요로 하다.
표제어 추출(Lemmatization)
표제어 추출은 단어들로부터 표제어를 찾아가는 과정이다. 표제어 추출은 단어들이 다른 형태를 가지더라도, 그 뿌리 단어를 찾아가서 단어의 개수를 줄일 수 있는지 판단한다. 예를 들어서 am, are, is는 서로 다른 스펠링이지만 그 뿌리 단어(표제어)는 be라고 볼 수 있다.
어간 추출 vs 표제어 추출
표제어 추출은 단어의 품사 정보를 포함하고 있지만, 어간 추출은 품사 정보를 갖고 있지 않다.
뜻이 분명한 단어들로만 이루어진 데이터에서는 어간 추출이 유리할 수 있지만, 뜻이 분명하지 않은 단어들로만 이루어진 데이터에서는 표제어 추출이 유리할 수도 있다.
불용어(Stopword)
예를 들면, I, me, my, myself와 같은 단어들은 문장에서는 자주 등장하지만 실제 의미 분석을 하는데는 거의 기여하는 바가 없는 경우가 있다. 이러한 단어들을 불용어라고 한다.
불용어들은 메모리, 시간, 해석의 차원에서 제거하는 것이 유리하다.
불용어(Stopword)를 제거하는 방법
불용어는 다음과 같은 방법을 통해서 제거할 수 있다.
- 불용어(stopword) 목록을 받아온다
- 정제할 문장을 토큰화(tokenization)한다
- 토큰화된 각 단어들을 불용어 목록에 있는 불용어와 대조하여
단어가 불용어 목록에 없는 경우 → 정제 결과에 추가
단어가 불용어 목록에 있는 경우 → Pass
인코딩(Encording)
컴퓨터는 텍스트보다 숫자를 효율적으로 처리한다. 그렇기에 자연어 처리에서는 텍스트를 숫자와 대응시켜 컴퓨터가 쉽게 처리할 수 있도록 변환하는 과정이 필요하다.
정수 인코딩(Integer-Encording)
대표적인 인코딩 방법으로는 정수 인코딩 방법이 있다.
정수 인코딩은 단어에 정수를 일대일로 대응시키는 인코딩 방식이다.
- 문장의 토큰화 - 불용어 및 대문자 제거 과정을 거친다
- 빈 단어 dictionart vocab = {}를 만든다
- 토큰화된 각 단어에 대해서
단어가 vocab에 속해 있지 않는 경우 → vocab[단어] = 0
단어가 vocab에 속한 경우 → vocab[단어]+= 1
정수 인코딩(Integer-Encording) 2: 빈도수 정렬
위의 과정 이후 가장 빈번한 단어에 낮은 인덱스를 부여한다. 이 과정을 거치면 행렬의 앞부분이 자주 사용되기 때문에 학습 시 메모리를 최적화할 수 있다.
패딩(Padding)
패딩을 통해 각 행렬의 인덱스 길이를 일정하게 맞출 수 있다.
패딩을 하는 이유는 대부분의 딥러닝 모델에서 고정된 길이의 행렬을 요구하기 때문이다. 왜냐하면 배치(batch) 학습과 후처리의 용이성 때문이다.
패딩(Padding) : 제로 패딩(Zero-padding)
대표적인 패딩 방법으로는 제로 패딩이 있다.
가장 길이가 긴 행렬의 길이에 맞추어 나머지 행렬의 뒷부분에 값이 0인 인덱스를 추가하는 방식이다.
원-핫 인코딩(One-hot Encording)
원-핫 인코딩은 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식이다. 이렇게 표현된 벡터를 원-핫 벡터(One-Hot vector)라고 한다.
원핫 인코딩은 각 범주를 이진 벡터로 변환하여 숫자형 데이터를 생성한다. 예를 들어, 세 개의 카테고리 ["사과", "바나나", "포도"]가 있을 때, 원핫 인코딩은 이를 [1, 0, 0], [0, 1, 0], [0, 0, 1]과 같은 벡터로 변환한다.
단어 집합의 크기를 벡터의 차원으로 하여 저장하기 때문에 저장공간을 많이 차지한다는 문제점이 있고, 단어 간의 유사도를 표현할 수는 없다는 단점이 있다.
Word2Vec Encording
원-핫 인코딩은 단어들 간의 유사도를표현할 수 없다는 단점 있다. 그렇기 때문에 단어들 간의 유의미한 유사도를 반영할 수 있도록 단어의 의미를 수치화 할 수 있는 방법이 필요하다. 이를 위해서 사용되는 대표적인 방법이 워드투벡터(Word2Vec)이다.
TF-IDF
TF-IDF를 통해 각 단어들마다 중요한 정도를 가중치로 매길 수 있다.
TF-IDF는 TF와 IDF의 곱으로 나타낸다.
tf(d,t)는 특정 문서 d에서 특정 단어 t의 등장 횟수를 의미하고,
idf(t)는 특정 단어 t가 등장한 문서의 수의 역수값이다. 이는 $ idf(t)=log(\frac{n}{1+df(t)}) $ 으로 나타내며 $n$은 총 문서의 수 이다. log를 사용하는 이유는 $n$의 값이 커질수록 IDF의 값이 기하급수적으로 커지게 되기 때문이고, 분모에 1을 더하는 이유는 $df(t)$의 값이 0일 경우 무한대에 수렴할 수 있기 때문이다. (굳이 1이 아니어도 되지만 통상적으로 1을 사용하며 이를 Smoothing이라고 함)
'AI인공지능' 카테고리의 다른 글
| 언어모델(Language Model, LM) 소개 (0) | 2024.08.15 |
|---|---|
| NLP (자연어 처리) 소개 (0) | 2024.08.09 |