딥 러닝을 이용한 자연어처리 입문1. 텍스트 전처리(1)

정선용·2021년 7월 19일
0

0. Tokenization

  • 주어진 corpus를 Token단위로 나누는 과정.
    보통 의미 있는 단위로 토큰을 정의.

1. Word Tokenization (단어 토큰화)

  • 의미 있는 단위를 [단어]로 설정하여 토큰화하는 것.
    • 단어 : literally 단어/ 단어구/ 의미가 있는 문자열

간단한 예제 )
my name is 'name' -> [my, name, is, name]
: 띄어쓰기 단위로 분리 및 정제
* 정제(Cleaning) : 구두점/특수문자 제거
-> 문제점 : 단순로직 , 한국어의경우 분리 어려움

2. 토큰화 기준

  • 데이터 용도에 따라 기준 선정.

간단한 예제 ) 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', '.']
  • Don't -> [do & n't,] / Jone's -> [Jone & 's]

(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', '.']  
  • Don't -> [don & ' & t] / Jone's -> [Jone & ' & s]
    WordPunctTokenizer : 구두점을 별도로 분류하는 특징.

(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']  
  • Don't -> [don't] / Jone's -> [Jone's]
    text_to_word_sequence : 모든 알파벳 소문자로 바꾸면서 마침표,컴마,느낌표 등 구두점 제거, upperstrophe 보존

3.tokenizer 고려 사항

  1. 구두점이나 특수문자 단순제외 x
    corpus 정제 작업 시 구두점도 하나의 토큰으로 분류하기도 한다.
    ex) 마침표 : 문장의 경계 판단에 이용. / 소수점 / (yy/mm/dd)
  2. 줄임말 & 단어 내 띄어쓰기 있는 경우
    upperstrophe I'm -> I am (접어)
    rock n roll (띄어쓰기 포함한 단어들이 하나의 의미 이룸)
  3. 표준 토큰화 예제
    표준으로 현재 쓰이고 있는 토큰화 방법 중 하나인 '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', '.'] 

.

4.sentence Tokenization (문장 토큰화)

갖고있는 코퍼스 내 문장단위로 구분하는 작업(문장 분류, 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
['딥 러닝 자연어 처리가 재미있기는 합니다.', '그런데 문제는 영어보다 한국어로 할 때 너무 어려워요.', '농담아니에요.', '이제 해보면 알걸요?']

문장 토큰화에서 예외사항 발생 마침표 처리를 위해 두개 클래스로 분류하는 이진클래스 사용하기도 함.(마침표가 단어의 일부분일경우(약어로쓰이는경우) / 마침표가 문장 구분자로 쓰이는경우) -> 사전 이용.

5. 한국어 토큰화의 어려움

영어와 달리 어절 토큰화는 한국어NLP에서 지양
(1) 한국어는 교착어이므로, 조사,어미가 띄어쓰기 없이 교착되어 처리가 번거로움. 형태소 개념 이해해야함.
(2) 한국어는 띄어쓰기가 영어보다 잘 지켜지지 않음.

  • 해당 단어가 어떤 품사로 쓰였는지 보는 것이 주요 지표가 될 수 있음.
    (품사태깅)

6. NLTK와 koNLPy를 이용한 영어/한국어 토큰화

  • nltk : 영어 corpus에 품사 태깅 기능 지원 ( penn treebank pos tags 기준)
  • konlpy : 한국어 자연어처리위한 패키지.
    Okt (open korea text) , 메캅(Mecab), 한나눔(hannanum)등 형태소분석기 존재.
    한국어 nlp에서 형태소분석기 사용하는 것은 단어 토큰화가 아니라 형태소(morpheme)단위로 형태소 토큰화를 수행하게됨.
    from konlpy.tag import Okt  
    okt=Okt()  
    print(okt.morphs("열심히 코딩한 당신, 연휴에는 여행을 가봐요"))
    #-------------------------------output
    ['열심히', '코딩', '한', '당신', ',', '연휴', '에는', '여행', '을', '가봐요']  

    1 (word) tokenization이란?
    2 nltk
    3 sentence tokenization
    4 koNLPy
profile
정선용

0개의 댓글