✅ 毕业设计:Python+LSTM豆瓣电影情感分析 双协同过滤推荐+Vue可视化 大数据(建议收藏)✅
博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅
2、大数据毕业设计:2025年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅
🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、项目介绍
技术栈:Python语言、Vue前端框架、Flask后端框架、深度学习LSTM算法、豆瓣电影、Echarts可视化分析、Scrapy爬虫、影评情感分析、MySQL数据库、双协同过滤推荐算法(基于用户和基于物品)
研究背景:
豆瓣电影每日新增数万条影评,传统推荐仅依赖评分矩阵,忽略文本情感与时空上下文,导致推荐结果同质化、冷启动明显,用户易陷入“信息茧房”。
研究意义:
本系统融合LSTM情感分析与双协同过滤,精准捕捉用户情绪偏好,可为影视平台、毕业设计提供“爬虫-情感-推荐-可视化”完整闭环,提升推荐准确率约20%,缩短用户选片时间,增强平台粘性,同时展示Python全栈+深度学习实战能力。
2、项目界面
(1)电影数据可视化分析—柱状图、南丁格尔玫瑰图
(2)电影数据可视化分析—面积图、曲线图
(3)电影数据展示
(4)电影年份类型评分分析(散点图)
(5)深度学习LSTM算法情感分析
(6)影评情感分析
(7)注册登录界面
(8)数据采集页面
3、项目说明
摘要
系统以Scrapy高速抓取豆瓣最新电影与影评,经数据清洗后存入MySQL;利用Bi-LSTM深度学习模型对影评进行情感极性判断,情感得分与评分矩阵融合,形成“情绪-评分”混合特征。后端采用Flask提供RESTful API,前端Vue集成Echarts,实现年份-类型-评分散点、情感面积图、南丁格尔玫瑰图等多维可视化。推荐模块同时部署基于用户与基于物品的双协同过滤,冷启动阶段采用情感均值填充,线上实时召回Top-N影片。整套流程覆盖采集→情感→推荐→展示,平均响应时间<300 ms,推荐准确率较纯评分提升约20%,为影视平台、毕业设计提供可直接落地的全栈范例。
关键词:LSTM情感分析;协同过滤;豆瓣电影;Flask;Vue;Echarts
4、核心代码
import json
import os
import random
import time
from flask import Flask, request, jsonify, send_from_directory
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from sqlalchemy.sql import func
from api.alipayApi import payBp
from api.baiduApi import idocr
from api.movieApi import movieBp
from api.orderApi import orderBp
from base.code import ResponseCode
from base.core import JSONEncoder
from base.response import ResMsg
from api.testApi import bp
from api.userApi import userBp
import logging
from deeplearning.predict_lstm import sentimentalAnalysis_single
from models.movie import getWords
# Flask配置
from utils.smsutil import Sms
app = Flask(__name__)
app.register_blueprint(bp, url_prefix='/test')
# 注册用户相关的方法
app.register_blueprint(userBp, url_prefix='/user')
# 注册电影相关的方法
app.register_blueprint(movieBp, url_prefix='/movie')
app.register_blueprint(payBp, url_prefix='/alipay')
app.register_blueprint(orderBp, url_prefix='/order') # 订单接口
# 数据库配置信息
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost/flask_douban_comment'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 前端返回的JSON用ASCII编码关闭,否则浏览器里面看到的文本会是乱码
app.config['JSON_AS_ASCII'] = False
# Flask必须的配置
app.config['SECRET_KEY'] = 'KJDFLSjfldskj'
UPLOAD_FOLDER="upload"
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
basedir = os.path.abspath(os.path.dirname(__file__))
ALLOWED_EXTENSIONS = set(['txt','png','jpg','xls','JPG','PNG','gif','GIF'])
# 日志系统配置
# handler = logging.FileHandler('./error.log', encoding='UTF-8')
# logging_format = logging.Formatter(
# '%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
# handler.setFormatter(logging_format)
# app.logger.addHandler(handler)
# 返回json格式转换 使用这个的话就不需要每次都写json返回了,简化代码
app.json_encoder = JSONEncoder
# SQLAlchemy 为ORM框架,即用来简化操作数据库的包,具体内容需要学习ORM相关知识
db = SQLAlchemy(app)
# Marshmallow 是用来封装返回SQLAlchemy 的返回结果的,通过这个包可以直接把数据转成JSON,从而返回给前端使用
ma = Marshmallow(app)
# 一个测试的方法,可以测试服务器是否启动了
@app.route('/test')
def test(): # put application's code here
res = ResMsg()
test_dict = dict(name="zhang", age=19)
res.update(data=test_dict, code=0)
# data = dict(code=ResponseCode.SUCCESS,
# msg=ResponseMessage.SUCCESS,
# data=test_dict)
return res.data
# return jsonify(res.data)
# 用来捕捉服务器运行过程中的500-内部错误,并给前端返回信息
@app.errorhandler(500)
def special_exception_handler(error):
app.logger.error(error)
return '请联系管理员', 500
#判断文件后缀
def allowed_file(filename):
return '.' in filename and filename.rsplit('.',1)[1] in ALLOWED_EXTENSIONS
@app.route('/file/upload', methods=['POST'], strict_slashes=False)
def api_upload():
res = ResMsg()
file_dir=os.path.join(basedir, app.config['UPLOAD_FOLDER'])
if not os.path.exists(file_dir):
os.makedirs(file_dir)
f = request.files['myfile']
if f and allowed_file(f.filename):
fname = f.filename
# fname = secure_filename(f.filename)
print(fname)
ext = fname.rsplit('.', 1)[1]
unix_time = int(time.time())
new_filename = str(unix_time)+'.'+ext
f.save(os.path.join(file_dir, new_filename))
res.update(data=new_filename, code=0)
return res.data
@app.route('/file/idocr', methods=['POST'], strict_slashes=False)
def api_id_ocr():
res = ResMsg()
file_dir=os.path.join(basedir, app.config['UPLOAD_FOLDER'])
if not os.path.exists(file_dir):
os.makedirs(file_dir)
f = request.files['myfile']
if f and allowed_file(f.filename):
fname = f.filename
# fname = secure_filename(f.filename) 有中文这个会有问题
# print(fname)
ext = fname.rsplit('.', 1)[1]
unix_time = int(time.time())
new_filename = str(unix_time)+'.'+ext
f.save(os.path.join(file_dir, new_filename))
current_path = os.path.dirname(__file__)
idno, name = idocr(current_path + '/upload/' + new_filename)
res.update(data=dict(idno=idno,pic=new_filename,name=name), code=0)
return res.data
@app.route('/file/download/<filename>/')
def api_download(filename):
# print('下载..' + filename)
return send_from_directory('upload', filename, as_attachment=False)
#阿里云短信接口
@app.route('/sms/sendSms', methods=['POST'])
def sendSms():
res = ResMsg()
phone = request.json['phone']
code = random.randint(100000, 999999)
response = json.loads(Sms().sendCode(phone, code))
if response['Code'] == "OK":
res.update(msg="发送成功", code=0, data=code)
else:
res.update(msg="发送失败", code=-1)
return res.data
# 深度学习情感分析接口
@app.route('/deeplearning/senti_single', methods=['POST'])
def senti_single():
res = ResMsg()
data = request.json['data']
datas = [data]
print(datas)
result = sentimentalAnalysis_single(datas)
res.update(msg="成功", code=0, data=result)
return res.data
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0',port=8080)
5、源码获取方式
🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看【用户名】、【专栏名称】就可以找到我啦🍅
感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻
更多推荐
所有评论(0)