ji这毕业设计我真的会谢选题的时候看到基于知识图谱的个性化学习路径推荐系统觉得挺高大上结果是给自己挖了一个大坑前前后后折腾了快两周才跑通中间差点把电脑砸了。完整源码链接https://pan.quark.cn/s/1e54aa2ae950得到的结果展示看起来挺唬人的这个题目到底要干嘛吧其实就是搞一个知识图谱把各个知识点之间的前置关系理清楚然后根据学生已经会了什么、想学什么推荐出一条最优的学习路径。听起来不就是个带权有向图加个拓扑排序么我当时也是这么想的结果写起来各种他*的细节问题。数据生成这块我一开始用手写了几十个知识点和自己编的前置依赖关系想想就觉得累。42个知识点61条边手打的时候就在想我是不是脑子有病选了这个题。KNOWLEDGE_POINTS [ (1, Python环境搭建, 基础, 1, 安装Python解释器与IDE开发环境), (2, 变量与数据类型, 基础, 1, int、float、str、bool等基本类型), ... ] PREREQUISITES [ (1, 2), (1, 12), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), ... ]然后学生画像也得造假的不然没数据跑。我设计了5个不同水平的学生张明是学完基础的想搞数据科学赵雷刚入门啥都不会王芳是大佬只差几个高阶知识点——这tm不就是我身边同学的真实写照么。STUDENTS [ {id: 1, name: 张明, known: [1..12], targets: [22..27], prefer_cat: [数据科学], pace: 0.7}, {id: 4, name: 赵雷, known: [1,2,33], targets: [13..21,36], prefer_cat: [进阶,计算机基础], pace: 0.5}, ]写到导出csv的时候还遇到了编码问题中文写到csv里在excel打开全乱码后来发现要加encodingutf-8-sig才对不过为了代码统一我全都用了utf-8。接下来是知识图谱的核心部分用networkx建的图一开始没注意有向无环图这个约束随便加了几个环进去拓扑排序直接炸了——NetworkXUnfeasible报错我当时就傻了。查了半天才发现是我加依赖关系的时候不小心加了个环形依赖比如A依赖B、B依赖C、C又依赖A这谁顶得住啊。def build_knowledge_graph(): G nx.DiGraph() for kp in KNOWLEDGE_POINTS: G.add_node(kp[0], namekp[1], categorykp[2], difficultykp[3], descriptionkp[4]) for from_id, to_id in PREREQUISITES: G.add_edge(from_id, to_id, relation前置) return G后面长记性了每次构建完都调用nx.is_directed_acyclic_graph(G)检查一下有环就回去改数据改到吐。推荐算法这块我纠结了好久一开始想用最短路径但发现学习路径不是越短越好啊前置知识没学直接跳到目标知识点这不扯淡么。所以最后还是老老实实拓扑排序打分排序。def analyze_knowledge_gaps(self, known_set, target_set): needed set() for t in target_set: prereqs get_all_prerequisites(self.G, t) needed | prereqs needed | target_set gaps needed - known_set return gaps打分这部分我综合了几个因素是不是目标节点10分、是不是偏好的分类5分、难度匹配度和老知识的平均难度差不超过1就3分、还有这个节点影响多少后续知识0.5分一个。写完实测效果还不错最起码看起来像那么回事。def score_node(self, node, known_set, target_set, preferred_categories): score 0.0 if node in target_set: score 10.0 if preferred_categories and node_cat in preferred_categories: score 5.0 diff_gap abs(node_diff - avg_known_diff) if diff_gap 1: score 3.0 ...重头戏是可视化matplotlib这玩意真是又爱又恨。画知识图谱的时候那些节点挤在一起根本看不清标签调spring_layout的k参数和iterations调了一万遍。还有一个坑是SimHei字体我一开始没设字体画出来的中文全是方框查了才知道要加这行plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False记得axes.unicode_minus也要设False不然负号会显示乱码我也是查了半天才知道的。画图函数有好几个最难的是把推荐路径高亮显示在知识图谱上。一开始只高亮了节点看不出路径方向后来又加了边的高亮才顺眼。def draw_knowledge_graph(G, title知识图谱总览, filenameknowledge_graph.png, highlight_pathNone, highlight_nodesNone): ... if highlight_path: edges_in_path list(zip(highlight_path[:-1], highlight_path[1:])) nx.draw_networkx_edges(G, pos, edgelistedge_list, edge_color#FF1744, width3.5) nx.draw_networkx_nodes(G, pos, nodelisthighlight_path, node_color#FF1744)看看跑出来的图全局知识图谱42个节点分成基础“进阶”“数据科学”“Web开发”“工具”计算机基础六大类每种颜色不一样绿色基础、蓝色进阶、橙色数据科学、紫色Web开发还挺好看的。难度分布图上能看出来基础类难度集中在1-2级进阶和数据科学就散在3-5级了合理。学生对比图更直观张明已知12个目标6个缺口7个赵雷已知3个目标10个缺口20个——这兄弟任务艰巨啊预估要140天才能学完节奏系数才0.5。王芳就舒服了缺口才4个15天搞定。最满意的还是每个学生的个性化学习路径图已掌握知识用绿色圆点亮出来推荐路径用红色高亮箭头方向一看就懂。比如给李华推荐的路径是Linux基础→计算机网络基础→Flask基础→RESTful API→SQL数据库→Django基础→Flask数据库→Django认证安全这个顺序就很合理先补工具和基础再上Web框架。其实做完回头看这个系统核心就三个东西数据生成、图算法、可视化。networkx的ancestors和topological_sort是主力matplotlib负责出图中间那些打分的逻辑完全是自己瞎琢磨的。虽然过程痛苦但结果还行吧至少图表跑出来了数据也对得上。最后跑main.py的时候看到所有图表生成成功output文件夹里8张png那一刻还是挺有成就感的前几天的崩溃都值了。可以参考一下
基于知识图谱的python个性化学习路径推荐系统项目源码
ji这毕业设计我真的会谢选题的时候看到基于知识图谱的个性化学习路径推荐系统觉得挺高大上结果是给自己挖了一个大坑前前后后折腾了快两周才跑通中间差点把电脑砸了。完整源码链接https://pan.quark.cn/s/1e54aa2ae950得到的结果展示看起来挺唬人的这个题目到底要干嘛吧其实就是搞一个知识图谱把各个知识点之间的前置关系理清楚然后根据学生已经会了什么、想学什么推荐出一条最优的学习路径。听起来不就是个带权有向图加个拓扑排序么我当时也是这么想的结果写起来各种他*的细节问题。数据生成这块我一开始用手写了几十个知识点和自己编的前置依赖关系想想就觉得累。42个知识点61条边手打的时候就在想我是不是脑子有病选了这个题。KNOWLEDGE_POINTS [ (1, Python环境搭建, 基础, 1, 安装Python解释器与IDE开发环境), (2, 变量与数据类型, 基础, 1, int、float、str、bool等基本类型), ... ] PREREQUISITES [ (1, 2), (1, 12), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), ... ]然后学生画像也得造假的不然没数据跑。我设计了5个不同水平的学生张明是学完基础的想搞数据科学赵雷刚入门啥都不会王芳是大佬只差几个高阶知识点——这tm不就是我身边同学的真实写照么。STUDENTS [ {id: 1, name: 张明, known: [1..12], targets: [22..27], prefer_cat: [数据科学], pace: 0.7}, {id: 4, name: 赵雷, known: [1,2,33], targets: [13..21,36], prefer_cat: [进阶,计算机基础], pace: 0.5}, ]写到导出csv的时候还遇到了编码问题中文写到csv里在excel打开全乱码后来发现要加encodingutf-8-sig才对不过为了代码统一我全都用了utf-8。接下来是知识图谱的核心部分用networkx建的图一开始没注意有向无环图这个约束随便加了几个环进去拓扑排序直接炸了——NetworkXUnfeasible报错我当时就傻了。查了半天才发现是我加依赖关系的时候不小心加了个环形依赖比如A依赖B、B依赖C、C又依赖A这谁顶得住啊。def build_knowledge_graph(): G nx.DiGraph() for kp in KNOWLEDGE_POINTS: G.add_node(kp[0], namekp[1], categorykp[2], difficultykp[3], descriptionkp[4]) for from_id, to_id in PREREQUISITES: G.add_edge(from_id, to_id, relation前置) return G后面长记性了每次构建完都调用nx.is_directed_acyclic_graph(G)检查一下有环就回去改数据改到吐。推荐算法这块我纠结了好久一开始想用最短路径但发现学习路径不是越短越好啊前置知识没学直接跳到目标知识点这不扯淡么。所以最后还是老老实实拓扑排序打分排序。def analyze_knowledge_gaps(self, known_set, target_set): needed set() for t in target_set: prereqs get_all_prerequisites(self.G, t) needed | prereqs needed | target_set gaps needed - known_set return gaps打分这部分我综合了几个因素是不是目标节点10分、是不是偏好的分类5分、难度匹配度和老知识的平均难度差不超过1就3分、还有这个节点影响多少后续知识0.5分一个。写完实测效果还不错最起码看起来像那么回事。def score_node(self, node, known_set, target_set, preferred_categories): score 0.0 if node in target_set: score 10.0 if preferred_categories and node_cat in preferred_categories: score 5.0 diff_gap abs(node_diff - avg_known_diff) if diff_gap 1: score 3.0 ...重头戏是可视化matplotlib这玩意真是又爱又恨。画知识图谱的时候那些节点挤在一起根本看不清标签调spring_layout的k参数和iterations调了一万遍。还有一个坑是SimHei字体我一开始没设字体画出来的中文全是方框查了才知道要加这行plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False记得axes.unicode_minus也要设False不然负号会显示乱码我也是查了半天才知道的。画图函数有好几个最难的是把推荐路径高亮显示在知识图谱上。一开始只高亮了节点看不出路径方向后来又加了边的高亮才顺眼。def draw_knowledge_graph(G, title知识图谱总览, filenameknowledge_graph.png, highlight_pathNone, highlight_nodesNone): ... if highlight_path: edges_in_path list(zip(highlight_path[:-1], highlight_path[1:])) nx.draw_networkx_edges(G, pos, edgelistedge_list, edge_color#FF1744, width3.5) nx.draw_networkx_nodes(G, pos, nodelisthighlight_path, node_color#FF1744)看看跑出来的图全局知识图谱42个节点分成基础“进阶”“数据科学”“Web开发”“工具”计算机基础六大类每种颜色不一样绿色基础、蓝色进阶、橙色数据科学、紫色Web开发还挺好看的。难度分布图上能看出来基础类难度集中在1-2级进阶和数据科学就散在3-5级了合理。学生对比图更直观张明已知12个目标6个缺口7个赵雷已知3个目标10个缺口20个——这兄弟任务艰巨啊预估要140天才能学完节奏系数才0.5。王芳就舒服了缺口才4个15天搞定。最满意的还是每个学生的个性化学习路径图已掌握知识用绿色圆点亮出来推荐路径用红色高亮箭头方向一看就懂。比如给李华推荐的路径是Linux基础→计算机网络基础→Flask基础→RESTful API→SQL数据库→Django基础→Flask数据库→Django认证安全这个顺序就很合理先补工具和基础再上Web框架。其实做完回头看这个系统核心就三个东西数据生成、图算法、可视化。networkx的ancestors和topological_sort是主力matplotlib负责出图中间那些打分的逻辑完全是自己瞎琢磨的。虽然过程痛苦但结果还行吧至少图表跑出来了数据也对得上。最后跑main.py的时候看到所有图表生成成功output文件夹里8张png那一刻还是挺有成就感的前几天的崩溃都值了。可以参考一下