[파이썬 머신러닝 가이드] 텍스트 분석 - 텍스트 전처리(정규화)

목록

1. 텍스트 분석 이해

2. 텍스트 사전 준비 작업(텍스트 전처리) - 텍스트 정규화

 

1. 텍스트 분석 이해

텍스트를 머신러닝에 적용하기 위해서는 비정형 텍스트 데이터를 어떻게 피처 형태로 추출하고 추출된 피처에 의미 있는 값을 부여하는가 하는 것이 매우 중요한 요소!

 

피처 벡터화
텍스트를 word(또는 word의 일부분) 기반의 다수의 피처로 추출하고 이 피처에 단어 빈도수와 같은 숫자 값을 부여하면 텍스트는 단어의 조합인 벡터값으로 표현될 수 있는데, 이렇게 텍스트를 변환하는 것을 피터벡터화 또는 피처 추출이라고 함.

 

 

  • 텍스트 분석 수행 프로세스
  1. 텍스트 사전 준비작업(텍스트 전처리) : 텍스트를 피처로 만들기 전에 미리 클렌징, 대/소문자 변경, 특수문자 삭제 등의 클렌징 작업, 단어(Word) 등의 토큰화 작업, 의미 없는 단어(Stop Word) 제거 작업, 어근 추출(Stemming/Lemmatization) 등의 텍스트 정규화 작업을 수행하는 것을 통칭함.
  2. 피처 벡터화/추출 : 사전 준비 작업으로 가공된 텍스트에서 피처를 추출하고 여기에 벡터 값을 할당함. BOW(Count기반, TF-IDF 기반), Word2Vec
  3. ML 모델 수립 및 학습/예측/평가 : 피처 벡터화된 데이터 세트에 ML 모델을 적용해 학습/예측 및 평가 수행

 

2. 텍스트 사전 준비 작업(텍스트 전처리) - 텍스트 정규화

 

  • 클렌징

불필요한 문자, 기호 등을 사전에 제거.

 

  • 텍스트 토큰화

1. 문장 토큰화 : 문서 → 문장 분리 

  • 마침표, 개행문자(\n) 등 기호에 따라 분리, 정규표현식에 따른 문장 토큰화도 가능.
  • sent_tokenize 사용
  • 각 문장이 가지는 시맨틱적인 의미가 중요한 요소로 사용될 때 사용

2. 단어 토큰화 : 문장 -> 단어 분리

공백, 콤마, 마침표, 개행문자 등으로 단어 분리, 정규표현식 사용 가능. 
Bag of Word와 같이 단어의 순서가 중요하지 않은 경우, 문장 토큰화 사용하지 않고 단어 토큰화만 사용해도 충분..

 

⇒ 여러개의 문장으로 된 입력 데이터를 문장별로, 이후 단어별로 토큰화 하면,
n개의 리스트 객체(n= 문장 수) 를 내포하고 있고, 내포된 개별 리스트 객체는 각각 문장별로 토큰화된 단어를 요소로 가지고 있음.

** n_gram
문맥적 의미 해결하고자 도입.
n개의 단어를 하나의 토큰화 단위로 분리해내는 것. 
ex) 2-gram(bigram)
“Agent Smith knocks the door”
→ (Agent, Smith), (Smith knocks), (knocks, the), (the, door)와 같이 연속적으로 2개의 단어들을 순차적으로 이동하며 토큰화

 

  • 스톱 워드 제거

stop word = 분석에 큰 의미가 없는 단어

ex) is, the, a, will 등 문맥상 큰 의미 없는 단어. → 문법적 특성으로 인해 빈번하게 텍스트에 나타나므로 사전에 제거 안하면 오히려 중요하게 인지될수도.

→ 언어별로 스톱워드가 목록화 되어 있음

import nltk

stopwords = nltk.corpus.stopwords.words('english')
all_tokens=[]

#위에서 3개의 문장별로 얻은 word_tokens list에 대해 스톱워드 제거
for sentence in word_tokens:
	filtered_words=[]
	for word in sentence:
		word = word.lower()
		if word not in stopwords:
			filtered_words.append(word)
	all_tokens.append(filterd_words)

print(all_tokens)

 

  • Stemming과 Lemmatization

문법적 또는 의미적으로 변화하는 단어의 원형을 찾는것. ex) worked, works, working → works

Lemmatization이 Stemming보다 정교하며 의미론적인 기반에서 단어의 원형을 찾음.

Stemming은 원형 단어로 변환 시 일반적인 방법을 적용하거나 더 단순화된 방법을 적용해 원래 단어에서 일부 철자가 훼손된 어근 단어를 추출하는 경향이 있음.

Lemmatization 은 품사와 같은 문법적인 요소와 더 의미적인 부분을 감안해 정확한 철자로 된 어근 단어 찾아줌.

→ 정확한 원형 단어 추출을 위해 단어의 품사를 입력해줘야함 (동사 = ‘v’, 형용사 =’a’)

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

lemma = WordNetLemmatizer()
print(lemma.lemmatize('amusing', 'v'))