# 电影评论情感分析预测可视化系统 **Repository Path**: guangduan/movie-review-sentiment-analysis-prediction-visualization-and-recommendation-system ## Basic Information - **Project Name**: 电影评论情感分析预测可视化系统 - **Description**: 基于大数据技术电影评论情感分析预测可视化系统(基于机器学习的电影评论情感分析预测可视化系统),该系统基 Java 语言,运用Spring Boot 框架搭建后端架构,搭配MySQL 数据库,Scrapy爬取电影数据及用户影评(豆瓣电影网),经机器学习情感分析算法处理后,借助Hadoop大数据分析和Echarts 将复杂的情感倾向以直观的可视化图表呈现,协同算法推荐。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-18 - **Last Updated**: 2025-09-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: 电影评论情感分析预测可视化系统, SpringBoot, 机器学习, Hadoop-spark-hive, 大数据 ## README **Springboot影评情感分析可视化及推荐系统** **基于大数据技术电影评论情感分析预测可视化系统** **基于机器学习的电影评论情感分析预测可视化系统** ## 前言介绍 随着数字化娱乐的蓬勃发展,影评情感分析可视化及推荐系统应运而生,旨在为用户提供个性化、智能化的电影推荐与情感分析服务。该系统基于 Java 语言构建核心逻辑,运用 Spring Boot 框架搭建稳定高效的后端架构,搭配 MySQL 数据库实现数据的高效存储与管理。Scrapy 负责抓取海量电影数据及用户影评,经情感分析算法处理后,借助Hadoop大数据分析和Echarts 将复杂的情感倾向以直观的可视化图表呈现,助力用户快速把握影片口碑。 系统涵盖多维度模块:首页聚合热门推荐、新片速递;用户模块实现个性化账号管理与互动;电影信息模块详尽展示影片详情;影评信息模块汇聚用户观点碰撞;情感分析模块深度洞察评论情感;论坛分类与举报记录保障社区交流有序;互动交流促进用户思想共鸣;系统管理维护平台稳定运营;“我的”模块打造专属个性空间。各模块协同运作,为用户打造一站式电影娱乐生态,让观影决策更加明智愉悦。 本系统通过整合数据挖掘、机器学习及可视化技术,构建了一个涵盖用户管理、电影信息整合、影评情感分析、互动交流与智能推荐的多模块协同平台。 ## 01开发环境 1.1Java 技术 1.2Spring Boot 框架 1.3Hadoop,spark,hive 1.4Scrapy爬虫 1.5MySQL数据库 1.6B/S 结构 1.7Vue.js 技术 1.8随机森林回归算法和基于用户收藏的协同算法 ## 02系统功能模块 **亮点(爬虫【豆瓣电影网站】、机器学习(随机森林)、数据预测、Echarts可视化)** 1、电影数据管理:爬虫信息列表展示。 2、数据备份:进行mysql数据备份。 3、可视化分析:各种数据分析统计后报表大屏展示 4、情感分析预测:根据电影名称、评论人预测。 5、数据分析:根据hadoop大数据技术进行数据分析 ![输入图片说明](%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84%E5%9B%BEa.png) ## 03图片展示 ![输入图片说明](a.png) ![输入图片说明](b.png) ![输入图片说明](c.png) ![输入图片说明](d.png) ![输入图片说明](e.png) ![输入图片说明](f.png) ![输入图片说明](g.png) ![输入图片说明](h.png) ![输入图片说明](i.png) ## 05 部分代码展示 5.2 代码展示

/**
 *交流学习vx18484646674
 */
private Map<String, Object> forecastRes(Instances instances, Map<String, Object> params, String[] eigenValueArr, String[] targetValueArr) throws Exception {
       Map<String, Object> forecastRes = new HashMap<>();
       // 预测结果
       // 创建一个与训练数据集结构相同的 Instance
       double[] instanceValue = new double[instances.numAttributes()];
       int x = 0;
       for (String attr : eigenValueArr) {
           if (instances.attribute(attr).isNominal()) {
               // 对于名义属性,使用indexOfValue
               double res = instances.attribute(attr).indexOfValue(params.get(attr).toString());
               instanceValue[x++] = res == -1 ? instances.attribute(attr).indexOfValue("unknown") : res; // 如果值不存在,使用Double.NaN
           } else {
               // 对于数值属性,直接使用数值
               instanceValue[x++] = Double.parseDouble(params.get(attr).toString());
           }
       }
       for (String attr : targetValueArr) {
           instanceValue[x++] = Double.NaN;
       }

       Instance instance = new DenseInstance(1.0, instanceValue);
       instance.setDataset(instances);

       for (int i = 0; i < targetValueArr.length; i++) {
           // 设置类属性索引为当前目标属性
           instances.setClassIndex(instances.numAttributes() - targetValueArr.length + i);

           // 创建并训练随机森林模型
           RandomForest randomForest = new RandomForest();
           randomForest.buildClassifier(instances);

           // 为预测创建一个新的实例
           double[] instanceValueForPrediction = Arrays.copyOf(instanceValue, instanceValue.length);
           instanceValueForPrediction[instances.numAttributes() - targetValueArr.length + i] = Double.NaN; // 设置目标属性为缺失值

           Instance instanceForPrediction = new DenseInstance(1.0, instanceValueForPrediction);
           instanceForPrediction.setDataset(instances);

           // 进行预测
           double predictedValue = randomForest.classifyInstance(instanceForPrediction);
           if (instances.classAttribute().isNominal()) {
               // 如果是名义属性,获取预测的类别名称
               String predictedClassName = instances.classAttribute().value((int) predictedValue);
               forecastRes.put(targetValueArr[i], predictedClassName);
           } else {
               // 如果是数值属性,直接使用预测值
               DecimalFormat df = new DecimalFormat("#.00");
               double formattedPredictedValue = Double.parseDouble(df.format(predictedValue));
               forecastRes.put(targetValueArr[i], formattedPredictedValue);
           }
       }
       return forecastRes;
   }


/**
    * 协同算法(基于用户收藏的协同算法)
    */
   @RequestMapping("/autoSort2")
   public R autoSort2(@RequestParam Map<String, Object> params,MovieinfoEntity movieinfo, HttpServletRequest request){
       String userId = request.getSession().getAttribute("userId").toString();
       Integer limit = params.get("limit")==null?10:Integer.parseInt(params.get("limit").toString());
       List<StoreupEntity> storeups = storeupService.selectList(new EntityWrapper<StoreupEntity>().eq("type", 1).eq("tablename", "movieinfo"));
       Map<String, Map<String, Double>> ratings = new HashMap<>();
       if(storeups!=null && storeups.size()>0) {
           for(StoreupEntity storeup : storeups) {
               Map<String, Double> userRatings = null;
               if(ratings.containsKey(storeup.getUserid().toString())) {
                   userRatings = ratings.get(storeup.getUserid().toString());
               } else {
                   userRatings = new HashMap<>();
                   ratings.put(storeup.getUserid().toString(), userRatings);
               }

               if(userRatings.containsKey(storeup.getRefid().toString())) {
                   userRatings.put(storeup.getRefid().toString(), userRatings.get(storeup.getRefid().toString())+1.0);
               } else {
                   userRatings.put(storeup.getRefid().toString(), 1.0);
               }
           }
       }
       // 创建协同过滤对象
       UserBasedCollaborativeFiltering filter = new UserBasedCollaborativeFiltering(ratings);