基于用户喜爱生成推荐电影

基于用户喜爱生成推荐电影

目录

  • 基于用户喜爱生成推荐电影
    • 集合说明
    • 代码描述
    • 代码
    • 总结


集合说明

用户集:该集合是通过代码生成
电影集:kaggle.com上面的数据集,filmtv_movies - ENG.csv

该推荐代码主要通过pandas处理,学会灵活运用Dataframe是处理csv文件的关键


代码描述

用户名随机生成,用户数据随机生成user列表[‘name’,‘sex’,‘age’,‘movie…’]
先生成用户集,然后通过用户观看的电影进行分析,得出通过相同类型高分电影推荐,可扩展相同演员,导演等喜爱因素,然后区分用户年龄层,用户性别等因素再进行分析。


代码

import datetime
import random
import pandas as pd

#数据预处理
film_url = "filmtv_movies - ENG.csv"
df = pd.read_csv(film_url, usecols=[i for i in range(0, 10)])
df = df.dropna(how="any")

# 随机生成用户名
def random_name():
    # 删减部分,比较大众化姓氏
    firstName = "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻水云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳鲍史唐费岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅卞齐康伍余元卜顾孟平" \
                "黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计成戴宋茅庞熊纪舒屈项祝董粱杜阮席季麻强贾路娄危江童颜郭梅盛林刁钟徐邱骆高夏蔡田胡凌霍万柯卢莫房缪干解应宗丁宣邓郁单杭洪包诸左石崔吉" \
                "龚程邢滑裴陆荣翁荀羊甄家封芮储靳邴松井富乌焦巴弓牧隗山谷车侯伊宁仇祖武符刘景詹束龙叶幸司韶黎乔苍双闻莘劳逄姬冉宰桂牛寿通边燕冀尚农温庄晏瞿茹习鱼容向古戈终居衡步都耿满弘国文东殴沃曾关红游盖益桓公晋楚闫"
    # 百家姓中双姓氏
    firstName2 = "万俟司马上官欧阳夏侯诸葛闻人东方赫连皇甫尉迟公羊澹台公冶宗政濮阳淳于单于太叔申屠公孙仲孙轩辕令狐钟离宇文长孙慕容鲜于闾丘司徒司空亓官司寇仉督子颛孙端木巫马公西漆雕乐正壤驷公" \
                 "良拓跋夹谷宰父谷梁段干百里东郭南门呼延羊舌微生梁丘左丘东门西门南宫南宫 "
    # 女孩名字
    girl = '秀娟英华慧巧美娜静淑惠珠翠雅芝玉萍红娥玲芬芳燕彩春菊兰凤洁梅琳素云莲真环雪荣爱妹霞香月莺媛艳瑞凡佳嘉琼勤珍贞莉桂娣叶璧璐娅琦晶妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶怡婵雁蓓纨仪' \
           '荷丹蓉眉君琴蕊薇菁梦岚苑婕馨瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育滢馥筠柔竹霭凝晓欢霄枫芸菲寒伊亚宜可姬舒影荔枝思丽'
    # 男孩名字
    boy = '伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰' \
          '朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘'
    # 名
    name = '中笑贝凯歌易仁器义礼智信友上都卡被好无九加电金马钰玉忠孝'
    # 10%的机遇生成双数姓氏
    if random.choice(range(100)) > 10:
        firstName_name = firstName[random.choice(range(len(firstName)))]
    else:
        i = random.choice(range(len(firstName2)))
        firstName_name = firstName2[i:i + 2]

    # 生成年龄(18,60)
    age = random.choice(range(18, 61))
    # 生成性别
    sex = random.choice(range(2))
    name_1 = ""
    # 生成并返回一个名字
    if sex > 0:
        girl_name = girl[random.choice(range(len(girl)))]
        if random.choice(range(2)) > 0:
            name_1 = name[random.choice(range(len(name)))]
        return firstName_name + name_1 + girl_name + ",女," + str(age)
    else:
        boy_name = boy[random.choice(range(len(boy)))]
        if random.choice(range(2)) > 0:
            name_1 = name[random.choice(range(len(name)))]
        return firstName_name + name_1 + boy_name + ",男," + str(age)

# 用户喜爱电影生成
def random_movie():
    # 上限10个电影
    movie = ""
    ran = random.randint(2, 10)
    for i in range(1, ran):
        # print("shape:"+str(df["title"].shape))
        dfm = df["title"].reset_index(drop=True)
        movie += dfm[random.randint(0, df["title"].shape[0] - 1)]
        if i != ran - 1:
            movie += ","
    return movie

# 用户数据生成 随机
def date_user_creation():
    username = random_name()
    user_movie = random_movie()
    user = username + "," + user_movie
    # 分隔为列表
    user = user.split(",", -1)
    print("user:\n" + str(user))
    return user

# 根据用户喜爱电影推荐(该函数只实现了通过相同类型高分电影推荐,可扩展相同演员,导演等喜爱因素)
def according_to_preference(user):
    # 首先根据电影类型筛选
    user_movies = user[3:]
    user_movies_genre = set()
    for i in range(len(user_movies)):
        dfg = df[df["title"] == user_movies[i]]["genre"]
        dfg = pd.Series(dfg.values)
        for j in dfg:
            user_movies_genre.add(j)
    user_movies_genre = list(user_movies_genre)
    prefer_movie = pd.read_csv(film_url, nrows=0, usecols=[i for i in range(0, 10)])
    for item in user_movies_genre:
        prefer_movie = pd.concat([prefer_movie, df[df["genre"] == item]])
    prefer_movie = prefer_movie.sort_index()
    # 其次用年龄进一步拟合
    younger = datetime.date.today().year - 30
    older = datetime.date.today().year - 50
    age = int(user[2])
    # 自行设置喜爱规则,年轻人看年轻电影,老人不看年轻电影,中年人不看老电影
    if datetime.date.today().year - age > younger:
        prefer_movie = prefer_movie[prefer_movie["year"] > younger]
    elif datetime.date.today().year - age < older:
        prefer_movie = prefer_movie[prefer_movie["year"] < younger]
    else:
        prefer_movie = prefer_movie[prefer_movie["year"] > older]

    # 在这些电影名中挑选评分人数多的并且评分高的电影加入到一个大电影列表list中
    prefer_movie = prefer_movie[prefer_movie["avg_vote"] > 8.0]
    prefer_movie = prefer_movie[prefer_movie["votes"] > 50]

    # 最后在这些所有的推荐电影中,随机抽调与用户电影相同数量的电影量
    prefer_movie = prefer_movie.reset_index(drop=True)
    recommend_movie = set()
    while prefer_movie.shape[0] > 0:
        if len(recommend_movie) <= 5:
            ran = random.randint(0, prefer_movie.shape[0] - 1)
            recommend_movie.add(prefer_movie["title"][ran])
        else:
            break

    # 推荐电影不能包含用户已观看电影
    recommend_movie = list(recommend_movie - set(user_movies))
    print("recommend_movie:\n" + str(recommend_movie))

# 调用
if __name__ == '__main__':
    use = date_user_creation()
    according_to_preference(use)
# 用户采用的代码随机生成,电影数据采用.csv文件

总结

以上就是今天要讲的内容,本文仅仅简单使用了pandas以及介绍如何实现给用户推荐电影,有许多地方还可以改进

文章引用用户名生成代码链接 :点击此处
鸣谢作者 :heaven&earth

你可能感兴趣的:(数据分析,pandas,算法)