본문 바로가기
AI

자연어처리 : 텍스트전처리 : 토큰화 (Tokenization)

by 월곡동로봇팔 2020. 3. 4.

Text Preprocessing

자연어 처리에서는 우리가 쓸 수 있게 Tokenization, Cleaning, Normalization 하는 일을 하게 된다.

 

이 때, 주어진 corpus에서 token으로 나눈 작업은 tokenization이라 한다. 보통 의미있는 단위를 token으로 정의한다.


1. 단어 토큰화 (Word Tokenization)

token의 기준을 word로 한 tokenization을 word tokenization이라 한다.

단어는 단어 단위 외에도 단어구, 의미를 갖는 문자열로도 간주된다.

 

보통 토큰화 작업은 단순히 구두점이나 특수문자를 전부 제거하는 정제(cleaning) 작업을 수행하는 것만으로 해결되지 않는다. 구두점이나 특수문자를 전부 제거하면 토큰이 의미를 잃어버리는 경우가 발생하기도 한다. 

 

ex) don't 같은 경우 do // n't 로 분리 된다면, 이는 Don't의 의미를 잃어버리는 것이다.


2. tokenize 종류

nltk.tokenize.word_tokenize

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 goes for a pastry shop."))  

"""
['Do', "n't", 'be', 'fooled', 'by', 'the', 'dark', 'sounding', 'name', ',', 
 'Mr.', 'Jone', "'s", 'Orphanage', 'is', 'as', 'cheery', 'as', 'cheery', 
 'goes', 'for', 'a', 'pastry', 'shop', '.']  
"""

Don't -> Do // n't,

Jone's -> Jone // 's

nltk.tokenize.WordPuncTokenizer

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

WordPunctTokenizer 는 '을 기준으로 분리하였다.

keras.preprocessing.text.text_to_word_sequence

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."))
                            
                            
"""
["don't", 'be', 'fooled', 'by', 'the', 'dark', 'sounding', 'name', 'mr', "jone's", 
 'orphanage', 'is', 'as', 'cheery', 'as', 'cheery', 'goes', 'for', 'a', 'pastry', 'shop']
"""

word_tokenize 와 WordPunctTokenzier와는 다르게

  1. 앞이 소문자로 바뀌었으며
  2. Don't, Jone's 모두 '가 살아있다. 이 자체로 의미를 부여한다.

3. tokenize 할 때 주의사항

1) 구두점, 특수문자를 단순 제외하면 No!

어 자체에서 구두점을 갖고 있는 경우도 있는데, m.p.h나 Ph.D나 AT&T 같은 경우가 있다.

특수 문자의 달러($)나 슬래시(/)로 예를 들어보면, $45.55와 같은 가격을 의미 하기도 하고, 01/02/06은 날짜를 의미하기도 한다.

숫자 사이에 컴마(,)가 들어가는 경우도 있다. 가령 보통 수치를 표현할 때는 123,456,789와 같이 세 자리 단위로 컴마가 들어간다.

 

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

토큰화 작업에서 종종 영어권 언어의 아포스트로피(')는 압축된 단어를 다시 펼치는 역할을 하기도 한다.

예를 들어 what're는 what are의 줄임말이며, we're는 we are의 줄임말이다.

위의 예에서 re를 접어(clitic)이라고 한다. 즉, 단어가 줄임말로 쓰일 때 생기는 형태를 말한다. 가령 I am을 줄인 I'm이 있을 때, m을 접어라고 한다.

New York이라는 단어나 rock 'n' roll이라는 단어를 보자.

단어들은 하나의 단어이지만 중간에 띄어쓰기가 존재한다. 사용 용도에 따라서, 하나의 단어 사이에 띄어쓰기가 있는 경우에도 하나의 토큰으로 봐야하는 경우도 있을 수 있으므로, 토큰화 작업은 저러한 단어를 하나로 인식할 수 있는 능력도 가져야한다.

 

3) 표준 토큰화 예제

규칙이 정해져 있는 tokenize 하는 code의 특성을 파악하면서 봐야한다.

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))

"""
['Starting', 'a', 'home-based', 'restaurant', 'may', 'be', 'an', 
 'ideal.', 'it', 'does', "n't", 'have', 'a', 'food', 'chain', 'or', 
 'restaurant', 'of', 'their', 'own', '.'] 
"""

규칙 1. 하이푼으로 구성된 단어는 하나로 유지한다.
규칙 2. doesn't와 같이 아포스트로피로 '접어'가 함께하는 단어는 분리해준다.


4. 문장 토큰화 (Sentence Tokenization)

?, ! 같은 경우는 보통 문장의 끝인 경우가 대부분이지만, 온점 같은 경우는 위의 word_tokenize 에서도 보면 word 나누는 기준을 온점 하나로 하면 안되는 것 처럼, 문장의 끝이 아닐 경우가 많다.

 

갖고 있는 corpus data에 오타나 문장의 구성이 엉망이라면, 정해놓은 규칙은 소용이 없다.

따라서 가지고 있는 corpus data도 굉장히 중요하다.

 

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))

['I am actively looking for Ph.D. students, and you are a Ph.D student.']

sent_tokenize 경우, 위 처럼, Ph.D. 을 한 단어라고 생각해서, 온점을 문장의 끝이라고 생각하지 않았다.

 

영어의 경우 sent_tokenize가 잘 맞다.


5. 이진분류기 (Binary Classifier)

문장 토큰화에서 온점의 예외처리를 위해, 이진분류기를 쓰기도 한다.

 

1. 온점(.)이 단어의 일부분일 경우. 즉, 온점이 약어(abbreivation)로 쓰이는 경우
2. 온점(.)이 정말로 문장의 구분자(boundary)일 경우를 의미할 것입니다.

 

이진 분류기는 앞서 언급했듯이, 임의로 정한 1. 여러가지 규칙을 코딩한 함수일 수도 있으며, 2. 머신 러닝을 통해 이진 분류기를 구현하기도 합니다.

온점(.)이 어떤 클래스에 속하는지 결정을 위해서는 어떤 온점이 주로 약어(abbreviation)으로 쓰이는 지 알아야합니다. 그렇기 때문에, 이진 분류기 구현에서 약어 사전(abbreviation dictionary)는 유용하게 쓰입니다.
영어권 언어의 경우에 있어 https://public.oed.com/how-to-use-the-oed/abbreviations/
해당 링크는 약어 사전의 예라고 볼 수 있습니다.

이러한 문장 토큰화를 수행하는 오픈 소스로는 NLTK, OpenNLP, 스탠포드 CoreNLP, splitta, LingPipe 등이 있습니다.
 

Abbreviations | Oxford English Dictionary

This list contains the most common abbreviations used in the OED. Click on a letter to see the abbreviations beginning with that letter. Most of the words listed are only...

public.oed.com


6. 품사 태깅 (Part-of-Speech Tagging)

단어는 표기는 같지만, 품사에 따라서 단어의 의미가 달라지기도 한다.

예를 들어서 영어 단어 'fly'는 동사로는 '날다'라는 의미를 갖지만, 명사로는 '파리'라는 의미를 갖고있다.

 

즉, 결국 단어의 의미를 제대로 파악하기 위해서는 해당 단어가 어떤 품사로 쓰였는지 보는 것이 주요 지표가 될 수도 있다. 그에 따라 단어 토큰화 과정에서 각 단어가 어떤 품사로 쓰였는지를 구분해놓기도 하는데, 이 작업을 품사 태깅(part-of-speech tagging)이라고 한다. 

 

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

"""
[('I', 'PRP'), ('am', 'VBP'), ('actively', 'RB'), ('looking', 'VBG'), 
 ('for', 'IN'), ('Ph.D.', 'NNP'), ('students', 'NNS'), ('.', '.'), 
 ('and', 'CC'), ('you', 'PRP'), ('are', 'VBP'), ('a', 'DT'), ('Ph.D.', 'NNP'), 
 ('student', 'NN'), ('.', '.')]
"""

 

댓글