[ 06/03 TIL ] 컨텐츠 기반 필터링 구현

JoonQpa·2022년 6월 3일
0

TIL

목록 보기
11/27
post-thumbnail

📌 구현 화면

📌 구현 방법

  • 100개의 한국 드라마의 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

profile
Intuition factory: from noob to pro

0개의 댓글