본문 바로가기
TIL _Today I Learned/2024.09

[DAY 45] Deep Learning 실습

by gamdong2 2024. 9. 13.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.09.13

📕 학습 목록

  • 초등학교 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 47] Deep Learning 실습  (0) 2024.09.20
[DAY 46] Deep Learning 실습  (0) 2024.09.19
[DAY 44] Deep Learning 실습  (0) 2024.09.12
[DAY 43] 자연어 처리(NLP) 모델  (0) 2024.09.11
[DAY 42] Deep Learning  (1) 2024.09.10