NLP Task를 수행하기 위해 필요한 데이터 전처리 과정 중 Tokenization(토큰화)를 직접 실습해본다.
Python 기본 라이브러리를 이용해 토큰화를 진행할 수도 있지만 시간이 오래걸리고 고려해야할 점이 많다.
공개되어있는 자연어 처리 Library를 사용하여 빠르게 토큰화를 하는 방법을 알아본다.
(sub-word 단위의 토큰화는 여기서 수행하지 않는다.)
NLTK는 Natural Language Toolkik의 약자로 교육용으로 개발된 자연어 처리 및 문서 분석용 Python Package이다.
주요 기능
NLTK는 pip를 이용해 설치할 수 있다.
!pip install nltk
완료가 되면 다음과 같이 nltk가 설치되어 있는 것을 확인할 수 있다.
!pip show nltk
NLTK의 Tokenizer(토크나이저)를 사용하기 위해서는 데이터(NLTK Data)를 설치해야한다.
nltk를 import하고 nltk.download()를 이용해서 토큰화에 필요한 데이터를 설치할 수 있다.
import nltk
nltk.download('popular')
word_tokenize()를 이용해 문장을 토큰화할 수 있다.
from nltk.tokenize import word_tokenize
text = 'David\'s book wasn\'t famous, but his family loved his book.'
word_tokenize(text)
['David',
"'s",
'book',
'was',
"n't",
'famous',
',',
'but',
'his',
'family',
'loved',
'his',
'book',
'.']
WordPunctTokenizer는 work_tokenize와는 달리 '(구두점)을 별도의 토큰으로 구분해서 토큰화를 진행한다.
from nltk.tokenize import WordPunctTokenizer
punct_tokenizer = WordPunctTokenizer()
punct_tokenizer.tokenize(text)
['David',
"'",
's',
'book',
'wasn',
"'",
't',
'famous',
',',
'but',
'his',
'family',
'loved',
'his',
'book',
'.']
wasn't이 wasn, ', t 로 분리된 것을 알 수 있다.
여러 문장으로 이루어진 text를 1개의 문장씩 토큰화하는 함수이다.
from nltk.tokenize import sent_tokenize
text2 = 'David\'s book wasn\'t famous, but his family loved his book. Seventy years later, his book began to be known to the public.'
sent_tokenize(text2)
["David's book wasn't famous, but his family loved his book.",
'Seventy years later, his book began to be known to the public.']
자주 등장하지만 실제 의미 분석을 하거나 작업을 수행하는데 크게 기여하지 않는 단어들을 불용어(stopword)라고 한다.
불용어는 문장의 길이를 늘리기 때문에 실제 학습할 때 불용어를 제거하는 작업을 수행할 수도 있다.
from nltk.corpus import stopwords
stop_word_list = stopwords.words('english')
for word in stop_word_list[:10]:
print(word)
i
me
my
myself
we
our
ours
ourselves
you
you're
token_list = [ token for token in word_tokenize(text) if token not in stop_word_list]
print(token_list)
print(word_tokenize(text))
['David', "'s", 'book', "n't", 'famous', ',', 'family', 'loved', 'book', '.']
['David', "'s", 'book', 'was', "n't", 'famous', ',', 'but', 'his', 'family', 'loved', 'his', 'book', '.']
참고
spaCy는 Python과 Cython으로 작성된 고급 자연어 처리를 위한 Python Package이다.
주요 기능
spaCy - Tokenization, spaCy - Processing Pipelines에서 자세한 내용을 확인할 수 있다.
spaCy는 pip를 이용하여 설치할 수 있다.
!pip install spacy
설치가 완료되면 다음과 같이 확인할 수 있다.
!pip show spacy
spaCy 역시 토큰화에 필요한 데이터를 다운로드 해야한다.
!python -m spacy download en_core_web_sm
import spacy
spacy_en = spacy.load('en_core_web_sm')
text = 'David\'s book wasn\'t famous, but his family loved his book.'
for token in spacy_en.tokenizer(text):
print(token)
David
's
book
was
n't
famous
,
but
his
family
loved
his
book
.
spaCy를 이용해 토큰화를 수행하면 기본적으로 토큰외에도 PoS(품사), lemma등의 정보를 알 수 있다.
for token in spacy_en.tokenizer(text):
print(f"token: {token.text}, PoS: {token.pos_}, lemman: {token.lemma_}")
token: David, PoS: , lemman:
token: 's, PoS: , lemman:
token: book, PoS: , lemman:
token: was, PoS: , lemman:
token: n't, PoS: , lemman:
token: famous, PoS: , lemman:
token: ,, PoS: , lemman:
token: but, PoS: , lemman:
token: his, PoS: , lemman:
token: family, PoS: , lemman:
token: loved, PoS: , lemman:
token: his, PoS: , lemman:
token: book, PoS: , lemman:
token: ., PoS: , lemman:
stop_words = spacy.lang.en.stop_words.STOP_WORDS
for i, stop_word in enumerate(stop_words):
if i == 10: break
print(stop_word)
very
become
twelve
hereupon
into
say
‘ll
each
throughout
’s
자연어처리를 위해 만들어진 PyTorch 라이브러리이다.
pip를 이용해 설치할 수 있다. PyTorch version 주의하여 적합한 version을 설치해야한다.
!pip install torchtext
!pip show torchtext
get_tokenizer()를 이용하여 torchtext에서 사용되는 tokenizer를 불러올 수 있다.
from torchtext.data import get_tokenizer
tokenizer = get_tokenizer('basic_english')
text = 'David\'s book wasn\'t famous, but his family loved his book.'
tokens = tokenizer(text)
tokens
['david',
"'",
's',
'book',
'wasn',
"'",
't',
'famous',
',',
'but',
'his',
'family',
'loved',
'his',
'book',
'.']