정리필요/NLP

[개념] 토큰화

kstar2 2021. 3. 29. 13:34

출처wikidocs.net/21667

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

1. 자연어 처리(natural language processing)란?

자연어(natural language)란 우리가 일상 생활에서 사용하는 언어이다. 즉, 자연어 처리란 우리가 일상 생활에서 사용하는 언어의 의미를 분석하여 컴퓨터가 처리할 수 있도록 하는 일이다.

 

예로는 음성 인식, 내용 요약, 사용자의 감성 분석, 텍스트 분류 작업(스팸 메일 분류, 뉴스 기사 카테고리 분류), 질의 응답 시스템, 챗봇 등의 분야에서 사용된다.

 

2. 텍스트 전처리(Text preprocessing)

자연어 처리에 있어서 텍스트 전처리는 매우 중요하다. 그 이유는 전처리가 제대로 되지 않으면 자연어 처리 기법들이 제대로 동작하지 않는다. 쉽게 생각하면 외계인이 우리에게 말을 건다면 못 알아듣지만 통역사가 있다면 알아 들을 수 있는 말로 바뀌듯이 자연어도 컴퓨터가 알아들을 수 있게 처리해야하기 때문에 중요하다.

 

2-1) 토큰화(Tokenization)

코퍼스(말뭉치) 데이터가 필요에 맞게 전처리되지 않은 상태라면, 해당 데이터를 사용하고자하는 용도에 맞게 토큰화&정제&정규화하는 일이 필요하다.

 

토큰(token)은 단위가 상황에 따라 다르지만, 보통 의미있는 단위를 의미한다.

즉, 토큰화는 주어진 코퍼스(corpus)에서 토큰(token)이라 불리는 단위로 나누는 작업이다.

 

2-1-1) 단어 토큰화(Word Tokenization)

토큰의 기준의 기준을 단어(word)로 하는 경우를 의미하며, 여기서 단어는 단어 단위 외에도 단어구, 의미를 갖는 문자열로도 간주되기도 한다.

 

2-1-2) 토큰화 중 생기는 선택의 순간

해당 데이터를 가지고 어떤 용도로 사용할 것인지에 따라 기준을 정하면 된다.

from nltk.tokenize import word_tokenize
print(word_tokenize("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery as cheery goes for a pasty shop."))

 

 만약 위 코드가 실행되는데 문제가 생기면 다음과 같은 코드를 실행하면된다.

참고 : wotres.tistory.com/entry/nltk-LookupError-%ED%95%B4%EA%B2%B0%EB%B2%95-in-python

 

nltk LookupError 해결법 in python

nltk 를 이용하고자 할때 아래와 같은 에러가 나타날떄가 있다. LookupError: ********************************************************************** Resource punkt not found. Please use the NLTK Download..

wotres.tistory.com

import nltk
nltk.download()

 WordPunctTokenizer는 구두점을 별도로 분류하는 특징을 갖고 있기때문에, 앞서 확인했던 word_tokenize와는 달리 Don't를 Don't로 하였다.

from tensorflow.keras.preprocessing.text import text_to_word_sequence
print(text_to_word_sequence("Don't be fooled by the dark sounding name, Mr. Jone's Orphanage is as cheery as cheery goes for a pastry shop."))

2-1-3) 토근화에서 고려해야할 사항

- 구두점이나 특수 문자를 단순 제외해서는 안 된다.

- 줄임말과 단어 내에 띄어쓰기가 있는 경우.

- 표준 토큰화 예제

from nltk.tokenize import TreebankWordTokenizer
tokenizer=TreebankWordTokenizer()
text="Starting a home-based restaurant may be an ideal. it doesn't have a food chain or restaurant of their own."
print(tokenizer.tokenize(text))

2-1-4) 문장 토큰화(Sentence Tokenization)

보통 갖고있는 코퍼스가 정제되지 않은 상태라면, 코퍼스는 문장 단위로 구분되어있지 않을 가능성이 높다. 이를 사용하고자 하는 용도에 맞게 하기 위해서는 문장 토큰화가 필요하다. 여기서 코퍼스 내에서 문장 단위로 구분하는 작업이 문장 분류이다. 여기서 !, ?, . 으로 구분자를 하면 될 듯 싶지만 ip 주소와 같이 .으로 나타내거나 MS. 같이 사용 될 수 있기에 꼭 문장 구분자일 것이라는 보장은 없다.

from nltk.tokenize import sent_tokenize
text="His barber kept his word. But keeping such a huge secret to himself was driving him crazy. Finally, the barber went up a mountain and almost to the edge of a cliff. He dug a hole in the midst of some reeds. He looked about, to make sure no one was near."
print(sent_tokenize(text))

아래 코드는 문장안에 .이 여러번 등장하는 경우이다.

from nltk.tokenize import sent_tokenize
text="I am actively looking for Ph.D. students. and you are a Ph.D student."
print(sent_tokenize(text))

한국어에 대한 토큰화 코드

import kss

text='딥 러닝 자연어 처리가 재미있기는 합니다. 그런데 문제는 영어보다 한국어로 할 때 너무 어려워요. 농담아니에요. 이제 해보면 알걸요?'
print(kss.split_sentences(text))

2-1-5) 이진 분류기(Binary Classifier)

문장 토큰화에서의 예외 사항을 발생시키는 마침표의 처리를 위해 입력에 따라 두 개의 클래스로 분류하는 이진 분류기(Binary classifier)를 사용

- 마침표가 단어의 일부일 경우. 즉, 마침표가 약어로 쓰이는 경우

- 마침표가 정말로 문장의 구분자일 경우

이진 분류기는 임이로 정한 여러가지 규칙을 코딩한 함수일 수도 있으며, 머신 러닝을 통해 이진 분류기를 구현하기도함

그래서 이준 분류기 구현에서 약어 사전은 유용하게 사용한다.

영어권 언어의 약어 사전 : https://public.oed.com/how-to-use-the-oed/abbreviations/

문장 토큰화 규칙 작성시 예외상황 관련 참고 사항 : https://www.grammarly.com/blog/engineering/how-to-split-sentences/

2-1-6) 한국어에서의 토큰화의 어려움

영어는 줄임말에 대한 예외처리만 한다면, 띄어쓰기를 기준으로 하는 띄어쓰기 토큰화를 수행해도 단어 토큰화가 잘 작동한다. 왜냐하면 거의 대부분의 경우에서 단어 단위로 띄어쓰기가 이루어지기 때문이다.

 

하지만 한국어는 영어와 달리 띄어쓰기만으로는 토큰화를 하기에 부족하다. 한국어의 경우에는 띄어쓰기 단위가 되는 단위를 어절이라고 하는데 한국어가 영어와는 다른 형태를 가지는 교착어라는 점에서 기인한다.

 

한국어 토큰화 어려움 1

- 한국어 토큰화에 있어 형태소는 개념은 중요한데, 이는 뜻을 가진 가장 작은 말의 단위를 의미한다. 

 - 자립 형태소 : 접사, 어미, 조사와 상관없이 자립하여 사용할 수 있는 형태소. 체언, 수식언, 감탄사 등 

 - 의존 형태소 : 다른 형태소와 결합하여 사용되는 형태소. 접사, 어미, 조사, 어간

 

한국어 토큰화 어려움 2

- 한국어는 띄어쓰기가 영어보다 잘 지켜지지 않는다. 뉴스 기사와 같이 철저하게 지켜진 것도 있지만, 대부분 지켜지지 않는 코퍼스가 많다. 즉, 한국어는 모아쓰기 방식, 여어는 풀어쓰기 방식이라는 언어적 차이가 있다.

 

2-1-7) 품사 태깅(Part-of-speech tagging)

단어의 의미를 제대로 파악하기 위해서는 해당 단어가 어떤 품사로 쓰였는지 보는 것이 주요 지표가 된다. 그에 따라 단어 토큰화 과정에서 각 단어가 어떤 품사로 쓰였는지를 구분해 놓기도 하는데, 이 작업을 품사 태깅이라고 한다. 이는 

NLTK와 KoNLPy에서 지원하는 것이 있다.

 

2-1-8) NLTK와 KoNLPy를 이용한 영어, 한국어 토큰화 실습

from nltk.tokenize import word_tokenize
text="I am actively looking for Ph.D. students. and you are a Ph.D. student."
print(word_tokenize(text))
from nltk.tag import pos_tag
x=word_tokenize(text)
pos_tag(x)

인칭 대명사(Penn Treebank POG Tags, PRP), 동사(VBP), 부사(RB), 현재부사(VBG), 전치사(IN), 고유 명사(NNP), 복수형 명사(NNS), 접속사(CC), 관사(DT)

 

한국어 자연어 처리르 위해 KoNLPy라는 파이썬 패키지를 사용 가능한데 여기서 형태소 분석기로는 Okt(Open Korea Text), 메캅(Mecab), 코모란(Komoran), 한나눔(Hannanum), 꼬꼬마(Kkma)

'정리필요 > NLP' 카테고리의 다른 글

[개념] 정제와 정규화  (0) 2021.03.31
[개념] Markov란  (0) 2021.03.18
[개념] NLP란?  (0) 2021.03.18
Wordpiece  (0) 2021.03.15
임베딩  (0) 2021.03.15