# 电影评论情感分析预测可视化系统 **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大数据技术进行数据分析  ## 03图片展示          ## 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);