基于大数据的豆瓣电影用户行为与市场趋势分析系统 【python、Hadoop、spark、数据可视化、高分毕设项目、python项目、vue前端、课程毕设】

47 阅读6分钟

💖💖作者:计算机毕业设计小途 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目

@TOC

基于大数据的豆瓣电影用户行为与市场趋势分析系统介绍

《基于大数据的豆瓣电影用户行为与市场趋势分析系统》是一个集数据处理、分析与可视化于一体的综合性数据平台,旨在深度挖掘豆瓣电影海量数据背后隐藏的用户行为模式与市场动态。在整体技术架构上,系统以后端分离模式为基础,巧妙地融合了当前主流的大数据与Web技术栈。其核心数据处理层采用了Hadoop作为分布式文件系统(HDFS)的基石,用以支撑海量电影与用户评论数据的可靠存储,并在此之上利用Apache Spark作为核心计算引擎,通过其强大的内存计算能力以及Spark SQL模块,对结构化数据进行高效的ETL(抽取、转换、加载)与交互式查询分析。后端服务层支持Java和Python两种主流技术栈,分别提供了基于Spring Boot框架和Django框架的实现版本,负责处理所有业务逻辑并提供标准化的API接口。前端界面则采用Vue.js框架构建现代化单页面应用(SPA),结合ElementUI组件库实现了美观统一且交互友好的用户界面,并通过强大的Echarts图表库,将复杂的数据分析结果,例如基于文本挖掘的评论情感分析、动态市场热度趋势、电影基础特征统计、质量与市场表现关联性、基于算法的用户聚类分布以及用户评分行为模式等,转化为直观易懂的动态可视化图表。系统不仅包含了基础的用户信息管理功能,更通过这七大核心分析模块,完整地展示了从数据采集、存储、清洗、分析到最终结果呈现的全流程,构成一个能够全面展现大数据技术在垂直领域应用潜力的毕业设计典范。

基于大数据的豆瓣电影用户行为与市场趋势分析系统演示视频

演示视频

基于大数据的豆瓣电影用户行为与市场趋势分析系统演示图片

电影基础特征分析.png

评论情感分析.png

市场热度分析.png

数据大屏上.png

数据大屏下.png

用户聚类分析.png

用户评分行为分析.png

质量市场表现分析.png

基于大数据的豆瓣电影用户行为与市场趋势分析系统代码展示

SparkSession spark = SparkSession.builder()
    .appName("DoubanMovieAnalysisSystem")
    .master("local[*]") // 在实际部署时应配置为YARN或Spark Standalone集群地址
    .getOrCreate();
// 评论情感分析核心处理函数
public List<Map<String, Object>> analyzeCommentSentiment(String movieCommentsPath) {
    // 1. 从HDFS加载评论数据集
    Dataset<Row> commentsDF = spark.read().option("header", "true").csv(movieCommentsPath);
    // 2. 定义一个简易的情感词典(实际项目中会更复杂)
    List<String> positiveWords = Arrays.asList("喜欢", "好看", "推荐", "精彩", "感动", "神作", "不错");
    List<String> negativeWords = Arrays.asList("难看", "垃圾", "失望", "烂片", "无聊", "尴尬", "不行");
    // 3. 注册一个UDF (User Defined Function) 来判断情感倾向
    spark.udf().register("calculateSentiment", (String comment) -> {
        if (comment == null) return "中性";
        long positiveCount = positiveWords.stream().filter(comment::contains).count();
        long negativeCount = negativeWords.stream().filter(comment::contains).count();
        if (positiveCount > negativeCount) return "正面";
        if (negativeCount > positiveCount) return "负面";
        return "中性";
    }, DataTypes.StringType);
    // 4. 应用UDF生成新的情感标签列
    Dataset<Row> sentimentDF = commentsDF.withColumn("sentiment", callUDF("calculateSentiment", col("comment")));
    // 5. 按电影ID和情感标签进行分组计数
    Dataset<Row> resultDF = sentimentDF.groupBy("movie_id", "sentiment").count();
    // 6. 将结果收集为List<Map>格式,方便前端序列化为JSON
    List<Map<String, Object>> resultList = resultDF.toJSON().collectAsList().stream().map(jsonString -> {
        try {
            return new ObjectMapper().readValue(jsonString, new TypeReference<Map<String, Object>>(){});
        } catch (Exception e) {
            return new HashMap<String, Object>();
        }
    }).collect(Collectors.toList());
    return resultList;
}
// 市场热度分析核心处理函数
public List<Map<String, Object>> analyzeMarketHeat(String movieDataPath) {
    // 1. 从HDFS加载电影基础数据集
    Dataset<Row> moviesDF = spark.read().option("header", "true").csv(movieDataPath);
    // 2. 数据预处理,提取上映年份,并将评分转为数值类型
    Dataset<Row> processedDF = moviesDF.withColumn("year", year(to_date(col("release_date"))))
                                       .withColumn("rating_double", col("rating").cast(DataTypes.DoubleType))
                                       .filter(col("year").isNotNull());
    // 3. 按年份进行分组
    RelationalGroupedDataset groupedByYear = processedDF.groupBy("year");
    // 4. 对每个年份进行聚合计算:电影总数、平均评分、总评论数
    Dataset<Row> heatAnalysisDF = groupedByYear.agg(
        count("movie_id").as("movie_count"),
        avg("rating_double").as("average_rating"),
        sum("comment_count").as("total_comments")
    );
    // 5. 对结果进行格式化,将平均分保留两位小数
    Dataset<Row> formattedDF = heatAnalysisDF.withColumn("average_rating", format_number(col("average_rating"), 2));
    // 6. 按年份升序排序
    Dataset<Row> sortedDF = formattedDF.orderBy(col("year").asc());
    // 7. 收集结果并转换为便于前端处理的格式
    List<Map<String, Object>> resultList = sortedDF.toJSON().collectAsList().stream().map(jsonString -> {
        try {
            return new ObjectMapper().readValue(jsonString, new TypeReference<Map<String, Object>>(){});
        } catch (Exception e) {
            return new HashMap<String, Object>();
        }
    }).collect(Collectors.toList());
    return resultList;
}
// 用户聚类分析核心处理函数
public List<Map<String, Object>> performUserClustering(String userRatingsPath) {
    // 1. 从HDFS加载用户评分数据
    Dataset<Row> ratingsDF = spark.read().option("header", "true").csv(userRatingsPath);
    // 2. 数据类型转换
    Dataset<Row> typedRatingsDF = ratingsDF.withColumn("user_id_numeric", col("user_id").cast(DataTypes.DoubleType))
                                           .withColumn("movie_id_numeric", col("movie_id").cast(DataTypes.DoubleType))
                                           .withColumn("rating_numeric", col("rating").cast(DataTypes.DoubleType));
    // 3. 为了聚类,我们需要为每个用户创建一个特征向量。这里简化为使用用户的平均评分和评分次数作为特征
    Dataset<Row> userFeaturesDF = typedRatingsDF.groupBy("user_id_numeric")
        .agg(
            avg("rating_numeric").as("avg_rating"),
            count("movie_id_numeric").as("rating_count")
        ).na().fill(0); // 对空值进行填充
    // 4. 使用VectorAssembler将多个特征列合并为单一的特征向量列
    VectorAssembler assembler = new VectorAssembler()
        .setInputCols(new String[]{"avg_rating", "rating_count"})
        .setOutputCol("features");
    Dataset<Row> assembledDF = assembler.transform(userFeaturesDF);
    // 5. 初始化KMeans模型,设定聚类数量为3
    KMeans kmeans = new KMeans().setK(3).setSeed(1L).setFeaturesCol("features").setPredictionCol("cluster_id");
    // 6. 训练模型
    KMeansModel model = kmeans.fit(assembledDF);
    // 7. 使用训练好的模型对用户进行预测(即打上簇标签)
    Dataset<Row> predictions = model.transform(assembledDF);
    // 8. 选择需要的用户ID和对应的簇ID作为最终结果
    Dataset<Row> userClusterDF = predictions.select("user_id_numeric", "cluster_id");
    // 9. 将结果转换为List<Map>格式返回给前端
    List<Map<String, Object>> resultList = userClusterDF.toJSON().collectAsList().stream().map(jsonString -> {
        try {
            return new ObjectMapper().readValue(jsonString, new TypeReference<Map<String, Object>>(){});
        } catch (Exception e) {
            return new HashMap<String, Object>();
        }
    }).collect(Collectors.toList());
    return resultList;
}

基于大数据的豆瓣电影用户行为与市场趋势分析系统文档展示

文档.png

💖💖作者:计算机毕业设计小途 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目