본문 바로가기
  • 데이터에 가치를 더하다, 서영석입니다.
공부하는 습관을 들이자/Deep Learning (NLP,LLM)

[딥러닝 자연어처리] 2-1. 텍스트 전처리 (Text Preprocessing)

by 꿀먹은데이터 2023. 11. 30.

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

01) 토큰화(Tokenization)

  • 주어진 코퍼스(corpus)에서 토큰(token)이라 불리는 단위로 나누는 작업

1. 단어 토큰화 (Word Tokenization)

  • 토큰의 기준을 단어(word)로 하는 경우
  • 입력: **Time is an illusion. Lunchtime double so!**
  • 출력: "Time", "is", "an", "illusion", "Lunchtime", "double", "so"

2. 토큰화 중 생기는 순간

  • 토큰화를 진행하다보면, 예상치 못한 경우가 발생하여 토큰화의 기준을 설정하는 것이 필요
  • 분석자가 기준을 정해서 토큰화를 수행

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

  • 구두점이나 특수 문자를 단순 제외해서는 안 됨. 의미 있는 구두점이나 특수 문자가 포함될 수 있으므로 고려해야 함.
  • 줄임말과 단어 내에 띄어쓰기가 있는 경우
  • 표준 토큰화 예제
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', '.']

 

 

4. 문장 토큰화(Sentence Tokenization)

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

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

 

5. 이진 분류기(Binary Classifier)

  • 문장 토큰화에서 예외 사항을 발생시키는 마침표의 처리를 위해서 입력에 따라 두 개의 클래스로 분류하는 이진 분류기를 사용하기도 함

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

  • 한국어는 교착어며, 띄어쓰기가 영어보다 잘 지켜지지 않음.

2) 정제(Cleaning) and 정규화(Normalization)

  • 정제(Cleaning): 갖고 있는 코퍼스로부터 노이즈 데이터를 제거
  • 정규화(normalization): 표현 방법이 다른 단어들을 통합시켜서 같은 단어로 만들어줌

1. 규칙에 기반한 표기가 다른 단어들의 통합

  • ex) USA - US, uh huh - uhhuh

2. 대, 소문자 통합

  • 영어권 언어에서 대, 소문자를 통합하는 것은 단어의 개수를 줄일 수 있는 또 다른 정규화 방법

3. 불필요한 단어의 제거(Removing Unnecessary Words)

  • 등장 빈도가 적은 단어 & 길이가 짧은 단어
  • 영어권 언어에서는 길이가 짧은 단어를 삭제하는 것만으로도 어느정도 자연어 처리에서 크게 의미가 없는 단어들을 제거하는 효과를 볼 수 있음.
  • 반면에 한국어에서는 길이가 짧은 단어라고 삭제하는 이런 방법이 크게 유효하지 않을 수 있음

4. 정규 표현식


03) 어간 추출 and 표제어 추출

1. 표제어 추출(Lemmatization)

  • 표제어: '표제어' 또는 '기본 사전형 단어'
  • 예를 들어, am, are, is 는 서로 다른 스펠링이지만 그 뿌리 단어는 be라고 볼 수 있음. 이 단어들의 표제어는 be임

2. 어간 추출(Stemming)

  • 어간을 추출하는 작업

3. 한국어에서의 어간 추출


04) 불용어(Stopword)

  • 불용어: 문장에서는 자주 등장하지만 실제 의미 분석을 하는데는 거의 기여하는 바가 없는 단어

1 ~ 2.NLTK에서 불용어 확인하기 & 제거하기

from nltk.corpus import stopwords  
stopwords.words('english')[:10]

#['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', 'your']

from nltk.corpus import stopwords 
from nltk.tokenize import word_tokenize 

example = "Family is not an important thing. It's everything."
stop_words = set(stopwords.words('english')) 

word_tokens = word_tokenize(example)

result = []
for w in word_tokens: 
    if w not in stop_words: 
        result.append(w) 

print(word_tokens) 
print(result)

#['Family', 'is', 'not', 'an', 'important', 'thing', '.', 'It', "'s", 'everything', '.']
#['Family', 'important', 'thing', '.', 'It', "'s", 'everything', '.']

3. 한국어에서 불용어 제거하기

from nltk.tokenize import word_tokenize 

# 아래의 불용어는 저자가 임의로 선정한 것으로 실제 의미있는 선정 기준이 아님
example = "고기를 아무렇게나 구우려고 하면 안 돼. 고기라고 다 같은 게 아니거든. 예컨대 삼겹살을 구울 때는 중요한 게 있지."
stop_words = "아무거나 아무렇게나 어찌하든지 같다 비슷하다 예컨대 이럴정도로 하면 아니거든"

stop_words = set(stop_words.split(' '))
word_tokens = word_tokenize(example)

result = [word for word in word_tokens if not word in stop_words]

print(word_tokens) 
print(result)

#['고기를', '아무렇게나', '구우려고', '하면', '안', '돼', '.', '고기라고', '다', '같은', '게', '아니거든', '.', '예컨대', '삼겹살을', '구울', '때는', '중요한', '게', '있지', '.']
#['고기를', '구우려고', '안', '돼', '.', '고기라고', '다', '같은', '게', '.', '삼겹살을', '구울', '때는', '중요한', '게', '있지', '.']

05) 정규 표현식(Regular Expression)

  • 텍스트 데이터를 전처리하다보면 정규 표현식은 아주 유용한 도구로서 사용됨.
  • 특정 규칙이 있는 텍스트 데이터를 빠르게 정제할 수 있음

5. 정규 표현식을 이용한 토큰화

from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer("\s+", gaps=True)
print(tokenizer.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']