[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.09.20
📕 학습 목록
- 초등학교 4학년 수학 챗봇 개발
📗 프로젝트 작업 내역
1) 프로젝트 제목
초등학교 4학년 수학 챗봇 개발 및 성능 평가
2) 프로젝트 목표
- 초등학교 4학년 수학 교과 과정의 학습 내용을 기반으로, 학생들이 자기주도 학습을 할 수 있도록 돕는 챗봇을 개발
- 사용자가 질문을 입력하면 해당 질문에 대해 연관된 수학 강의를 추천(강의 썸네일, 요약, 키워드 제공)
3) 사용한 데이터 셋
- 데이터: 초등학교 4학년 강의 영상 (→ 음성 → 텍스트 → 요약 및 키워드 추출)
4) 워크플로우
① 패키지 임포트
- 사용한 주요 패키지: pandas, scikit-learn, Django, SQLite, NLTK 등의 NLP 패키지
import pandas as pd
import numpy as np
from sklearn.metrics import accuracy_score, classification_report
from django.shortcuts import render
import sqlite3
import nltk
② 데이터 로드 및 요약
# 데이터 로드
data = pd.read_csv('grade4_math_data.csv')
print(data.head())
print(data.info())
③ 데이터 전처리
- 데이터 증강 및 전처리
- 강의 내용에서 주요 질문 키워드를 추출하고 학생 질문을 전처리
- 자연어 처리를 통해 문장을 정규화하고 불용어를 제거
# 텍스트 정규화 및 불용어 제거
nltk.download('stopwords')
from nltk.corpus import stopwords
stop_words = set(stopwords.words('korean'))
def preprocess_text(text):
text = text.lower() # 소문자 변환
text = ' '.join([word for word in text.split() if word not in stop_words]) # 불용어 제거
return text
data['processed_question'] = data['question'].apply(preprocess_text)
④ 챗봇 응답 함수 설정
- 사용자 질문에 대해 답변을 생성하고 관련 강의를 찾아 응답 반환
- 비동기 함수를 활용하여 응답 시간을 단축
# Django views.py 챗봇 응답 함수
from django.http import JsonResponse
import time
import asyncio
from django.shortcuts import render
from .models import Lecture, Keyword
# 챗봇 응답 함수
async def chatbot_response(request):
question = request.GET.get("question")
start_time = time.time()
# 질문을 교정 및 키워드 추출
keywords = extract_keywords(question)
results = await search_lectures(keywords)
# 응답 시간 측정
end_time = time.time()
print(f"Response time: {end_time - start_time} seconds")
if not results:
return JsonResponse({"response": "해당 질문에 대한 답변을 준비 중입니다."})
return JsonResponse({"response": results})
# 키워드 추출 함수
def extract_keywords(question):
# 불용어 제거 후 키워드 추출
keywords = [word for word in question.split() if word not in STOP_WORDS]
return keywords
# 강의 검색 함수
@sync_to_async
def search_lectures(keywords):
keyword_objects = Keyword.objects.filter(keyword__in=keywords)
lectures = Lecture.objects.filter(keywords__in=keyword_objects).distinct()
return [lecture.title for lecture in lectures]
⑤ 성능 평가 및 분석
- chatbot_performance_test.py 파일을 사용하여 성능 테스트 수행
- 챗봇의 정확도, 정밀도, 재현율, F1 점수 및 평균 응답 시간을 평가하여 결과를 분석
async def evaluate_chatbot_performance(test_data, output_csv_path):
# 성능 지표 계산 및 결과 출력
accuracy = correct_predictions / total_questions if total_questions > 0 else 0
print(f"정밀도(Precision): {precision:.2f}")
print(f"재현율(Recall): {recall:.2f}")
print(f"F1 Score: {f1:.2f}")
print(f"정확도(Accuracy): {accuracy:.2f}")
print(f"평균 응답 시간: {average_response_time:.4f} 초")
5) 프로젝트 결과
- 구현 기능
- 학생의 질문에 실시간으로 응답하여 학습을 지원하는 챗봇
- Django ORM을 통해 DB에서 강의 데이터를 검색하고, 학습에 필요한 자료를 제공
- 챗봇 성능 테스트를 통해 정확도, 정밀도, 재현율, F1 점수 및 응답 시간을 분석
6) 트러블 슈팅
- 오류: AttributeError: 'NoneType' object has no attribute 'split'
- 상황: CSV 파일에서 데이터를 로드하여 데이터베이스에 삽입하는 과정에서 특정 열의 데이터가 누락
- 해결 방법: None 체크를 통해 데이터가 비어있는지 확인하고, 비어 있을 경우 기본 값을 할당하거나 해당 데이터를 건너뛰도록 처리
- 오류: OperationalError: no such table: Lecture
- 상황: 모델이 정의된 후 마이그레이션을 적용하지 않아서 테이블이 생성되지 않음
- 해결 방법: python manage.py makemigrations와 python manage.py migrate 명령어를 사용하여 모델에 맞는 테이블을 생성
7) 프로젝트를 통해 얻은 역량
- Django와 OpenAI API를 활용한 챗봇 개발 및 성능 최적화
- 데이터 전처리와 텍스트 요약을 통한 DB 생성 및 관리
- 챗봇 성능(정확도, 정밀도, 재현율, F1 점수 및 평균 응답 시간) 평가
📙 내일 일정
- 딥러닝 실습
'TIL _Today I Learned > 2024.09' 카테고리의 다른 글
[DAY 49] 자연어 처리(NLP) (0) | 2024.09.24 |
---|---|
[DAY 48] Deep Learning 실습 (0) | 2024.09.23 |
[DAY 46] Deep Learning 실습 (0) | 2024.09.19 |
[DAY 45] Deep Learning 실습 (0) | 2024.09.13 |
[DAY 44] Deep Learning 실습 (0) | 2024.09.12 |