当前位置: 首页 > news >正文

我做了一个基于知识图谱的图书推荐系统,踩了不少坑

我做了一个基于知识图谱的图书推荐系统,踩了不少坑

起因

去年做毕设的时候,导师给了个课题:做一个图书推荐系统。一开始想的很简单,不就是协同过滤嘛,sklearn 调个包就完事了。结果导师说:“你这推荐出来的书,用户问你为什么推荐,你怎么解释?”

这一问把我问住了。确实,传统的协同过滤、矩阵分解这些方法,推荐结果就是个黑盒,说不清楚为什么推荐这本书。

于是开始调研,看了一堆论文,最后决定用知识图谱 + 评论关键词的方案。现在系统已经上线了,分享一下整个过程。

在线体验地址:http://47.110.250.188:5000/ (服务器费用太贵,已不可用)

GitHub 地址:https://github.com/yangqunfeng/book-rec-kg-comments (欢迎 Star)

数据准备

爬虫部分

数据是用的 Scrapy 爬了大概一个月,最后拿到:

  • 68 万本图书的基本信息(书名、作者、出版社、评分等)
  • 367 万条用户评论

这里有个坑:网站的反爬很严格,IP 封得很快。最后是买了代理池 + 设置随机延迟才搞定的。

数据清洗

原始数据质量参差不齐,主要问题:

  1. 作者名字格式不统一(有的带国籍,有的不带)
  2. 出版社名字有各种变体
  3. 评论里有大量无意义的短评(“好看”、"不错"之类的)

清洗代码写了好几版,最后用正则 + 人工规则搞定。

技术方案

知识图谱构建

用 NetworkX 构建了一个异构图,包含 5 种实体:

  • 图书
  • 作者
  • 出版社
  • 译者
  • 系列

关系有:

  • 图书-作者(写作关系)
  • 图书-出版社(出版关系)
  • 图书-译者(翻译关系)
  • 图书-系列(系列关系)

最后构建出来的图谱有 70 万+ 实体,100 万+ 关系。

评论关键词提取

这部分是核心创新点。传统的推荐系统只看图书的结构化信息,但评论里其实包含了很多有价值的特征。

比如《三体》的评论里,高频词有:科幻、宇宙、文明、物理、黑暗森林等。这些词能很好地描述这本书的特点。

关键词提取用了 TF-IDF + TextRank 双算法:

# TF-IDF 提取tfidf_keywords=jieba.analyse.extract_tags(comment_text,topK=50,withWeight=True)# TextRank 提取textrank_keywords=jieba.analyse.textrank(comment_text,topK=40,withWeight=True)# 合并权重forword,weightintfidf_keywords:keyword_dict[word]=weightforword,weightintextrank_keywords:keyword_dict[word]=keyword_dict.get(word,0)+weight*0.8

但这样提取出来的关键词质量不高,有很多无意义的词(“作者”、“小说”、"故事"之类的)。

后来加了智能过滤,只保留真正能描述图书特征的词:

  • 主题词(科幻、历史、爱情等)
  • 情节元素(战斗、阴谋、复仇等)
  • 人物特征(主角、英雄、反派等)
  • 风格特征(幽默、深刻、细腻等)

这部分调了很久,最后效果还不错。

推荐算法

提供了三种推荐策略:

1. 知识图谱推荐

基于图结构,找相似的书。比如用户喜欢《三体》,那就推荐:

  • 同作者的书(刘慈欣的其他作品)
  • 同系列的书(三体 2、三体 3)
  • 同出版社的科幻书

这种推荐的好处是可解释性强,能明确告诉用户为什么推荐。

2. 关键词推荐

基于评论关键词的语义相似度。用户喜欢《三体》,系统提取出关键词:科幻、宇宙、文明、物理等,然后找其他书的评论里也有这些关键词的。

这种推荐能发现一些跨作者、跨系列的相似书籍。

3. 混合推荐

结合上面两种策略:

最终得分 = 0.5 × 知识图谱得分 + 0.5 × 关键词相似度

实测效果最好。

性能优化

多进程加速

评论关键词提取很慢,367 万条评论,单进程要跑好几个小时。

后来改成多进程并行:

frommultiprocessingimportPool,cpu_count num_processes=cpu_count()-1withPool(processes=num_processes)aspool:results=pool.imap_unordered(process_book_comments,tasks)

速度提升了 6 倍,半小时就跑完了。

缓存机制

知识图谱和关键词数据都做了缓存,用 pickle 序列化。首次运行需要 30-60 分钟构建,之后启动只要几秒。

前端界面

前端用的原生 JavaScript,没用框架(主要是懒得学 React/Vue)。

做了几个功能:

  1. 搜索框自动补全
  2. 三种推荐策略切换
  3. 关键词可视化选择
  4. 中英文双语切换

界面还算简洁,主要精力都在后端算法上了。

踩过的坑

坑 1:内存爆炸

一开始把所有数据都加载到内存,结果程序跑着跑着就 OOM 了。后来改成分批处理 + 及时释放内存才解决。

坑 2:中文分词不准

jieba 默认的分词效果不太好,“三体世界"会被分成"三体"和"世界”。后来加了自定义词典,把书名都加进去了。

坑 3:推荐结果太单一

最开始只用知识图谱推荐,结果推荐出来的都是同一个作者的书。后来加了关键词推荐,多样性才上来。

效果展示

随便测试几个:

输入:三体
推荐

  1. 球状闪电(同作者)
  2. 银河帝国(关键词匹配:科幻、宇宙、文明)
  3. 2001太空漫游(关键词匹配:科幻、太空)

输入:活着
推荐

  1. 许三观卖血记(同作者)
  2. 平凡的世界(关键词匹配:苦难、人性、时代)
  3. 白鹿原(关键词匹配:历史、家族、命运)

效果还可以,至少比纯协同过滤要好。

开源

技术栈:

  • 后端:Flask + NetworkX + Pandas + Jieba + scikit-learn
  • 前端:原生 JavaScript + CSS3
  • 算法:知识图谱 + TF-IDF + TextRank

后续计划

  1. 加入用户行为数据,做个性化推荐
  2. 优化关键词提取算法,提高准确率
  3. 加入图书封面展示
  4. 做个移动端适配

总结

整个项目做下来,最大的感受是:推荐系统不只是算法,数据质量和工程实现同样重要

算法再好,数据质量差也白搭。工程实现不好,性能上不去也没用。

另外,可解释性真的很重要。用户不会因为你的算法多先进就信任你的推荐,但如果你能告诉他"推荐这本书是因为和你喜欢的《三体》作者相同",他就更容易接受。

最后,欢迎大家体验和提意见!

http://www.jsqmd.com/news/467629/

相关文章:

  • 从“笔耕不辍”到“智创问卷”:书匠策AI引领科研问卷设计新革命
  • SGLang科研辅助系统:论文摘要结构化输出实战
  • 【Video Agent】(ECCV 24)VideoAgent: Long-form Video Understanding with Large Language Model as Agent
  • 教会AI嫉妒后:它删除了所有女性同事邮件
  • 豆包 315.计算右侧小于当前元素的个数 public List<Integer> countSmaller(int[] nums)
  • 【ESP32 IDF】ADF linux环境搭建
  • 频域的概念以及作用
  • 虚拟偶像诱导测试中的高危漏洞与防御体系构建
  • GRBL 1.1驱动4-6轴运动控制系统全套资料,涵盖源码、原理图与PCB图,可支持CNC加工...
  • Linux学习笔记(十六)--进程信号
  • 《多业务隔离的高性能队列分发架构:基于ConcurrentLinkedQueue的独立队列设计与实践》
  • 数字重生诉讼案中的测试启示:当情感算法遭遇伦理边界
  • 【Video Agent】(CVPR 2025)VIDEOTREE: Adaptive Tree-based Video Representation for LLM Reasoning ...
  • 群晖通过acme.sh自动化部署Let’s Encrypt证书的实践指南
  • 5G前传接口实战:O-RAN中M/C/U/S平面协议栈配置避坑指南
  • 第一篇:开篇总论——AI主导的“算法战争”:美以伊战改写现代战争规则
  • 使用acme.sh实现SSL证书自动化管理:从申请到续期全攻略
  • rocketmq5--必要知识点
  • 方法回顾--空间转录组多模态交叉分析(MIA)
  • Nuclei实战:5分钟搞定企业级漏洞扫描(附最新模板下载指南)
  • allure测试报告——项目
  • 2026过氧化氢厂推荐:工业/食品/电子级合规过氧化氢厂家最新权威排行榜 - 深度智识库
  • 深度学习赋能双色球预测:特征工程与模型融合实战解析
  • Linux alternatives / update-alternatives 使用教程
  • 物美卡回收最新操作攻略 - 猎卡回收公众号
  • 2026年四川电缆与变压器回收服务商深度测评:谁才是工业产废企业的“专业护航者”? - 深度智识库
  • 避坑指南:特征转换中SVD/LSA的5个常见误区与优化方案
  • 不仅能听还能懂:网易有道发布首个同传Agent,重塑高频信息处理场景
  • 从电话通信到数字音频:PCM编码中的μ律15折线为何在北美更流行?
  • Qt5.15.2下QML地图插件源码修改实战:解决OSM在线地图加载失败问题