ecsimsw
영화 추천 서비스 / TF-IDF, NLP 본문
영화 추천 서비스
공부한 자연어 처리를 연습 할 수 있는 간단한 서비스를 만들고 싶었습니다.
영화를 입력하면 45000개의 영화 데이터 내에서 '제작 언어', '시리즈', '줄거리', '평점', '장르'를 바탕으로 가장 유사한 영화 n개를 추천합니다.
웹 서버와 연산 서버로 구성되어, 연산 서버에서 유사한 영화 뽑는 연산을 처리하고, 웹 서버는 검색 영화, 추천 영화를 연산 서버와 주고 받고 페이지를 구성하여 브라우저에 응답합니다.
연산 서버
파이썬으로 제작한 연산 서버는 검색한 영화와 제작 언어 일치, 시리즈 존재 여부, 줄거리 유사도, 평점, 장르 유사 여부를 비교하여 가장 높은 점수의 n개 수의 추천 영화를 찾습니다. 소켓 통신으로 웹 서버로부터 검색 영화 정보를 받고, 연산 후 추천 영화 목록을 전송합니다.
유사도 평가 방식
SckitLearn TfidfVectorizer을 사용하여 TF-IDF 방식으로 줄거리의 단어 마다의 문서 내 희귀함을 구하고 각 단어에 가중치를 줘, 두 줄거리 사이의 희귀한 단어의 포함 여부에 따라 유사함을 점수화 할 수 있었습니다.
예를 들면 '그' 라는 단어는 대다수의 영화 줄거리에 포함되므로 '그'라는 단어가 두 줄거리에서 모두 포함된 것으로 얻는 유사함 점수는 적습니다. 반면 보다 희귀한 단어, 이를 테면 '전쟁'이라는 단어가 두 줄거리에서 모두 포함되면 이는 보다 많은 유사함 점수를 받을 수 있을 것 입니다.
또, 줄거리 내의 150개 단어 중 '전쟁' 키워드가 1번 들어갔을 때와, 줄거리 내의 10개 단어 중 2개의 단어가 '전쟁'인 경우, 후자가 유사도 점수가 더 높아야 하는 것처럼, 줄거리 내부에서 해당 단어의 중요도 역시 유사함 판단의 기준이 되었습니다.
DTM (Document-Term Matrix)
문서 단어 행렬(DTM)은 문장 안 각 단어들의 빈도를 행렬로 표현한 것이다.
TF-IDF
TF는 각 문서 안에서의 단어의 빈도, DF는 문서군안에서 각 단어가 등장한 문서의 수를 의미한다. IDF는 DF에 반비례하는 값이다. 이 TF-IDF를 사용하여 문장끼리의 유사도나, 단어의 중요도를 구할 수 있다.
#TF : term frequency
#IDF : inverse document frequency
#IDF는 이 DF의 역수인 것은 맞는데, 일반 역수를 사용하면 분자 (전체 문장의 개수)가 늘어짐에 따라 분모 (등장 문장의 수)는 그를 따라가지 못하므로, 그 값이 기하급수적으로 커져 결국 단어들의 중요성을 하향평준화 시켜 비교가 어려워지므로 역수에 로그를 취하여 IDF를 정의한다. (분모가 0이 되는 것을 막기 위해, 등장 문장의 수에 1을 더하여 로그 취함)
한 문서 안에서 단어가 몇번 사용되는지를 구하는 것으로, 문서 안에서의 단어의 중요도를, 전체 문서군에서 단어가 등장하는 문서 비율을 구하는 것으로 특정 단어가 얼마나 희소한지를 나타낼 수 있을 것이다. 문장 안에서의 중요도 (TF)와 전체 문서군에서의 희귀성 (IDF)를 곱하여 TF-IDF를 구한다. 즉 TF-IDF가 높은 단어일수록 특정 문서 내에서 그 단어가 많이 쓰면서도, 전체 문서군에서 희귀하다는 것을 의미한다.
스크린샷
만든이
김진환 (ecsimsw) / 박소빈 (sobin1023)
제작 기간 : 2020.04.05 ~ 2020.04.14
'KimJinHwan > Project' 카테고리의 다른 글
Spring boot, JPA / Giggle (0) | 2020.10.05 |
---|---|
JSP, Servlet / 익명 질문과 답변 (1) | 2020.05.20 |
Python / Google image crawler (5) | 2019.12.01 |
유전 알고리즘 시뮬레이션 (9) | 2019.11.28 |
소켓 통신 연습 / Node.js, C# (0) | 2019.02.11 |