텍스트 전처리(Text preprocessing) -1

안소희·2025년 3월 28일

자연어처리입문

목록 보기
3/4

Tokenization

주어진 코퍼스(말뭉치)에서 토큰이라 불리는 단위로 나누는 작업을 토큰화

  • 코퍼스 : 언어 데이터(주로 텍스트)의 큰 집합을 의미

Word Tokenization

토큰의 기준이 단어일 경우, 단어 토큰화를 한다고 함
예) 입력으로부터 구두점과 같은 문자를 제외시키는 간단한 단어 토큰화 작업

입력: Time is an illusion. Lunchtime double so!

출력: "Time", "is", "an", "illusion", "Lunchtime", "double", "so"
  • 보통 구두점이나 특수문자를 전부 제거하면 토큰의 의미를 잃어버리게 되는 겨우가 발생
  • 영어는 띄어쓰기 단위로 단어 토큰이 구분이 되는 반면 한국어는 띄어쓰기만으로는 단어 토큰을 구분하기 어렵다

토큰화 중 생기는 선택의 순간

만약 영어권 언어에서 아포스트로피(')가 들어가 있는 단어를 어떻게 토큰으로 분류 할 것인가?

예) Don't , Jone's
-> Don't, Don t, Dont, Do n't, Jone's, Jones, Jone, Jone s등등

nltk 의 word_tokenize

print('단어 토큰화1 :',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."))
>>>
단어 토큰화1 : ['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 의 WordPuncTokenizer

print('단어 토큰화2 :',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."))
>>>
단어 토큰화2 : ['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로 분리

keras의 text_to_word_sequence

print('단어 토큰화3 :', 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."))
>>>
단어 토큰화3 : ["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나 jone's 같은 겨우 아포스트로피 보존

토큰화에서 고려해야할 사항

  • 구두점이나 특수 문자를 단순 제외해서는 안됨
  • 줄임말과 단어 내에 띄어쓰기가 있는 경우

Setence Tokenization

직관적으로 생각했을때는 ?나 .나 !기준으로 문장을 잘라내면 되지 않을까라고 생각할 수 있지만 꼭 그렇지만은 않다

  • !나?는 문장의 구분을 위한 명확한 구분자(boundary)역할을 하지만 마침표는 그렇지 않음

예1) IP 192.168.56.131 서버에 들어가서 로그 파일 저장해서 aaa@gmail.com로 결과 좀 보내줘. 그 후 점심 먹으러 가자

예2) Since I'm actively looking for Ph.D. students, i get the same qeustion a dozen time every year.

NLTK에서는 영어 문장의 토큰화를 수행하는 sent_tokenize를 지원하고 있다

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('문장 토큰화1: ',sent_tokenize(text))
>>>
문장 토큰화1:  ['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.']

마침표가 다수 등장하는 예시

text = "Since I'm actively looking for Ph.D. students, i get the same qeustion a dozen time every year."
print("문장 토큰화2: ",sent_tokenize(text))
>>>
문장 토큰화2:  ["Since I'm actively looking for Ph.D. students, i get the same qeustion a dozen time every year."]

NLTK는 단순히 마침표를 구분자로 하여 문장을 구분하지 않음

KSS(Korean Sentence Splitter)

  • 박상길님이 개발하신 한국어 문장토큰화
import kss

text = '딥러닝 자연어 처리가 재미있기는 합니다. 그런데 문제는 영어보다 한국어로 할 때 너무 어렵습니다. 이제 해보면 알걸요?'

print('한국어 문장 토큰화 :',kss.split(text))
>>>
한국어 문장 토큰화 : ['딥 러닝 자연어 처리가 재미있기는 합니다.', '그런데 문제는 영어보다 한국어로 할 때 너무 어렵습니다.', '이제 해보면 알걸요?']

한국어에서의 토큰화 어려움

교착어의 특성

한국어에 그(he/him)라는 주어나 목적어가 들어간 문장이 있다고 하자. 단어 하나에도 그가, 그에게, 그를, 그와, 그는과 같이 다양한 조사가 '그'라는 글자 뒤에 띄어쓰기 없이 바로 붙게된다

한국어 토큰화에서는 형태소(morpheme)란 개념을 반드시 이해하자

  • 자립 형태소 : 접사, 어미, 조사와 상관없이 자립하여 사용할 수 있는 형태소. 그 자체로 단어
  • 의존 형태소 : 다른 형태소와 결합하여 사용되는 형태소. 접사, 어미, 조사, 어간을 뜻함

문장 : 소희가 밥을 먹었다
이 문장을 띄어쓰기 단위 토큰화를 수행하면
-> ['소희가', '밥을', '먹었다']

하지만 형태소 단위로 분해하면
-> 자립 형태소 : 소희, 밥
-> 의존 형태소 : 가, 을, 먹, 었, 다

  • 여기서 소희, 밥이라는 명사를 얻었고 영어에서의 단어 토큰화와 유사한 형태를 얻으려면 어절 토큰화가 아니라 형태소 토큰화를 수행해야한다

띄어쓰기

한국어는 띄어쓰기가 영어보다 잘 지켜지지 않는다
영어의 경우에는 띄어쓰기를 하지 않으면 손쉽게 알아보기 어려운 문장들이 생긴다.

영어 : Tobeornottobethatisthequestion
한국어 : 제가이렇게띄어쓰기를전혀하지않고글을썼다고하더라도글을이해할수있습니다

결론-> 한국어는 수많은 코퍼스에서 띄어쓰기가 무시되는 경우가 많아 자연어 처리가 어려워졌다

profile
인공지능.관심 있습니다.

0개의 댓글