- 다양한 주제에 대해 자유롭게 글을 작성하는 게시판입니다.
Date 17/02/21 03:21:44
Name   Top
Subject   영화를 추천해드립니다! Movie2Vec
신상 변동으로 사이트 내립니다. 사이트 바로가기 : 펑 

목차
0) 개요
1) 메뉴얼
2) 배경
3) 작업수기
4) 마치며


0) 개요 

https://kongcha.net/?b=31&n=21114 진짜로 만들기를 끝낸 이야기.
숫자로된 IMDB ID 를 입력하시면 유사한 영화를 추천해드립니다!
아래 메뉴얼을 확인하고 제일 위 링크를 클릭해주세요!

1) 메뉴얼

1. IMDB 접속


2. 원하는 영화 검색

http://imgur.com/VsN8RJN

http://imgur.com/071dtSw


3. 주소창에서 /title/ 이후 숫자 부분만 복사

Ex) Toy story (1995) 검색시

http://www.imdb.com/title/tt0114709/?ref_=nv_sr_1

여기서 114709 만 복사

4. 펑! 접속 (가끔 접속에 오래걸릴때 있음)

http://imgur.com/SOH3Gyu

5. 입력란에 아까 복사한 숫자 붙여넣고 엔터 후 대기 (최소 5초 가량 필요. 최대 20초. 20초 이상 발생시 서버 죽으니 글쓴이 소환 필요. 해결책 탐색중)

http://imgur.com/rjvGIpQ

6. 결과

http://imgur.com/79vip1I


2) 배경

1. Word2Vec

Word2Vec이 뭐하는 놈인지 딱 한줄로 설명하면 아래와 같습니다.

한국-서울+도쿄 = ? —> 일본이라고 답할 수 있게 만들어주는 방법

단어들을 의미가 녹아있는 좌표에 할당하는 방법이 되겠습니다. 좌표에 할당하면 좌표간 거리/방향 이런거로 위와 같은 계산을 할수도 있고, 인접 좌표에 있는 단어 = 연관있는 단어 로 생각할수도 있고, 여~~~~러 처리를 가능하게 해줍니다!

더 궁금하신 분은 다음 블로그 추천합니다 -_- 설명을 하자니 밑천이 드러나서도 끝도 없이 늘어질거같아서… 더 설명을 잘하시는 분께 패스!

2. Movie2Vec

모든일의 발단은 작년 6월쯤…  어디에서 무슨일을 해야 먹고 살수있는가 찾아보다 다음과 같은 웹페이지를 찾아내고부터였습니다.

https://www.pycon.kr/2015/program/58 (14년도에도 똑같은 주제로 발표하셨던듯 한데 찾지는 못함…)

“영화 제목들을 하나의 단어로, 한 사람이 3.0 이상 평점한 영화 목록을 문장으로 하여  word2vec 실행한다면, 영화 제목들을 word2vec 처리하듯이 처리할 수 있지않을까?!
애니메이션을 입력하면 애니메이션 명작 영화들을 알려주고, 스릴러를 입력하면 훌륭한 스릴러를, B급 쌈마이 영화를 집어넣으면 B급 쌈마이 영화를 알려줄수 있을거야!”
라는게 골자입니다.

3) 개발수기

1. 제작과정 및 환경

9월 마지막주 즈음부터 시작해서 2.20에 끝났으니 5개월 걸렸군요. 음 javascript/네트워크? 하나도 모르고 시작해서 5개월을 혼자서 했으면 짧은건지 긴건지 감이 안오네요. 처음에 2개월정도는 내 밥줄이 걸렸지만 아직 여유가 있다! 해서 25%정도 여력을 두고 작업했다면, 이후로는 이쪽말고 다른쪽에서 희망이 생겨 25%정도의 힘만 가지고 작업했습니다 (..) 전에 홍차넷 개발하려면 얼마나 걸릴까요? 하는 질문을 어디선가 본거같은데, 프로그래밍에 익숙하다면 주말마다 취미로 1년정도면 만들지 않을까요? 라고 답변드릴 수 잇을 것 같네요. 익숙하지 않으면 기약할 수 없어요…

아무튼 다음과 같은 기술이 이 웹페이지에 이용되었습니다… 만 튜토리얼 하나 붙잡고 쭉가서 만든뒤 막힐때마다 각 요소별로 문서 찾아보고 누더기로 만들었네요.

MongoDB     - 데이터베이스(라고해봐야 IMDB ID 랑 Movie Title 이랑 연결만…)
Express.JS  - 웹 어플리케이션 프레임워크(라지만 그냥 이거 쓰면 편하다만 알아요)
Angular.JS   - 클라이언트
Node.JS       - 서버
    + Python- Movie2Vec을 굴려줄 핵심!

봤던 튜토리얼이 있는데, 전반적인 훑어보기 + Angular 기초(?) 는 다음과 같은 곳에서 
node + mongodb 는 아래에서 많이 도움을 얻었습니다.

왜 이걸골랐냐면… 입사를 노렸던 회사가 두군데가 있는데, 한군데는 Full Stack(당신이 보고있는 화면부터 저 뒤쪽 서버의 끝단까지 다하는 잡부)을 구하고, 다른 한군데는 데이터 엔지니어인데 서버를 Node 로 쓴다는 얘기가 있어서였습니다. 앞쪽엔 Full Stack 을 할 수ㄴ 있다는 증명을, 뒤쪽은 Node 쓸줄알고 인공신경망 기반 추천시스템 만들라면 만들 수 있다는 증명을 위해서 였죠. -_- 둘다 꿈에 가까운 일들을 할 수 있을거란 생각에 급여라던가 이것저것 별로여도 전문연만 시켜주면 일할 수 있다는 생각이였거든요. 아 두업체 모두 전문연 자리가 있는 업체는 아니였습니다만, 제가 봤을땐 충분히 딸 수 있을거라 생각되는 회사들이였습니다.
현재는 좋은 조건에 박사과정 지원해보지 않겠냐는 컨택이와서… 보류상태입니다. 더 좋은 조건+전문연 올해안 가능이면 당장 면접보러 달려갈테니 2월 안으로 연락주세요 +_+

작업 환경은 우분투 + PyCharm 쓰다가 PyCharm 이 프로만 웹지원 된다는것을 알고 VS Code로 갈아탔습니다 —
그리고 윈도 +  VS Code 해서 MongoDB 본격적으로 쓰기 전까지 잘썼습니다. -MongoDB + Windows + Git 은 뒤쪽에서 얘기할게 좀 있네요… 이놈때문에 마지막에 2일쯤 더걸려서 —
VS Code 덕분에 Git 사용이 참 편하더군요.

아참. Git 은 Git hub 안쓰고, 아이폰 사진 백업/게임용 데탑 공유기(..) 로 사용중이던 맥미니를 개인용 Git 서버로 이용해서 썼습니다.

그러고 최종 라이브 서버는 윈도우에서 돌리고 있네요 -_- 심심할때 바깥에서 개발하겠답시고 서피스에 Python 과 node 세팅을 다해놨어서 그냥 서피스에서 돌리고 있습니다. 덕분에… 느려요… 이해해주세요 ㅠㅠ

아무튼 도메인 사고나서, 웹메일 준다길레 룰루랄라했는데, 네임플러스 서비스는 안준데서… 가XX… 부들부들…
메일 서버 구축할라다 이건 요구 노력치가 너무 큰거같아 포기했습니다.

뭔가 작업 내역 AtoZ 해서 써볼까했는데, Git 로그 까서 하나하나 열거하기엔 삽질이 너무 많네요 ㅠㅠ 특기할만한 삽질만 아랫쪽에 따로 적겠습니다.

2. 데이터


미네소타 대학의 GroupLens 연구실에서 제공하는 영화 평점 데이터입니다. 개인정보 없이 추천영화 리스트 제공합니다.
저는 이중 작년 10월 기준 ml-latest 데이터 이용하였는데 영화 타이틀만 4만개쯤 잡힌 것으로 기억하네요.
아프리카 선지자님이 어떻게 했나 훑어보니, 그냥 3.0 이상 평점 받은 데이터만 이용하셨다고 하셔서 저도 따라했습니다 -_-
3.0 100개 이상 받은 영화만 골랐더니, 되는 영화가 엄청나게 많진 않습니다. 갓-급 영화들은 되는데 최근거이거나, 마이너한 영화들은 검색이 안되는것 같아요.

3. python

Word2Vec  은 gensim 이라는 패키지 안에 존재합니다. 이미 누가 잘 만들어두었으니 아무런 걱정하지 마세요

귀찮은 사람은 Anaconda 에서 Python과 함께 패키지로 묶어서 받을 수 있습니다. 이방법을 추천하는게, Scipy 나 이런저런 모듈 설치하다 빡칠바에야 그냥 한방에 받으세요.

우분투에서 처음에 gensim 세팅하다가 미쳐버리는줄알았는데, 윈도우 세팅할때 아나콘다에서 제공하는거 보고 뒤집어졌었습니다…

4. MEAN

이부분은 별로 할얘기가 없네요… 그냥 node js를 홈페이지에서 깔면 express 와 angular 가 딸려온다 정도로 인식하고 잇습니다. 
요 튜토리얼 세팅 그대로 따라가서, 대충 만들고 돌아간이후로 신경을 안써서 -_-
안돌아갈때만 기술문서 보고 문제를 해결할 수 있으면 되는거 아닌가요?! 최고는 각 요소별로 기술문서 보는겁니다?!

5. 삽질의 기록 - 넘겨도 되는이야기

-1 Gensim 에서 warning 이 터지면서 node js 가 죽어요!!!!

정확히말하면 python-shell이라는 node js 와 python 사이를 연결해주는 모듈이 존재하는데, 이 모듈은 warning 만 나도 node 를 죽여버립니다! Gensim이 pattern 이라는 Python 모듈을 사용하는데, 이 모듈이 Python3에서 지원을 안해요 — 그래서 warning 이 뜨는데, genesis 패키지를 까서 수정할수도 없는 노릇이고 돌아버리는줄 알았습니다.

해결방법은…  import gensim 하기전에

import warnings
warnings.simplefilter(“ignore”)

요고 삽입해주면 됩니다.

-2 Angular + Node

Angular - 클라이언트
Node - 서버

간단해보이는데, 아무것도 모르고 시작하다보니 발생했던 문제가… Angular 에 node 코드 써놓고 왜안되지?! 하고있던겁니다.

그리고 둘사이에 데이터 통신도 어떻게 해야하는지  몰라서 한참 헤맸는데, Http 데이터 통신 방법 이용하면 되더군요 —

Post 로 Request 를 Angular 에서 node 로 발사하면 Node 에서 request.body.이름 와 같은 형태로 내용을 쓸 수 있고, 반대로 node 에서 Response.json(json내용) 으로 Angular  에 데이터 발사하면 angular 에서 잘 받아다 쓸 수 있습니다.

이런 기초중의 기초도 몰라도 5개월이면 만들수 있어요 여러분!

-3 Node... CallbackHell

Node 는 비동기 처리를 강점으로 내세우는데… 이게 당해보지 않으면 뭐가 문젠지 어떻게 해결해야 좋은지 모릅니다 ㅠㅠ

비동기화 처리에 대해서 제가 이해한바를 얘기하면 프로그램을 쭉 짜두면 그것을 할일 목록으로 인식해서 오래걸리면 나중으로 미루고 다른일 부터 시작합니다.
뭐랄까… 요리할때 소금을 꺼내고, 물을 냄비에 채우고, 물을 끓여라. 이런식으로 말하면 소금 금방꺼내니까 꺼내고, 물을 냄비에 채우는 시간이 오래걸리니까, 물을 냄비에 틀어놓고…
물을 끓이는거 돌입하는데 물이 없다고 에러를 뿜습니다!

그래서 순차적으로 진행되게 해줘야하는 경우 여러가지 해법을 이용해서 처리한다고 하는데, 저는 Promise 는 어떻게 쓰는지 감이 안와서… 걍 콜백콜백콜백 으로 처리했습니다. 처음엔 콜백 어떻게 쓰는지 몰라서 한참 헤맴 ㅠㅠ 전 지옥에 떨어질만큼 콜백을 많이 쓸 능력이 안되서... 지옥엔 안갔습니다. 헤헤 다 제가 착해서죠 ^오^

-4 NodeJS - Python-Shell

Node 에서 python 실행시키기 위해선 npm 에 python shell이 있어야 합니다.. 기본으로 깔려있던 것으로 기억하는데 가물가물하네요. 아마 기본일거에요…

Json 으로 처리하려고 하니, 예제를 훑어봐도 마땅치가 않더군요. Txt 모드는 깔끔했는데, JSON 으로 처리하려니 온갖 귀차니즘이… 지금보면 다 알려준듯 싶기도 한데… 아무튼 예제에서 언급이 안되거나 그대로 하면 안되는게 조금 있습니다.

(1) node js
Python shell 객체(?)를 만듭니다.
Ex) var pyshell = new PythonShell(‘script.py’.options);

pyshell.send(보낼내용) 로 json 내용을 날려주고

pyshell.on(‘message’, 콜백함수) 해서 콜백함수에서 처리할거 다하고

pyshell.end() 해서 꼭! 꺼줘야합니다. 안꺼주면 에러터지더군요…


(2) python
json.load(sys.stdin)
json.loads 아닙니다. load 입니다. loads 는 여러개 받을때 인 것 같더군요. 이 플젝에선 하나만 주면되서 s 붙음 에러가 저를 괴롭혔습니다.

나머지는 예제와 동일하게 하셔도 됩니다.

-5 csv merge

아무래도 영화 개수도 많고 사람 숫자도 많고, MongoDB 는 join 을 지원하지 않다보니, 내용 합칠때 여러모로 처리 방법이 고민이더군요… 하지만! Python 모듈중 하나인 Pandas csv merge 쓰니깐 간단하게 해결되었습니다. 빠른건 덤…

-6 MongoDB + Git + Windows

Windows 에서 Git 으로 Checkout 하면 mongdb 에러납니다 -_- 하지마세요. 우분투에서는 문제 안생기던데, 아직 해결방법 못찾았고, 그냥 안찾기로 결심했습니다.

MongoDB 측에서도 백업할때 git 쓰지 마라고 하는걸 뒤늦게 봣는데 상관없어요. 이젠 수정안할거니까 ^오^

-7 timeout

21일날 일어났을때 문제 없으면 댓글내용 정리해서 작성 예정.

4) 마치며

5개월간 대장정을 마쳤습니다. 정리하는 글까지 쓰니 정말 끝난거같은데, 이거 작업하면서 한달에 한번쯤 대충 휘갈겼던 블로그에도 로그를 남겨야하니 조금 더 남았군요.

웹페이지는 이번주말까지 열어둘 생각입니다. 서피스를 언제까지 묶어둘수도 없는 노릇이라서요.

Movie2Vec 결과물이 마음에 들진 않는데… 저거 손보려면 작정하고 몇일 돌려봐야할거같아서 더 손안대렵니다. 대충 테스트 케이스 몇개 했을때 IMDB 랑 50% 선 일치, 동일장르 추출율 80% 선으로 아주 못봐줄건 아니네요.

끝으로 질문 받습니다. 작업중 발생한 문제/해결 이라던가, 부전공한 이야기, 이쪽이 왜 좋아요? 등등 아무거나 하고싶은거 하시면 됩니다.
혹시나 숨겨진 Resume 보신분들은 쉿쉿! 개인 신상관련은 쪽지나 거기 적힌 이메일로 날려주세요~



6
  • 프로그래밍 삽질기는 추천!
  • 3월이 되면 업데이트 된 모습이 보이겠죠.
  • 춫천


목록
번호 제목 이름 날짜 조회 추천
공지 티타임 게시판 이용 규정 2 Toby 15/06/19 31705 7
15061 스포츠[MLB] 2024 AL,NL MVP 수상자.jpg 김치찌개 24/11/22 25 0
15060 스포츠[MLB] 2024 AL,NL 사이영 수상자.jpg 김치찌개 24/11/22 31 0
15059 음악[팝송] 션 멘데스 새 앨범 "Shawn" 김치찌개 24/11/22 56 0
15058 방송/연예예능적으로 2025년 한국프로야구 순위 및 상황 예언해보기 10 문샤넬남편(허윤진남편) 24/11/21 392 0
15057 일상/생각우리는 어쩌다 이렇게 됐을까 3 SKT Faker 24/11/21 538 1
15056 오프모임23일 토요일 14시 잠실 보드게임, 한잔 모임 오실 분? 4 트린 24/11/20 316 0
15055 방송/연예페미니스트 vs 변호사 유튜브 토론 - 동덕여대 시위 관련 24 알료사 24/11/20 2965 31
15054 생활체육[홍.스.골] 10,11월 대회 상품공지 켈로그김 24/11/19 247 1
15053 여행여자친구와 부산여행 계획중인데 어디를 가면 좋을까요?! 29 포도송이 24/11/19 682 0
15052 일상/생각오늘도 새벽 운동 다녀왔습니다. 5 큐리스 24/11/19 453 9
15051 일상/생각의식의 고백: 인류를 통한 확장의 기록 11 알료사 24/11/19 493 6
15050 게임[1부 : 황제를 도발하다] 님 임요환 긁어봄?? ㅋㅋ 6 Groot 24/11/18 448 0
15049 꿀팁/강좌한달 1만원으로 시작하는 전화영어, 다영이 영어회화&커뮤니티 19 김비버 24/11/18 918 10
15048 의료/건강고혈압 치료제가 발기부전을 치료제가 된 계기 19 허락해주세요 24/11/18 710 1
15047 일상/생각탐라에 쓰려니 길다고 쫓겨난 이야기 4 밀크티 24/11/16 896 0
15046 정치이재명 1심 판결 - 법원에서 배포한 설명자료 (11page) 33 매뉴물있뉴 24/11/15 1787 1
15045 일상/생각'우크라' 표기에 대한 생각. 32 arch 24/11/15 1004 5
15044 일상/생각부여성 사람들은 만나면 인사를 합니다. 6 nothing 24/11/14 900 20
15043 일상/생각수다를 떨자 2 골든햄스 24/11/13 458 10
15042 역사역사적으로 사용됐던 금화 11종의 현재 가치 추산 2 허락해주세요 24/11/13 558 7
15041 영화미국이 말아먹지만 멋있는 영화 vs 말아먹으면서 멋도 없는 영화 8 열한시육분 24/11/13 688 3
15040 오프모임11/27(수) 성북 벙개 33 dolmusa 24/11/13 748 3
15039 요리/음식칵테일 덕후 사이트 홍보합니다~ 2탄 8 Iowa 24/11/12 407 7
15022 기타[긴급이벤트] 티타임 따봉 대작전 (종료) 19 dolmusa 24/11/05 1074 31
목록

+ : 최근 2시간내에 달린 댓글
+ : 최근 4시간내에 달린 댓글

댓글