본문 바로가기

NPL with ML

추천시스템 구축을 위한 텍스트 분석 이해 #1

반응형

텍스트 분석은 비정형 데이터인 텍스트를 분석하는 것입니다. ML모델은 주어진 정형 데이터 기반에서 모델을 수립하고 예측을 수행했습니다. 그리고 머신러닝 알고리즘은 숫자형의 피처 기반 데이터만 입력받을 수 있기 때문에 텍스트를 머신러닝에 적용하기 위해서는 비정형 텍스트 데이터를 어떻게 피처 형태로 추출하고 추출된 피처에 의미 있는 값을 부여하는가 하는 것이 매우 중요한 요소입니다.

 

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

 

대표적으로 텍스트를 피처 벡터화해서 변환하는 방법에는 BOW(Bag of Words)와 Word2Vec방법이 있습니다. 텍스트를 벡터 값을 가지는 피처로 변환하는 것은 머신러닝 모델을 적용하기 전에 수행해야 할 매우 중요한 요소입니다.

 


한글 NLP 처리의 어려움

일반적으로 한글 언어 처리는 영어 등의 라틴어 처리보다 어렵습니다. 그 주된 원인은 '띄어쓰기'와 '다양한 조사'때문입니다. 한글의 과학성은 세계적으로 인정받고 있지만, 이러한 이슈로 인해서 상대적으로 라틴어 계열의 언어보다 NLP처리가 어려운 문제가 있습니다.

 


텍스트 분석 수행, 기본 프로세스

 

머신러닝 기반의 텍스트 분석 프로세스는 다음과 같은 프로세스 순으로 수행합니다.

 

1. 텍스트 사전 준비작업(텍스트 전처리): 텍스트를 피처로 만들기 전에 미리 클렌징. 대/소문자 변경. 특수문자 삭제 등의 클렌징 작업. 단어(Word) 등의 토큰화 작업, 의미 없는 단어(Stop word) 제거 작업, 어근 추출(Stemming/Lemmatization) 등의 텍스트 정규화 작업을 수행하는 것을 통칭합니다.

2. 피처 벡터화/추출: 사전 준비 작업으로 가공된 텍스트에서 피처를 추출하고 여기에 벡터 값을 할당합니다. 대표적인 방법은 BOW와 Word2Vec이 있으며, BOW는 대표적으로 Count기반과 TF-IDF기반 벡터화가 있습니다.

3. ML 모델 수립 및 학습/예측/평가: 피처 벡터화된 데이터 세트에 ML모델을 적용해 학습/예측 및 평가를 수행합니다.

 


텍스트 분석 패키지

 

1. Gensim: 토픽 모델링 분야에서 가장 두각을 나타내는 패키지입니다. 오래전부터 토픽 모델링을 쉽게 구현할 수 있는 기능을 제공해 왔으며, Word2Vec 구현 등의 다양한 신기능도 제공합니다.

2. Spacy: 뛰어난 수행 성능으로 최근 가장 주목을 받는 NLP패키지입니다.

3. NLTK(Natural Language Toolkit for Python): 파이썬의 가장 대표적인 NLP 패키지입니다. 방대한 데이터 세트와 서브 모듈을 가지고 있으며 NLP의 거의 모든 영역을 커버하고 있습니다. 많은 NLP패키지가 NLTK의 영향을 받아 작성되고 있습니다. 수행 속도 측면에서 아쉬운 부분이 있어서 실제 대량의 데이터 기반에서는 제대로 활용되지 못합니다.

4. KoNLPy: 파이썬의 대표적인 한글 형태소 패키지입니다. 형태소의 사전적인 의미는 '단어로서 의미를 가지는 최소 단위'로 정의할 수 있습니다. 형태소 분석이란 말뭉치를 이러한 형태소 어근 단위로 쪼개고 각 형태소에 품사 태깅(POS tagging)을 부착하는 작업을 일반적으로 지칭합니다.

 

사이킷런은 머신러닝 위주의 라이브러리여서 NLP를 위한 다양한 라이브러리, 예를 들어 '어근 처리'와 같은 NLP패키지에 특화된 라이브러리는 가지고 있지 않습니다. 하지만 텍스트를 일정 수준으로 가공하고 머신러닝 알고리즘에 텍스트 데이터를 피처로 처리하기 위한 편리한 기능을 제공하고 있어 사이킷런으로도 충분히 텍스트 분석 기능을 수행할 있습니다.

 

NLTK와 Konlpy 예제

from nltk import sent_tokenize, word_tokenize
from nltk.tag import pos_tag
import nltk

from konlpy.tag import Okt
from konlpy.tag import Kkma

# nltk.download('punkt')
# nltk.download('stopwords')
# nltk.download('averaged_perceptron_tagger')

text_sample = '미국 국제무역위원회(ITC)가 LG화학과 SK이노베이션의 전기차 배터리 영업비밀 침해 소송의 최종 판결일을 12월10일로 또 연기하면서 양측의 합의 여부가 주목받는다. 당초 이날 LG화학 승소로 최종 판결이 나올 것이 유력했으나, '
# text_sample = "Starting a home-based restaurant may be an ideal. it doesn't have a food chain or restaurant of their own."

sentences = sent_tokenize(text=text_sample)
words = word_tokenize(text_sample)
print(pos_tag(words))

print(type(sentences), len(sentences))
print(sentences)

print(type(words), len(words))
print(words)

# print(len(nltk.corpus.stopwords.words('english')))
# print(nltk.corpus.stopwords.words('english')[:20])

# print(len(nltk.corpus.stopwords.words('korea')))
# word_tokens = CMNLP.tokenize_text(str(text_sample))
# print(type(word_tokens), len(word_tokens))

# stopwords = nltk.corpus.stopwords.words('english')
# all_tokens = []
# for sentence in words:
#     filtered_words=[]

print(Okt().morphs(text_sample))
print(Okt().pos(text_sample))
print(Okt().nouns(text_sample))

print(Kkma().morphs(text_sample))
print(Kkma().pos(text_sample))
print(Kkma().nouns(text_sample))


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

 

텍스트 자체를 바로 피처로 만들 수는 없습니다. 이를 위해 사전에 텍스트를 가공하는 준비 작업이 필요합니다. 텍스트 정규화는 텍스트를 머신러닝 알고리즘이나 NLP 애플리케이션에 입력 데이터로 사용하기 위해 클렌징, 정제, 토크화, 어근화 등의 다양한 텍스트 데이터의 사전 작업을 수행하는 것을 의미합니다.

 

텍스트 분석은 이러한 텍스트 정규화 작업이 매우 중요합니다.

이러한 텍스트 정규화 작업은 크게 다음과 같이 분류할 수 있습니다.

 

1. 클렌징 (Cleansing)

2. 토큰화 (Tokenization)

3. 필터링/스톱 워드 제거/철자 수정

4. Stemming

5. Lemmatization

 


클렌징(Cleansing)과 토큰화(Tokeniaztion)

 

클렌징은 텍스트 분석에 방해가 되는 불필요한 문자, 기호 등을 사전에 제거하는 작업입니다. 예를 들어 HTML, XML태그나 특정 기호 등을 사전에 제거합니다.

 

토큰화의 유형은 문서에서 문장을 분리하는 문장 토큰화와 문장에서 단어를 토큰으로 분리하는 단어 토큰화로 나눌 수 있습니다.

반응형