大数跨境

《构建个人知识图谱》002:规划你的「第二大脑」

《构建个人知识图谱》002:规划你的「第二大脑」 国科慧安
2023-11-05
2
导读:今天跟大家聊聊如何规划个人知识图谱。每个人对图谱的需求和理解不同,规划设计以及使用方式当然也不同, 包括上一篇讲的收集数据、清理数据、抽取融合这些步骤也不尽相同,只有把自己的需求想清楚才能构建出能 充

今天跟大家聊聊如何规划个人知识图谱。每个人对图谱的需求和理解不同,规划设计以及使用方式当然也不同, 包括上一篇讲的收集数据、清理数据、抽取融合这些步骤也不尽相同,只有把自己的需求想清楚才能构建出能 充当自己「第二大脑」的知识图谱。

为什么构建个人知识图谱

第一个要回答的问题就是为什么构建 个人知识图谱?

这个问题对于我个人来说很简单,就是为了管理自己的知识,构建完整的知识体系,打造第二大脑,当然我的要求在知识管理的基础上对知识实体识别的需求可能更贴合知识图谱的概念。

知识管理的形式?

是不是所有人都需要构建知识图谱?

答案肯定是否定的。知识管理有很多形式。你可以记日记、记笔记、用书签管理、写博客、用带着目录树的工具整理资料、或者画各种知识导图沉淀。

知识管理的方式

而知识图谱知识一种比较好的可视化方式,并且和人类大脑的神经网络原理比较类似的一种实现方式, 而恰恰对于我来说,大家最常用的按照目录总结知识不能够满足我的需求,因为除了大数据量下不够直观,就单单把所有知识都归类到目录里面,就是一件很困难的事情。

谷歌和哈弗绘制的大脑神经网络(百万分之一大脑)

现有工具能满足么?

我觉得这个是大家在计划构建知识图谱之后第一个要考虑的问题:是不是有现有的工具能满足你对知识管理的需求。

除了我的脑子,我用到(用过)的工具很多,包含但不限于下面这些,我觉得他们中的某一款能已经能满足大多数人的需求:

  • • Microsoft OneNote

  • • MacOS Notes

  • • Quiver

  • • Youdao Notes

  • • 印象笔记

  • • Obsidian

  • • XMind

  • • The Brain

  • • iThoughtX

  • • VuePress

  • • Notion

  • • Excel

使用过的各种工具

所有的工具都有各自的优点,但是也都有不那么满足我需求的地方,经常想要是能把他们的优点结合起来就好了。

  • • 一些脑图工具适合简答的展示,但是复杂内容关联大数据管理 和搜索能力不够;

  • • 大多数笔记工具写作体验很好、全文搜索很方便,但是关键词搜索不行;

  • • 类似 Obsidian 这样的包含图谱能力的工具提供了很棒的功能,其实能解决很多人的问题,但是其扩展方式包括 UI 体验,有点儿不太适合我打造第二大脑的想法。

如果你只是想画一些脑图,有很多优秀的工具来实现。

XMind XMind [1] 是很流行的脑图工具。

XMind
iThoughts iThoughts [2] 同样是一款优秀的脑图工具,他支持多个文件进行关联,显示在同一个脑图里, 让你能够更自由的组织大规模脑图。
iThoughts


同样的,笔记软件也有很多优秀的。

有道云笔记 有道云笔记是我比较喜欢的笔记工具,支持、文档、 表格,流程图,脑图,Markdown 等多种格式。

有道云笔记
微软 OneNote 微软的 OneNote 也是一款很棒的笔记工具。


Obsidian 包括很多国产的类似工具提供了知识关联和脑图展示。

Obsidian Obsidian 是一款很强大的知识管理工具,也支持脑图模式,并且有各种插件可以用。

Obsidian 社区图谱展示
Obsidian 社区图谱展示


而现如今我觉得最大的问题就是搜索、知识关联、资源连接。而做一个一劳永逸的工具,可能对我来说是比较好的方案。

个人知识图谱放什么

好了,既然我们已经确定了要做知识图谱,而不仅仅是记录,下一个问题就是个人知识图谱里面放什么内容?

个人知识图谱内容

由于我现在还主要和各种技术打交道,所以我的知识图谱主要就是各种技术工具(包含各种开源项目)、技能、方法论等。

另外我还写了很多文章,除了很早之前在 JavaEye、博客园等平台的「旧文章」之外,还有大几百篇博客文章,也没有很认真的进行分类归纳, 内容也比较杂,不能整体进行查看管理,这块后期我也要集成到知识图谱里面。

除了技术和历史文章,国内外的公司以及产品,一些商业思维和管理框架我也很感兴趣,当然一并放入我的知识图谱里面了。

如何动手做个人知识图谱?

经常有人开玩笑说,价值一个亿的商业想法有了,就差一个程序员、一个产品经理、一个设计师?

个人知识图谱,首先要有知识吧,其次要有图谱吧,咱们简单粗暴一点拆解,知识图谱就先做这两个东西。既然定位是个人 的,那肯定怎么开心怎么搞了。

知识 + 图谱

如何进行知识存储

为了检索效率以及满足未来扩展能力,我们直接用最简单的方案,使用数据库存储知识。

图数据库 vs 关系数据库 用来存储图数据首选当然是用图数据库了,比如大名鼎鼎的 Neo4j,有很多牛逼的图计算功能。但是,图数据库的强大功能隐藏了很多技术细节,从使用和理解上对初学者有一定难度。所以这个系列文章我们从头开始定义图结构,使用关系数据库来实现后端存储。

我们先实现一个最最简单的图模型,有两个对象:「节点」和「」。

最基本的节点和边对象

节点和边只有最基本的属性,足矣支撑我们实现最初的知识图谱。后续可以在此基础上为节点和边补充更多的属性, 比如节点类型、节点标签、节点颜色,边类型等。

这里简单用代码表示一下数据结构:

转换成代码可能是这样:

class KgNode {
    String id
    String name
}
class KgEdge {
    String source
    String target
}

有很多可用的 ORM 和数据库框架来实现数据存储,比如 Python 的 SqlAlchemy,Java 的 Spring Data JPA等, 后端实现我就不再赘述,大家可以参考使用自己喜欢的方法来实现,

一定要用数据库么? 当然不一定啦,比如前面提到的一些笔记工具,就没有用传统的数据库。我们数据也可以记录在  Json\CSV 文本文件里面,这样就不用需要后端程序处理了, 我之前做 技术雷达的时候就是用 Json 存储的数据,数据量不大的话很方便,而且数据通用型好,数据迁移也很容易。

AOE的技术雷达,就不放我的数据了

如何进行图谱展示?

我们还是使用通用的方式,使用 Web 浏览器来展示图谱,简单说,就是写一个网页。

工欲善其事,必先利其器,对图谱进行可视化肯定要有个趁手的工具,常见(或者不常见)的可视化库有下面几个:

  • • d3.js

  • • ECharts

  • • AntV

  • • Graphology

  • • cola.js

d3-force d3.js [3] 是一个超棒的可视化图形库,而 d3-force [4] 组件实现了引力图可以很好的进行图谱展示。

d3.js
d3-force-3d D3 Force 3d [5] 是一个基于 d3.js 的 3D 引力图实现。
d3 force 3d
ECharts ECharts [6] 我们很熟悉了,之前《万物皆可 LLM》系列里面也用到了 ECharts 进行可视化。它也提供了关系图来帮助我们进行图谱可视化。
ECharts 关系图
AntV G6 AntV 的 G6 [7] 提供了图可视化能力,之前我是很看好这个工具的, 但是用过了几天,越用越火大,可能是我和阿里系的开源工具无缘吧。
AntV G6
它还提供了基于 G6 的封装 Graphin [8],文档和介绍都挺好,就是用起来感觉太复杂了,试了试还是放弃了。
Graphology 可以通过查看 Graphology 的文档 [9] 或者 可以通过查看 Graphology 的文档 [10] 或者 在线Examples [11] 来使用。
Graphology Example


我最终选择了使用 d3-force-3d 来实现图谱展现的第一版。

图谱可视化预览

知识图谱实现

个人知识图谱的方案如上所述,下面大概讲一下我怎么实现的。

后端(可选)

后端功能我估计未来会比较复杂,所以没用 Python,直接用 Java 做原型开发。

首先就是初始化[12]一个 SpringBoot 项目。

初始化SpringBoot项目

然后连接上咱的 Postgres 数据库,写两个 API 接口返回下数据。

后端实现

前端实现

直接参考例子[13] 写一个界面,然后用我们《三天速成JavaScript》的知识来修改一下:

const elem = document.getElementById('3d-graph');

const Graph = ForceGraph3D()
  (elem)
    .graphData(data)
    .nodeLabel('id')
    .nodeAutoColorBy('group')
    .nodeLabel((node) => {
      return node.name
    })
    .onNodeClick(node => {
      // Aim at node from outside it
      const distance = 40;
      const distRatio = 1 + distance/Math.hypot(node.x, node.y, node.z);

      const newPos = node.x || node.y || node.z
        ? { x: node.x * distRatio, y: node.y * distRatio, z: node.z * distRatio }
        : { x0y0z: distance }; // special case if node is in (0,0,0)

      Graph.cameraPosition(
        newPos, // new position
        node, // lookAt ({ x, y, z })
        3000  // ms transition duration
      );
    });

如果是后端数据源,

const data = await axios.get('/api/graphData')

如果没有写后端,咱们直接把数据给写出来就好:

const data = {
  nodes: [
    {id: llm, name'LLM'},
    {id: openai, name'OpenAI'}
  ],
  edges: [
    {source'llm'target'openai'}
  ]
}

最后补充下数据,看看结果:

图谱可视化预览

结语

首先现有的五花八门的工具能满足大多数人的个人知识管理以及知识图谱的需求。

其次对于我这种没事儿找事儿的,先把思路理清楚,出个原型,构建个人知识图谱也很容易实现。

万事开头难,明天继续补充细节和功能。

引用链接

[1] XMind: https://xmind.app/features/
[2] iThoughts: https://www.toketaware.com/ithoughts-osx
[3] d3.js: https://d3js.org/
[4] d3-force: https://d3js.org/d3-force
[5] D3 Force 3d: https://github.com/vasturiano/3d-force-graph
[6] ECharts: https://echarts.apache.org/
[7] G6: https://g6.antv.antgroup.com/
[8] Graphin: https://graphin.antv.vision/zh
[9] Graphology 的文档: https://graphology.github.io/
[10] Graphology 的文档: https://graphology.github.io/
[11] 在线Examples: https://codesandbox.io/examples/package/graphology
[12] 初始化: https://start.spring.io/
[13] 例子: https://github.com/vasturiano/3d-force-graph/blob/master/example/click-to-focus/index.html


--- END ---




【声明】内容源于网络
0
0
国科慧安
关注安全与可靠性行业动态,提升国内安全与可靠性设计评价水平,打造尖端安全与可靠性软件,提供优质安全与可靠性设计评价服务。
内容 38
粉丝 0
国科慧安 关注安全与可靠性行业动态,提升国内安全与可靠性设计评价水平,打造尖端安全与可靠性软件,提供优质安全与可靠性设计评价服务。
总阅读15
粉丝0
内容38