8. 텍스트 마이닝(konlpy 패키지)

🔗 'Do it! 쉽게 배우는 파이썬 데이터 분석' 책을 기반으로 JupyterLab 환경에서 학습한 내용입니다 _φ(๑╹╹๑)

 

📌 텍스트 마이닝 준비


  1. KoNLPy 패키지 설치하기 전
    1. java 설치: http://abit.ly/easypy_101에서 운영체제 버전에 맞는 msi 파일 다운로드
    2. jpype1 패키지 설치: 아나콘다 프롬프트에 pip install jpype1 작성
  2. KoNLPy 패키지 설치: 아나콘다 프롬프트에 pip install konlpy 작성
    • KoNLPy 패키지: 한글 텍스트로 형태소를 분석할 수 있게 해주는 패키지

 

 

 

📌 대통령 연설문 텍스트 마이닝


  • 연설문 불러오기
    1. open(): 파일 열기
      • encoding: 컴퓨터는 사용자가 지정한 인코딩 방식을 통해 파일의 문자를 숫자로 저장한다. 따라서 이때 사용한 인코딩 방식을 작성해 주면, 파일을 불러올 때 숫자로 저장된 파일을 다시 문자로 변환할 수 있다.
    2. read(): 내용 불러오기
moon = open('speech_moon.txt', encoding = 'UTF-8').read()
moon

 

  • 불필요한 문자(특수 문자, 한자, 공백) 제거: moon이 str 타입 변수이므로 re(문자 처리) 패키지의 sub('패턴', '대체할 문자', 텍스트) 함수 활용
import re
moon = re.sub('[^가-힣]', ' ', moon) # 한글이 아닌 모든 문자를 공백으로 변환
moon

 

  • 글의 내용을 파악하기 쉽도록 명사 추출: konlpy 패키지 tag 모듈 Hannanum 클래스의 nouns(텍스트) 함수 활용
    • tag 모듈: 형태소 분석에 필요한 모든 도구를 모아놓은 상자
    • Hannanum 클래스: tag 모듈 안에 Hannanum이라는 형태소 분석 도구
    • nouns 함수: 명사 추출 함수
import os
import konlpy

# konlpy 패키지 실행에 필요한 자바 위치를 못찾아서 에러 발생 → 자바 위치 경로 지정
os.environ['JAVA_HOME'] = r'C:\Program Files\Amazon Corretto\jdk11.0.32_9'

# 형태소 분석 클래스의 객체 생성 = 클래스라는 설계도로 객체라는 실제 도구를 만들어서 활용
hannanum = konlpy.tag.Hannanum() 

 # 명사 추출
nouns = hannanum.nouns(moon)
nouns

import pandas as pd

# 추출한 명사 리스트 데이터프레임으로 변환
df_word = pd.DataFrame({'word': nouns})
df_word

 

  • 빈도표 생성
# 단어 길이 파악
df_word['len'] = df_word['word'].str.len()

# 한 글자 단어는 의미가 없는 경우가 많기 때문에 제거
df_word = df_word.query('len >= 2')
df_word

# 단어별 빈도 계산
df_word = df_word.groupby('word', as_index = False)\
.agg(n = ('word', 'count'))\
.sort_values('n', ascending = False)

df_word

 

  • 막대 그래프 생성
# 빈도 수 상위 20개 단어 추출
top20 = df_word.head(20)

import seaborn as sns
import matplotlib.pyplot as plt

plt.rcParams.update({'font.family': 'Malgun Gothin'}) # 한글 깨짐 방지
sns.barplot(data = top20, x = 'n', y = 'word', hue = 'word') # 그래프 생성

 

  • 분석 결과
    • 일자리 문제를 해결하고 복지국가를 지향하겠다는 의사 표현이 나타난다.

 

 

 

📌 기사 댓글 텍스트 마이닝


  • 기사 댓글 파일 불러오기
df = pd.read_csv('news_comment_BTS.csv', encoding = 'UTF-8') # 인코딩을 작성하지 않아도 동작하지만, 확실히 명시하는 것 추천
df.head()

df.info()

 

  • 불필요한 문자 제거: reply가 데이터프레임에 담겨있는 변수이므로 데이터프레임의 str.replace('패턴', '대체할 문자', regex = True) 함수 활용
    • regex = True: 특정 문자 형태가 아니라, [^가-힣] 등의 정규 표현식을 활용할 것이라고 명시 
df['reply'] = df['reply'].str.replace('[^가-힣]', ' ', regex = True)
df['reply'].head()

 

  • 명사 추출: 데이터프레임의 apply 함수를 활용하여 konlpy 패키지 tag 모듈 Kkma 클래스의 nouns 함수 적용
    • tag 모듈: 형태소 분석에 필요한 모든 도구를 모아놓은 상자
    • Kkma 클래스: tag 모듈 안의 Kkma이라는 형태소 분석 도구로 띄어쓰기 오류가 있어도 형태소를 잘 추출한다는 장점이 있어 정제되지 않은 댓글 텍스트 분석에 적합
    • nouns 함수: 명사 추출 함수
import konlpy
import os

# konlpy 패키지 실행에 필요한 자바 위치를 못찾아서 에러 발생 → 자바 위치 경로 지정
os.environ['JAVA_HOME'] = r'C:\Program Files\Amazon Corretto\jdk11.0.32_9'

# 형태소 분석 클래스의 객체 생성
kkma = konlpy.tag.Kkma()

# 각 행마다 함수를 적용하여 명사 추출
nouns = df['reply'].apply(kkma.nouns)
nouns

# 한 행에 한 단어만 들어가도록 구성
nouns = nouns.explode()
nouns

 

  • 빈도표 생성
# 데이터프레임으로 변환
df_word = pd.DataFrame({'word': nouns})

# 한 글자 단어 제외하고 추출
df_word['len'] = df_word['word'].str.len()
df_word = df_word.query('len >= 2')

# 단어별 빈도 계산
df_word = df_word.groupby('word', as_index = False)\
.agg(n = ('word', 'count')\
.sort_values('n', ascending = False)
df_word

 

  • 막대 그래프 생성
# 빈도 상위 20개 단어 추출
top20 = df_word.head(20)

# 막대 그래프 생성
sns.barplot(data = top20, x = 'n', y = 'word', hue = 'word')

 

  • 분석 결과
    • '축하', '자랑', '국위선양' 등의 단어를 보면 BTS가 빌보드 차트 1위에 오른 일을 축하하고 국위 선양을 했다고 칭찬하는 댓글이 많다는 것을 알 수 있다.
    • '군대', '면제', '군면제' 등의 단어를 보면 BTS의 병역 의무를 면제해 줘야 한다는 댓글도 많다는 것을 알 수 있다.