영화 복제 시스템을 만들어 봤어요.


영화 검사 데이터 집합을 사용하여 필터를 강화하는 복사본 시스템을 만들었습니다.
상세한 코드는 GitHub,Google Colab를 참조하십시오.
합작 필터에 관해서는 이 사이트를 참고하였다.
https://qiita.com/hik0107/items/96c483afd6fb2f077985

사용된 데이터 세트 개요


MovieLens 이 사이트의 가장 용량이 가벼운 Movielens Latest Datasets를 사용했습니다.
ml-latest-small.zip을 해제하면 여러 파일이 확장되지만 다음 csv 두 개가 사용됩니다.
영화의 제목과 장르를 담은 무비스.csv.
  • 회고 속도를 설명하는ratings.csv.그리고 평론의 값은 0.5~5.0이다.
  • 또한 두 csv 파일을 DataFrame으로 변환하여 movieid 표시줄에 통합하면 필요한 사용자(정확히 말하면 데이터 집합에서 사용자가 엄폐 처리를 했기 때문에 사용자 ID)는 영화의 제목과 댓글의 속도만 추출하여 다음과 같은 데이터를 생성한다.

    이 열을 사용자 ID로 만들고, 색인을 영화 제목으로 지정합니다.
    df = dataset.pivot_table(index='title', columns='userId', values='rating')
    df.columns.name = None
    df
    

    성형 시 주의사항은 2가지입니다.
    첫 번째 점은 팬더스의 pivot가 아니라 pivot입니다.테이블을 사용하는 점입니다.
    pivt는 데이터를 종합할 수 없기 때문에 중복이 존재하는 경우, 완전히 같은 값이라도 오류로 통계할 수 없습니다.
    http://ynomura.dip.jp/archives/2019/03/pandaspivotpivo.html
    두 번째는 DataFrame입니다.columns.name=None 처리입니다.
    pivot_테이블로 데이터를 성형하면 다음과 같은 다중 인덱스가 되기 때문에 상기 처리를 통해 다중 인덱스를 해제합니다.

    http://ynomura.dip.jp/archives/2019/03/pandasmeltpivot.html

    설명 정보


    또 참고 사이트에서 사전형 데이터를 사용했기 때문에 리뷰가 없는 영화의 리뷰 값은 존재하지 않지만, 이 블로그처럼 DataFrame으로 데이터를 만들면 리뷰가 없는 영화의 리뷰 값은 낸으로 인식된다.
    # .notnull() を使って NaN がないデータを抽出している
    movie1 = dataset[dataset[person1].notnull()][person1].index
    
    따라서 유사값을 계산할 때 NaN이 평가값에 있는 부분을 무시하는 처리가 추가되었다.
    또 심사치가 0.5~5.0과 크게 다르지 않아 여현 유사도를 사용하지 않았다.
    자세한 내용은 아래 사이트를 참조하십시오.
    https://qiita.com/Qiitaman/items/fa393d93ce8e61a857b1
    https://qiita.com/michi_wkwk/items/613034b1ec52b6be4720
    유사도를 계산하는 함수를 만듭니다.
    ### 類似値の算定
    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는 참고가 되었다.

    좋은 웹페이지 즐겨찾기