수집된 코퍼스를 활용하기 위해서는 용도에 맞게 전처리할 필요가 있습니다. 전처리를 통해 코퍼스를 컴퓨터가 이해할 수 있겠끔 정제하는거죠. 이번 시간은 그 중에서도 토큰화에 대해 알아보겠습니다.
토큰화(Tokenization)는 텍스트를 토큰이라는 작은 단위로 나누는 것을 말합니다. 토큰은 상황에 따라서 형태소, 단어, 문장 등이 될 수 있습니다.
토큰화는 텍스트 전처리의 기본이기 때문에 다양한 라이브러리에서 제공하고 있습니다. 이 시리즈에서는 NLTK 라이브러리를 사용하여 진행하겠습니다.
💡 NLTK란?
NLTK는 Natural Language Toolkit로 토큰화, 품사 태깅 등 텍스트 전처리를 위한 기능들을 가지고 있는 대표적인 NLP 라이브러리입니다.
코랩 환경의 경우%pip install nltk
로 라이브러리를 설치할 수 있습니다.
NLTK 라이브러리는 %pip install nltk
로 설치했다고 해서 그 기능을 온전히 사용할 수 있는 것이 아닙니다. 필요한 기능과 데이터를 사용하기 위해선 nltk.download()
를 통해 추가로 다운로드할 필요가 있습니다.
토큰화를 하기 위해서 다음과 같이 입력해줍니다.
import nltk
nltk.download("punkt")
punkt를 다운로드함으로써 토큰화를 위한 토크나이저를 사용할 수 있게 되었습니다.
단어 토큰화(word tokenization)는 단어를 기준으로 토큰을 나눕니다. 이때 단어는 구두점(punctuation)을 구분하여 토큰화를 진행합니다.
import nltk
txt = "Study the past, if you would divine the future."
print(nltk.tokenize.word_tokenize(txt))
# 결과
# ['Study', 'the', 'past', ',', 'if', 'you', 'would', 'divine', 'the', 'future', '.']
위의 코드처럼 NLTK의 단어 토큰화는 .
이나 ,
같이 구두점을 별도로 분리하여 리스트로 반환합니다. 그렇다면 다음과 같은 경우는 어떨까요?
from nltk.tokenize import word_tokenize
txt = "Don't do that!"
print(word_tokenize(txt))
# 결과
# ['Do', "n't", 'do', 'that', '!']
아포스트로피('
)가 들어가면서 Don't가 do와 n't로 분리된 것을 확인할 수 있습니다. 사실 이런 경우, 토크나이저마다 처리하는 방식이 미세하게 다릅니다. 일례로 NLTK의 WordPunctTokenizer를 보면 다음과 같이 처리합니다.
from nltk.tokenize import WordPunctTokenizer
tokenizer = WordPunctTokenizer() # 클래스임으로 객체를 만들어줍니다.
txt = "Don't do that!"
print(tokenizer.tokenize(txt)
# 결과
# ['Don', "'", 't', 'do', 'that', '!']
위의 코드를 보면, WordPunctTokenizer에서는 아포스트로피와 그 앞뒤를 별도로 분리하여 토큰화를 진행한다는 점을 알 수 있습니다.
이와 같은 점 때문에 단어 토큰화를 진행 시에는 구두점이나 특수문자들을 주의해야 합니다. 방금 아포스트로피처럼 토크나이저마다 처리 방식이 다를 수도 있으니까요.
문장 토큰화는 여러 문장이 들어있는 방대한 양의 코퍼스를 전처리할 때 필요합니다. 보통 코퍼스는 문장 단위로 분류되지 않은 경우가 많기에 문장 토큰화가 필요할 수 있습니다.
문장 토큰화는 마침표(.
)나 개행문자(\n
) 등으로 분리하는 것이 일반적이나, 코퍼스 내 문장이 잘못된 문법을 사용할 수도 있고 Mr.Lee
처럼 문장이 끝이 아닌데도 마침표가 올 수 있기 때문에 문장 토큰화 역시 단어 토큰화처럼 어려운 일이라 할 수 있겠습니다.
NLTK에서 문장 토큰화는 다음과 같이 이루어집니다.
from nltk.tokenize import sent_tokenize
txt = "If you don't design your own life plan, chances are you'll fall into someone else's plan. And guess what they have planned for you? Not much."
print(sent_tokenize(txt))
# 결과
# ["If you don't design your own life plan, chances are you'll fall into someone else's plan.", 'And guess what they have planned for you?', 'Not much.']