추가 선택과제 (NLP, 워드 클라우드)

2star_·2024년 10월 25일
0

ML/DL

목록 보기
11/18

전체코드 링크
전체 코드 링크 타고가면 결과값도 함께 볼 수 있다.

NLP 이용해보기

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']]

wordcloud 이용해보기

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()

이런식으로 나온다!
신기하다.

profile
안녕하세요.

0개의 댓글