未完待续
此篇文章是一个复盘,所以会持续写2-3天。
概述
这篇文章是针对之前做的一个知识图谱项目的复盘。这个项目花费了大量精力,也耗费了公司不少资源。离职一段时间之后,也是时间整体复盘一下,免得学而不思则罔。
如果有读者也恰好在做类似的AI项目,或许可以从中吸取一些经验,那就再好不过了。
此文不会涉及任何具体代码,以免侵犯前东家的知识产权和商业机密。 所有代码都是伪代码, 设计图,流程图也会是简洁版,基本上不保留任何前司生产环境的实践内容。
知识图谱是什么
对于一个专门做工程的研发而言,知识图谱是一个听起来很耳熟,但好像又离的很远的技术概念。或许你在研究搜索技术,智能问答系统的时候,都有看到知识图谱的身影,但真正做图谱的人貌似又不多见。
我最开始对知识图谱的一个感性认识就是:
-
对于人来说,知识图谱应该是一个图,直观的来说,就是类似天眼查、企查查这种工商信息查询工具,把一堆信息用图展示出来,人们可以很清楚的从中看出一些信息, 而这些信息如果要一篇篇文章去读的话,会花费十几倍的时间,也不一定很清楚的能归纳出来。 因为图这种载体,天生的就比文字容易理解, 也可以说,关系图是对文字在定向信息的高度提炼。 例如,去年疫情严重期间,各个城市都在做疫调,如果你去听一段冗长的报告,你很难搞清楚传染链条,但是一旦把这个传染链条画出图来,就很容易看明白。
-
对于机器或者程序来说,图能提供很方便的关联, 这就是搜索, 问答系统都重度依赖知识图谱的原因。 特别是问答系统, 对于一个问答系统来说, 典型的流程就是:输入问题, 理解问题,从知识库中关联问题,给出回答。例如,“谁是美国总统” 这个问题, 映射到知识图谱就是查找 “美国总统”这个实体关联的信息,对于一个图来说,就是查找一个点关联的其他点。
知识图谱的要点
如果已经存在一个图,里面包含了我们所需要的一切信息, 那么这就是一个很完善的基础图谱了,要做的就是利用图的特性在上面做一些二次开发,本质上就是一些图数据库CRUD的扩展。
但是实际上,业界普遍存在的问题是, 大部分企业都有一堆原始数据,但是很难把这些数据保存成图的格式。 例如, 工商数据是公开的,理论上所有人都可以爬取这些公开数据,将其图谱化之后,就是一个简陋版的天眼查了。但实际上模仿天眼查的网站很多,做得那么好的却很少,这也变相说明了文字数据图谱化的难点。
知识图谱工程解决的就是这个问题--如何快速、方便的把批量文字信息图谱化。
一切工程都是模拟人工操作起步。 假设我们拥有一个图数据库,以及无穷的人力, 理论上,我们可以让人不断阅读高到数百G的文章(不是视频,是文字), 然后将每篇文章的内容,按照我们规定好的知识去归纳出来, 然后依次输入到图数据库里,把定义好的各类实体,按照定义好的关系连接起来。这也就形成了知识图谱。
但是上述过程基本不可能实现,因为人力归纳起来,总是太慢,且成本巨高。 这个时候就需要将人力归纳的过程工程化。简单来说,就是我们定义好知识,然后人工归纳若干篇,随后将这些归纳好(或者是标注过)的数据,拿去做NLP训练,之后就可以交由机器来归纳,人工仅需审核,这会节省大量时间。 同时把知识归纳过程,流水线化,会显著提升效率。
由此,可以得出,做一个知识图谱工程,最重要的是:
-
图数据库,市场上有很多选择,例如arangoDb, neo4j, neptune等,这些数据库各有优劣,但是任意一个,都能满足我们大部分的需求。当然,如果最开始需求就很明确,那必须拿着需求去一个个考察这些数据库是否合适, 因为一旦选定了主数据库,之后切换都会非常痛苦, 特别是图数据库这种并非传统SQL语言支持的,可能每个数据库都有自己的一套SQL规范。
-
一个可以从语料(原始文章)中提取实体(entity), 关系(relation)的nlp模型, 并且这个模型可以不断随着越来越多的标注数据进行迭代进化。
-
一个将人工标注--模型训练--模型预测--人工审核/标注--模型训练--模型预测 这个过程串联起来的工程。
-
一个实现图数据CRUD的工程,也就是能向外输出图的能力。