- 감성 분석의 기초 개념과 응용 방법을 이해한다. - IMDB 영화 리뷰 데이터를 활용하여 텍스트 데이터를 처리하고 긍정/부정 감성 분석을 수행한다. - WordCloud를 이용하여 긍정과 부정 단어를 시각화한다.
문장의 감정을 읽어내는 마법, 텍스트마이닝과 함께라면 가능합니다!
1. 감성 분석(Sentiment Analysis)의 개요
인터넷에 남겨진 수많은 리뷰와 댓글 속에는 사람들이 느끼는 감정이 숨겨져 있습니다. 그 감정을 읽어내어 트렌드를 파악하거나 고객의 의견을 분석할 수 있다면 어떨까요?
수많은 리뷰와 댓글에는 사람들이 느끼는 감정과 의견이 숨겨져 있습니다. 이러한 데이터를 분석하면 단순히 긍정적이거나 부정적인 감정을 넘어 소비자 트렌드, 시장 변화, 제품 개선 방향 등 유의미한 인사이트(insight)를 얻을 수 있습니다. 감성 분석은 이러한 텍스트 데이터를 구조화하여 기업의 의사결정을 지원하고, 새로운 비즈니스 기회를 발견하는 강력한 도구로 자리 잡고 있습니다.
감성 분석(Sentiment Analysis)은 텍스트와 같은 비정형 데이터로부터 감정이나 의견을 추출하는 자연어 처리 기술입니다. 소셜 미디어 데이터, 제품 리뷰, 고객 의견 등 다양한 텍스트 데이터를 통해 소비자 심리를 파악하고, 데이터를 기반으로 한 전략적 판단을 가능하게 합니다. 텍스트마이닝과 결합된 감성 분석은 방대한 텍스트 속에 숨겨진 감정의 흐름을 읽어내고, 이를 통해 트렌드를 예측하며 미래를 설계할 수 있는 핵심적인 분석 도구입니다.
이번 강의에서는 초보자도 감성 분석의 기초부터 Python을 활용한 실습까지 체계적으로 학습하며, 데이터를 분석하고 유의미한 인사이트(insight)를 도출하는 과정을 함께 경험할 예정입니다. 이 여정을 통해 텍스트 데이터를 다루는 방법과 감성 분석의 실질적인 응용을 이해하게 될 것입니다.
1.1 감성 분석(Sentiment Analysis)의 개념과 현황
1) 감성 분석(Sentiment Analysis)의 정의
감성 분석은 텍스트 데이터를 바탕으로 특정 문장이 긍정적인지, 부정적인지, 또는 중립적인지를 판별하는 과정입니다. 이는 자연어 처리(NLP)의 주요 응용 분야 중 하나로, 데이터로부터 사람들의 의견이나 감정을 파악하는 데 사용됩니다.
텍스트에서 감정(긍정, 부정, 중립)을 추출하는 과정이다.
2) 감성 분석의 필요성
기업에서 고객 피드백을 분석하여 제품 및 서비스 개선.
소셜 미디어 데이터를 기반으로 한 트렌드 예측.
영화, 제품, 정치적 견해 등 다양한 주제에 대한 대중의 반응 이해.
3) 현재 기술과 동향
머신러닝 기반 모델: Naive Bayes, SVM, Random Forest 등.
딥러닝 기반 모델: RNN, LSTM, BERT와 같은 최신 모델이 감성 분석 정확도를 크게 향상시킴.
실시간 감성 분석 기술: 소셜 미디어와 같은 실시간 데이터를 분석하는 시스템 개발.
1.2 감성 분석에 사용되는 주요 Python 기술
데이터 전처리
텍스트 정규화: 모든 텍스트를 소문자로 변환하거나 숫자와 기호를 제거하여 일관성을 유지.
토큰화(Tokenization): 텍스트를 단어 또는 문장 단위로 나누는 작업.
불용어 제거(Stopwords Removal): 분석에 불필요한 단어 제거.
텍스트 표현
Bag of Words(BoW): 텍스트를 단어 빈도 기반의 벡터로 표현.
TF-IDF(Term Frequency-Inverse Document Frequency): 문서 내 특정 단어의 중요도를 계산하는 방법.
워드 임베딩(Word Embedding): 단어를 밀집 벡터 형태로 표현하여 문맥 정보를 유지 (예: Word2Vec, GloVe).
분류 모델
머신러닝 모델: Scikit-learn 라이브러리를 사용하여 Naive Bayes, Logistic Regression 모델 구현.
딥러닝 모델: TensorFlow와 PyTorch를 이용하여 LSTM, BERT 기반 감성 분석 모델 구현.
시각화 도구
WordCloud: 텍스트 데이터를 시각적으로 표현하여 자주 사용되는 단어 확인.
Matplotlib, Seaborn: 분석 결과를 그래프로 시각화.
2. 감성 분석 예제 : IMDB 영화 리뷰 데이터를 활용한 감성 분석
2.1 데이터 로드 및 탐색
감성 분석을 수행할 텍스트 데이터를 수집한다. 여기서는 IMDB 영화 리뷰 데이터를 사용한다.
Python을 사용하여 IMDB 데이터셋 로드.
데이터의 샘플 확인 및 분포 분석.
IMDB 영화 리뷰 데이터
데이터 개요: 긍정 및 부정 영화 리뷰로 구성된 공개 데이터셋이다.
데이터 형태: 리뷰 텍스트와 라벨(긍정: 1, 부정: 0)로 구성.
사전 처리 필요성: 텍스트 정규화, 불용어 제거, 토큰화 등.
import pandas as pd
# 데이터 로드
url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"
reviews = pd.read_csv("imdb_reviews.csv") # CSV 파일로 가정
print(reviews.head())
2.2 데이터 전처리
텍스트 데이터를 분석하기 전에 정제 작업을 수행하여 모델 학습에 적합한 형태로 만든다.
텍스트 정규화: 소문자 변환, 불용어 제거.
토큰화 및 단어 빈도 분석.
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
# 텍스트 전처리 함수
def preprocess_text(text):
text = text.lower() # 소문자 변환
tokens = word_tokenize(text) # 토큰화
tokens = [word for word in tokens if word.isalnum()] # 특수문자 제거
tokens = [word for word in tokens if word not in stopwords.words("english")] # 불용어 제거
return " ".join(tokens)
# 데이터에 전처리 적용
reviews["cleaned_text"] = reviews["review"].apply(preprocess_text)
print(reviews["cleaned_text"].head())
2.3 텍스트 표현
텍스트 데이터를 수치 데이터로 변환하여 모델이 처리할 수 있도록 만든다.
Bag of Words (BoW)
TF-IDF
from sklearn.feature_extraction.text import TfidfVectorizer
# TF-IDF 변환
vectorizer = TfidfVectorizer(max_features=5000)
X = vectorizer.fit_transform(reviews["cleaned_text"])
y = reviews["label"] # 긍정(1) 또는 부정(0) 레이블
2.4 감성 분석 모델 학습
변환된 데이터를 사용하여 머신러닝 모델을 학습한다.
주요 모델: Naive Bayes, Logistic Regression 등.
머신러닝 기법 (예: Naive Bayes)으로 긍정/부정 분류 모델 학습.
학습 및 테스트 데이터 분리 (예: 80:20 비율)
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
# 학습/테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 모델 학습
model = MultinomialNB()
model.fit(X_train, y_train)
# 테스트 데이터 예측
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
데이터 구조:ratings_train.txt, ratings_test.txt 파일로 제공되며,
각 파일은 다음과 같은 형식:
id\tdocument\tlabel
9976970\t아 더빙.. 진짜 짜증나네요 목소리\t0
3.2. 감성 분석
Step 1: 데이터 로드
import pandas as pd
# 데이터셋 다운로드 경로
train_url = "https://raw.githubusercontent.com/e9t/nsmc/master/ratings_train.txt"
test_url = "https://raw.githubusercontent.com/e9t/nsmc/master/ratings_test.txt"
# 데이터 로드
train_data = pd.read_csv(train_url, sep="\t")
test_data = pd.read_csv(test_url, sep="\t")
# 데이터 확인
print(train_data.head())
print(test_data.head())
# 불필요한 결측치 제거
train_data = train_data.dropna()
test_data = test_data.dropna()
Step 2: 데이터 전처리
import re
from konlpy.tag import Okt
okt = Okt()
# 텍스트 전처리 함수
def preprocess_text(text):
text = re.sub(r"[^ㄱ-ㅎㅏ-ㅣ가-힣 ]", "", text) # 한글 및 공백 제외 제거
tokens = okt.morphs(text, stem=True) # 형태소 분석 및 어간 추출
return " ".join(tokens)
# 전처리 적용
train_data["cleaned_document"] = train_data["document"].apply(preprocess_text)
test_data["cleaned_document"] = test_data["document"].apply(preprocess_text)
# 전처리 결과 확인
print(train_data[["document", "cleaned_document"]].head())
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
# 로지스틱 회귀 모델 학습
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
# 예측 및 성능 평가
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
print("\nClassification Report:\n", classification_report(y_test, y_pred))