计算机毕业设计python+spark+hive动漫推荐系统 漫画推荐系统 漫画分析可视化大屏 漫画爬虫 漫画推荐系统 漫画爬虫 知识图谱 大数据毕设

课题名称

基于hadoop+spark的漫画推荐与可视化系统

课题类型

设计

课题性质

结合实际

课题来源

自拟

横、纵向项目名称

项目编号

项目来源

导师姓名

黄亮

职称

有否科研背景

有否实际工程背景

所在单位

数学与计算机学院

所学专业

上机时数

384(小时)

目的要求

  • 数据处理和分析:利用Hadoop和Spark的大数据处理能力,对大量的漫画数据进行处理和分析,包括用户行为数据、漫画内容数据等,以提取有用的信息。
  • 用户行为分析:通过对用户行为数据的分析,包括浏览、收藏、评价、分享等,挖掘用户的兴趣和需求,为推荐系统提供依据。
  • 漫画数据分析:对漫画内容进行深度分析,以提取其特征和关键信息,为推荐和可视化提供支持。
  • 推荐系统:基于用户行为分析和漫画内容分析的结果,构建一个高效的推荐系统,向用户推荐他们可能感兴趣的漫画作品。
  • 可视化系统:通过可视化的方式,将处理和分析的结果展示出来,包括用户行为分析结果、漫画内容分析结果等,以帮助用户更好地理解和分析数据。
  • 实时推荐:利用Spark的实时处理能力,实现实时推荐,能够及时向用户推荐他们可能感兴趣的漫画作品。
  • 性能优化:在整个系统的设计和实现过程中,需要考虑性能的优化,包括数据处理速度、推荐准确率、系统响应时间等。
  • 隐私保护:对用户数据进行脱敏处理,保护用户隐私。
  • 系统可扩展性:在设计时考虑系统的可扩展性,以便在未来的需求变化或数据增长时能够灵活地扩展系统。
  • 安全性:确保系统的安全性,包括数据安全、系统安全和用户隐私保护等方面。

主要内容

  • 前台系统:漫画推荐(提供四种算法模型分别实现,协同过滤算法的基于用户+基于物品、神经网络混合推荐算法、SVD)、漫画视频流量预测(卷积神经网络/线性回归算法进行预测)、漫画视频查询、漫画视频在线观看、模拟VIP充值观看(支付宝沙箱支付)、通过短信验证码修改密码、LSTM情感分析模型分析用户评论等;
  • 后台系统:用户管理、漫画视频管理、评论管理、订单管理、日志管理、权限管理、视频知识图谱(neo4j图数据库实现)等;
  • 可视化大屏系统:热门漫画视频分类、热门漫画话题饼图、漫画分享量Top10、每日漫画视频播放量折线图、漫画词云、漫画投币量排行榜等;
  • 爬虫:Python的selenium框架采集B站/知音漫客的漫画视频、评论等数据集;

预期

目标

(一)Selenium自动化Python爬虫工具采集漫画视频等约10万条存入.csv文件作为数据集;

(二)使用pandas+numpy或MapReduce对数据进行数据清洗,生成最终的.csv文件并上传到hdfs;

(三)使用hive数仓技术建表建库,导入.csv数据集;

(四)离线分析采用hive_sql完成,实时分析利用Spark之Scala完成;

(五)统计指标使用sqoop导入mysql数据库;

(六)使用Flask+echarts进行可视化大屏开发;

(七)使用机器学习、深度学习的算法进行个性化漫画视频推荐;

(八)使用卷积神经网络KNN、CNN实现漫画视频流量预测;

(九)搭建springboot+vue.js前后端分离web系统进行个性化推荐界面、漫画视频流量预测界面、知识图谱等实现;

教研室审查小组意见

本课题能否满足综合训练学生的教学要求

课题中有无基本工程训练内容,份量多大(限于理工专业)

本课题的要求、任务、内容是否明确、具体

进行本课题现有实施条件是否具备

工作量是否饱满,课题难度是否适中

进行本课题尚缺的条件本单位能否解决

对本课题的评审结论:

教研室主任(签字):

20   年  月  日

院系审定意见

院长(系主任)(签字):

                                           20   年  月  日

核心算法代码分享如下:

# coding=utf-8
# 基于物品的协同过滤推荐

import random
import sys

import math
from operator import itemgetter

import pymysql
from rate import Rate
import db

"""
"""
class ItemBasedCF():
    # 初始化参数
    def __init__(self):
        self.n_sim_movie = 8
        self.n_rec_movie = 4

        self.trainSet = {}
        self.testSet = {}

        self.movie_sim_matrix = {}
        self.movie_popular = {}
        self.movie_count = 0

        print('Similar movie number = %d' % self.n_sim_movie)
        print('Recommneded movie number = %d' % self.n_rec_movie)

    def get_dataset(self, pivot=0.75):
        trainSet_len = 0
        testSet_len = 0
        # sql = ' select * from tb_rate'
        results = db.session.query(Rate).all()
        # print(results)
        for item in results:
            user, movie, rating = item.uid, item.iid, item.rate
            self.trainSet.setdefault(user, {})
            self.trainSet[user][movie] = rating
            trainSet_len += 1
            self.testSet.setdefault(user, {})
            self.testSet[user][movie] = rating
            testSet_len += 1
        # cnn.close()
        # db.session.close()

        print('Split trainingSet and testSet success!')
        print('TrainSet = %s' % trainSet_len)
        print('TestSet = %s' % testSet_len)

    # 读文件,返回文件的每一行
    def load_file(self, filename):
        with open(filename, 'r') as f:
            for i, line in enumerate(f):
                if i == 0:  # 去掉文件第一行的title
                    continue
                yield line.strip('\r\n')
        print('Load %s success!' % filename)

    # 计算电影之间的相似度
    def calc_movie_sim(self):
        for user, movies in self.trainSet.items():
            for movie in movies:
                if movie not in self.movie_popular:
                    self.movie_popular[movie] = 0
                self.movie_popular[movie] += 1

        self.movie_count = len(self.movie_popular)
        print("Total movie number = %d" % self.movie_count)

        for user, movies in self.trainSet.items():
            for m1 in movies:
                for m2 in movies:
                    if m1 == m2:
                        continue
                    self.movie_sim_matrix.setdefault(m1, {})
                    self.movie_sim_matrix[m1].setdefault(m2, 0)
                    self.movie_sim_matrix[m1][m2] += 1
        print("Build co-rated users matrix success!")

        # 计算电影之间的相似性 similarity matrix
        print("Calculating movie similarity matrix ...")
        for m1, related_movies in self.movie_sim_matrix.items():
            for m2, count in related_movies.items():
                # 注意0向量的处理,即某电影的用户数为0
                if self.movie_popular[m1] == 0 or self.movie_popular[m2] == 0:
                    self.movie_sim_matrix[m1][m2] = 0
                else:
                    self.movie_sim_matrix[m1][m2] = count / math.sqrt(self.movie_popular[m1] * self.movie_popular[m2])
        print('Calculate movie similarity matrix success!')

    # 针对目标用户U,找到K部相似的电影,并推荐其N部电影
    def recommend(self, user):
        K = self.n_sim_movie
        N = self.n_rec_movie
        rank = {}
        if user > len(self.trainSet):
            user = random.randint(1, len(self.trainSet))
        watched_movies = self.trainSet[user]

        for movie, rating in watched_movies.items():
            for related_movie, w in sorted(self.movie_sim_matrix[movie].items(), key=itemgetter(1), reverse=True)[:K]:
                if related_movie in watched_movies:
                    continue
                rank.setdefault(related_movie, 0)
                rank[related_movie] += w * float(rating)
        return sorted(rank.items(), key=itemgetter(1), reverse=True)[:N]

    # 产生推荐并通过准确率、召回率和覆盖率进行评估
    def evaluate(self):
        print('Evaluating start ...')
        N = self.n_rec_movie
        # 准确率和召回率
        hit = 0
        rec_count = 0
        test_count = 0
        # 覆盖率
        all_rec_movies = set()

        for i, user in enumerate(self.trainSet):
            test_moives = self.testSet.get(user, {})
            rec_movies = self.recommend(user)
            for movie, w in rec_movies:
                if movie in test_moives:
                    hit += 1
                all_rec_movies.add(movie)
            rec_count += N
            test_count += len(test_moives)

        precision = hit / (1.0 * rec_count)
        recall = hit / (1.0 * test_count)
        coverage = len(all_rec_movies) / (1.0 * self.movie_count)
        print('precisioin=%.4f\trecall=%.4f\tcoverage=%.4f' % (precision, recall, coverage))

    def rec_one(self,userId):
        print('推荐一个')
        rec_movies = self.recommend(userId)
        # print(rec_movies)
        return rec_movies

# 推荐算法接口
def recommend(userId):
    itemCF = ItemBasedCF()
    itemCF.get_dataset()
    itemCF.calc_movie_sim()
    reclist = []
    recs = itemCF.rec_one(userId)
    return recs

if __name__ == '__main__':
    param1 = sys.argv[1]
    # param1 = "1"
    result = recommend(int(param1))
    list = []
    for r in result:
        list.append(dict(iid=r[0], rate=r[1]))
    print(list)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

B站计算机毕业设计1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值