토큰화(Tokenization)?
"토큰화(Tokenization)"란, 텍스트 데이터를 작은 단위로 나누는 작업이다.
이 작은 단위를 "토큰(Token)"이라고 하며 의미를 가진 단위이다. 주로 단어로 구성되지만 경우에 따라 음절로 분할하기도 한다.
- 텍스트 데이터를 문장 단위로 분리한다.
- 문장을 단어 또는 음절 단위로 분리한다.
- 분리된 단어 또는 음절을 토큰으로 처리한다.
토큰화는 자연어 처리에서 중요한 전처리 과정 중 하나이다. 토큰화를 통해 텍스트 데이터를 작은 단위로 분할하여 이를 기반으로 다양한 분석 작업을 수행할 수 있다. 예를 들어, 단어 단위로 토큰화를 하면 단어 빈도수를 계산하여 텍스트 데이터의 특징을 파악할 수 있다.
from nltk.tokenize import TreebankWordTokenizer
tokenizer = TreebankWordTokenizer()
text = "You don't need to search Iris data on Google but to load by Scikit-Learn"
print(tokenizer.tokenize(text))
"""
['You', 'do', "n't", 'need', 'to', 'search', 'Iris',
'data', 'on', 'Google', 'but', 'to', 'load', 'by', 'Scikit-Learn']
"""
# TreebankWordTokenizer는 하이픈(-)을 붙여서 하나로 출력한다.
text2 = "바람이 솔솔 부는 곳에서는 가만히 앉아만 있어도 낙원 그 자체이다. -자작글"
print(tokenizer.tokenize(text2))
"""
['바람이', '솔솔', '부는', '곳에서는', '가만히', '앉아만', '있어도', '낙원', '그', '자체
이다.', '-자작글']
"""
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-multilingual-cased")
print(tokenizer.tokenize("어머니 가방에 들어가신다"))
# ['어머니', '가', '##방', '##에', '들어', '##가', '##신', '##다']
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
text = "unhappiness"
tokens = tokenizer.tokenize(text)
print(tokens)
"""
'un', '##happiness'
"""
BertTokenizer는 BERT(Bidirectional Encoder Representations from Transformers) 모델을 위한 토큰화 도구 중 하나로, BertTokenizer를 사용하여 문장을 토큰으로 분리하면, '#' 문자가 포함된 토큰이 생성될 수 있다. 이러한 토큰은 'subword tokenization' 기법을 사용하여 생성된다.
'subword tokenization' 기법은 단어를 작은 단위(subword)로 분할하여 토큰을 생성하는 방식이다. 이 방식은 단어가 희소(sparse)한 경우에도 효과적으로 토큰화를 수행한다. BertTokenizer는 'subword tokenization' 기법 중 하나인 'WordPiece' 기법을 사용한다. 이 기법은 단어를 작은 단위(subword)로 분할하고, '#' 문자를 붙여서 다른 토큰과 구분한다.
예를 들어, "playing" 이라는 단어가 있다면, 이는 "play"와 "##ing" 이라는 두 개의 subword로 분할된다. "##"는 앞선 subword와 결합하여 하나의 토큰으로 처리된다. 따라서 BertTokenizer를 사용하여 "playing"을 토큰화하면 "play"와 "##ing" 이라는 두 개의 토큰이 생성되며, "##"는 subword를 나타내는 기호로 사용된다.
*희소(sparse)
"희소(sparse)"란, 데이터에서 0과 같은 값이 많이 존재하거나, 값이 거의 없는 상태를 의미한다. 예를 들어, 한국어 단어들의 벡터 표현을 구성하는 경우, 한국어 단어의 수는 수십만개 이상일 수 있다. 그러나 특정 문서나 문장에서는 사용된 단어의 수가 그에 비해 상대적으로 적을 수 있다. 이러한 경우, 벡터 공간에서의 단어 표현은 대부분 0으로 채워진 희소한(parse) 상태를 가지게 된다.
자연어 처리에서는, 이러한 희소한 데이터를 다루는 기술이 중요하다. 대표적인 기술로는 차원 축소(dimensionality reduction)나 희소 표현(sparse representation) 등이 있다. 이러한 기술을 사용하여 희소한 데이터를 밀집(dense)한 데이터로 변환하거나, 보다 효율적으로 다룰 수 있는 형태로 변환할 수 있다. 이를 통해 자연어 처리의 다양한 문제를 더욱 효과적으로 다룰 수 있다.
두 토크나이저 차이 알아보기!
TreebankWordTokenizer VS. BertTokenizer
TreebankWordTokenizer는 구두점(punctuation)을 포함하여 단어를 분리하는 방식을 채택하고 있다. 예를 들어, "Don't"는 "Do", "n't" 두 개의 토큰으로 분리된다.
반면에, BertTokenizer는 BERT(Bidirectional Encoder Representations from Transformers) 모델을 위한 토큰화 도구 중 하나이다. 이 도구는 'subword tokenization' 기법을 사용하여 문장을 토큰으로 분리한다. 이 방식은 단어를 작은 단위(subword)로 분할하여 토큰을 생성하는 방식이다. 이러한 방식은 단어가 희소(sparse)한 경우에도 효과적으로 토큰화를 수행할 수 있다.
따라서, TreebankWordTokenizer는 주로 기존의 언어 모델을 사용하여 토큰화를 수행하고자 할 때 사용되며, BertTokenizer는 주로 BERT 모델과 같은 최신 언어 모델을 사용하여 문장을 분석하고자 할 때 사용된다.
'자연어 처리(NLP) 공부' 카테고리의 다른 글
자연어 처리(NLP) - 정수 인코딩(Integer Encoding) (0) | 2023.03.15 |
---|---|
자연어 처리(NLP) - 불용어(stopwords) 제거 (0) | 2023.03.15 |
자연어 처리(NLP) - 텍스트 데이터 전처리(preprocessing) 과정 (0) | 2023.03.13 |
자연어 처리(NLP) 공부 순서 (2) | 2023.03.11 |
자연어 처리(NLP) (0) | 2023.03.10 |