- CSS 38.5%
- Python 35%
- HTML 20.1%
- JavaScript 5.7%
- Batchfile 0.7%
| .idea | ||
| .trae/documents | ||
| .wdm | ||
| __pycache__ | ||
| data | ||
| models | ||
| output/charts | ||
| sql | ||
| src | ||
| web | ||
| config.py | ||
| crawl_20000.py | ||
| current_login.png | ||
| current_login2.png | ||
| generate_sample_data.py | ||
| README.md | ||
| real_spider.py | ||
| requirements.txt | ||
| requirements_real.txt | ||
| review_test_output.txt | ||
| run_all.py | ||
| run_spider.py | ||
| test_real_review_result.txt | ||
| test_spider.py | ||
| 启动.bat | ||
| 爬取20000条.bat | ||
| 爬取真实数据.bat | ||
| 真实数据爬取说明.md | ||
| 运行代码 | ||
基于豆瓣影评情感特征与多维度属性的电影评分预测与可视化系统
本科毕业设计项目 · 数据科学与大数据技术专业
完整链路:数据爬取 → 情感特征提取 → 多特征融合 → 评分预测 → 可视化展示
一、项目介绍
本项目自主爬取豆瓣电影公开页面的影片元数据与用户影评数据,以评论文本为核心提取情感维度特征,同时融合电影导演、类型、上映时间、制片地区、片长等多维度元数据特征,构建机器学习回归模型(线性回归、随机森林、XGBoost),实现电影评分的定量预测,并搭建 Web 可视化交互面板对数据分布、情感特征、模型效果、预测结果进行多维度展示。
差异化亮点
- 自主爬取数据:核心数据源通过爬虫从豆瓣电影公开页面获取,禁止使用现成数据集
- 情感特征与多维度属性融合驱动评分预测:区别于纯可视化、纯情感分析类项目
- 完整链路闭环:从数据采集到可视化展示的全流程自主实现
二、技术栈
| 模块 | 技术 |
|---|---|
| 开发语言 | Python 3.10 |
| 数据爬取 | requests + BeautifulSoup4 + fake_useragent |
| 数据处理 | Pandas、NumPy |
| 文本与情感 | jieba 分词、中文停用词过滤、TF-IDF、Boson/知网情感词典(禁止调用大模型 API) |
| 机器学习 | scikit-learn + XGBoost(线性回归/随机森林/XGBoost 三模型对比) |
| 评估指标 | MAE、MSE、RMSE、决定系数 R² |
| 数据存储 | CSV 文件(默认)/ MySQL(可选扩展) |
| Web 后端 | Python 标准库 http.server(ThreadingHTTPServer 多线程) |
| 前端可视化 | HTML + ECharts |
| 模型持久化 | joblib |
三、环境配置步骤
1. Python 环境
要求 Python 3.8+(推荐 3.10)。安装依赖:
cd movie-rating-prediction
pip install -r requirements.txt
2. 数据存储说明
系统默认采用 CSV 文件存储,开箱即用,无需安装数据库。所有数据文件位于 data/ 目录下:
| 目录 | 内容 |
|---|---|
data/raw/ |
爬虫原始数据(movies_raw.csv, reviews_raw.csv) |
data/processed/ |
清洗与特征融合后的数据 |
data/dict/ |
情感词典与停用词表 |
data/users.csv |
用户账号数据 |
(可选)启用 MySQL 数据库:如需使用数据库存储,可按以下步骤配置:
(1) 安装 MySQL:下载安装 MySQL 8.0(官网),记住 root 密码。
(2) 创建数据库:执行项目根目录下的建表脚本
mysql -u root -p < sql/create_tables.sql
该脚本会自动创建 douban_movie 数据库及 3 张核心表(movie_meta、movie_reviews、movie_features)。
(3) 修改配置:打开 config.py,将 ENABLE_DB 设为 True,并修改 DB_CONFIG 中的密码为本机 MySQL 密码:
ENABLE_DB = True # 启用 MySQL 数据库
DB_CONFIG = {
"host": "localhost",
"port": 3306,
"user": "root",
"password": "your_password", # 改为本机 MySQL 密码
"database": "douban_movie",
"charset": "utf8mb4",
}
说明:系统默认
ENABLE_DB = False,仅使用 CSV 存储,全流程即可正常运行。MySQL 作为可选扩展,启用后数据会同时写入数据库和 CSV 备份。
3. 词典资源
项目已内置 data/dict/ 下的停用词表与情感词典(正向/负向/程度副词/否定词),无需额外下载。如需扩展词典,可直接编辑对应文件。
四、爬虫启动与配置说明
爬虫模块位于 src/spider/,含反爬、重试、断点续爬机制。
配置项
在 config.py 的 SPIDER_CONFIG 中修改:
SPIDER_CONFIG = {
"movie_count": 200, # 爬取电影数量(TOP200)
"reviews_per_movie": 200, # 每部电影评论数
"delay_min": 2.0, # 请求最小延时(秒)
"delay_max": 4.0, # 请求最大延时(秒)
"movie_delay": 5.0, # 单部电影完成后额外延时
"retry_max": 3, # 失败重试次数
}
合规声明
本爬虫仅用于本科毕业设计学习研究,遵守豆瓣 robots 协议,已内置随机延时与请求头伪装,禁止用于大规模商用爬取。
单独运行爬虫
# 爬电影元数据
python -m src.spider.movie_spider
# 爬影评(需先完成电影爬取)
python -m src.spider.review_spider
支持断点续爬:中断后再次运行会自动跳过已爬取的电影(进度记录于 data/raw/spider_progress.json)。
五、模型训练步骤
一键执行全流程
python run_all.py
该脚本按顺序执行:爬虫 → 数据清洗 → 情感提取 → 特征工程 → 模型训练。
分步执行
# 跳过爬虫(已有数据时)
python run_all.py --skip-spider
# 仅指定爬取数量
python run_all.py --movie-count 50
# 仅执行训练(步骤5)
python run_all.py --steps 5
训练完成后产出:
models/best_model.pkl:最优评分预测模型models/feature_scaler.pkl:特征标准化处理器models/feature_columns.pkl:特征列名(预测对齐用)models/model_compare.csv:多模型评估指标对比
六、Web 系统启动步骤
python web/app.py
浏览器访问:http://127.0.0.1:5000
5 个可视化看板
- 数据概览:核心指标卡片 + 评分分布直方图 + 类型 TOP10 + 年份趋势 + 地区分布饼图
- 情感分析:情感倾向分布饼图 + 评分-情感散点图 + 高频情感词云 + 类型情感对比
- 模型效果:三模型指标对比 + 预测vs真实对比 + 特征重要性 + 残差分布
- 预测交互:表单输入电影参数与影评,实时返回预测评分与情感特征
- 榜单分析:真实评分/预测评分/情感正向度 TOP10,支持类型与年份筛选
七、功能模块说明
movie-rating-prediction/
├── README.md # 项目说明文档
├── requirements.txt # 依赖库清单
├── run_all.py # 一键执行脚本
├── config.py # 全局配置(数据库/爬虫/模型超参)
├── data/
│ ├── raw/ # 爬虫原始数据 CSV 备份
│ ├── processed/ # 清洗、特征融合中间数据
│ └── dict/ # 停用词表、情感词典
├── src/
│ ├── spider/ # 模块1:豆瓣爬虫
│ │ ├── movie_spider.py # 电影元数据爬虫
│ │ ├── review_spider.py # 影评数据爬虫
│ │ └── spider_utils.py # 爬虫工具(请求头/延时/重试/断点)
│ ├── data_process/ # 模块2:数据预处理与数据库交互
│ │ ├── data_clean.py # 原始数据清洗与规范化
│ │ └── db_operator.py # MySQL 可选扩展接口(默认 CSV 存储)
│ ├── sentiment/ # 模块3:影评情感特征提取
│ │ ├── text_preprocess.py # 影评分词、去停用词
│ │ └── sentiment_calc.py # 情感得分计算 + 电影维度聚合
│ ├── feature_engineering/ # 模块4:多维度特征工程
│ │ ├── meta_feature.py # 元数据特征编码
│ │ ├── feature_merge.py # 情感特征与元数据拼接
│ │ └── feature_split.py # 特征选择 + 数据集划分
│ └── model/ # 模块5:评分预测模型
│ ├── train.py # 三种模型训练 + 网格调优
│ ├── evaluate.py # 模型评估指标计算 + 对比
│ └── predict_api.py # 单样本预测接口封装
├── models/ # 模型持久化文件
├── web/ # 模块6:Web 可视化系统
│ ├── app.py # http.server 后端入口 + API(标准库零依赖)
│ ├── static/css/style.css # 页面样式
│ ├── static/js/main.js # ECharts 渲染 + 交互
│ └── templates/index.html # 单页可视化面板(5 个 Tab)
├── sql/create_tables.sql # 数据库建表脚本
└── output/charts/ # 静态分析图表输出
八、算法原理说明
情感特征提取(基于情感词典 + 规则)
- 分词:jieba 精确模式,基于前缀词典 + 动态规划 + HMM 识别未登录词
- 情感得分:遍历分词,匹配正向/负向词典累加得分,考虑前缀否定词(反转极性)与程度副词(放大权重)
- 综合情感值归一化:
(正向得分 - 负向得分) / (正向得分 + 负向得分 + ε)∈ [-1, 1] - 电影维度聚合:单条评论特征按 movie_id 聚合为平均情感、方差、正负向占比、TOP20 高频情感词
特征工程
- 类别特征:电影类型/导演/地区独热编码(导演与地区保留高频 Top-K 避免维度爆炸)
- 时间特征:上映年份、月份、是否档期(春节1-2月/暑期7-8月/国庆10月)
- 数值特征:片长、评论总数 z-score 标准化
- 特征选择:皮尔逊相关性分析 + 随机森林特征重要性
模型对比
- 线性回归:基线模型,可解释性强,假设线性关系
- 随机森林:集成多棵决策树,抗过拟合,捕捉非线性
- XGBoost:梯度提升树,迭代优化残差,精度高
- 网格调优:对最优模型用 GridSearchCV 搜索超参数组合
九、常见问题
Q1:爬虫被限制访问(返回 403)?
A:调大 delay_min/delay_max 延时,更换网络环境,或先少量爬取测试(--movie-count 10)。
Q2:需要安装 MySQL 吗? A:不需要。系统默认使用 CSV 文件存储,开箱即用。如需数据库支持,可在 config.py 中将 ENABLE_DB 设为 True 并配置 MySQL 连接参数。
Q3:xgboost 安装失败?
A:尝试 pip install xgboost --no-cache-dir 或下载预编译 wheel 包安装。
Q4:Web 预测功能提示模型未加载?
A:需先执行训练流水线(python run_all.py --steps 5)生成 models/best_model.pkl。
十、合规与版权声明
- 本项目仅用于本科毕业设计学习研究
- 爬虫遵守豆瓣 robots 协议,内置限速与重试机制,不对目标网站造成压力
- 禁止用于大规模商用爬取或数据倒卖
- 仅供学术交流,请勿用于商业用途
十一、登录页视频背景说明
登录页(/login)左侧使用电影片段视频作为动态背景,营造沉浸式入场体验。
视频文件放置
请将视频文件命名为 movie_bg.mp4,放入以下目录:
web/static/video/movie_bg.mp4
视频要求
- 格式:MP4(H.264 编码),兼容性最佳
- 时长:建议 10-30 秒(短循环即可,文件体积更小)
- 分辨率:建议 1920×1080 或更高,横屏比例
- 内容:电影片段、胶片滚动、星光等与电影主题相关的画面
- 体积:建议压缩到 5MB 以内,避免加载过慢
自动降级机制
- 视频标签设置了
onerror事件,当视频文件缺失或加载失败时,自动降级为浅灰渐变背景 + 电影胶片 SVG 插画,保证页面不空白 - 视频属性为
autoplay muted loop playsinline(静音、循环、内联播放),符合浏览器自动播放策略
获取免费电影片段素材
- Pixabay Videos:https://pixabay.com/videos/
- Pexels Videos:https://www.pexels.com/videos/
- Coverr:https://coverr.co/