728x90
반응형

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

 

1. 데이터 전처리

🧀데이터 셋 읽어들이기

### 라이브러리 정의하기
import pandas as pd

# 데이터프레임 변수명 : df_org
file_path = "./data/df_new.csv"
df_org = pd.read_csv(file_path)
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

 

  • 긍정 리뷰에서 한글 이외 모두 제거 처리하기
    • re.sub(pattern, replace, text)
      : text 중 pattern에 해당하a는 부분을 replace로 대체한다.
    • 코드에선 "ㄱ-ㅣ가-힣"가  아닌 것은 " "로 대체
    • [^] : 부정
pos_reviews.loc[ : , "comment"] = [re.sub(r"[^ㄱ-ㅣ가-힣+]", " ", data) for data in pos_reviews["comment"]]
pos_reviews

 

  • 부정 리뷰에서 한글 이외 모두 제거 처리하기
neg_reviews.loc[ : , "comment"] = [re.sub(r"[^ㄱ-ㅣ가-힣+]", " ", data) for data in neg_reviews["comment"]]
neg_reviews


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

  • 형태소 분석 라이브러리
# jpype : java 라이브러리를 python에서 사용할 수 있도록 도와주는 라이브러리
# - konlpy는 java로 만들어진 라이브러리
import jpype

# Okt : 한국어 형태소 분석 라이브러리
# - Okt(Open Korean Text) : 대표적 한글 형태소 분석기
from konlpy.tag import Okt

 

  • 형태소 분석기 객체 생성하기
okt = Okt()
okt

 

  • 긍정 리뷰 데이터에서 명사만 추출하기
## - 명사만 담아 놓을 리스트 변수 선언
pos_comment_nouns = []

for cmt in pos_reviews["comment"] :
    #print(okt.nouns(cmt)) # 리스트 형태로 뽑아줌
    pos_comment_nouns.extend(okt.nouns(cmt))

print(pos_comment_nouns)

 

 부정 리뷰 데이터도 똑같이 생성


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

  • 긍정 리뷰 명사 데이터에서 1글자 모두 제외하기
pos_comment_nouns2 = [word for word in pos_comment_nouns if len(word) > 1]
print(pos_comment_nouns2)

 

→ 부정 리뷰 데이터도 똑같이 생성


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

  • 리뷰 명사들에 대한 워드 카운트
from collections import Counter
  • 긍정 명사 워드카운트 처리
  • 딕셔너리 형태로 추출 된다.
pos_word_count = Counter(pos_comment_nouns2)
print(pos_word_count)

 

→ 부정 명사 워드카운트도 똑같이 생성


🧀긍정 및 부정 워드카운트 상위 20개 단어만 추출

  • 긍정 > 워드카운트 상위 20개 단어 추출
  • Count() 지원 함수 중에 내림차순 함수 : most_common(20) > 내림차순 후에 상위 20개 추출하는 함수임
pos_top_20 = {}

# - 1
for k, v in pos_word_count.most_common(20) :
    pos_top_20[k] = v
print(pos_top_20)

# - 2
pos_top_20 = {k:v for k, v in pos_word_count.most_common(20)}

 

→ 상위 20개 부정 명사 워드카운트도 똑같이 생성

 

 

2. 데이터 시각화(1) - 막대 그래프

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

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

### 폰트 설정 라이브러리
from matplotlib import font_manager, rc

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

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

 

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

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

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

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

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

### 그래프 나타내기
plt.show()

 

→ 부정 리뷰의 막대 그래프도 똑같이 생성

 

3. 데이터 시각화(2) - 워드 클라우드

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

  • 워드클라우드 라이브러리
from wordcloud import WordCloud
  • 긍정 리뷰 단어 워드 클라우드 시각화
plt. figure(figsize=(8, 8))

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

### 사용할 폰트 파일 지정하기
# font_path = "C:/Windows/Fonts/malgunsl.ttf"
font_path = "C:/Users/user/Desktop/KCC-Ganpan.ttf"

### 워드클라우드 속성 설정
wc = WordCloud(
                ### 폰트 지정
                font_path=font_path,
                ### 배경색 지정
                background_color="ivory",
                ### 그래프 너비
                width=800,
                ### 그래프 높이
                height=600
            )

### 워드클라우드 그래프에 데이터 넣기
# - generate_from_frequencies() : 워드클라우드 이미지로 반환해줌
# 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()

 

→ 부정 리뷰의 워드클라우드도 똑같이 생성

728x90
반응형

+ Recent posts