8. 텍스트 마이닝(konlpy 패키지)
🔗 'Do it! 쉽게 배우는 파이썬 데이터 분석' 책을 기반으로 JupyterLab 환경에서 학습한 내용입니다 _φ(๑╹╹๑)
📌 텍스트 마이닝 준비
- KoNLPy 패키지 설치하기 전
- java 설치: http://abit.ly/easypy_101에서 운영체제 버전에 맞는 msi 파일 다운로드
- jpype1 패키지 설치: 아나콘다 프롬프트에 pip install jpype1 작성
- KoNLPy 패키지 설치: 아나콘다 프롬프트에 pip install konlpy 작성
- KoNLPy 패키지: 한글 텍스트로 형태소를 분석할 수 있게 해주는 패키지
📌 대통령 연설문 텍스트 마이닝
- 연설문 불러오기
- open(): 파일 열기
- encoding: 컴퓨터는 사용자가 지정한 인코딩 방식을 통해 파일의 문자를 숫자로 저장한다. 따라서 이때 사용한 인코딩 방식을 작성해 주면, 파일을 불러올 때 숫자로 저장된 파일을 다시 문자로 변환할 수 있다.
- read(): 내용 불러오기
- open(): 파일 열기
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의 병역 의무를 면제해 줘야 한다는 댓글도 많다는 것을 알 수 있다.
'데이터 분석 > Python' 카테고리의 다른 글
| 10. 인터랙티브 그래프(plotly 패키지) (0) | 2026.07.29 |
|---|---|
| 9. 지도 시각화(folium 패키지) (0) | 2026.07.29 |
| 7-2. 한국복지패널 데이터 분석(2) (1) | 2026.07.24 |
| 7-1. 한국복지패널 데이터 분석(1) (0) | 2026.07.23 |
| 6. 데이터 시각화(seaborn 패키지) (0) | 2026.07.20 |