- 주어진 corpus를 Token단위로 나누는 과정.
보통 의미 있는 단위로 토큰을 정의.
- 의미 있는 단위를 [단어]로 설정하여 토큰화하는 것.
- 단어 : literally 단어/ 단어구/ 의미가 있는 문자열
간단한 예제 )
my name is 'name' -> [my, name, is, name]
: 띄어쓰기 단위로 분리 및 정제
* 정제(Cleaning) : 구두점/특수문자 제거
-> 문제점 : 단순로직 , 한국어의경우 분리 어려움
- 데이터 용도에 따라 기준 선정.
간단한 예제 ) nltk를 이용한 영어권의 upperstrophe (') 분리
nltk : 자연어 처리를 위한 파이썬 패키지. (예제에서는 word_tokenize와 WordPunctTokenizer 사용)
@don't vs @name's
(2.1) word_tokenize 이용
#-------------------------------------------------input
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."))
#-------------------------------------------------output
['Do', "n't", 'be', 'fooled', 'by', 'the', 'dark', 'sounding', 'name', ',', 'Mr.', 'Jone', "'s", 'Orphanage', 'is', 'as', 'cheery', 'as', 'cheery', 'goes', 'for', 'a', 'pastry', 'shop', '.']
(2.2) wordPunctTokenizer 이용
#-------------------------------------------------input
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."))
#-------------------------------------------------output
['Don', "'", 't', 'be', 'fooled', 'by', 'the', 'dark', 'sounding', 'name', ',', 'Mr', '.', 'Jone', "'", 's', 'Orphanage', 'is', 'as', 'cheery', 'as', 'cheery', 'goes', 'for', 'a', 'pastry', 'shop', '.']
(2.3) text_to_word_sequence (keras) 이용
#-------------------------------------------------input
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."))
#-------------------------------------------------output
["don't", 'be', 'fooled', 'by', 'the', 'dark', 'sounding', 'name', 'mr', "jone's", 'orphanage', 'is', 'as', 'cheery', 'as', 'cheery', 'goes', 'for', 'a', 'pastry', 'shop']
- 구두점이나 특수문자 단순제외 x
corpus 정제 작업 시 구두점도 하나의 토큰으로 분류하기도 한다.
ex) 마침표 : 문장의 경계 판단에 이용. / 소수점 / (yy/mm/dd)- 줄임말 & 단어 내 띄어쓰기 있는 경우
upperstrophe I'm -> I am (접어)
rock n roll (띄어쓰기 포함한 단어들이 하나의 의미 이룸)- 표준 토큰화 예제
표준으로 현재 쓰이고 있는 토큰화 방법 중 하나인 'Penn Treebank Tokenization 규칙
#1 하이픈으로 구성된 단어는 하나로 유지
#2 don't같이 upperstrophe로 접어 함께하는 단어는 분리
penn treebank tokenization example)
#-------------------------------------------------input
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))
#-------------------------------------------------output
['Starting', 'a', 'home-based', 'restaurant', 'may', 'be', 'an', 'ideal.', 'it', 'does', "n't", 'have', 'a', 'food', 'chain', 'or', 'restaurant', 'of', 'their', 'own', '.']
.
갖고있는 코퍼스 내 문장단위로 구분하는 작업(문장 분류, sentence segmentation)
corpus가 어떤 국적 언어인지, 특수문자들이 어떻게 사용되고 있는지 따라 직접 규칙 정의해볼 수 있음.
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))
#-------------------------------------------output
['I am actively looking for Ph.D. students.', 'and you are a Ph.D student.']
한국어 문장 토큰화 도구 KSS
import kss
text='딥 러닝 자연어 처리가 재미있기는 합니다. 그런데 문제는 영어보다 한국어로 할 때 너무 어려워요. 농담아니에요. 이제 해보면 알걸요?'
print(kss.split_sentences(text))
#-------------------------------------------output
['딥 러닝 자연어 처리가 재미있기는 합니다.', '그런데 문제는 영어보다 한국어로 할 때 너무 어려워요.', '농담아니에요.', '이제 해보면 알걸요?']
문장 토큰화에서 예외사항 발생 마침표 처리를 위해 두개 클래스로 분류하는 이진클래스 사용하기도 함.(마침표가 단어의 일부분일경우(약어로쓰이는경우) / 마침표가 문장 구분자로 쓰이는경우) -> 사전 이용.
영어와 달리 어절 토큰화는 한국어NLP에서 지양
(1) 한국어는 교착어이므로, 조사,어미가 띄어쓰기 없이 교착되어 처리가 번거로움. 형태소 개념 이해해야함.
(2) 한국어는 띄어쓰기가 영어보다 잘 지켜지지 않음.
- 해당 단어가 어떤 품사로 쓰였는지 보는 것이 주요 지표가 될 수 있음.
(품사태깅)
from konlpy.tag import Okt
okt=Okt()
print(okt.morphs("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))
#-------------------------------output
['열심히', '코딩', '한', '당신', ',', '연휴', '에는', '여행', '을', '가봐요']