Skip to content

AI (Flask Server, Dataset)

SeungWon Lee edited this page May 14, 2024 · 7 revisions

github Flask repository url: https://github.com/Garam-e/Flask

프로젝트 Wiki 페이지

프로젝트 개요

이 프로젝트는 Flask 웹 애플리케이션으로, 다양한 웹사이트에서 데이터를 크롤링하고, 크롤링한 데이터를 기반으로 질문에 대한 답변을 제공하는 시스템입니다. 주요 기능은 다음과 같습니다:

  • 웹사이트 공지사항 크롤링
  • 학사 일정 크롤링
  • 도서관 좌석 정보 크롤링
  • 학식 메뉴 크롤링
  • 질문에 대한 최적의 답변 제공

Installation 환경

요구 사항

  • Python 3.7 이상
  • pip (Python 패키지 관리자)

설치 방법

  1. 프로젝트를 클론합니다:

    git clone https://github.com/your-repo/your-project.git
    cd your-project
  2. 필요한 라이브러리를 설치합니다:

    pip install -r requirements.txt
  3. dataset 폴더를 생성하고 필요한 JSON 파일을 저장할 수 있는 경로를 확인합니다.

  4. Flask 애플리케이션을 실행합니다:

    python app.py

Library

주요 라이브러리

  • Flask: 웹 애플리케이션 프레임워크로 사용됩니다.
  • apscheduler: 정기적으로 작업을 예약하고 실행하는 데 사용됩니다.
  • flasgger: Swagger UI를 통해 API 문서를 자동으로 생성하고 제공합니다.
  • json: 데이터를 JSON 형식으로 저장하고 로드하는 데 사용됩니다.

추가 라이브러리

  • question_processing: 질문을 처리하고 가장 적합한 답변을 선택하는 모듈입니다.
  • crawler: 다양한 웹사이트에서 데이터를 크롤링하는 모듈입니다.
  • httpx: HTTP 클라이언트로, 웹 페이지로부터 데이터를 가져오는 데 사용됩니다.
  • BeautifulSoup: HTML 파싱 라이브러리로, 웹 페이지로부터 원하는 데이터를 추출하는 데 사용됩니다.
  • torch, sentence_transformers: 질문을 임베딩하고 유사한 질문을 찾는 데 사용됩니다.
  • pandas: 데이터 프레임을 처리하는 데 사용됩니다.
  • numpy: 수치 데이터를 처리하는 데 사용됩니다.

API에 대한 구체적인 설명

GET /get-question/

질문에 대한 최적의 답변을 반환합니다.

  • URL: /get-question/<question>
  • Method: GET
  • URL 파라미터:
    • question (string): 사용자의 질문
  • 응답:
    • answer (string): 질문에 대한 최적의 답변
    • button_name (string): 버튼 이름
    • link (string): 관련 링크
    • question (string): 처리된 질문

예제 요청

curl -X GET "http://localhost:5000/get-question/도서관 좌석은?"

예제 응답

{
  "answer": "현재 도서관 좌석 정보는 ...",
  "button_name": "도서관 좌석 확인",
  "link": "http://library.example.com/seats",
  "question": "도서관 좌석은?"
}

예제코드

예제 1: 질문에 대한 답변 요청

아래 코드는 Flask 애플리케이션을 실행하고 /get-question 엔드포인트에 GET 요청을 보내 질문에 대한 답변을 받는 예제입니다.

import requests

def get_answer(question):
    url = f"http://localhost:5000/get-question/{question}"
    response = requests.get(url)
    if response.status_code == 200:
        data = response.json()
        print(f"Question: {data['question']}")
        print(f"Answer: {data['answer']}")
        print(f"Link: {data['link']}")
        print(f"Button Name: {data['button_name']}")
    else:
        print("Error:", response.status_code)

if __name__ == "__main__":
    question = "도서관 좌석은?"
    get_answer(question)

이 코드는 로컬 서버에서 Flask 애플리케이션을 실행한 후, 사용자가 입력한 질문에 대해 가장 적합한 답변을 반환합니다. 응답 데이터는 JSON 형식으로 반환되며, 각 키와 값을 출력합니다.

Dataset

가천대학교 공식 데이터를 수집 후 가공하여 사용

  • qna 데이터셋
    • 유저의 질문과 유사도가 높은 답변과 관련 링크를 제공
    • 데이터셋 구조
항목 내용
소분류 총장실
질문 총장님이 궁금해요
답변 총장님에 대해 알려드릴게요. 현재 가천대학교 총장님은 이길여 총장님으로, 항상 학생들을 위해 힘써주시는 분이에요. 버튼을 누르면 현 총장님의 인사말, 프로필, 포토갤러리, 메시지를 확인할 수 있어요.
링크 https://www.gachon.ac.kr/kor/641/subview.do
https://www.gachon.ac.kr/kor/643/subview.do
https://www.gachon.ac.kr/kor/644/subview.do
https://www.gachon.ac.kr/kor/830/subview.do
버튼이름 인사말
프로필
포토갤러리
메시지
  • 웹크롤링 데이터셋
    • 공지사항, 학사일정, 학사메뉴, 도서관 좌석 실시간 데이터 제공
    • 가천대학교 사이트에서 크롤링하여 수집 후 가공
    • 라이브러리: BeautifulSoup

관련 코드

전체 공지 크롤링

import httpx
from bs4 import BeautifulSoup

def crawl_notices():
    url = 'https://www.gachon.ac.kr/kor/7986/subview.do'
    response = httpx.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    notices = [item.get_text().strip() for item in soup.find_all('td', 'td-subject')[:5]]
    return notices
  • 설명: 이 함수는 가천대학교 공지사항 페이지에서 최근 5개의 공지 제목을 크롤링합니다. httpx를 사용해 페이지 HTML을 가져오고, BeautifulSoup으로 파싱하여 공지 제목을 추출합니다.

중앙도서관 좌석 크롤링

def crawl_library_seats(type='READING', libno='2'):
    url = 'https://lib.gachon.ac.kr/main/seatAjax'
    params = {'type': type, 'libno': libno, 'time': int(time.time() * 1000)}
    response = httpx.get(url, params=params)
    return response.json()
  • 설명: 이 함수는 중앙도서관 좌석 정보를 가져옵니다. httpx를 사용해 AJAX 요청을 보내고, 좌석 상태를 JSON 형식으로 반환받아 파싱합니다. params로 요청 파라미터를 전달하여 필요한 좌석 정보를 얻습니다.