자연어 처리에서 크롤링 등으로 얻어낸 코퍼스 데이터가 필요에 맞게 전처리 되지 않은 상태라면, 해당 데이터를 사용하고자 하는 용도에 맞게 토큰화, 정제, 정규화 해야 한다. 이때, 주어진 코퍼스에서 토큰이라는 단위로 나누는 작업을 토큰화라고 한다.
코퍼스 데이터 (Corpus data)
자연어 처리 및 머신 러닝 연구를 위해 수집된 대량의 텍스트 데이터이다.
토큰의 기준을 단어로 한다.
토큰화를 하다 보면, 토큰화의 기준을 생각해 보아야 하는 경우가 있다. 어떤 기준으로 토큰화 할 것인지는 데이터의 용도에 맞게 결정하면 된다.
예를 들어 다음과 같은 문장이 있다고 하자.
The past is never dead. It's not even past.
이때, It's를 토큰화 기준에 따라 여러 방법으로 토큰화 할 수 있다.
원하는 결과가 나오도록 직접 설계할 수도 있지만, NLTK는 목적에 부합한다면 편하게 활용할 수 있는 영어 코퍼스 토큰화 도구를 제공해 준다.
예시를 살펴보기 위해 필요한 모듈을 import 하고 토큰화할 문장을 정해준다.
문장은 William Faulkner의 명언이다.
from nltk.tokenize import word_tokenize
from nltk.tokenize import WordPunctTokenizer
from tensorflow.keras.preprocessing.text import text_to_word_sequence
sentence = "The past is never dead. It's not even past."
먼저, 기본 word_tokenize를 활용해 보자.
word_tokenize는 It'와 s로 분리하였다.
print('단어 토큰화1 :',word_tokenize(sentence))
==========
단어 토큰화1 : ['The', 'past', 'is', 'never', 'dead', '.', 'It', "'s", 'not', 'even', 'past', '.']
다음으로, wordPunctTokenizer를 활용해 보자.
WordPunctTokenizer는 구두점을 별도로 분류하는 특징을 갖고 있다.
따라서 It', ', s로 분리하였다.
중복되어 나온 것이 문제이긴 하다.
print('단어 토큰화2 :',WordPunctTokenizer().tokenize(sentence))
==========
단어 토큰화2 : ['The', 'past', 'is', 'never', 'dead', '.', 'It', "'", 's', 'not', 'even', 'past', '.']
마지막으로 케라스의 text_to_word_sequence를 활용해 보자.
케라스의 text_to_word_sequence는 기본적으로 모든 알파벳을 소문자로 바꾸면서 마침표나 컴마, 느낌표 등의 구두점을 제거한다. 그러나 '는 보존하고, it's는 분리하지 않았음을 확인할 수 있다.
print('단어 토큰화3 :',text_to_word_sequence(sentence))
==========
단어 토큰화3 : ['the', 'past', 'is', 'never', 'dead', "it's", 'not', 'even', 'past']
토큰의 기준을 문장으로 한다. 코퍼스를 문장 단위로 구분하는 작업으로, 문장 분류 (sentence segmentation)라고도 한다.
예시를 보자. 어린왕자의 한 부분을 가져와 보았다.
from nltk import sent_tokenize
text = 'The fact is that I did not know how to understand anything! I ought to have judged by deeds and not by words. She cast her fragrance and her radiance over me. I ought never to have run away from her... I ought to have guessed all the affection that lay behind her poor little stratagems. Flowers are so inconsistent! But I was too young to know how to love her.'
print('문장 토큰화1 :',sent_tokenize(text))
----------
문장 토큰화1 : ['The fact is that I did not know how to understand anything!', 'I ought to have judged by deeds and not by words.', 'She cast her fragrance and her radiance over me.', 'I ought never to have run away from her...', 'I ought to have guessed all the affection that lay behind her poor little stratagems.', 'Flowers are so inconsistent!', 'But I was too young to know how to love her.']
!, ., ...를 기준으로 총 7문장으로 잘 나누어 준 것을 알 수 있다.
오늘은 자연어 처리란 무엇인지, 그리고 자연어 처리에서 중요한 데이터 전처리 과정 중 토큰화를 영어 중심으로 알아보았다. 자연어 처리는 어떤 방법으로 토큰화를 진행하는지에 따라 결과가 크게 달라지기 때문에 전처리 과정이 중요하다. 다음 포스팅에서는 한국어 토큰화에 대하여 알아보자.