본문 바로가기

Back-End/데이터베이스

[DB] 워드클라우드 시각화 - KoNLPY, Okt, Counter, WordCloud

~ 목차 ~

워드클라우드 - 설치준비

 

< 한글 형태소 분석 라이브러리 : KoNLPY >

 

 

 

🐤 Java 기반으로 만들어진 라이브러리로 JDK 설치 및 환경 설정

  

       - 환경변수 등록 (파일탐색기>내 pc 마우스 우클릭 > 속성 > 고급시스템설정 > 환경 변수  )
          * JAVA_HOME : 경로 - JDK설치 폴더까지
          * Path 수정 후 두개 추가 : %JAVA_HOME%, %JAVA_HOME%\bin
       - PC 재부팅 후 설정 확인 : command창 open 후 -> java, javac 입력 후 help 내용 나오면 성공

환경 변수
사용자 변수 편집 새로만들기
시스템변수 > Path > 편집

 

🐤라이브러리 설치

      - nltk 설치 : 영어 형태소 분석 라이브러리(KoNLPY의 상위 라이브러리)
         * pip install nltk

가상환경에 nltk설치

 


      - nltk 플러그인 추가 설치(다운로드 설치 방식)
        → 플러그인은 최초 한번 설치하면, 추후 다른 가상환경에서도 적용됨
        →  다른 가상환경에서는 pip install nltk 라이브러리만 설치하면 됨
        > python
        > import nltk
        > nltk.download()
        > NLTK 창이 Open됨
        > All Packages 탭 선택 > punkt 더블클릭, stopwords 더블클릭

           ※ 마우스로 움직이지 말고 키보드로 위아래 움직이기
        > exit()

파이썬 실행후 nltk플러그인 설치
패키지 탭 이동

 

punkt설치
stopwords 설치

 


     - 워드클라우드 라이브러리 설치
        > pip install wordcloud

워드클라우드 라이브러리 설치



     - konlpy 설치 전에 파이썬에서 JAVA 라이브러리 인식을 위한 라이브러리 설치( JPype1 )
        > pip install JPype1 (끝에는 숫자 1)
        > pip install konlpy

 

JPype1와 konlpy 설치

 

 

     - jvm.py 파일 내에 별표시(*) 삭제하기
         * 위치 : C:\Users\user\anaconda3\envs\gj_env_01\Lib\site-packages\konlpy\
         * 메모장으로 jvm.py 열기
         * folder_suffix[] 리스트 내에 별(*) 표시 찾아서 삭제 > 저장 > 닫기

 

라이브러리 설치 후
jvm.py 수정

 

 

 

영화 긍정/부정 리뷰데이터 빈도분석 및 워드클라우드 시각화

 

🐤 라이브러리 정의하기

 

     import pandas as pd

 

🐤 데이터 읽어들이기

 

     file_path = "./data/df_new.csv"
     df_org = pd.read_csv(file_path)
     df_org

df_org

 

🐤 긍정 및 부정에 대해서만 각각 데이터 필터링하기

      - 긍정 데이터프레임 변수명 : pos_reviews

         pos_reviews = df_org[df_org["label"] == 1]
         pos_reviews

긍정 리뷰

 

      - 부정 데이터프레임 변수명 : neg_reviews

        neg_reviews = df_org[df_org["label"] == 0]
        neg_reviews

부정 리뷰

 

 

 

🐤 리뷰데이터 전처리

 

      - 정규표현식 라이브러리 활용

         import re

 

      - 리뷰에서 한글 이외 모두 제거 처리하기

        * sub(r"패턴", " ", 변수명) : 변수에서 패턴에 해당하지 않는 모든것을 두번째것으로 바꿔라(한칸 띄어쓰기)

         pos_reviews.loc[ : , "comment"] = [re.sub( r"[^ㄱ-ㅣ가-힣+]", " ", data) for data in pos_reviews["comment"]]
         pos_reviews

 

pos_reviews

 

         neg_reviews.loc[ : , "comment"] = [re.sub( r"[^ㄱ-ㅣ가-힣+]", " ", data) for data in neg_reviews["comment"]]
        neg_reviews

neg_reviews


 

긍정 및 부정 리뷰 형태소 추출하기

 

 🐤 형태소 분석 라이브러리

       - jpype : java 라이브러리를 python에서 사용할 수 있도록 도와주는 라이브러리
       - konlpy는 java로 만들어진 라이브러리


         import jpype

 

 🐤 한국어 형태소 분석 라이브러리

       - Okt(Open Korean Text) : 대표적 한글 형태소 분석기


          from konlpy.tag import Okt

 

       - 형태소 분석기 객체 생성하기


          okt = Okt()
          okt

 

       - 긍정 리뷰 데이터에서 → 명사 추출하기( okt.nouns() ) 


          pos_comment_nouns = []

          for cmt in pos_reviews["comment"]:
            
                 pos_comment_nouns.extend(okt.nouns(cmt))
    
          print(pos_comment_nouns)

 

긍정리뷰 명사 추출

 

       - 부정 리뷰 데이터에서 → 명사 추출하기( okt.nouns() ) 


          neg_comment_nouns = []

          for cmt in neg_reviews["comment"]:
            
                 neg_comment_nouns.extend(okt.nouns(cmt))
    
          print(neg_comment_nouns)

 

부정리뷰 명사 추출

 

 

 🐤 긍정 및 부정 리뷰 데이터에서 1글자는 모두 제외 시키기


       - 긍정 리뷰 데이터에서 1글자 모두 제외하기              

         pos_comment_nouns2 = [ w for w in pos_comment_nouns if len(w) > 1]
         print(pos_comment_nouns2)

 

       - 부정 리뷰 데이터에서 1글자 모두 제외하기    

         neg_comment_nouns2 = [ w for w in neg_comment_nouns if len(w) > 1]
         print(neg_comment_nouns2)

긍정 리뷰 1글자 제외

 

 

 🐤 긍정 및 부정 명사들의 빈도 분석

 

       - 리뷰 명사들에 대한 워드카운드 라이브러리 ( Counter )
          from collections import Counter

 

       - 긍정 명사 워드카운드 처리

          pos_word_count = Counter(pos_comment_nouns2)
          pos_word_count

pos_word_count

 

       - 부정 명사 워드카운드 처리

          neg_word_count = Counter(neg_comment_nouns2)
          neg_word_count

 

neg_word_count

 

 

🐤 상위 20개 단어만 추출

 

       - Count()에서 지원하는 함수 중에 내림차순 함수 : most_common(20)

          ; 내림차순 후에 상위 20개 추출

 

      - 1번 방법
          pos_top_20 = {}
          for k, v in pos_word_count.most_common(20):
                pos_top_20[k] = v
          print(pos_top_20)


      - 2번 방법
        neg_top_20 = { k:v for k,v in neg_word_count.most_common(20) }
        print(neg_top_20)

 

 

상위 20개 단어만 추출


 

긍정 및 부정 상위 20개 명사에 대한 빈도 시각화

 

 

### 시각화 라이브러리
import matplotlib.pyplot as plt

### 폰트 설정 라이브러리
from matplotlib import font_managerrc

### 폰트 설정
plt.rc("font", family = "Malgun Gothic")

### 마이너스 기호 설정
plt.rcParams["axes.unicode_minus"] = False

 

### 긍정 리뷰의 단어 상위(20개) 빈도 시각화


### 막대 그래프를 이용한 빈도 시각화
plt.figure(figsize=(10, 5))

### 제목 넣기
plt.title("긍정 리뷰의 단어 상위(20개) 빈도 시각화", fontsize = 17)

### 막대그래프 그리기
for key, value in pos_top_20.items():
    # 영화라는 단어는 의미가 없을 것으로 여겨짐, 따라서 제외시키기
    if key == "영화":
        continue
        
    plt.bar(key, value, color = "pink")

### x축, y축 제목 넣기
plt.xlabel("리뷰 명사")
plt.ylabel("빈도(count)")

### x축 각도 조절
plt.xticks(rotation = 70)


### 그래프 출력
plt.show()

 

긍정리뷰 단어 막대그래프

 

### 부정 리뷰의 단어 상위(20개) 빈도 시각화


### 막대 그래프를 이용한 빈도 시각화
plt.figure(figsize=(10, 5))

### 제목 넣기
plt.title("부정 리뷰의 단어 상위(20개) 빈도 시각화", fontsize = 17)

### 막대그래프 그리기
for key, value in neg_top_20.items():
    # 영화라는 단어는 의미가 없을 것으로 여겨짐, 따라서 제외시키기
    if key == "영화":
        continue
        
    plt.bar(key, value, color = "pink")

### x축, y축 제목 넣기
plt.xlabel("리뷰 명사")
plt.ylabel("빈도(count)")

### x축 각도 조절
plt.xticks(rotation = 70)


### 그래프 출력
plt.show()

부정리뷰 단어 막대그래프


 

 

긍정 및 부정 리뷰 단어 워드클라우드(wordcloud) 시각화

 

### 워드클라우드 라이브러리
from wordcloud import WordCloud

 

  - generate_from_frequencies() : 워드클라우드 이미지로 반환해줌

  - axis("off") : x y 좌표축 제외시키기

### 긍정 리뷰 단어 워드클라우드 시각화
plt.figure(figsize=(8, 8))

### 그래프 제목
plt.title("[긍정] 리뷰 단어 워드클라우드 시각화")

### 사용할 폰트 파일 지정하기
font_path = "C:/Windows/Fonts/malgunsl.ttf"

wc = WordCloud(
    ### 폰트 지정
    font_path=font_path,
    ### 배경색 지정
    background_color="ivory",
    ### 그래프 너비
    width=800,
    ### 그래프 높이
    height=600
)

### 워드클라우드 그래프에 데이터 넣기

# 긍정 상위 20개 단어만 넣기
# cloud = wc.generate_from_frequencies(pos_top_20)
# 긍정 전체 단어 넣어보기
cloud = wc.generate_from_frequencies(pos_word_count)

### 워드클라우드 이미지 보여주기
plt.imshow(cloud)

### x y 좌표축 제외시키기
plt.axis("off")

### 이미지 저장하기
plt.savefig("./img/긍정_리뷰_단어_워드클라우드_시각화.png")

### 그래프 출력
plt.show()

긍정 단어 워드 클라우드

 

### 부정 리뷰 단어 워드클라우드 시각화
plt.figure(figsize=(8, 8))

### 그래프 제목
plt.title("[부정] 리뷰 단어 워드클라우드 시각화")

### 사용할 폰트 파일 지정하기
font_path = "c:/windows/fonts/gulim.ttc"

wc = WordCloud(
    ### 폰트 지정
    font_path=font_path,
    ### 배경색 지정
    background_color="black",
    ### 그래프 너비
    width=800,
    ### 그래프 높이
    height=600
)

### 워드클라우드 그래프에 데이터 넣기

# 긍정 상위 20개 단어만 넣기
# cloud = wc.generate_from_frequencies(neg_top_20)
# 긍정 전체 단어 넣어보기
cloud = wc.generate_from_frequencies(neg_word_count)

### 워드클라우드 이미지 보여주기
plt.imshow(cloud)

### x y 좌표축 제외시키기
plt.axis("off")

### 이미지 저장하기
plt.savefig("./img/부정_리뷰_단어_워드클라우드_시각화.png")

### 그래프 출력
plt.show()

 

부정 단어 워드 클라우드

728x90