영화 복제 시스템을 만들어 봤어요.
영화 검사 데이터 집합을 사용하여 필터를 강화하는 복사본 시스템을 만들었습니다.
상세한 코드는 GitHub,Google Colab를 참조하십시오.
합작 필터에 관해서는 이 사이트를 참고하였다.
사용된 데이터 세트 개요
MovieLens 이 사이트의 가장 용량이 가벼운 Movielens Latest Datasets를 사용했습니다.
ml-latest-small.zip을 해제하면 여러 파일이 확장되지만 다음 csv 두 개가 사용됩니다.
영화의 제목과 장르를 담은 무비스.csv.
이 열을 사용자 ID로 만들고, 색인을 영화 제목으로 지정합니다.
df = dataset.pivot_table(index='title', columns='userId', values='rating')
df.columns.name = None
df
성형 시 주의사항은 2가지입니다.
첫 번째 점은 팬더스의 pivot가 아니라 pivot입니다.테이블을 사용하는 점입니다.
pivt는 데이터를 종합할 수 없기 때문에 중복이 존재하는 경우, 완전히 같은 값이라도 오류로 통계할 수 없습니다.
두 번째는 DataFrame입니다.columns.name=None 처리입니다.
pivot_테이블로 데이터를 성형하면 다음과 같은 다중 인덱스가 되기 때문에 상기 처리를 통해 다중 인덱스를 해제합니다.
설명 정보
또 참고 사이트에서 사전형 데이터를 사용했기 때문에 리뷰가 없는 영화의 리뷰 값은 존재하지 않지만, 이 블로그처럼 DataFrame으로 데이터를 만들면 리뷰가 없는 영화의 리뷰 값은 낸으로 인식된다.
# .notnull() を使って NaN がないデータを抽出している
movie1 = dataset[dataset[person1].notnull()][person1].index
따라서 유사값을 계산할 때 NaN이 평가값에 있는 부분을 무시하는 처리가 추가되었다.또 심사치가 0.5~5.0과 크게 다르지 않아 여현 유사도를 사용하지 않았다.
자세한 내용은 아래 사이트를 참조하십시오.
유사도를 계산하는 함수를 만듭니다.
### 類似値の算定
def get_similairty(person1, person2, dataset):
# レートがNaNになっているものを除いた、指定した人の見た映画リスト
movie1 = dataset[dataset[person1].notnull()][person1].index
movie2 = dataset[dataset[person2].notnull()][person2].index
## 各映画とも見た人の集合
set_movie1 = set(movie1)
set_movie2 = set(movie2)
set_both = set_movie1.intersection(set_movie2)
if len(set_both)==0: #共通でみた映画がない場合は類似度を0とする
return 0
# 同じ映画のレビュー点の差の2乗を計算
# この数値が大きいほど「似ていない」と定義
distance = pow(dataset.loc[list(set_both)][person1] - dataset.loc[list(set_both)][person2], 2)
distance = distance.sum()
return 1/(1+np.sqrt(distance)) #各映画の似てなさの合計の逆比的な指標を返す
사용자 ID가 1인 사용자와 50명의 사용자의 유사한 값을 계산한 후 다음과 같다.# ユーザーは 1~610
get_similairty(1, 50, df)
출력0.12002728245132872
이 비슷한 값을 계산하는 함수를 사용하여 던전 함수를 만듭니다.
여기에도 검사 값이 Nan인 무시 처리가 추가됐다.
### レコメンド関数
def get_recommend(person, top_N, dataset):
#推薦度スコアを入れるための箱を作っておく
totals = {}
simSums = {}
# 自分以外のユーザのリストを取得してFor文を回す
# -> 各人との類似度、及び各人からの(まだ本人が見てない)映画の推薦スコアを計算するため
list_others = list(dataset)
list_others.remove(person)
for other in list_others:
# 本人以外が見た映画
other_movie = dataset[dataset[other].notnull()][other].index
set_other = set(other_movie) # 集合
# 本人が見た映画
self_movie = dataset[dataset[person].notnull()][person].index
set_self_movie = set(self_movie) # 集合
# 本人がまだ見たことが無い映画の集合を取得
set_new_movie = set_other.difference(set_self_movie)
# あるユーザと本人の類似度を計算(simは0~1の数字)
sim = get_similairty(person, other, dataset)
# (本人がまだ見たことがない)映画のリストでFor分を回す
for movie in set_new_movie:
# "類似度 x レビュー点数" を推薦度のスコアとして、全ユーザで積算する
totals.setdefault(movie,0)
totals[movie] += dataset[other][movie]*sim
# またユーザの類似度の積算値をとっておき、これで上記のスコアを除する
simSums.setdefault(movie,0)
simSums[movie] += sim
rankings = [(total/simSums[movie],movie) for movie, total in totals.items()]
rankings.sort()
rankings.reverse()
return [i[1] for i in rankings][:top_N]
사용자 ID가 12명의 사용자에게 5개의 평론을 출력한 영화는 다음과 같다.# ユーザーは 1~610
recommend_movie = get_recommend(12, 5, df)
pd.DataFrame(recommend_movie, columns=["RecommendMovie"])
이상은 끝까지 읽어주셔서 감사합니다.
참조 정보
평론 이론에 관하여 추천 시스템 알고리즘 이 PDF는 참고가 되었다.
Reference
이 문제에 관하여(영화 복제 시스템을 만들어 봤어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/megane_otoko/articles/020_recommend_movie텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)