Synopsis
, Cast
, Genre
, Tags
의 키워드들을 추출# dataset from https://www.kaggle.com/datasets/chanoncharuchinda/top-100-korean-drama-mydramalist
import MeCab
import pandas as pd
df = pd.read_csv('top100_kdrama_ko.csv')
mecab = MeCab.Tagger("-Owakati")
mecab.parse("kill bill").split()
test = mecab.parse(df['Synopsis'][0]).split()
df['token'] = 0
for i in range(0, len(df['Synopsis'])):
df['token'][i] = mecab.parse(df['Synopsis'][i]).split()
df['token'][i].extend(mecab.parse(df['Cast'][i]).split())
df['token'][i].extend(mecab.parse(df['Genre'][i]).split())
df['token'][i].extend(mecab.parse(df['Tags'][i]).split())
# remove keywords that seemed not related to similarity work.
list1 = [',','.','s',"'",'"','-','…','(',')','년']
for j in list1:
for i in range(0, len(df['token'])):
while j in df['token'][i]:
df['token'][i].remove(j)
from gensim.test.utils import common_texts
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
documents = [TaggedDocument (doc, [i]) for i, doc in enumerate(df['token'])]
model = Doc2Vec(documents, vector_size=100, window=3, epochs=10, min_count=0, workers=4)
inferred_doc_vec = model.infer_vector(df['token'][0])
most_similar_docs = model.docvecs.most_similar([inferred_doc_vec], topn=10)
for index, similarity in most_similar_docs:
print(f'{index}, similarity: {similarity}')
print(documents[index])
index = []
similarity = []
for i in range(0,10):
index.append(most_similar_docs[i][0])
similarity.append(most_similar_docs[i][1])
# definition for applying recommendation feature through Django
def content_recommendation(int):
df = pd.read_csv('top100_kdrama_ko.csv')
mecab = MeCab.Tagger("-Owakati")
mecab.parse("kill bill").split()
test = mecab.parse(df['Synopsis'][0]).split()
df['token'] = 0
for i in range(0, len(df['Genre'])):
df['token'][i] = mecab.parse(df['Genre'][i]).split()
df['token'][i].extend(mecab.parse(df['Tags'][i]).split())
list1 = [',','.','s',"'",'"','-','…','(',')','년']
for j in list1:
for i in range(0, len(df['token'])):
while j in df['token'][i]:
df['token'][i].remove(j)
documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(df['token'])]
model = Doc2Vec(documents, vector_size=100, window=3, epochs=10, min_count=0, workers=4)
inferred_doc_vec = model.infer_vector(df['token'][int])
most_similar_docs = model.docvecs.most_similar([inferred_doc_vec], topn=10)
for index, similarity in most_similar_docs:
print(f'{index}, similarity: {similarity}')
print(documents[index])
index = []
similarity = []
for i in range(0, 10):
index.append(most_similar_docs[i][0])
similarity.append(most_similar_docs[i][1])
return index, similarity
가장 단순한 컨텐츠 기반 필터링으로 추천시스템을 구성했기 때문에, 필터버블현상이 생길 수 있다.
또한 유저들의 평가 데이터에 의한 추천 시스템이 아니기 때문에, 실제로 구매를 많이 하는(인기가 많은) 컨텐츠인지 아닌지 유저의 입장에서는 알 수가 없다.
Cold Start 현상, 유저가 한국 드라마를 처음 접한다고 할때, 추천해줄 수 있는 데이터가 없다. 적어도 한가지 이상은 시청한 이력이 있고, 그 이력을 데이터로 입력을 해줘야 추천해 줄 수 있다.
현재는 유저의 평가 데이터가 없는 데이터 셋이기 때문에, 직접 데이터를 만들어서 보완할 계획이다. 풍부한 데이터를 만들긴 힘들겠지만 기능을 구현해본다는 것에 의의를 두고 진행할 계획.
현재 가장 좋은 평가를 받고 있는 딥러닝을 이용한 neural collaborative filtering
을 사용하여 구현하기.
만에하나 구현하지 못한다고 하더라도 논문은 읽어볼 계획이다.
이번 황금 주말을 잘 이용해서 계획했던 개인 프로젝트를 진행해보자. + apply
자세한 코드
https://github.com/attabooi/til/blob/main/ml/content-based-filtering.md