본문 바로가기

자연어처리(NLP)

1. 토큰화 [초등학생도 이해하는 자연어처리]

반응형

 안녕하세요 '코딩 오페라'블로그를 운영하고 있는 저는 'Master.M'입니다.

오늘부터는 '초등학생도 이해하는 자연어 처리'라는 주제로 자연어 처리(NLP)에 대해 포스팅하도록 하겠습니다. 제목처럼 진짜 핵심 내용을 쉽게 설명하는 것을 목표로 하고 있으니 자연어 처리(NLP)에 입문하고 싶은 분들은 많은 관심 부탁드립니다. 오늘 알아볼 내용은 '토큰화'입니다.

 

토큰화란?

 우선 토큰화가 무엇이지 알아야겠죠? 토큰화란 문장을 분석하기 위해 더 이상 쪼개 지지 않을 때까지 잘게 분해는 작업을 의미합니다. 여러분들이 레고 모형을 더 이상 쪼개 지지 않는 레고 블록 단위로 분해하는 것과 유사하다고 생각하면 됩니다. 여기서 '토큰(token)'은 우리나라 말로는 '형태소(morpheme)'로 가장 작은 말의 단위라고 생각하면 됩니다. 

예를들어 위와 같이 'I am a boy.'라는 문장을 토큰 화하면 'I', 'am', 'a', 'boy', '.'이렇게 5개로 나뉩니다. 이와 같은 과정을 '토큰화(tokenize)'라고 합니다. 

 

그럼 이제 본격적으로 토큰화 예제를 실습해보도록 하겠습니다.

 

영어 토큰화

 영어는 거의 띄어쓰기 단위로 토큰화가 가능하여 한국어 토큰 화보다 쉽습니다.

 

문장 토큰화(Sentence Tokenization) 

!pip install nltk

text = "I'm a elementary student. And I'm hadding to a middle school student." 
sentence = "And I'm hadding to a middle school student." 

# Sentence tokenize
from nltk import sent_tokenize
sentences = sent_tokenize(text)
print(sentences)
["I'm a elementary student.", "And I'm hadding to a middle school student."]

 문장 토큰화는 문서를 문장 단위로 분해합니다. 우선 토큰화에 사용되는 프로그램은 'nltk'입니다. 이 nltk에서 문장 단위 토크 나이저인 sent_tokenize를 import 하고 text를 넣어주면, 다음과 같이 문장 단위로 토큰 화가 된 것을 확인할 수 있습니다.

 

 

 단어 토큰화(Word)

sentence = "And I'm hadding to a middle school student." 

# Word tokenize
from nltk import word_tokenize
words = word_tokenize(sentence)
print(words)
['And', 'I', "'m", 'hadding', 'to', 'a', 'middle', 'school', 'student', '.']

 단어 토큰화는 문장을 단어 단위로 분해합니다. nltk의 단어 단위 토크나이저인 word_tokenize를 import  하고 문장을 넣어주면, 다음과 같이 단어 단위로 토큰 화가 된 것을 확인할 수 있습니다. 그런데 여기서 자세히 보면 I'm에서 apostrophe를 포함해서 "'m" 이렇게 분해된 것을 확인 할 수 있습니다. 만약 apostrophe 역시 분해하고 싶다면 다음과 같이 실행하면 됩니다. 

 

sentence = "And I'm hadding to a middle school student." 

# Word tokenize
from nltk.tokenize import WordPunctTokenizer  
words = WordPunctTokenizer().tokenize(sentence)
print(words)
['And', 'I', "'", 'm', 'hadding', 'to', 'a', 'middle', 'school', 'student', '.']

nltkWordPunctTokenizer를 사용하면 apostrophe 역시 분해된 것을 확인할 수 있습니다. 

 

한국어 토큰화

 앞서 말했듯이 한국어는 영어와 다르게 띄어쓰기 만으로 토큰을 구별하기가 어렵습니다. 때문에 형태소 단위로 문장을 구분지어야 하는데 이때는 위에서 사용했던 nltk가 아닌 konlpy를 사용하는 것이 유리합니다.

# Korean
!pip install konlpy

text = "나는 초등학생이다. 나는 앞으로 중학생이 될 것이다."  

from konlpy.tag import Okt
okt = Okt()
morphs = okt.morphs(text)
print(morphs)
['나', '는', '초등학생', '이다', '.', '나', '는', '앞', '으로', '중학생', '이', '될', '것', '이다', '.']
위와 같이 konlpy를 설치해주고 Okt를 import하여 문장을 분해하면, 형태소 단위로 잘 분해가 된 것을 확인 할 수 있습니다. 
 
 

정리

- 토큰화: 토큰화란 문장을 분석하기위해 더이상 쪼개지지 않을 때까지 잘게 분해는 작업을 의미(레고 모형을 더이상 쪼개지지 않는 레고 블럭 단위로 분해하는 것과 유사)

- 영어 문장 토큰화: from nltk import sent_tokenize

 

- 영어 단어 토큰화: from nltk import word_tokenize, from nltk.tokenize import WordPunctTokenizer 

 

- 한국어 형태소 토큰화: from konlpy.tag import Okt

 

  지금 까지 저희는 '토큰화(tokenize)'에 대해 알아보았습니다. 도움이 되셨나요? 만약 되셨다면 구독 및 좋아요로 표현해 주시면 정말 많은 힘이 됩니다. 궁금한 사항 혹은 앞으로 다루어 주었으면 좋을 주제가 있으시면 댓글 남겨주시면 감사하겠습니다. 저는 '코딩 오페라'의 'Master.M'이었습니다. 감사합니다.

반응형