[텍스트 마이닝] 2장. 텍스트 전처리

반응형

NLP 공부를 하다가 이 책을 보고 정리한 내용을 정리했습니다.

출처는 모두 '파이썬 텍스트 마이닝 완벽 가이드'입니다.

'파이썬 텍스트 마이닝 완벽 가이드' _ 박상언 외 1지음

https://product.kyobobook.co.kr/detail/S000201057527
 

파이썬 텍스트 마이닝 완벽 가이드 | 박상언 - 교보문고

파이썬 텍스트 마이닝 완벽 가이드 | 텍스트 마이닝에는 자연어 처리, 통계, 딥러닝 기법에 대해 많은 지식이 필요하지만, 이론적인 내용에 얽매이다 보면 정작 구현은 너무 먼 이야기가 되어 버

product.kyobobook.co.kr

* NLP 공부하기 위해 보는 중인데, 최근 연구에서 많이 나오는 기술과 기초 부분들까지 전체적으로 볼 수 있어서 좋음!


 

텍스트 마이닝: 자연어 처리 기법을 이용해 텍스트를 정형화된 데이터로 변환하고, 머신러닝 기법을 적용해 우리가 관심이 있는 어떤 사건을 예측하고자 하는 방법론

 

정형화된 데이터

  • 데이터: 일정한 길이의 벡터

* 벡터: 하나의 값이 아니라 차원의 수만큼의 여러 개의 값으로 구성된 것

  • 정형화: "오늘은 제육덮밥"와 같은 텍스트를 [3, 7, 4, 2, 5]와 같은 python 리스트 형태로 변환하는 것
  • 임베딩: 주어진 텍스트를 일정한 길이의 벡터로 변환하는 것

 

텍스트 마이닝 패러다임의 변화

- 카운트 기반의 문서 표현: 문서를 사용된 단어들의 빈도로 표현, 텍스트의 내용을 완전히 이해하지 않더라도 단어 빈도들을 이용해 우리가 원하는 많은 작업들을 어느 정도 잘 수행할 수 있음. (각 단어별로 개수를 세어 이를 벡터로 만듬)

- 시퀸스 기반의 문서 표현: 사람이 글을 읽고 이해하는 것과 유사한 방법으로 텍스트의 문맥을 이해하고자 하는 방식. 각 단어를 먼저 벡터로 변환하고, 이러한 벡터의 연속된 나열 혹은 시퀸스로 문서 표현. 문맥을 이해함으로써 더 정학하게 문장의 의미를 이해할 수 있다.

- 연속된 단어의 형태로 문장을 이해하려면 RNN과 같은 딥러닝 기법 필요

  • 원핫 인코딩: 단어를 일정 규칙에 따라 정렬하고 단어의 수만큼 벡터를 만든 후 단어 자신의 위치로만 1로 표시 → a, b, c, d, e – a [1, 0, 0, 0, 0] , b [0, 1, 0, 0, 0] ...
  • 원핫 인코딩 한계: 보통 하나의 문서가 아닌 수많은 문서의 집합을 다루기 때문에, 원핫 인코딩으로 진행 시 지나치게 벡터가 커지는 문제가 생김
  • 보통 딥러닝 기법에서는 특별한 과정을 거쳐서 이렇게 긴 벡터를 길이가 보통 200 정도인 짧은 벡터로 변환 → (문서)임베딩
  • 워드 임베딩(앞서 말한 임베딩), 문서 임베딩으로 구분

 

- 용어 정리

  • 문장: 문서를 구성하는 단위, 마침표 등으로 종결된다.
  • 텍스트: 분석의 대상이 되는 문자열. 문서, 문장 등 길이를 가리지 않으며, 때로는 한 권의 책이 될 수도 있음.
  • 말뭉치(corpus): 언어 연구를 위해 컴퓨터가 텍스트를 가공·처리·분석할 수 있는 형태로 모아놓은 자료의 집합

 

텍스트 전처리: 주어진 텍스트에서 노이즈와 같이 불필요한 부분을 제거하고 문장을 표준단어들로 분리한 후에, 각 단어의 품사를 파악하는 것

  1. 정제(cleaning): noise removal 작업, 불용어제거(stopword removal, 유의미한 단어라도 분석에 도움 안 되는 단어 제거)
  2. 토큰화(tokenization): 텍스트를 원하는 단위(token)로 나누는 작업, sentence tokenization, word tokenization
  3. 정규화: 같은 의미를 가진 동일한 단어임에도 형태가 다를 때, 단어들을 통일시켜서 표준 단어로 만드는 작업, 정규화는 방법에 따라 어간 추출과 표제어 추출로 나뉜다.
  4. 품사 태깅: 단어를 문법적인 기능에 따라 분류한 것

 

토큰화

1. 문장 토큰화: 여러 문장으로 이루어진 텍스트를 각 문장으로 나누는 것 nltk의 sent_tokenize 사용

para = "Hello everyone. It's good to see you. Let's start our text mining class!"

from nltk.tokenize import sent_tokenize
print(sent_tokenize(para))

 

2. 단어 토큰화: 대상이 되는 텍스트를 단어 단위로 분리하는 작업. 단어 토큰화를 하려고 반드시 문장 토큰화를 수행할 필요는 없고, 문장 단위의 분석이 필요할 때만 문장 토큰화 진행. word_tokenize / WordPunctTokenizer

from nltk.tokenize import word_tokenize
print(word_tokenize(para))

['Hello', 'everyone', '.', 'It', "'s", 'good', 'to', 'see', 'you', '.', 'Let', "'s", 'start', 'our', 'text', 'mining', 'class', '!']

from nltk.tokenize import WordPunctTokenizer
print(WordPunctTokenizer().tokenize(para))

['Hello', 'everyone', '.', 'It', "'", 's', 'good', 'to', 'see', 'you', '.', 'Let', "'", 's', 'start', 'our', 'text', 'mining', 'class', '!']

 

3. 한국어의 단어 토큰화

  • 한글을 대상으로 하는 토큰화는 형태소로 텍스트를 분리하는 것을 의미. 하지만, 영어는 모든 단어를 공백으로 분리할 수 있어서 어렵지 않지만, 한국어에서는 의미를 이루는 최소 단위가 공백없이 붙어 있는 경우가 많아 공백을 이용한 분리만으로는 부족하게 느껴진다.
  • 단어 경계(word boundary): 공백과 같이 단어를 구분해 주는 것 (word_tokenize, WordPunctTokenizer)
  • 단어 분할(word segmentation): 공백만으로 토큰화가 되지 않는 한국어 같은 경우 새로운 방법으로 단어를 분할해야 함.
print(word_tokenize(para_kor))

['안녕하세요', ',', '여러분', '.', '만나서', '반갑습니다', '.', '이제', '텍스트마이닝', '클래스를', '시작해봅시다', '!']

 

 

반응형