데이터 한 그릇

텍스트 분석(2) - 텍스트 전처리, 정규화 본문

머신러닝/텍스트 분석

텍스트 분석(2) - 텍스트 전처리, 정규화

장사이언스 2021. 9. 1. 17:29

 

  • 클렌징(Cleansing)
  • 토큰화(Tokenization)
  • 필터링/스톱 워드 제거/철자 수정
  • Stemming
  • Lemmatization

 

  텍스트 분석의 큰 프로세스를 살펴보자면 문서에서 단어 기반으로 하여 피처를 뽑은 후에 피처에 벡터 값을 부여하는 작업이 필요하다. 하지만 피처에 벡터값을 부여하는 작업을 하기 전에 본 데이터에 대한 전처리 작업이 필요하다. 전처리 작업은 크게 클렌징, 토큰화, 필터링/스톱 워드 제거/ 철자 수정/Stemming/Lemmatization 등이 있다. 각각의 전처리 작업을 실습해보도록 하자.

 


 

클렌징

 

 

텍스트에서 분석에 오히려 방해가 되는 불피요한 문자 등을 제거하는 작업을 말한다. 예를 들어서 인터넷에서 크롤링한 데이터가 있다고 했을 때, html 기호 등을 사전에 삭제하는 작업이 이에 속한다.

 


텍스트 토큰화

 

(날것의 텍스트를 문장별, 단어별로 나누기)

 

토큰화의 유형은 "문서에서 문장을 분리" 하는 문장 토큰화와 "문장에서 단어를 토큰으로 분리" 하는 단어 토큰화로 나눌 수 있다. (문서 -> 문장, 문장 -> 단어)

 

  1. 문장 토큰화 (Sentence tokenization)
  2. 단어 토큰화 (Word tokenization)

 

 

 

- 문장 토큰화

 

문장 토큰화는 주로 문장의 마지막을 뜻하는 기호를 기준으로 작업이 일반적으로 진행된다. 문장의 마지막을 상징하는 기호로는 대표적으로 마침표(.) 와 개행문자(\n) 등이 있다. 또한 정규화 표현식에 따른 문장 토큰화도 가능하다.

 

NLTK 패키지의 sent_tokenize 를 이용하여 문장 토큰화를 한번 진행해 보자. 

 

from nltk import sent_tokenize
import nltk
nltk.download('punkt')

 

입력해야할 패키지를 임포트 해준다.

 

text_sample = '''The Matrix is everywhere its all around us, 
here even in this room. you can see it out your window or on your television.
you feel it when you go to work, or go to church or pay your taxes.'''

sentences =  sent_tokenize(text = text_sample)

print(sentences)
len(sentences)

 

print 로 text를 확인해보면, 문장별로 분리가 되어 리스트에 담겨 있음을 확인할 수 있다.

 

 

- 단어 토큰화

 

  단어 토큰화는 문장을 단어로 토큰화 함을 의미한다. 기본적으로 공백, 콤마(,), 마침표(.), 개행문자 등을 기준으로 토큰화 시킨다.

 

from nltk import word_tokenize

sentence = "The Matrix is everywhere its all around us, here even in this room"
words = word_tokenize(sentence)
print(type(words))
print(words)

 

공백을 기준으로 각 단어들이 리스트에 담겨 나타나고 있는 걸 확인할 수 있다.

 

 

-문장 토큰화와 단어 토큰화의 결합

 

from nltk import word_tokenize, sent_tokenize

def tokenize_text(text):
    
    #문장별로 분리
    sentences = sent_tokenize(text)
    
    #분리된 문장별 단어 토큰화
    
    word_tokens = [word_tokenize(sentence) for sentence in sentences]
    
    return word_tokens


#여러 문장에대해 문장별 단어 토큰화 수행

word_tokens =  tokenize_text(text_sample)
print(type(word_tokens), len(word_tokens))
print(word_tokens)

 

3개의 문장들이 각각 단어 토큰화 되어 하나의 리스트에 담겨 있음을 확인할 수 있다.

 


스톱 워드 제거

 

(의미 없는 불필요한 단어들 제거)

 

스톱 워드(Stop word) 는 분석에 큰 의미가 없는 단어를 지칭한다. 예를 들어서 is, the, a, will 등은 문법적으로 필요한 단어들이지만 문맥상 큰 의미가 없는 단어들이기 때문에 스톱 워드에 속한다. 이러한 단어들은 모든 텍스트에서 빈번하게 나타나므로 만일 제거하지 않고 그대로 사용한다면, 기계가 다른 중요한 단어를 제쳐두고 이 단어들을 중요한 단어들로 생각할 수 있을 위험이 있다. 따라서 이 의미없는 단어들을 전처리 해줘야만 한다.

 

하지만 언어별로 스톱 워드의 종류가 다르지 않은가? 다행히도 언어별로 스톱 워드의 목록이 목록화 되어 있다. NLTK 와 같은 경우 가장 다양한 언어의 스톱 워드를 제공한다.

 

import nltk

stopwords = nltk.corpus.stopwords.words('english')

all_tokens = []

for i in word_tokens:
    
    filltered_words = []
    
    for word in i:
        
        word = word.lower()
        
        if word not in stopwords:
            filltered_words.append(word)
    all_tokens.append(filltered_words)

 

앞서 3개의 문장 별로 단어 토큰화 시켰던 변수 word_tokens 를 이용해서 각각의 단어에 대해 stopwords 인지 판별하여 따로 all_tokens 리스트에 저장한다.

 

결과를 확인해보면 is 나 this 같은 스톱 워드가 필터링 되었음을 확인할 수 있다.

 


Stemming 과 Lemmatization

 

(정교함의 차이와 이에 따른 작업 수행 속도의 차이)

 

Stemming 과 Lemmatization 은 단어의 원형을 찾아주는 작업을 한다. 예를 들어서 영어 단어 work 는 과거형으로 worked, 3인찬 단수일 때는 wokrs, 그리고 진행형일 경우에는 working 으로 바뀐다. Stemming 과 Lemmatization 은 변형된 단어들의 원형을 찾아주는 역할을 한다.

 

이때 Lemmatization 이 Stemming 보다 더 정교한 작업을 한다. Lemmatization 은 문법과 의미론적인 기반에서 단어의 원형을 찾기 때문에 정확한 어근을 찾는다. 하지만 Stemming 같은 경우에는 더 단순화된 방식으로 변형된 단어를 원형 단어로 변환시키기 때문에 훼손된 어근 단어를 추출하는 경향이 있다.

 

이러한 차이점 때문에 Lemmatization 은 작업을 하는데 더 오랜 시간이 걸리고 Stemming 은 시간이 덜 걸린다.

 

from nltk.stem import LancasterStemmer

stemmer = LancasterStemmer()

print(stemmer.stem('working'), stemmer.stem('works'), stemmer.stem('worked'))
print(stemmer.stem('happiest'), stemmer.stem('happier'))
print(stemmer.stem('fancier'), stemmer.stem('fanciest'))
print(stemmer.stem('amuses'),stemmer.stem('amusing'), stemmer.stem('amused'))

 

LancasterStemmer 로 Stemming 작업을 시행했다.

 

위에 보이는 work를 어근으로 하는 변형 동사들은 단순 변형이기 때문에 쉽게 그 원형을 찾지만 비교급이나 최상급에서는 원형을 정확히 찾아내지 못한 결과를 보여준다 .또한 본래 amuse 가 우너형이지만, amuses, amusing, amused 모두amus 에 추가 단어들이 붙는 것이기 때문에 컴퓨터가 amus 를 어근으로 추리한다. 즉, 정교하지 못하고 훼손된채 어근을 가져오게 된다.

 

from nltk.stem import WordNetLemmatizer
import nltk
nltk.download('wordnet')

lemma = WordNetLemmatizer()

print(lemma.lemmatize('amusing','v'), lemma.lemmatize('amuses','v'),lemma.lemmatize('amused','v'))
print(lemma.lemmatize('happier','a'), lemma.lemmatize('happiest','a'))
print(lemma.lemmatize('fancier','a'), lemma.lemmatize('fanciest','a'))

 

이번에는 Lemmatization 작업을 실행했다. 일반적으로 Lemmatization 작업은 단어 옆에 품사를 적어줘야 한다. 동사는 v, 형용사는 a 를 사용해준다.

 

 

지금까지 텍스트를 벡터값을 가진 피처화 하는 작업을 하기 이전에 해야할 전처리 과정들을 살펴봤다.

클렌징 같은 경우, 특수문자(html) 과 같은 것들을 제거하는 작업을 의미하며, 토큰화 같은 경우, 문장별로 그리고 단어별로 텍스트를 나눌 때 사용하며, stop words 같은 경우에는 의미 없는 단어들을 제거하는 것을 의미한다. 마지막으로  stemming 과 lemmatization 은 단어의 어근을 찾는데 사용되어 진다. 

 

다음으로는 텍스트 분석의 다음 단계인 텍스트를 벡터값을 가진 피처로 바꾸는 과정을 살펴보도록 하자.

 

 

'머신러닝 > 텍스트 분석' 카테고리의 다른 글

텍스트 분석(4) - 감성 분석  (0) 2021.09.05
텍스트 분석(3) - Bag of Words (BOW)  (0) 2021.09.02
텍스트 분석(1)  (0) 2021.09.01
Comments