전체코드 링크
전체 코드 링크 타고가면 결과값도 함께 볼 수 있다.
import pandas as pd
import numpy as np
import re
import nltk
from textblob import TextBlob
import gensim
from gensim import corpora
from gensim.utils import simple_preprocess
df = pd.read_csv("netflix_reviews.csv") # 파일 불러오기
df = df.iloc[:,0:5]
이모티콘도 감정의 중요부분이라 생각해서 이모티콘도 전처리 작업에 넣어봄...
# 전처리 함수
import re
import emoji
# 이모티콘만 추출하는 함수 (중복 제거)
def remove_duplicate_emojis(text):
# 유니코드 이모티콘 범위에 해당하는 모든 이모티콘을 찾음
emoji_pattern = re.compile("[\U0001F600-\U0001F64F\U0001F300-\U0001F5FF\U0001F680-\U0001F6FF\U0001F700-\U0001F77F]", flags=re.UNICODE)
# 중복 제거를 위한 세트 (set) 사용
emojis = set(emoji_pattern.findall(text))
# 텍스트에서 중복된 이모티콘을 제거하고, 하나의 이모티콘만 남김
for em in emojis:
text = re.sub(em + '+', em, text) # 중복된 이모티콘을 하나로 줄임
return text
# 전처리 함수 (이모티콘 중복 제거 후 텍스트로 변환)
def preprocess_text(text):
if isinstance(text, float):
return ""
# 이모티콘 중복 제거
text = remove_duplicate_emojis(text)
# 이모티콘을 텍스트로 변환
text = emoji.demojize(text, delimiters=(" ", " "))
# 소문자로 변환
text = text.lower()
# 숫자 및 구두점 제거
text = re.sub(r'\d+', '', text)
text = re.sub(r'[^\w\s]', '', text)
# 앞뒤 공백 제거
text = text.strip()
return text
df['reviewId'] = df['reviewId'].apply(preprocess_text)
df['userName'] = df['userName'].apply(preprocess_text)
df['content'] = df['content'].apply(preprocess_text)
# 감성 분석을 위한 함수
def get_sentiment(text):
return TextBlob(text).sentiment.polarity
df['sentiment'] = df['content'].apply(get_sentiment) # (DIY) apply를 사용하여 감성 분석을 해보세요. 필수 텍스트가 전처리되어있어야 합니다.
# df에 sentiment 값을 적용을 먼저 하시고, 아래와 같이 긍정과 부정을 분류하세요.
df['sentiment_label'] = df['sentiment'].apply(lambda x: 'positive' if x > 0.1 else ('negative' if x < -0.1 else 'neutral'))
df[['content', 'score', 'sentiment_label']]
from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt
# (선택) 불용어를 먼저 제거해주세요.
stopwords = set(STOPWORDS)
stopwords.update(['netflix', 'movie', 'show', 'time', 'app', 'series', 'phone']) # 리뷰에서 필요없는 단어는 여기 안에 추가하셔도 좋습니다.
# 부정적인 리뷰만 필터링
negative_reviews = df[df['sentiment_label'] == 'negative']['content'].tolist() # 부정적인 리뷰를 리스트로 변환
negative_reviews = ' '.join(negative_reviews) # 부정적인 리뷰 리스트를 하나의 문자열로 결합
# 부정적인 리뷰만 먼저 모아본 다음, 아래처럼 wordcloud를 그려보세요
wordcloud = WordCloud(width=800, height=400, background_color='white', stopwords=stopwords).generate(negative_reviews)
plt.figure(figsize=(12,6))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.title('Negative Reviews Word Cloud')
plt.show()
이런식으로 나온다!
신기하다.