电影知识图谱推荐问答系统
技术架构与概述
本项目构建了一个聚焦电影领域的知识图谱推荐问答系统,旨在解决传统模式下电影信息获取效率低、推荐精准度不足的问题。系统以 Python 为核心开发语言,基于 Django 框架搭建后端架构,采用 Neo4j 图形数据库存储关系数据,MySQL 保障结构化数据的稳定性,前端结合 HTML5、DIV+CSS 布局及 Echarts 可视化工具,支持多终端访问。
核心功能模块包括电影知识图谱管理、智能问答交互、电影列表展示、个人信息查看、电影详情展示、用户注册登录以及后台数据管控。通过融合协同过滤推荐算法与 Cypher 查询能力,系统实现了电影的智能推荐与高效问题解答。
核心功能模块
1. 电影知识图谱管理
展示电影相关节点与关系的可视化图谱,支持通过 Cypher 语句查询数据并呈现对应节点信息。提供数据库信息查看、节点标签与关系类型管理等功能,辅助用户管理和分析电影知识图谱数据。

2. 电影问答系统
支持用户在输入框提交关于电影的问题并搜索,展示相关问题及回答内容。页面右侧设有电影推荐列表,在帮助用户获取信息的同时提供观影建议。
3. 电影列表与详情
以海报形式展示多部电影,呈现名称与所属国家信息。详情页则涵盖上映日期、演员、导演、评分、想看数、故事简介及评论数量,是系统中展示单部电影信息的核心入口。

4. 用户与后台管理
用户端提供注册登录及个人中心,展示 ID、账号、联系方式及管理员身份标识。后台管理模块允许管理员对电影信息进行添加、删除操作,并通过左侧导航栏切换不同管理功能,确保数据可控。

推荐算法实现
在推荐引擎的核心部分,我们采用了基于用户的协同过滤(UserCF)策略。这段代码展示了如何计算用户相似度矩阵并生成 Top-N 推荐列表。实际运行中,系统会先加载或训练相似度模型,随后根据目标用户的历史行为,寻找相似用户群体进行加权评分预测。
# -*- coding = utf-8 -*-
""" User-based Collaborative filtering. """
import collections
from operator import itemgetter
import math
from collections import defaultdict
from . import similarity
from . utils
.utils LogTime
:
():
()
.k_sim_user = k_sim_user
.n_rec_movie = n_rec_movie
.trainset =
.save_model = save_model
.use_iif_similarity = use_iif_similarity
():
model_manager = utils.ModelManager()
:
.user_sim_mat = model_manager.load_model( .use_iif_similarity )
.movie_popular = model_manager.load_model()
.movie_count = model_manager.load_model()
.trainset = model_manager.load_model()
()
OSError:
()
.user_sim_mat, .movie_popular, .movie_count = \
similarity.calculate_user_similarity(trainset=trainset, use_iif_similarity=.use_iif_similarity)
.trainset = trainset
()
.save_model:
model_manager.save_model(.user_sim_mat, .use_iif_similarity )
model_manager.save_model(.movie_popular, )
model_manager.save_model(.movie_count, )
()
():
.user_sim_mat .n_rec_movie \
.trainset .movie_popular .movie_count:
NotImplementedError()
K = .k_sim_user
N = .n_rec_movie
predict_score = collections.defaultdict()
user .trainset:
( % user)
[]
watched_movies = .trainset[user]
similar_user, similarity_factor (.user_sim_mat[user].items(), key=itemgetter(), reverse=)[:K]:
movie, rating .trainset[similar_user].items():
movie watched_movies:
predict_score[movie] += similarity_factor * rating
[movie movie, _ (predict_score.items(), key=itemgetter(), reverse=)[:N]]
():
.n_rec_movie .trainset .movie_popular .movie_count:
ValueError()
.testset = testset
()
N = .n_rec_movie
hit =
rec_count =
test_count =
all_rec_movies = ()
popular_sum =
test_time = LogTime(print_step=)
i, user (.trainset):
test_movies = .testset.get(user, {})
rec_movies = .recommend(user)
movie rec_movies:
movie test_movies:
hit +=
all_rec_movies.add(movie)
popular_sum += math.log( + .movie_popular[movie])
rec_count += N
test_count += (test_movies)
test_time.count_time()
precision = hit / ( * rec_count)
recall = hit / ( * test_count)
coverage = (all_rec_movies) / ( * .movie_count)
popularity = popular_sum / ( * rec_count)
()
test_time.finish()
( % (precision, recall, coverage, popularity))
():
movies_recommend = defaultdict()
()
predict_time = LogTime(print_step=)
i, user (testset):
rec_movies = .recommend(user)
movies_recommend[user].append(rec_movies)
predict_time.count_time()
()
predict_time.finish()
movies_recommend


