| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- 인공지능
- 생명정보학
- 단백질 구조 예측
- 생물정보학
- 시그모이드
- 이항분포
- 알파폴드
- 결정트리
- 인공신경망
- Kaggle
- AP
- BLaST
- RNN
- bioinformatics
- COVID
- 서열정렬
- 딥러닝
- 캐글
- 로제타폴드
- 바이오파이썬
- ncbi
- 파이썬
- CNN
- 바이오인포매틱스
- 인공지능 수학
- Java
- SVM
- 오류역전파
- AP Computer Science A
- 자바
- Today
- Total
데이터 과학
네이버 영화 리뷰 본문
Hugging Face와 네이버 영화 리뷰를 활용한 AI 감성분석
1. 네이버 영화 리뷰를 AI가 판단할 수 있을까?
우리가 인터넷에서 영화나 상품을 검색하면 수많은 사용자 리뷰를 볼 수 있습니다. 사람은 리뷰를 읽고 비교적 쉽게 긍정적인 내용인지 부정적인 내용인지 판단할 수 있습니다.
예를 들어 다음 두 문장을 살펴보겠습니다.
정말 재미있는 영화였습니다. 배우들의 연기도 훌륭합니다.
사람은 이 문장을 긍정적인 리뷰라고 판단합니다.
반대로,
스토리도 지루하고 배우들의 연기도 별로였습니다.
라는 문장은 부정적인 리뷰라고 판단할 수 있습니다.
그렇다면 인공지능도 이러한 문장의 의미를 이해하고 긍정과 부정을 구분할 수 있을까요?
이번 실습에서는 Hugging Face에서 제공되는 Transformer 기반 자연어 처리 모델과 네이버 영화 리뷰 데이터인 NSMC를 이용하여 실제 감성분석을 수행합니다.
2. NSMC란?
NSMC는 Naver Sentiment Movie Corpus의 약자로 네이버 영화 리뷰를 이용하여 만들어진 한국어 감성분석 데이터셋입니다.
데이터에는 영화 리뷰 문장과 함께 해당 리뷰가 긍정적인지 부정적인지를 나타내는 Label이 포함되어 있습니다.
데이터 구조는 다음과 같습니다.
항목의미
| id | 리뷰 고유 번호 |
| document | 네이버 영화 리뷰 |
| label | 긍정 또는 부정 |
| label = 0 | 부정적인 리뷰 |
| label = 1 | 긍정적인 리뷰 |
예를 들어 다음과 같은 데이터가 존재합니다.
document label
정말 재미있게 봤습니다. 1
배우들의 연기가 정말 훌륭합니다. 1
시간이 아까울 정도로 재미없었습니다. 0
스토리가 너무 지루합니다. 0
NSMC는 학습용 데이터 약 15만 개와 테스트용 데이터 약 5만 개로 구성되어 있어 한국어 자연어 처리와 감성분석 실습에 많이 활용됩니다.
3. Hugging Face란?
Hugging Face는 인공지능 연구자와 개발자들이 다양한 AI 모델과 데이터셋을 공유하고 활용할 수 있도록 지원하는 AI 플랫폼입니다.
특히 Transformer 라이브러리를 이용하면 BERT, RoBERTa, ELECTRA 등 다양한 자연어 처리 모델을 비교적 간단한 Python 코드로 사용할 수 있습니다.
이번 실습에서는 다음 모델을 사용합니다.
nlptown/bert-base-multilingual-uncased-sentiment
이 모델은 여러 언어의 문장을 분석하여 감성을 1점부터 5점까지의 별점 형태로 예측합니다.
예를 들어,
정말 재미있는 영화였습니다.
라는 문장을 입력했을 때 모델이 다음과 같은 결과를 출력할 수 있습니다.
5 stars
반대로,
정말 재미없는 영화였습니다.
라는 문장은
1 star
와 같이 판단할 수 있습니다.
4. Google Colab에서 실습 환경 만들기
이번 실습은 별도의 프로그램을 설치하지 않고 Google Colab에서 실행할 수 있습니다.
먼저 필요한 라이브러리를 설치합니다.
!pip install transformers torch pandas scikit-learn matplotlib -q
이번 실습에서 사용하는 주요 라이브러리는 다음과 같습니다.
라이브러리역할
| transformers | Hugging Face AI 모델 사용 |
| torch | 딥러닝 모델 실행 |
| pandas | 데이터 처리 |
| scikit-learn | AI 모델 성능 평가 |
| matplotlib | 그래프 작성 |
5. 네이버 영화 리뷰 데이터 불러오기
NSMC의 테스트 데이터를 불러옵니다.
import pandas as pd
url = "https://raw.githubusercontent.com/e9t/nsmc/master/ratings_test.txt"
df = pd.read_csv(
url,
sep="\t"
)
print(df.shape)
df.head()
데이터를 확인하면 다음과 같은 세 개의 항목이 나타납니다.
id
document
label
여기서 document가 실제 영화 리뷰이며 label이 사람이 판단한 실제 감성입니다.
6. 데이터 전처리
실제 데이터에는 내용이 없는 데이터가 포함되어 있을 수 있으므로 제거합니다.
df = df.dropna(subset=["document"])
print("전체 리뷰 개수 :", len(df))
NSMC 테스트 데이터 전체를 분석하면 시간이 오래 걸릴 수 있습니다.
수업에서는 먼저 1,000개의 리뷰를 무작위로 선택하여 분석해 보겠습니다.
sample_df = df.sample(
n=1000,
random_state=42
).reset_index(drop=True)
sample_df.head()
random_state=42를 지정하면 프로그램을 다시 실행해도 동일한 리뷰가 선택되므로 학생들의 실험 결과를 비교하기 쉽습니다.
7. Hugging Face AI 모델 불러오기
Hugging Face의 pipeline() 기능을 이용하면 복잡한 모델 구조를 직접 구현하지 않고도 감성분석 모델을 사용할 수 있습니다.
from transformers import pipeline
import torch
device = 0 if torch.cuda.is_available() else -1
classifier = pipeline(
"sentiment-analysis",
model="nlptown/bert-base-multilingual-uncased-sentiment",
device=device
)
print("GPU 사용 여부 :", torch.cuda.is_available())
Google Colab에서 GPU를 사용하면 많은 리뷰를 훨씬 빠르게 분석할 수 있습니다.
8. 문장 하나를 AI에게 분석시키기
먼저 하나의 문장을 입력해 보겠습니다.
text = "정말 재미있는 영화였습니다. 배우들의 연기도 훌륭합니다."
result = classifier(text)
print(result)
결과는 다음과 비슷한 형태로 나타납니다.
[{'label': '5 stars', 'score': 0.78}]
여기서 label은 AI가 예측한 별점이며 score는 모델이 해당 결과를 얼마나 강하게 선택했는지를 나타냅니다.
주의할 점은 score가 0.90이라고 해서 실제 정답일 확률이 반드시 90%라는 의미는 아니라는 것입니다.
9. 별점을 긍정과 부정으로 변환하기
NSMC의 실제 정답은 0과 1의 두 가지 값으로 되어 있습니다.
하지만 현재 사용하는 Hugging Face 모델은 1점부터 5점까지를 출력합니다.
따라서 두 결과를 비교하기 위해 다음과 같이 변환합니다.
1점 → 부정
2점 → 부정
3점 → 부정
4점 → 긍정
5점 → 긍정
Python 함수로 작성하면 다음과 같습니다.
def convert_sentiment(label):
rating = int(label.split()[0])
if rating >= 4:
return 1
else:
return 0
3점은 중립적인 의미가 강하기 때문에 긍정과 부정 중 어느 쪽에 포함할 것인지에 따라 최종 정확도가 달라질 수 있습니다. 이것 역시 좋은 실험 주제가 될 수 있습니다.
10. 네이버 영화 리뷰 1,000개 분석하기
이제 실제 네이버 영화 리뷰 1,000개를 AI에게 입력합니다.
reviews = sample_df["document"].tolist()
results = classifier(
reviews,
batch_size=32,
truncation=True
)
predictions = []
stars = []
confidence = []
for result in results:
rating = int(
result["label"].split()[0]
)
stars.append(rating)
predictions.append(
convert_sentiment(result["label"])
)
confidence.append(
result["score"]
)
분석 결과를 기존 데이터에 추가합니다.
sample_df["AI_star"] = stars
sample_df["AI_prediction"] = predictions
sample_df["confidence"] = confidence
sample_df.head(20)
이제 하나의 데이터 안에서 실제 평가와 AI의 판단을 동시에 확인할 수 있습니다.
네이버 영화 리뷰
↓
실제 Label
↓
Hugging Face 분석
↓
AI 별점
↓
AI 긍정·부정 판단
11. 실제 정답과 AI 예측 비교하기
AI가 정확하게 판단했는지 확인합니다.
sample_df["correct"] = (
sample_df["label"]
==
sample_df["AI_prediction"]
)
sample_df[
[
"document",
"label",
"AI_star",
"AI_prediction",
"confidence",
"correct"
]
].head(20)
correct=True이면 AI의 판단과 실제 NSMC의 정답이 같다는 의미입니다.
12. AI의 정확도 계산하기
머신러닝 모델을 평가하는 가장 기본적인 방법 중 하나가 Accuracy, 즉 정확도입니다.
정확도는 다음과 같은 의미입니다.
전체 데이터 가운데 AI가 정답을 맞힌 데이터의 비율
Python에서는 다음과 같이 계산할 수 있습니다.
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(
sample_df["label"],
sample_df["AI_prediction"]
)
print(
"Hugging Face 모델 정확도 :",
round(accuracy * 100, 2),
"%"
)
예를 들어 1,000개의 리뷰 가운데 780개를 정확하게 판단했다면 정확도는 78%가 됩니다.
실제 정확도는 선택된 데이터와 모델, 별점 변환 기준에 따라 달라집니다.
13. 긍정과 부정 리뷰의 정확도 비교
AI가 긍정과 부정을 똑같이 잘 판단하는지도 확인할 수 있습니다.
positive_df = sample_df[
sample_df["label"] == 1
]
negative_df = sample_df[
sample_df["label"] == 0
]
positive_accuracy = accuracy_score(
positive_df["label"],
positive_df["AI_prediction"]
)
negative_accuracy = accuracy_score(
negative_df["label"],
negative_df["AI_prediction"]
)
print(
"긍정 리뷰 정확도 :",
round(positive_accuracy * 100, 2),
"%"
)
print(
"부정 리뷰 정확도 :",
round(negative_accuracy * 100, 2),
"%"
)
이 실험을 통해 AI가 긍정적인 표현과 부정적인 표현 가운데 어느 쪽을 더 잘 판단하는지 분석할 수 있습니다.
14. 혼동행렬 Confusion Matrix
정확도만으로는 AI가 어떤 종류의 오류를 발생시키는지 자세히 알기 어렵습니다.
이때 사용하는 것이 혼동행렬 Confusion Matrix입니다.
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(
sample_df["label"],
sample_df["AI_prediction"]
)
print(cm)
혼동행렬에는 다음 네 가지 결과가 나타납니다.
구분의미
| TN | 실제 부정을 AI도 부정으로 판단 |
| FP | 실제 부정을 AI가 긍정으로 판단 |
| FN | 실제 긍정을 AI가 부정으로 판단 |
| TP | 실제 긍정을 AI도 긍정으로 판단 |
그래프로 표현하면 더욱 쉽게 확인할 수 있습니다.
import matplotlib.pyplot as plt
plt.figure(figsize=(6, 5))
plt.imshow(cm)
plt.title("NSMC Sentiment Confusion Matrix")
plt.xlabel("Predicted")
plt.ylabel("Actual")
plt.xticks(
[0, 1],
["Negative", "Positive"]
)
plt.yticks(
[0, 1],
["Negative", "Positive"]
)
for i in range(2):
for j in range(2):
plt.text(
j,
i,
cm[i, j],
ha="center",
va="center"
)
plt.colorbar()
plt.show()
15. Precision, Recall, F1-score 알아보기
AI 모델을 평가할 때는 정확도 이외에도 여러 가지 평가 지표를 사용합니다.
from sklearn.metrics import classification_report
print(
classification_report(
sample_df["label"],
sample_df["AI_prediction"],
target_names=[
"Negative",
"Positive"
]
)
)
주요 평가 지표는 다음과 같습니다.
Accuracy
전체 데이터 중 AI가 정확하게 맞힌 비율입니다.
Precision
AI가 특정 감성이라고 판단한 데이터 가운데 실제로 그 감성이 맞는 비율입니다.
Recall
실제로 특정 감성에 해당하는 데이터 가운데 AI가 제대로 찾아낸 비율입니다.
F1-score
Precision과 Recall을 함께 고려한 평가 지표입니다.
따라서 AI 모델을 평가할 때 단순히 정확도 하나만 확인하는 것보다 여러 평가 지표를 함께 분석하는 것이 중요합니다.
16. AI가 틀린 리뷰 찾아보기
AI 모델을 이해하는 가장 좋은 방법 중 하나는 AI가 틀린 데이터를 분석하는 것입니다.
wrong_df = sample_df[
sample_df["correct"] == False
]
wrong_df[
[
"document",
"label",
"AI_star",
"AI_prediction",
"confidence"
]
].head(30)
예를 들어 다음과 같은 문장을 생각해 볼 수 있습니다.
진짜 대단한 영화다. 이렇게 재미없기도 힘들겠다.
사람은 전체적인 문맥을 보고 부정적인 리뷰라는 것을 알 수 있습니다.
하지만 AI는 대단한, 재미 등의 표현에 영향을 받아 잘못 판단할 가능성이 있습니다.
또 다른 예는 다음과 같습니다.
배우 연기는 좋은데 스토리는 최악이다.
하나의 문장 안에 긍정적인 내용과 부정적인 내용이 동시에 존재합니다.
이러한 표현은 감성분석 모델이 처리하기 어려운 경우가 있습니다.
17. AI가 가장 확신한 문장 찾기
AI가 높은 점수로 판단한 리뷰를 찾아봅니다.
high_confidence = sample_df.sort_values(
"confidence",
ascending=False
)
high_confidence[
[
"document",
"label",
"AI_star",
"AI_prediction",
"confidence"
]
].head(20)
반대로 모델의 점수가 낮은 문장도 확인할 수 있습니다.
low_confidence = sample_df.sort_values(
"confidence",
ascending=True
)
low_confidence[
[
"document",
"label",
"AI_star",
"AI_prediction",
"confidence"
]
].head(20)
두 결과를 비교하면 AI가 어떤 표현을 쉽게 판단하고 어떤 표현을 어려워하는지 분석할 수 있습니다.
18. AI가 예측한 별점 분포 확인하기
이번에 사용한 모델은 감성을 1점부터 5점까지 예측합니다.
각 별점이 몇 번 나타났는지 확인해 보겠습니다.
star_count = (
sample_df["AI_star"]
.value_counts()
.sort_index()
)
print(star_count)
그래프로 표현할 수도 있습니다.
plt.figure(figsize=(8, 5))
plt.bar(
star_count.index,
star_count.values
)
plt.xlabel("AI Predicted Star Rating")
plt.ylabel("Number of Reviews")
plt.title(
"Hugging Face Predicted Rating Distribution"
)
plt.xticks([1, 2, 3, 4, 5])
plt.show()
이를 통해 AI가 1점부터 5점 가운데 어떤 평가를 많이 내리는지도 확인할 수 있습니다.
19. 전체 AI 감성분석 과정
이번 실습의 전체 과정을 정리하면 다음과 같습니다.
네이버 영화 리뷰 NSMC
↓
텍스트 입력
↓
Hugging Face Transformer
↓
BERT 기반 모델
↓
감성분석 수행
↓
1~5점 예측
↓
긍정·부정 변환
↓
NSMC 실제 Label과 비교
↓
┌─────────────────────┐
│ Accuracy │
│ Precision │
│ Recall │
│ F1-score │
│ Confusion Matrix │
└─────────────────────┘
↓
오분류 분석
이 과정은 실제 머신러닝 프로젝트에서 사용하는 데이터 준비 → 모델 적용 → 예측 → 평가 → 오류 분석이라는 기본적인 흐름과 연결됩니다.
20. 왜 AI는 모든 리뷰를 정확하게 판단하지 못할까?
사람의 언어는 단순히 긍정적인 단어와 부정적인 단어의 조합으로만 이루어져 있지 않습니다.
다음과 같은 표현들은 AI가 판단하기 어려울 수 있습니다.
반어적 표현
와, 정말 대단한 영화다.
두 시간을 이렇게 낭비하게 만들다니.
긍정과 부정이 섞인 표현
배우들의 연기는 훌륭하지만
스토리는 너무 지루했다.
매우 짧은 표현
별로
신조어나 인터넷 표현
개꿀잼
노잼
핵노잼
존잼
문맥이 필요한 표현
두 번 볼 영화는 아니다.
이러한 데이터를 직접 찾아보는 것은 단순히 정확도를 계산하는 것보다 AI의 한계를 이해하는 데 더욱 중요한 활동입니다.
21. 이 실습에서 주의해야 할 점
이번 실습에서 사용한
nlptown/bert-base-multilingual-uncased-sentiment
모델은 NSMC 데이터에 특화하여 학습된 네이버 영화 리뷰 전용 모델이 아닙니다.
여러 언어를 처리할 수 있도록 만들어진 다국어 감성분석 모델입니다.
따라서 이 모델을 실제 네이버 영화 리뷰에 적용하면 잘못된 판단이 나타나는 것은 자연스러운 결과입니다.
오히려 이러한 특성을 이용하면 학생들이 중요한 질문을 생각해 볼 수 있습니다.
AI 모델은 어떤 데이터로 학습했는가?
같은 문장을 서로 다른 AI 모델에 입력하면 결과가 같을까?
한국어 데이터로 학습한 모델은 더 정확할까?
데이터의 특성과 AI 모델의 성능은 어떤 관계가 있을까?
22. 확장 실습
이번 실습을 완료한 후에는 여러 가지 추가 실험을 진행할 수 있습니다.
첫 번째는 데이터 개수에 따른 분석입니다.
100개
500개
1,000개
5,000개
로 리뷰 개수를 증가시키면서 정확도가 어떻게 달라지는지 확인할 수 있습니다.
두 번째는 별점 변환 기준을 변경하는 실험입니다.
현재는
1~3점 → 부정
4~5점 → 긍정
으로 설정했습니다.
이를
1~2점 → 부정
3점 → 제외
4~5점 → 긍정
으로 변경하여 정확도를 다시 측정할 수 있습니다.
세 번째는 서로 다른 Hugging Face 모델을 비교하는 실험입니다.
다국어 감성분석 모델
VS
한국어 특화 감성분석 모델
동일한 NSMC 데이터 1,000개를 두 모델에 입력한 후 Accuracy, Precision, Recall, F1-score를 비교하면 모델에 따라 결과가 어떻게 달라지는지 확인할 수 있습니다.
23. 실습을 통해 이해할 수 있는 AI 개념
이번 실습은 단순히 네이버 영화 리뷰의 긍정과 부정을 판단하는 프로그램을 만드는 활동이 아닙니다.
학생들은 실제 데이터를 이용하면서 다음과 같은 인공지능의 핵심 개념을 이해할 수 있습니다.
자연어 처리 NLP
컴퓨터가 사람이 사용하는 언어를 분석하고 처리하는 기술입니다.
Transformer
문장 안에 존재하는 단어들의 관계와 문맥을 효과적으로 학습하기 위해 만들어진 딥러닝 구조입니다.
BERT
Transformer의 Encoder 구조를 활용하여 문맥을 이해하도록 만들어진 대표적인 자연어 처리 모델입니다.
감성분석 Sentiment Analysis
텍스트에 나타나는 의견이나 감정을 긍정, 부정 또는 여러 단계의 감성으로 분류하는 기술입니다.
모델 평가
AI의 결과가 실제 정답과 얼마나 일치하는지 Accuracy, Precision, Recall, F1-score 등의 지표를 이용하여 분석하는 과정입니다.
마무리
Hugging Face를 활용하면 이미 학습된 다양한 인공지능 모델을 비교적 간단하게 사용할 수 있습니다.
이번 실습에서는 실제 네이버 영화 리뷰 데이터인 NSMC와 Transformer 기반 감성분석 모델을 결합하여 실제 한국어 문장을 AI가 어떻게 판단하는지 직접 확인하였습니다.
그러나 더 중요한 것은 AI가 정답을 맞혔는지만 확인하는 것이 아닙니다.
AI가 왜 특정 문장을 정확하게 판단했는지, 왜 어떤 문장은 틀렸는지, 학습 데이터와 모델이 달라지면 결과가 어떻게 변화하는지를 분석하는 과정이 인공지능을 이해하는 데 중요합니다.
따라서 이 실습은 Hugging Face 모델을 단순히 사용하는 단계에서 출발하여 자연어 처리, Transformer, BERT, 감성분석, 모델 성능평가와 AI의 한계를 이해하는 과정으로 확장할 수 있습니다.
'인공지능 > 자연어 처리' 카테고리의 다른 글
| Hugging Face예제와 메뉴를 알아보기 (3) | 2026.08.24 |
|---|---|
| AI 개발용 Linux 시스템 구축 (3) | 2026.07.05 |
| KoBERT로 영화 감상 리뷰 분석하기 (0) | 2026.06.15 |
| 트랜스포머 정리 (1) | 2025.11.10 |
| BERT 개요 (0) | 2025.11.10 |
