KIMMUSIC / book_server

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

OWN BOOK

  • 계명대학교 컴퓨터공학과 캡스톤디자인
  • 개발기간 : 2021.09 ~ 2021.12
  • 개발인원 : 5명

목적 및 필요성

오프라인 서점의 재고를 파악하기 위해서는 내 주위의 서점 위치를 파악하고 해당 서점의 홈페이지에 들어가 재고를 확인해야 한다. 만약 서점이 많다면 그만큼 오랜 시간이 걸린다. 이를 통합하여 보여줄 수 있다면 사용자에게 편의성을 제공해 줄 수 있을 것이다. 책만을 거래하는 중고시장이 대중적이지 않다. 알라딘 중고서점의 경우 사람 대 사람이 아닌 서점 대 사람의 거래이기 때문에 차별점이 있다고 생각했다. 학교 홈페이지에서 수강 중인 강의의 교재를 찾는 과정에 불편함이 있다. 이를 홈페이지에서 일괄 확인할 수 있다면 사용자에게 편의성을 제공할 수 있을 것이다. 기존 서점들의 추천도서는 같은 카테고리 내의 책들을 무작위로 추천해 주거나 개인 맞춤화된 추천시스템이 존재하지 않는다. 이를 인공지능을 활용해 추천 해주는 시스템을 고안한다면 유사도가 더 높은 책들로 추천해 줄 수 있다.

제품설계

  • 사용자는 검색 또는 구입하고 싶은 책을 검색해 온라인에서 판매되는 책의 가격을 비교해 구매 페이지로 이동할 수 있고 오프라인에서 어느 지점에 재고가 얼마나 있는지 파악할 수 있다. 또한, 페이지 내에 중고거래 게시판에 판매되고 있는 책이라면 누가 얼마에 판매하고 있는지 파악할 수 있고 채팅을 보낼 수 있다.
  • Naver Cloud Platform을 이용해 클라우드 환경에서 서버를 동작시켰으며 Nodejs를 이용해 웹서버를 열고 MySQL과의 연동을 통해 데이터베이스를 사용하였다. 소켓 통신을 통해 서버와 이용자간 웹을 통해 실시간으로 통신할 수 있도록 하였으며 이를 활용하여 이용자끼리 서로 채팅할 수 있도록 하였다.유저가 로그인 시 세션을 얻을 수 있도록 하였고 해당 세션을 데이터베이스에 저장되도록 하여 사용자의 로그인 인증을 구현하였다. Kakao Map API 사용을 위해 서버가 https 프로토콜을 사용할 수 있도록 SSL 인증서를 적용시켰고 DNS를 통해 도메인 이름을 설정하였다. 게시판 작성시 XSS 취약점을 보완하기 위해 서버로 들어오는 글 내용을 필터링 하여 데이터베이스에 저장되도록 하였다.
  • BeautifulSoup를 이용해 교보문고에 있는 2만여개의 책들로 책 제목, ISBN코드, 책 소개 내용을 크롤링하여 csv파일로 저장되게 하였다. 크롤링 한 책 소개 내용을 한국어 형태소 분석기인 Konlpy를 이용해 명사를 추출 후 csv 파일에 저장되게 하였다. Konlpy 사용 과정에서 Hannanum, Kkma, Komoran, Okt 등의 다양한 클래스들을 비교해 보았고 그 중에서 성능이 가장 좋았던 Okt를 사용하기로 하였다.선정된 클래스를 활용하여 명사로 나눠진 책 소개 내용을 바탕으로 Word2Vec를 활용해 학습시켰다. 그 결과 하나의 명사 단어가 100차원의 벡터 값을 가질 수 있게 되었다. Word2Vec 학습 과정에서 단어의 출현빈도를 정하는 min_count 값과 주변 단어들을 고려하는 범위를 나타내는 window_size를 바꿔가며 모델의 정확도를 비교하였고 min_count값을 40, window_size값을 10으로 설정했을 때 가장 괜찮은 정확성을 보여 이 모델을 사용하였다. 학습된 단어모델을 바탕으로 책 소개 내용에 있는 단어들을 벡터값으로 변환 후 이를 모두 더해 총 단어 수로 나눈 값을 하나의 책을 나타낼 수 있는 값으로 설정하였다. 이를 새로운 Word2Vec 모델에 학습시켜 책 벡터 모델을 따로 저장하였다.
  • 위에서 학습된 모델을 Flask 서버를 이용해 API 서버를 설계하였다. Node 서버에서 사용자가 클릭 한 책을 Flask 서버로 넘겨주면 Flask에서는 해당 책의 내용을 Konlpy로 형태소 분석 후 단어 벡터 모델로 해당 책의 벡터값을 구한다. 그 후 책 벡터 모델과 코사인 유사도를 비교해 유사도가 높은 순으로 Node 서버에 전달한다. Node서버에서는 전달된 책들을 바탕으로 다시 책들의 이미지를 전달받아 사용자에게 제공해 준다. Flask 서버에서 이용자별로 벡터값을 가질 수 있도록 유저 벡터를 csv 파일로 만들어 저장되게 하였다. 사용자가 책을 클릭하면 csv 파일로부터 사용자의 벡터값을 불러와 클릭한 책의 벡터와 연산 후 다시 csv 파일에 저장되게 하였다. 만약 사용자가 홈 화면으로 이동 시 csv 파일에 있는 유저 벡터값을 불러와 책 벡터 모델과 코사인 유사도를 비교하여 사용자에게 유사도가 높은 책을 제공해 준다.

결과물

  • 웹 페이지 메인 화면
    ownbook1
    홈페이지의 메인 화면 상단에는 HOME, CHAT, LOGIN 버튼과 학교 수강신청내역을 바탕으로 교재를 불러오기 하는 버튼이 있다.
    중앙에는 검색창과 현재 로그인 중인 사용자의 추천 도서가 제공된다. 만약 로그인 상태가 아니라면 랜덤으로 제공된다.

  • 학교 수강 교재 불러오기 화면 onwbook2
    사용자는 불러오기 버튼을 누른 후 학교 아이디와 비밀번호를 입력하면 현재 수강중인 과목의 교재를 불러 올 수 있다.

  • 상품 검색 화면 ownbook3
    상품 검색 시 Naver Book API를 통해 검색된 책들의 리스트가 사용자에게 제공된다.

  • 상품 상세 페이지
    ownbook4
    상품 상세 페이지에서 사용자는 현재 웹페이지 내의 중고거래 게시판에서 해당 책이 중고거래 되고있는지 바로 볼 수 있고 대화 버튼을 통해 판매자와 1:1 대화를 할 수 있다. 오프라인 서점의 경우 지도를 통해 재고 현황 및 서점 위치를 제공받을 수 있고 온라인 서점에서의 가격비교를 통해 어느 사이트에서 가장 저렴하게 파는지 확인 할 수 있다. 가장 하단에는 현재 검색된 책과 가장 유사한 책들이 제공된다.

문제점 및 해결 노력

  • 카카오맵에서 서점에 대한 마커를 누를 시, 위치정보나 내용 등, 세부적인 안내가 나타나도록 개선이 필요하다.
  • 카카오맵API를 사용하는 과정에서 HTTPS가 필요시 되어 SSL인증서를 적용하여 문제를 해결하였다.
  • 추천 알고리즘에 사용할 단어분석기를 설계하는 과정에서 일부 실행환경에서만 실행되는 문제가 발생하였다. 실행환경을 리눅스 서버로 하여 임시로 조치하였다.
  • 책 추천 알고리즘을 개선하여 관련 책이 더 유사하도록, 또는 사용자에게 더 필요로 하는 책이 노출되도록 개선이 필요하다.

About


Languages

Language:HTML 48.4%Language:Python 25.2%Language:JavaScript 22.5%Language:CSS 3.9%