[Python] 국문 전처리와 텍스트 마이닝 방법

한국어 전처리 입문

자연어 처리

  • Natural Language Processing
  • 일상에서 사용하는 자연어를 컴퓨터로 하여금 분석, 처리할 수 있도록 다듬는 것

자연어 처리를 위한 Python 패키지

  • NLTK (Natural Language ToolKit)
    : 영문으로 이루어진 텍스트 데이터의 처리와 분석을 가능케 하는 Python 패키지
  • KoNLPy (Python package for NLP of the Korean language)
    : 형태소 분석 등 한국어 텍스트의 전처리에 특화된 Python 패키지

영문 전처리에 비해 월등히 어려운 국문 전처리

Problem 1 : 띄어쓰기로 문장을 명확하게 나누기 어려움

  • 띄어쓰기를 통해 문장이 비교적 뚜렷하게 구분되는 영어
  • 한국어의 경우, 띄어쓰기 규범이 올바르게 지켜지지 않은 텍스트를 분석해야 하는 경우가 대단히 많음

Problem 2 : 교착어에 해당하는 한국어, 더욱 어려운 문장 분석

  • “시험 문제를 잘 맞혔겠더라” 분석
    → 시험/문제/를/잘/맞히/었/겠/더라
  • 낱말의 형태가 다양하게 변화하는 한국어 특성상, 텍스트 분석이 더욱 어려움

한국어 전처리를 위한 konlpy 설치

!pip install konlpy

불필요한 특수문자 제거

text = '액션이 어떻게 되는지 아세요? 무한! 무~야~호'
filter = ['~','!','@','*','%','?']

for i in filter :
  text = text.replace(i,'')

print(text)

특수문자 리스트를 생성 후, 해당 문자 제거

텍스트를 낱말 단위로 쪼개기 (단순 split)

text = '액션이 어떻게 되는지 아세요 무한 무야호'
text_token = text.split()

print(text_token)

Komoran : 보다 의미 있는 토큰화

from konlpy.tag import Komoran  # konlpy 설치는 미리 필요

komoran = Komoran()
text = '액션이 어떻게 되는지 아세요 무한 무야호'

result = komoran.morphs(text)
print(result)

pos_result = komoran.pos(text)
print(pos_result)

Komoran 형태소 분석 결과에 품사 태깅

noun_only = komoran.nouns(text)
print(noun_only)

Komoran 형태소 분석 결과에서 명사만을 추출

Komoran의 품사 분류 체계

불용어 제거 : 일상 어휘를 분석에서 배제하기

stopwords = ['은','는','이','가','어떤','무','유','든지','는지','게']
stop_results = []

for word in result :
  if (word in stopwords) == False :
    stop_result.append(word)

print(stop_result)

stopword 리스트를 생성한 후, 해당 낱말 제거

TF-IDF와 문서 유사도

TF-IDF

  • Term Frequency - Inverse Doucument Frequency
  • (특정 문서의 해당 낱말 빈도)에 (해당 낱말이 등장한 문서 수)를 나눈 값
    → 여러 문서에 등장하면 희소성 낮음
  • 낱말의 등장 횟수뿐 아니라, 낱말이 등장한 문서의 희소성까지 고려

문서별 낱말 등장 횟수 알아보기

articles = ['대선 후보 전략 분석', '경제 위기 신호 감지', '주식 시장 혼란 전략', '대선 여론 조사 역전 조사 결과 분석']

from sklearn.feature_extraction.text import CountVectorizer

vector = CountVectorizer()
print(vector.fit_transform(articles).toarray())
print(vector.vocabulary_)
  • 전처리가 완료된 기사 제목 리스트 생성 후, CounterVector를 이용한 문서-낱말 행렬 생성

scikit-learn을 이용한 TF-IDF 연산 결과 도출

from sklearn.feature_extraction.text import TfidfVectorizer

tf_idf = TfidfVectorizor().fit(articles)
tf_idf_matrix = tf_idf.transform(articles).toarray()
print(tf_idf_matrix)
print(tf_idf.vocabulary_)

cosine similarity

  • 평면 혹은 공간에 존재하는 두 벡터가 얼마나 비슷한지 확인하려면?
    문서 벡터 간의 코사인 값을 계산하여, 두 문서가 얼마나 유사한지 파악
    → 두 벡터가 비슷한 방향을 가리킬수록 / 각의 크기가 작을수록 / 코사인의 값이 1에 가까울수록
from sklearn.metrics.pairwise import cosine_similarity

similar_article = cosine_similarity(tf_idf_matrix, tf_idf_matrix)
print(similar_article)

1에 가까운 수가 나올수록 유사한 문서

감성 분석과 토픽 모델링

감성 분석을 위한 접근법

1. Predictive Model

  • 분류 문제와 비슷하게 정서 분석을 접근
  • 정서 분류 결과를 알고 있는 데이터를 학습
  • 정서를 모르는 데이터에 대해 이를 적용

2. Dictionary Based Model

  • 정서 분석을 위한 사전을 활용하는 접근
  • 긍정어, 부정어 목록이 담긴 사전을 마련
  • 각 데이터의 긍정어와 부정어 빈도를 분석

Topic Modeling

  • 주어진 텍스트로부터 개별 낱말의 등장 빈도 등을 파악
  • 공통된 주제라 할 수 있는 토픽을 도출하는 기법