Programming/Python

Python 워드 클라우드, 막대 그래프로 단어 빈도수 분석

gellygelly 2021. 12. 29. 19:37
  • os: windows
  • Python 3.8
  • Pycharm 
  • jdk 17.0.1
  • JPype1-1.1.2-cp38-cp38-win_amd64.whl

 

데이터 준비하기

 

네이버 블로그 게시물 데이터를 크롤링 한 뒤, 엑셀 파일 형태로 저장한 후 해당 데이터를 가지고 단어 빈도수를 워드 클라우드 및 막대 그래프로 나타내 보겠습니다. 

 

먼저 아래와 같이 5개 블로그에서 긁어온 크롤링 데이터를 하나의 파일로 통합하겠습니다. 

[1] naver_blog_post_crawling.xlsx
[2] naver_blog_post_crawling.xlsx
[3] naver_blog_post_crawling.xlsx
[4] naver_blog_post_crawling.xlsx
[5] naver_blog_post_crawling.xlsx

엑셀 파일로 저장된 크롤링 데이터

 

저의 경우에는 파일명을 [1] ..., [2] ..., 의 형태로 저장해서 반복문을 이용했지만, 파일명이 특정한 규칙 없이 다 다르다면 file_list = ['파일명1', '파일명2'... ] 의 형태로 저장해 반복문을 돌려 하나의 데이터 프레임으로 만들어준 뒤 해당 데이터 프레임을 엑셀 형태로 저장해도 됩니다. 

# 여러 엑셀 파일들을 통합하는 코드
import pandas as pd

df = pd.DataFrame([])

for i in range(1, 6):
    fname = '['+str(i)+'] naver_blog_post_crawling.xlsx'
    temp = pd.read_excel(fname)
    df = df.append(temp)

df.columns = ['title', 'content', 'date', 'season', 'nickname']
df = df.fillna(0) # NaN 값 0으로 변경
file_name = "naver_blog_post_crawling.xlsx"
df.to_excel(file_name, index=False)

 

워드 클라우드 생성을 위한 각종 패키지 설치

import pandas as pd
from collections import Counter
import matplotlib.pyplot as plt
import seaborn as sns
from wordcloud import WordCloud
from matplotlib import rc
from konlpy.tag import Okt

한글로 된 게시물을 분석할 것이기 때문에 konlpy가 필요합니다. 설치되어 있지 않은 패키지들을 모두 pip install ~ 명령어를 통해 설치합니다.

 

konlpy 설치

 

konlpy의 경우, jdk와 Jpype 설치가 필요하므로, 해당 파일 설치해줍니다. 

 

jpype는 python 버전, os를 확인해 설치해주어야 합니다.

 

  • jdk 설치

Oracle java, AdoptOpenJDK, OpenJDK 중 어느 것을 설치해도 무방합니다. 저는 OpenJDK 17.0.1 버전을 설치했습니다.

 

https://www.oracle.com/java/technologies/downloads/

 

https://adoptopenjdk.net/

 

AdoptOpenJDK

AdoptOpenJDK provides prebuilt OpenJDK binaries from a fully open source set of build scripts and infrastructure. Supported platforms include Linux, macOS, Windows, ARM, Solaris, and AIX.

adoptopenjdk.net

 

https://openjdk.java.net/

 

OpenJDK

Learn about the key active Projects in the Community including Amber (high-productivity language features), Loom (lightweight concurrency), Panama (foreign functions and foreign data), Valhalla (primitive types and specialized generics), and, of course, th

openjdk.java.net

 

jdk 설치 후에는 java 환경변수 설정도 잊지 마세요!

java 환경변수 설정은 아래 블로그 참고했습니다.

 

https://hi-datalab.tistory.com/16

 

자바 jdk 다운로드 하고 버전 확인, 환경변수 설정하기

자바를 하다보면 JDK 와 JRE 에 대해 헷갈릴 때가 있는데 용어를 정리해보겠습니다. 그전에 JVM에 대해 알아보겠습니다. JVM, JRE, JDK 의 차이점 JVM JVM은 자바 가상머신(Java Virtual Machine)의 약자로 자바

hi-datalab.tistory.com

 

  • jpype 설치

https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype

 

Python Extension Packages for Windows - Christoph Gohlke

by Christoph Gohlke, Laboratory for Fluorescence Dynamics, University of California, Irvine. Updated on 26 December 2021 at 20:23 UTC. This page provides 32 and 64-bit Windows binaries of many scientific open-source extension packages for the official CPyt

www.lfd.uci.edu

 

jpype 설치 후에는 실행할 코드와 같은 디렉토리로 설치한 jpype 파일을 옮겨 주세요! 

 

이후, pip install 명령어를 통해 jpype 파일을 설치합니다. 

pip install 설치한 jpype 파일명
pip install JPype1-1.1.2-cp38-cp38-win_amd64.whl

 

jpype 설치가 완료되면, konlpy를 설치합니다.

pip install konlpy

 

워드 클라우드 및 막대 그래프 생성 

워드 클라우드 생성 전 전처리로 특수문자 및 \n 문자를 모두 제거하고 2글자 이상의 명사만 추출하는 과정을 거쳤습니다.  (# 전처리, # 통합 저장 부분) 

 

df.columns = ['title', 'content', 'date', 'season', 'nickname']은 수집한 네이버 블로그 게시물의 제목, 본문, 작성일자, 시즌(S/S, F/W), 닉네임 정보입니다. 아래 코드에서는 '본문' 내용을 기준으로 워드 클라우드를 생성했습니다. 

 

만약 엑셀 관련 오류가 발생한다면, pip install openpyxl 명령어를 통해 엑셀을 다루는 데 필요한 패키지가 설치되었는지 확인해 주세요. 

# 수집한 텍스트 정보를 워드 클라우드로 표현하는 코드

import pandas as pd
from collections import Counter
import matplotlib.pyplot as plt
import seaborn as sns
from wordcloud import WordCloud
from matplotlib import rc
from konlpy.tag import Okt

total = pd.read_excel('naver_blog_post_crawling.xlsx')

content_total = [ ] # 텍스트 내용을 기준으로 워드 클라우드 생성

## df.columns = ['title', 'content', 'date', 'season', 'nickname'] 

nlp = Okt()

# 전처리 - 특수문자, \n 제거, 특정 시즌 게시물만 추출
total = total[total['season']=='F/W'] # 2021 F/W season 게시물만 추출
total['content'] = total['content'].str.replace(pat=r'[^\w]', repl=r'', regex=True) # 특수문자 제거
total['content'] = total['content'].str.replace('\n', '') # \n 제거

# 통합 저장 

print(total['content'])
for word in total['content']:
    nouns = nlp.nouns(word) # 명사별로 분할
    for temp in nouns:
        if len(temp)>=2:
            content_total.append(temp)

print(content_total)

# 빈도수 집계
count = Counter(content_total)
count.most_common(50) # 가장 많이 사용된 단어 확인

print(count)

# 데이터 정제(제외할 단어)
STOPWORDS = ['코디', 'ootd', '패션', '여자', '남자', '추천', '여성', '남성', '브랜드', '옷', '인스타그램', '완성', '선물', '재생', '착용', '선택', '영상', '화질', '광고',
             '음소거', '네이버', '동영상', '자막', '해제', '어플리케이션', '블로거', '디자인', '보기', '시간', '코드', '공식', '할인', '제품', '사이즈', '느낌', '아이템', '활용', '생각',
             '컬러', '포인트', '요즘', '이번', '오늘', '출처', '포함', '참고', '부분', '사이즈']

total_selected = []

for tag in content_total:
    if tag not in STOPWORDS:
        total_selected.append(tag)

count_selected = Counter(total_selected)
count_selected.most_common(50)

# 막대 차트 그리기
font_name = "malgun gothic"
rc('font', family=font_name)

# 데이터 준비

df = pd.DataFrame(count_selected.most_common(30))
df.columns = ['words', 'counts']

# 막대 차트 그리기
plt.figure(figsize=(10,8))
sns.barplot(x='counts', y='words', data=df)

# 워드 클라우드 그리기
font_path = 'C:/Windows/Fonts/malgun.ttf'
wordcloud = WordCloud(font_path=font_path,
                      background_color='white',
                      max_words=100,
                      relative_scaling=0.3,
                      width=800,
                      height=400).generate_from_frequencies(count_selected)

plt.figure(figsize=(15,10))
plt.imshow(wordcloud)

plt.show()

 

 

수집한 텍스트 데이터의 단어 빈도수를 막대 그래프 및 워드 클라우드로 표현했습니다~!!

 


<웹 크롤링 데이터 저장 및 워드 클라우드 생성 과정에서 발생한 오류 모음>

 

▶ openpyxl.utils.exceptions.IllegalCharacterError

 

python 웹 크롤링 후 데이터 저장 과정에서 특정 문자열이 포함되었을 경우, 엑셀 파일에 저장하려고 할 시 문제가 발생한다고 합니다.. 

 

아래 블로그 게시물 참고해서 해결했으며, 아래 코드는 제가 웹 크롤링 후 데이터를 엑셀로 저장할 때 사용한 코드고, 주석 부분 참고하시면 될 것 같습니다~

 

https://cindycho.tistory.com/entry/Python-Openpyxl-openpyxlutilsexceptionsIllegalCharacterError-%EA%B0%80-%EB%82%A0-%EB%88%88%EB%AC%BC%EC%A7%93%EA%B2%8C-%ED%95%B4

 

[Python / Openpyxl] openpyxl.utils.exceptions.IllegalCharacterError 가 날 눈물짓게 해

파이썬 크롤링을 해서 엑셀에 저장하는 도중 특정 문자열이 포함된 (print 해서 보면 우리눈에는 정상으로 보인다) 경우에는 엑셀파일에 저장하려고 할 경우 에러가 발생한다... 에러는 "openpyxl.uti

cindycho.tistory.com

    def save_to_excel(self,data, num):
        df = pd.DataFrame(data)
        df.columns = ['title', 'content', 'date', 'season', 'nickname']

        file_name = '[m'+str(num)+'] naver_blog_post_crawling.xlsx'

        # 엑셀에 특정 문자 포함 시 illgal characters 오류가 발생하는 걸 막기 위함
        df = df.applymap(lambda x: ILLEGAL_CHARACTERS_RE.sub(r'', x) if isinstance(x, str) else x)

        df.to_excel(file_name, index=False)

 

▶ TypeError : Package kr.lucypark.tkt.TktInterface is not Callable

 

자바 jvm 셋팅 문제입니다. 아래 글 참고하여 해결했습니다. 

 

https://github.com/konlpy/konlpy/issues/81

 

TypeError : Package kr.lucypark.tkt.TktInterface is not Callable 에러 · Issue #81 · konlpy/konlpy

konlpy 를 이용하여 만든 프로그램을 exe화 하기위해 py2exe 를 사용하여 만들었는데 제목과 같은 오류가 발생합니다...... 혹시 해결방법이 있을까요 ?

github.com

 

JAVA_HOME 환경 변수 설정 제대로 했는데도, 해결이 되지 않으면 jvm.py 파일에서 jvmpath = 'jvm.dll 파일 경로' 코드를 작성해 주시면 됩니다. 

 

 

▶AttributeError: module 'tweepy' has no attribute 'StreamListener'

 

konlpy package import 시 발생하는 문제입니다.

tweepy 패키지를 아래 버전으로 설치해주면 해결됩니다. 

pip install tweepy==3.10.0

아래 블로그 글 참고해서 해결했습니다. 

 

https://doitgrow.com/27

 

[오류 해결] konlpy 패키지 import 에러 (AttributeError: module 'tweepy' has no attribute 'StreamListener')

자연어 처리를 할 때 문장을 단어로 나누고, 형태소 분석을 하는 등 다양한 전처리 작업이 필요하다. 영어를 자연어 처리할 때에는 nltk 패키지를 가장 많이 사용하며, 한국어를 처리할 때에는 kon

doitgrow.com