cos, eud 활용 영화추천시스템

BABY CAT·2022년 8월 10일
0

ai

목록 보기
3/12
  1. data2 로드를 통한 데이터 프레임 완성
  2. 한글에 맞게 형태소 분석기를 이용해서 단어 토큰화 TF-IDF 계산
  3. 코사인 유사도를 기반으로 영화 3종 추천 -올드보이
import pandas as pd
import numpy as np
! pip install konlpy
from konlpy.tag import Okt
data = pd.read_csv('data2.csv')
data.head(), data.shape
okt = Okt() #
data_l = [' '.join(okt.morphs(i)) for i in data['content']]
data_l[0]
# 백터라이저 > cos유사도, eud유사도 뽑기
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_v = TfidfVectorizer()
tfidf_m = tfidf_v.fit_transform(data_l)
tfidf_m.toarray()
from sklearn.metrics.pairwise import cosine_similarity # 코사인유사도
cos = cosine_similarity(tfidf_m, tfidf_m)
from sklearn.metrics import euclidean_distances #유클리드거리 소문자-매소드
eud = euclidean_distances(tfidf_m, tfidf_m)
cos.shape, eud.shape
data.index  
t_idx = dict(zip(data['name'], data.index )) # 집으로 결합해서 딕셔너리화   영화제목 : 인덱스
t_idx
# cos 유사도로 상위5위 유사도 뽑기
# 특정 영화의 상위 유사도 영화제목으로 뽑기
def ck_s_t(t, cosine_sim = cos ):
    idx = t_idx[t]
    c_sc = list(enumerate(cosine_sim[idx])) # 넘버링 #이누머-열거
    c_sc = sorted ( c_sc, key=lambda x:x[1] , reverse=True) # reverse=True 내림차순 , 코사인유사도는 높은 것이 좋은 거니까, 디폴트는 오름차순
    m_d = c_sc[1:6] # (인덱스,유사도) (15348, 0.5258229300737997),  # 0인덱은 자기자신이니까 빼고 상위 1,2,3,4,5 위의 유사도가 높은 것을 뽑는다. 
    m_i = [i[0]for i in m_d]  # (인덱스,유사도) 를 하나 뽑아서 [0]인덱스 > 인덱스 뽑아서 리스트로 >  상위 5위까지 인덱스를 뽑았다
    return data['name'].iloc[m_i] #영화타이틀 시리즈에서 그 인덱 값들만 뽑아온다 (판다스시리즈 타입으로 뽑힌다)
pd.DataFrame(ck_s_t('올드보이'))
# eud로 뽑기
def ck_s_t(t, cosine_sim = eud ):
    idx = t_idx[t]
    c_sc = list(enumerate(cosine_sim[idx])) # 넘버링 #이누머-열거
    c_sc = sorted ( c_sc, key=lambda x:x[1] , reverse=True)  
    m_d = c_sc[-2:-7:-1]   # eud는 작을수록 유사도가 높으니까 뒤에서 5개를 뽑는다 -1인덱은 올드보이
    m_i = [i[0]for i in m_d]  
    return data['name'].iloc[m_i]  
pd.DataFrame(ck_s_t('올드보이'))

0개의 댓글