NLP 태스크의 전처리 과정에서, 토큰화(tokenization), 정제(cleaning), 정규화(normalization)와 같은 작업이 수행된다.
토큰화란? (Tokenization)
토큰화는 주어진 코퍼스(corpus)에서 토큰(token)이라 불리는 단위로 나누는 작업이다.
토큰의 단위는 상황에 따라 다르지만, 보통 의미있는 단위를 토큰으로 정의한다.
ex) 단어, 형태소
한국어 토큰화
영어는 New York같은 합성어나 There's와 같은 줄임말에 대한 예외처리만 한다면, 띄어쓰기를 기준으로 토큰화를 수행해도 의미를 가지고 있는 단위로 볼 수 있는 단어 토큰화가 잘 작동한다.
-> 영어는 대부분 단어 단위로 띄어쓰기가 이루어지기 때문이다.
하지만 한국어에서는 띄어쓰기를 기준으로 토큰화를 하면 제대로 수행되지 않는다. 그 이유는 다음과 같다.
- 한국어는 띄어쓰기가 잘 지켜지지 않는다. -> 영어와 다르게 글을 이해하는 데 문제가 없기 때문
- 한국어는 띄어쓰기의 단위가 '어절'이다.
- 근본적으로 조사, 어미 등을 붙여서 만드는 언어인 교착어이기 때문이다.
-> 뜻을 가진 가장 작은 말의 단위인 형태소를 기준으로 토큰화가 필요하다!
한국어 토크나이저(Tokenizer)
한국어 자연어 처리를 위한 KoNLPy라는 파이썬 패키지가 존재한다.
KoNLPy 공식문서: https://konlpy-ko.readthedocs.io/ko/v0.4.3/
KoNLPy에서 제공하는 형태소 분석기들은 아래와 같다.
- OKT (Open Korea Text)
- 메캅 (Mecab)
- 코모란 (Komoran)
- 한나눔 (Hannanum)
- 꼬꼬마 (Kkma)
이 중, 메캅(Mecab)은 Windows환경은 공식적으로 지원하지 않는다.
-> Windows에서 Mecab 사용하는 방법: https://haseong8012.tistory.com/51
[NLP] 토큰화 및 형태소 분석, Mecab 윈도우에서 사용하기(사용자 사전 추가, 우선순위 변경)
토큰화란? 형태소 분석이란? 자연어처리 과정 중에는 토큰화(Tokenize) 과정이 있다.한국어 토큰화를 진행할 때에는 형태소(morpheme)란 기준으로 토큰화 하기 때문에 '형태소 분석'이라고도 불린다.
haseong8012.tistory.com
한국어 토크나이저(형태소 분석기) 비교
비교해 볼 대상인 형태소 분석기들은 위에 있는 KoNLPy에서 제공해주는 형태소 분석기들이다.
필요한 Library Import
import time
import random as rd
import pandas as pd
# 형태소 분석기
from konlpy.tag import Okt, Komoran, Hannanum, Kkma, Mecab
konlpy 패키지에서 비교할 토크나이저들을 불러온다.
Dataset Load
df = pd.read_pickle("../data/MaeIlGyeongJe.pkl")
df
Sample 문장 추출
texts = list(df['Text'])
sample_text1 = texts[0]
# 본문 문장단위로 분리
def splitText(text: str):
text = text.replace('\n', '. ')
text = (text.split('. '))
text = (list(filter(None, text))) # 빈 문자열 제거
return text
sample_text1 = splitText(sample_text1)
sample_sentence1 =''.join(sample_text1[10])
데이터셋에서 Sample문장을 뽑아와서 비교하기 위해, 여러 개의 문장으로 이루어진 데이터에서 임의로 한 개의 문장을 뽑아왔다.
형태소 분석기 비교 준비
# 형태소 분석기 생성
def get_tokenizer(tokenizer_name):
if tokenizer_name == "komoran":
tokenizer = Komoran()
elif tokenizer_name == "okt":
tokenizer = Okt()
elif tokenizer_name == "Mecab":
tokenizer = Mecab(dicpath='C:/mecab/mecab-ko-dic')
elif tokenizer_name == "hannanum":
tokenizer = Hannanum()
elif tokenizer_name == "kkma":
tokenizer = Kkma()
else:
print("Tokenizer is not valid")
return tokenizer
반복문을 사용해 토크나이저를 사용할 때, 편하도록 토크나이저의 이름을 입력으로 받으면 해당 토크나이저를 반환하도록 하는 함수를 생성한다.
# 토크나이저별로 토큰화 결과, 시간 측정
def compareTokenizer(sentence: str, tokenizer_list: list):
result_list = []
for i in tokenizer_list:
start = time.time() # 시작 시간 저장
tokenizer = get_tokenizer(i) # 토크나이저 불러오기
tokenized_sentence = tokenizer.morphs(sentence) # 토큰화
# 종료 시간에서 시작 시간을 빼서 걸린 시간 계산
time_required = time.time() - start
# 토크나이저 이름, 걸린 시간, 결과를 리스트에 저장
tokenizer_and_time = i, time_required, tokenized_sentence
result_list.append(tokenizer_and_time)
result_df = pd.DataFrame(
result_list,
columns=["Tokenizer", "Time", "Result"]
)
return sentence, result_df
문장과 토크나이저들로 이루어진 리스트를 입력으로 받으면,
해당 문장을 토크나이저로 토큰화 및 소요 시간을 반환하는 함수를 만든다.
토크나이저 비교
- sample sentence = ["아버지가방에들어가신다", "국민의힘", "더불어민주당"]
한국어 토큰화의 대표적인 예제인 "아버지가방에들어가신다"와 지금 하고 있는 "언론사별 정치적 편향성 분석"의 메인 워드인 "국민의힘"과 "더불어민주당"을 토큰화 해본다.
from IPython.display import display # display 함수를 이용하여 DataFrame 출력
pd.set_option('display.max_colwidth', None) # DataFrame 출력 컬럼 길이 설정
tokenizer_list = ["komoran", "okt", "Mecab", "hannanum", "kkma"]
for i, sample_sentence in enumerate(["아버지가방에들어가신다", "국민의힘", "더불어민주당"]):
text, result = compareTokenizer(sample_sentence, tokenizer_list)
print(f"본문: {text}\n")
display(result)
if i != 2:
print(f"{'='*200}\n")
결과
먼저 소모 시간부터 보면 다른 토크나이저들에 비해 Mecab이 월등히 빠른 것을 볼 수 있다.
또한, 토크나이저별로 결과가 모두 다르게 나오는 것을 볼 수 있다.
"아버지가방에들어가신다"의 문장의 결과 또한 hannanum의 토큰화 결과가 가장 최악의 경우이고, 사용 목적마다 다르겠지만 Mecab이 가장 토큰화 결과가 좋은 것을 볼 수 있다.
또, 지금 프로젝트의 메인 키워드인 "국민의힘", "더불어민주당"는 토큰화를 진행했을 때, 단어가 찢어지면 안된다. 이를 확인하기 위해 토큰화를 시도해보았다.
이 또한 결과가 모두 다르게 나오는 것을 볼 수 있다. 여기서 Mecab의 결과는 내가 사용자 사전에 따로 추가해두었기 때문에 토큰화되지 않은 결과이다.
Mecab 사용자 사전 추가 방법: https://haseong8012.tistory.com/51
결론
위 프로세스 이후에도 따로 랜덤하게 여러 문장들을 토큰화 해 본 결과는 다음과 같다.
소요시간: Mecab > Okt > kkma > hannanum > komoran
토큰화 품질: Mecab > Okt > Komoran > Kkma > hannanum
(토큰화 품질 평가는 주관적이며 사용할 데이터셋, 사용 목적에 따라 달라질 것이다.)
'Data Science > NLP' 카테고리의 다른 글
[NLP] 토큰화 및 형태소 분석, Mecab 윈도우에서 사용하기(사용자 사전 추가, 우선순위 변경) (0) | 2024.05.25 |
---|