데이터분석/Text Mining

워드 클라우드로 텍스트 분석

상선약수64 2025. 3. 9. 19:49

1. 워드 클라우드(Word Cloud)란

 

  • 텍스트 분석에서 가장 많이 등장하는 시각화 기법입니다. 자주 등장하는 단어의 빈도를 크기와 색상으로 표현하는 시각화 기법으로 단어의 빈도수가 높을수록 큰 글씨로 표현되며, 데이터의 주요 키워드를 빠르게 파악할 수 있습니다.
  • 워드 클라우드 활용의 예는 아래와 같습니다.
    • 뉴스 기사 분석: 특정 시기나 주제의 핵심 단어 파악
    • 소셜 미디어 분석: 트위터, 블로그 등에서 자주 언급되는 키워드 시각화
    • 고객 리뷰 분석: 제품 리뷰에서 자주 등장하는 단어 확인

2. 워드 클라우드를 위한 주요 라이브러리

 

라이브러리 주요기능
wordcloud 텍스트 데이터를 워드 클라우드 형태로 시각화
konlpy 한국어 자연어 처리(형태소 분석, 명사 추출 등)
re 정규 표현식 활용(텍스트 전처리)
collections Counter, defaultdic 등 다양한 자료구조를 제공

 

(1) wordcloud 라이브러리

 

  • 자주 등장하는 단어일수록 크기가 크게 표시되며, 텍스트 데이터의 핵심 키워드를 쉽게 시각화할 수 있는 모듈 임
  • 주요 기능 
    • 텍스트 데이터에서 단어 빈도수를 계산하여 워드 클라우드를 생성
    • 특정 단어를 제외하는 불용어(stopwords) 설정 가능
    • 한글 폰트 설정 가능(기본적으로 영어 폰트만 지원)
    • 다양한 모양과 색상 적용 가능 
  • 기본 사용법
pip install wordcloud #라이브러리 설치

 

    박노해 시인의 "다시"라는 시를 파이썬으로 wordcloud 프로그램을 작성해 보도록 하겠습니다.

from wordcloud import WordCloud
import matplotlib.pyplot as plt

text = """희망찬 사람은 
그 자신이 희망이다.
길 찾는 사람은
그 자신이 새 길이다.
참 좋은 사람은
그 자신이 이미 좋은 세상이다.
사람 속에 들어있다.
사람에서 시작된다.
다시, 사람이 희망이다."""  #박노해 시인의 다시라는 

# 워드 클라우드 생성
wordcloud = WordCloud(font_path="malgun.ttf", background_color="white").generate(text) #malgun.ttf는 한글 폰트입니다.

# 시각화
plt.figure(figsize=(8, 6))
plt.imshow(wordcloud, interpolation="spline16")
plt.axis("off")
plt.show()

 

worlcloud 결과

 

(2) konlpy 라이브러리

  • 한국어 형태소 분석을 지원하는 자연어 처리 라이브러리 입니다. 
  • 주요 기능 
    • 형태소 분석 (명사, 동사, 형용사 등)
    • 품사 태깅 (POS Tagging)
    • 불용어 제거
    • 한국어 텍스트 전처리에 유용
  • 기본 사용법
pip install konlpy #라이브러리 설치

   

    박노해 시인의 "다시"라는 시를 파이썬으로 형태소 분석을 하여 명사면 출력하는 프로그램을 작합니다.

from konlpy.tag import Okt

okt = Okt()
text = text = """희망찬 사람은 
그 자신이 희망이다.
길 찾는 사람은
그 자신이 새 길이다.
참 좋은 사람은
그 자신이 이미 좋은 세상이다.
사람 속에 들어있다.
사람에서 시작된다.
다시, 사람이 희망이다."""

# 형태소 분석
tokens = okt.morphs(text)
print(tokens)  # 형태소 분석한 결과를 출력함 

# 명사 추출
nouns = okt.nouns(text)
print(nouns)  # 명사만 추출한 결과를 출력함 

 

  • 결과

 

(3) re 라이브러리

 

  • re는 파이썬의 정규 표현식 (Regular Expression, Regex) 처리를 위한 내장 라이브러리입니다.
  • 주요 기능
    • 텍스트에서 특정 패턴 찾기
    • 특정 문자/단어 제거
    • 문자열 치환 및 분리
  • 정규 표현식 활용 예제
패턴 설명
\d+ 숫자(0-9) 찾기
\w+ 문자(알파벳, 숫자 등) 찾기
\s+ 공백(스페이스, 탭, 줄바꿈) 찾기
[\^가-힝] 한글이 아니 문자 제거
[^\w\s가-힣]" 특수문자 제거
(.)\1{2,} 같은 문자 반복 시 2개만 남기기(ㅋㅋㅋㅋㅋ -> ㅋㅋ)

 

import re

def clean_korean_text(text): 
    text = text.lower()  # 소문자 변환 (필요한 경우)
    text = re.sub(r"https?://\S+|www\.\S+", "", text)  # URL 제거
    text = re.sub(r"[^\w\s가-힣]", " ", text)  # 특수 문자 제거 (한글, 숫자, 영어만 남기기)
    text = re.sub(r"\d+", "", text)  # 숫자 제거
    text = re.sub(r"[a-zA-Z]+", "", text)  # 영어 제거
    text = re.sub(r"\s+", " ", text)  # 여러 개의 공백을 하나로 변환
    text = re.sub(r"(.)\1{2,}", r"\1\1", text)  # 같은 문자 반복 시 2개만 남기기 (ㅋㅋㅋㅋ → ㅋㅋ)
    
    return text.strip()  # 앞뒤 공백 제거

text = """
안녕하세요!! 😊😊 저는 Python과 AI를 공부하는 학생입니다. 
요즘 ㅋㅋ 너무 바빠서 ㅠㅠㅠㅠ 공부를 못하고 있어요... ㅠㅠ 
제 블로그: https://example.com 에 방문해주세요! 100% 추천합니다!!!
"""

# 전처리 적용
clean_text = clean_korean_text(text)
print(clean_text) #데이터 전처리한 결과를 출력합니다.

 

  • 결과

 

(4) collections 라이브러리

  • 파이썬의 내장 라이브러리, 데이터를 효율적으로 다룰 수 있는 다양한 컨테이너 자료형을 제공합니다.
  • 주요 기능
    • 텍스트에서 특정 패턴 찾기
    • 특정 문자/단어 제거
    • 문자열 치환 및 분리
  • 프로그램 작성
rom collections import Counter

text = ["사과", "바나나", "사과", "포도", "바나나", "사과"]
word_count = Counter(text)
print(word_count) # Counter({'사과': 3, '바나나': 2, '포도': 1})

# 가장 많이 등장한 단어 2개 출력
print(word_count.most_common(2))  # [('사과', 3), ('바나나', 2)]

 

  • 결과

 

3. 텍스트 분석

  • 텍스트 마이닝에 많이 사용되는 라이브러리에 대한 내용을 언급하였습니다. 위의 모듈을 활용하여 워드클라우드로 "윤석열 헌법재판소 최후변론 전문"을 워드클라우드로 시각화하고자 합니다. 주석을 참조하여 코드를 작성해 보세요.
import pandas as pd
import re
from collections import Counter
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from konlpy.tag import Okt

# 데이터 불러오기

df = pd.read_csv("윤석열최후변론전문.txt",  sep='\t', header=None).dropna()


# 텍스트 전처리 함수
def clean_text(text):
    text = re.sub(r"[^\w\s가-힣]", " ", text)  # 특수 문자 제거 (한글, 숫자, 영어만 남기기)
    text = re.sub(r"\d+", "", text)  # 숫자 제거
    text = re.sub(r"[a-zA-Z]+", "", text)  # 영어 제거
    text = re.sub(r"\s+", " ", text)  # 여러 개의 공백을 하나로 변환
    text = re.sub(r"(.)\1{2,}", r"\1\1", text)  # 같은 문자 반복 시 2개만 남기기 (ㅋㅋㅋㅋ → ㅋㅋ)
  
    return text.strip()  # 앞뒤 공백 제거

df[0] = df[0].apply(clean_text)


# 형태소 분석 및 명사 추출
okt = Okt()
nouns = []
for doc in df[0]:
    nouns.extend(okt.nouns(doc))  # 문장에서 명사 추출

# 단어 빈도수 계산
word_counts = Counter(nouns)
word_dict = dict(word_counts.most_common(30))  # 상위 100개 단어만 사용

# 워드 클라우드 생성
wordcloud = WordCloud(
    font_path="malgun.ttf",  # 한글 폰트 설정 (Mac: "AppleGothic", Windows: "malgun.ttf")
    background_color="white",
    width=800,
    height=600
).generate_from_frequencies(word_dict)

# 워드 클라우드 출력
plt.figure(figsize=(10, 6))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

 

워드클라우드로 시각화 한 내용입니다. 많이 언급한 단어의 빈도는 표시되지만 그외 분석은 하지 않았습니다. 향후 감성분석 등 다양한 분석을 해 볼 필요가 있습니다.

'데이터분석 > Text Mining' 카테고리의 다른 글

텍스트 마이닝과 워드 클라우드  (1) 2025.03.09