감정 분석이란?
: 텍스트에서 작성자의 감정 상태나 태도를 파악하고 분류하는 과정
: 텍스트 마이닝과 자연어 처리(NLP) 분야에 속함
<기본적인 감정 범주>
- 긍정적(Positive)
- 부정적(Negative)
- 중립적(Neutral)
감정 분석의 응용
: 감정 분석은 다양한 분야에서 광범위하게 적용
- 소셜 미디어 감성 모니터링 : 대중의 반응 모니터링
- 고객 서비스 분석 및 소비자 인사이트
- 헬스 케어 및 의료 : 환자의 감정 상태 분석
감정 분석 사례
- 호텔 리뷰 감정 분석 사례
- 콜센터 사례 : 실시간 고객 감정 파악
- 의류 소매 업체 감정 분석 사례 : 틱톡의 콘텐츠 데이터 분석 -> 고객의 특성과 선호도 파악
감정 분석 모델 알고리즘
텍스트 데이터 전처리
: 텍스트 데이터는 분석에 사용할 수 있는 형태로 전처리 필요
Tokenize
: 원문 글을 분석에 사용할 기본 개념 단위로 분리하는 과정. 이 단위가 글을 분석하는 과정의 가장 작은 의미 단위가 됨
* Token이란, 분석의 기본 단위가 되는 개체. 문제에 따라 사용자가 정의!
=> 원래 글을 Token으로 나누는 과정을 Tokenize라고 함
Stop Words 제거
: 개념 단위로 나뉜 개체에서 의미가 없는 개체(Token)를 제거하는 과정
데이터의 복잡도를 줄이고 분석 정확도를 올리는 역할을 함
ex. 그리고, 아, 내가, The, a, and 등..
=> 굉장히 많이 쓰이지만 의미가 없음
==> stop words는 미리 사전에 정의해두고 해당 단어가 나오면 제거함
Stemming
단어 기반의 Token을 사용하는 경우, 특정 단어를 그것의 기본 형태(어간)으로 축소하는 과정
나뉜 개체에서 접두사나 접미사를 제거해 기본 의미를 갖도록 함
(접두사나 접미사를 제거하여 단어의 기본 줄기(stem)를 찾는 과정)
ex. Running -> Run / Runner -> Run
잘못된 결과 반환 가능 (ex. University / Universe)
[참고] Lemmatization
: 단어를 그 의미론적 기본 형태(Lemma)로 변환하는 과정
-> Stemming에 비해 복잡하고 시간이 오래걸리지만 정확도 좋음
ex. are, is, am -> be
딥러닝을 기반으로 하는 전처리
=> 전통적인 방식에서 중요하게 생각했던 처리 과정을 일부 변형하여 사용
Tokenize
: 단어를 더 상세하게 쪼개는 Subword 방식의 Tokenize 사용
=> 딥러닝 모델이 사용하는 Tokenize가 다름
ex. subword -> sub, word
Stop Words
: 딥러닝 모델은 종종 문맥 속에서 단어의 중요성을 자동으로 파악
=> 잘 사용 X. 제거할 필요가 적음 (내부적으로 처리)
Stemming & Lemmatization
: 단어를 표준화하는 과정을 딥러닝 모델이 스스로 처리 (잘 사용 X)
감정 분석 실습
Yelp 데이터셋
: 로컬 음식점에 대한 리뷰 공유 플랫폼
-> 1000개의 리뷰를 모아 학습용 데이터로 구축한 Kaggle 데이터 활용
: 음식점과 음식에 대한 텍스트 리뷰 & 만족도
https://www.kaggle.com/datasets/marklvl/sentiment-labelled-sentences-data-set
==>
문제: 사용자의 텍스트 리뷰를 바탕으로 그들의 감정 상태 예측
입력: 텍스트 리뷰 문장
출력: 감정 상태 (1 - 만족 / 0 - 불만족)
전처리
: 단어 기반 Tokenize, Stop Words 제거 등
# 최종 함수로 표현
import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')
stop_words = set(stopwords.words('english'))
def preprocessing(text) :
text = text.lower()
text = re.sub(r'\W', ' ', text)
text = text.split()
text = [t for t in text if t not in stop_words]
return text
모델 적용 및 학습
- GloVe를 통해 단어 임베딩
- 문장에 존재하는 임베딩 값들을 기반으로 문장의 임베딩 생성 (TF-IDF 가중치를 추가한 단어들의 임베딩 값을 평균)
: 각 단어마다 중요도를 나타내는 수치값(TF-IDF)을 적용한 임베딩
* TF-IDF는 문서 안에서 특정 단어의 중요도를 평가하는 통계적인 방법
: TF 파트와 IDF 파트의 곱으로 계산
- TF(Term Frequency) : 단어의 빈도, 특정 단어가 문서 내에 얼마나 자주 등장하는지
- IDF(Inverse Document Frequency) : 역 문서 빈도, 특정 단어가 얼마나 여러 문서에서 등장하는지 (모든 문서에서 자주 등장한 단어는 중요도가 낮고, 특정 문서에서만 자주 등장하면 중요도가 높음)
import numpy as np
def sentence_embedding(tfidf_matrix, tfidf_feature_names, doc, doc_idx):
embeddings = []
for word in doc:
# GloVe에서 학습한 데이터와 tf-idf에서 학습한 데이터만 취급
# 그렇지 않은 데이터는 무시됨
if word in glove and word in tfidf_feature_names:
# 여기서는 transform을 쓰지 않고 이미 학습한 matrix에서 indexing으로 가져옴
# 속도 효율성이 높음
# 만약 처음 보는 문장에 대해서 TF-IDF를 한다면 transform이 필수!
word_idx = np.where(tfidf_feature_names==word)[0][0]
tfidf_weight = tfidf_matrix.toarray()[doc_idx, word_idx]
embeddings.append(glove[word] * tfidf_weight)
return np.mean(embeddings, axis=0) if embeddings else np.zeros(100) # GloVe 차원에 맞춰 조정
- 이진분류(긍정/부정) 문제로 Logistic Regression 적용
결과 확인
# 예제 문장 전처리
preprocessed_examples = [preprocessing(text) for text in examples]
# 원래 문장의 분포와 비슷한 문장들을 활용해 TF-IDF 메트릭스를 다시 생성하고
examples_vectorizer = TfidfVectorizer()
examples_tfidf_matrix = examples_vectorizer.fit_transform([' '.join(doc) for doc in preprocessed_examples])
examples_tfidf_feature_names = examples_vectorizer.get_feature_names_out()
# TF-IDF 값과 GloVe 임베딩을 결합하여 문장 임베딩 생성
example_sentence_embs = []
for doc_idx, doc in enumerate(preprocessed_examples):
example_sentence_embs.append(sentence_embedding(examples_tfidf_matrix,
examples_tfidf_feature_names,
doc, doc_idx))
# 모델을 이용해 감정 분석 수행
example_sentence_embs = np.array(example_sentence_embs)
predictions = model.predict(example_sentence_embs)
# 결과 출력
for idx, (text, pred) in enumerate(zip(examples, predictions)):
origin_sent = '긍정적' if idx % 2 == 0 else '부정적'
pred_sent = '긍정적' if pred == 1 else '부정적'
print(f"문장: {text} \n원래 감정 : {origin_sent} / 예측 : {pred_sent}", end='\n\n')
'STUDY > DevCourse' 카테고리의 다른 글
[데브코스][데이터 분석] 자연어 처리 & 문장 분류 (0) | 2024.05.15 |
---|---|
[데브코스][데이터 분석] 토픽 모델링과 워드 클라우드 (1) | 2024.05.15 |
[데브코스][데이터 분석] 단어 임베딩과 문장 임베딩 (0) | 2024.05.14 |
[데브코스][데이터 분석] 텍스트 마이닝 개요 (0) | 2024.05.13 |
[데브코스][데이터 분석] SageMaker 소개 및 실습 (0) | 2024.05.03 |