본문 바로가기
Coding/Python

[Python & Matplotlib] 명사 추출 후 다양한 그래프로 시각화하기 !!

by 포스트it 2024. 11. 28.
반응형

 

[Python & Matplotlib] 명사 추출 후 다양한 그래프로 시각화하기 !!

2024.11.27 - [Coding/데이터 시각화] - [Python & Matplotlib] 명사 추출 후 그래프로 시각화하는 방법 !!

 

[Python & Matplotlib] 명사 추출 후 그래프로 시각화하는 방법 !!

[Python & Matplotlib] 명사 추출 후 그래프로 시각화하는 방법 !!한국어 형태소 분석을 위해 KoNLPy 라이브러리를 사용하고, 시각화를 위해 matplotlib를 사용한 예제입니다 ㅎ 1. 필요한 라이브러

seill.tistory.com

 

이전글에서 명사추출해서 그래프로 표현했었는데, 이번 코드에선 워드클라우드, 파이차트 등 다양한 차트를 같이 포함하여 시각화 해보았습니다 !

 

1. 필요한 라이브러리 설치

pip install konlpy matplotlib wordcloud networkx plotly

 

2. 예제 코드

아래 코드 실행시키면 위에 결과화면 처럼 나오게 됩니다 :)

from konlpy.tag import Okt
from collections import Counter, defaultdict
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import networkx as nx
import plotly.express as px
import pandas as pd
from matplotlib import font_manager, rc

# 한글 폰트 설정
font_path = "C:/Windows/Fonts/malgun.ttf"  # 시스템에 맞게 변경하세요
font_name = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font_name)

# 분석할 텍스트
text = """
코드 설명
폰트 설정: matplotlib에서 한글이 깨지지 않도록 시스템에 설치된 한글 폰트를 설정합니다.
텍스트 입력: 분석하고 싶은 한국어 텍스트를 text 변수에 입력합니다.
명사 추출: Okt 형태소 분석기를 사용하여 텍스트에서 명사만 추출합니다.
빈도 계산: Counter를 사용하여 명사의 빈도수를 계산합니다.
데이터 준비: 가장 빈도 높은 10개의 명사와 그 빈도수를 리스트로 분리합니다.
그래프 시각화: 막대 그래프로 명사의 빈도수를 시각화합니다.
실행 결과
코드를 실행하면 입력한 텍스트에서 가장 많이 등장한 명사 10개의 빈도수를 막대 그래프로 볼 수 있습니다.
"""

# 형태소 분석기 초기화
okt = Okt()

# 명사 추출
nouns = okt.nouns(text)

# 명사 빈도 계산
count = Counter(nouns)

# 상위 n개의 명사 추출
n = 10
most_common = count.most_common(n)
words = [word for word, _ in most_common]
freqs = [freq for _, freq in most_common]

# 그래프를 2x2 형태로 배치
fig, axs = plt.subplots(2, 2, figsize=(15, 12))

# 1. 막대 그래프
axs[0, 0].bar(words, freqs, color='skyblue')
axs[0, 0].set_xlabel('명사')
axs[0, 0].set_ylabel('빈도수')
axs[0, 0].set_title('명사 빈도 막대 그래프')
axs[0, 0].tick_params(axis='x', rotation=45)

# 2. 워드 클라우드
wordcloud = WordCloud(font_path=font_path, background_color='white', width=400, height=300).generate_from_frequencies(count)
axs[0, 1].imshow(wordcloud, interpolation='bilinear')
axs[0, 1].axis('off')
axs[0, 1].set_title('워드 클라우드')

# 3. 파이 차트
axs[1, 0].pie(freqs, labels=words, autopct='%1.1f%%', startangle=140)
axs[1, 0].set_title('명사 빈도 파이 차트')
axs[1, 0].axis('equal')

# 4. 히스토그램 (명사 길이 분포)
lengths = [len(noun) for noun in nouns]
axs[1, 1].hist(lengths, bins=range(1, max(lengths)+2), align='left', color='skyblue', rwidth=0.8)
axs[1, 1].set_xlabel('글자 수')
axs[1, 1].set_ylabel('빈도수')
axs[1, 1].set_title('글자 수 분포 히스토그램')
axs[1, 1].set_xticks(range(1, max(lengths)+1))

plt.tight_layout()
plt.show()
728x90
반응형

댓글