토큰화 : 코퍼스를 의미 있는 단위로 쪼갬 (단어/어절/문장/...)

- ['아버지', '가', '방', '에', '들어가', '신다']


코퍼스를 수집하고 가장 먼저 해야할 것은, 데이터들을 의미 있는 작은 단위(Token)로 쪼개는 토큰화(tokenization) 작업을 해야 한다. 띄어쓰기 별로 나눈다던지, 어절별로 나눈다던지, 형태소별로 나누던지, 이러한 토큰화 작업을 하면 토큰들에 대한 분석이 가능해 진다.



언어별 토큰화의 어려움


의미있는 단어들을 추출하기 위한 첫번째 단계인 토큰화는 언어별로 섬세한 알고리즘을 필요로 한다. 예로 들면, 영어권 언어들은 띄어쓰기 단위의 어절 토큰화가 단어 토큰화와 같아 합성어(New York)나 줄임말(I'm) 정도의 예외처리만 잘하면 단어(word) 토큰화가 가능하다. 한국어의 경우 띄어쓰기를 규칙적으로 사용하지도 않을 뿐더러, 교착어이기 때문에 대부분의 단어에 조사 등이 붙어 어절 토큰화가 아닌 형태소 토큰화가 필요하다. 형태소는 그 자체로 뜻이 있는 자립 형태소와, 다른 형태소와 결합해야지만 사용할 수 있는 의존 형태소가 있는데 이 형태소들을 각각 분리하는 것이 형태소(morpheme) 토큰화이다. 또한 여러 뜻을 포함하는 단어의 의미를 파악하기 위해 품사 태깅(part-of-speech tagging)도 필요하다. 문장(sentence) 토큰화를 먼저 수행할 수도 있는데 이 경우 구두점이 단어의 일부분이 아닌 문장의 끝임을 어떻게 판단할 것인지, 이러한 규칙들이 필요하다.


이런 것들을 어떻게 만들어야 하나... 걱정할 필요 없다. 이미 공개된 자연어 처리 패키지들을 잘 활용하기만 하면 된다.


◈ 영문 자연어 처리: NLTK(Natural Language Toolkit)


◈ 한글 자연어 처리: KoNLPy

- 한글 형태소 분석기: Mecab, Komoran, Hannanum, Kkma, Okt(Open Korean Text, 예전이름 Twitter),... 


◈ 한글 문장 분리기: kss(Korean Sentence Splitter)



NLTK 를 사용한 영어권 언어 토큰화


import nltk
from nltk.tokenize import word_tokenize
from nltk.tokenize import sent_tokenize
from nltk.tag import pos_tag
 
# corpus download
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
 
text = "At eight o'clock on Thursday morning. Arthur didn't feel very good."
tokens = word_tokenize(text)
 
print(tokens) # 단어 토큰화
print(pos_tag(tokens)) # 품사 태깅
print(sent_tokenize(text)) # 문장 토큰화
 

""" 결과
['At', 'eight', "o'clock", 'on', 'Thursday', 'morning', '.', 'Arthur', 'did', "n't", 'feel', 'very', 'good', '.']
[('At', 'IN'), ('eight', 'CD'), ("o'clock", 'NN'), ('on', 'IN'), ('Thursday', 'NNP'), ('morning', 'NN'), ('.', '.'), ('Arthur', 'NNP'), ('did', 'VBD'), ("n't", 'RB'), ('feel', 'VB'), ('very', 'RB'), ('good', 'JJ'), ('.', '.')]
["At eight o'clock on Thursday morning.", "Arthur didn't feel very good."]
"""
cs


NLTK 를 사용하여 단어/문장 토큰화 및 토큰화 데이터에 품사를 태깅하였다. NLTK 는 Penn Treebank Tokenization 의 규칙에 따라 토큰화 하고, Penn Treebank POS Tags 라는 품사 태깅 기준을 사용한다.(패키지마다 기준이나 규칙은 다를 수 있다.)



KoNLPy 를 사용한 한글 토큰화


KoNLPy 을 사용하기 위해서는 JDK 1.7 이상이 설치되어 있어야 한다. 그리고 pip 로 konlpy 를 설치하고, JAVA 와 Python 을 연결해 주는 JPype 를 본인의 버전에 맞게 다운로드 하여 설치한다. (JPype 다운로드 - https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype)


> pip install konlpy
> pip install JPype1-1.1.2-cp38-cp38-win_amd64.whl
cs


from konlpy.tag import *
 
okt = Okt()
hannanum = Hannanum()
kkma = Kkma()
komoran = Komoran()
mecab = Mecab()
 
text = "아버지가방에들어가신다"
 
print(okt.morphs(text))
print(okt.pos(text))
print('-----')
print(mecab.morphs(text))
print(mecab.pos(text))
 
 
""" 결과
['아버지', '가방', '에', '들어가신다']
[('아버지', 'Noun'), ('가방', 'Noun'), ('에', 'Josa'), ('들어가신다', 'Verb')]
-----
['아버지', '가', '방', '에', '들어가', '신다']
[('아버지', 'NNG'), ('가', 'JKS'), ('방', 'NNG'), ('에', 'JKB'), ('들어가', 'VV'), ('신다', 'EP+EC')]
"""
cs


한글 토큰화 방법도 형태소를 분석하고 품사를 태깅하는 순서로 토큰화 과정은 대부분 비슷하다. 형태소 분석기에 따라 토큰화된 결과가 조금씩 다르며, 상황별 문장에 따라 각각의 장단점이 있다. 저중에는 아버지가 제대로 방에 들어가는 분석기도 mecab 뿐이고 성능도 가장 낫다고는 하지만... 윈도우 플랫폼은 지원하지 않아 추가 설치 및 설정 등이 필요하다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,