django基于Spark的国漫推荐系统

**详细视频演示请联系博主

项目实现:










核心代码:

from pyspark.sql import SparkSession

from pyspark.ml.recommendation import ALS

from pyspark.ml.evaluation import RegressionEvaluator

from pyspark.sql.functions import col

class ComicRecommender:

def init (self):

self.spark = SparkSession.builder

.appName("ComicRecommendation")

.config("spark.executor.memory", "4g")

.getOrCreate()

复制代码
    # 加载数据
    self.ratings = self.spark.read.csv(
        "data/user_ratings.csv", 
        header=True, 
        inferSchema=True
    )
    self.comics = self.spark.read.csv(
        "data/comic_info.csv",
        header=True,
        inferSchema=True
    )
    
def preprocess(self):
    """数据预处理"""
    # 过滤无效评分
    self.ratings = self.ratings.filter((col("rating") >= 1) & (col("rating") <= 5))
    
    # 处理冷启动问题:添加默认评分
    popular_comics = self.ratings.groupBy("comic_id").count()
    avg_rating = self.ratings.groupBy().avg("rating").first()[0]
    
    default_ratings = popular_comics.filter(col("count") > 100) \
        .limit(100) \
        .withColumn("user_id", lit(0)) \
        .withColumn("rating", lit(avg_rating))
    
    self.ratings = self.ratings.union(default_ratings)

def train_model(self):
    """训练ALS模型"""
    # 划分训练集/测试集
    train, test = self.ratings.randomSplit([0.8, 0.2])
    
    # 配置ALS模型
    als = ALS(
        maxIter=10,
        regParam=0.01,
        userCol="user_id",
        itemCol="comic_id",
        ratingCol="rating",
        coldStartStrategy="drop"
    )
    
    # 训练模型
    self.model = als.fit(train)
    
    # 评估模型
    predictions = self.model.transform(test)
    evaluator = RegressionEvaluator(
        metricName="rmse", 
        labelCol="rating",
        predictionCol="prediction"
    )
    rmse = evaluator.evaluate(predictions)
    print(f"模型RMSE: {rmse}")
    
    return self.model

def generate_recommendations(self, user_id, num_recs=10):
    """为用户生成推荐"""
    # 创建用户DF
    user_df = self.spark.createDataFrame([(user_id,)], ["user_id"])
    
    # 获取推荐
    recs = self.model.recommendForUserSubset(user_df, num_recs)
    
    # 提取推荐结果
    rec_list = recs.select("recommendations").first()[0]
    
    # 关联漫画信息
    comic_ids = [row.comic_id for row in rec_list]
    comic_recs = self.comics.filter(col("id").isin(comic_ids))
    
    return comic_recs.toPandas().to_dict(orient="records")

def update_model(self, new_ratings):
    """增量更新模型"""
    # 将新评分添加到数据集
    new_df = self.spark.createDataFrame(new_ratings)
    self.ratings = self.ratings.union(new_df)
    
    # 重新训练模型
    self.train_model()
相关推荐
FYKJ_201010 小时前
springboot高考志愿填报推荐系统14332-计算机课程设计、毕业设计
javascript·spring boot·python·架构·django·课程设计·高考
我的xiaodoujiao11 小时前
Django 权限系统项目实战详细图文教程 3--系统登录功能实现
后端·python·django
我的xiaodoujiao12 小时前
Django 权限系统项目实战详细图文教程 4--系统登录功能实现 2
后端·python·django
2501_944521591 天前
Immer 跨端三方库仓颉适配全流程
python·eclipse·django
2501_948122631 天前
Qs 跨端三方库仓颉适配全流程
python·react native·django·tornado
星_离1 天前
《Ajax - 实战基础篇》
前端·ajax
磁场转动100万匹1 天前
Spark Core 核心原理:从 RDD 到分布式计算
大数据·分布式·spark
CS创新实验室2 天前
改了模型,数据库为什么能自动跟上?——Django 迁移(migrations)的底层
数据库·django·sqlite
李纲明2 天前
WordPress 结账页一直转圈不跳支付:AJAX、缓存排除、支付回调和 REST 怎么逐层核
运维·ajax·缓存·wordpress·woocommerce·devdiy·结账
weixin_BYSJ19872 天前
电竞先锋网站---附源码02032
java·vue.js·spring boot·python·django·tomcat·php