手把手教你搭建一个中式菜谱知识图谱可视化系统

手把手教你搭建一个中式菜谱知识图谱可视化系统

  • 中式菜谱知识图谱
    • 1、系统功能
    • 2、先来看看效果
      • 实体间关联关系及实体信息显示
      • 不同类型实体开关显示
      • 搜索功能展示
    • 3、系统实现流程
      • 3.1 数据爬取
      • 3.2 D3可视化

中式菜谱知识图谱

今天分享一个自己从数据爬取到d3可视化的中式菜谱知识图谱可视化系统的搭建流程。
Github项目地址:https://github.com/ngl567/CookBook-KG
访问可视化系统GithubPage地址:https://ngl567.github.io/CookBook-KG/

1、系统功能

本项目开发的系统名称为AI Food Time,中文名为爱食光。通过收集网上完全公开的有关中式菜谱的数据,经过数据清洗和分析,转换为知识图谱的存储结构,并提供可视化展示和模糊搜索等功能,为热爱美食与烹饪的人们提供方便快捷的中式菜谱服务,并以知识图谱的形式直观显示出不同菜品的关系及所用原料,在生活中具有很大的实际应用需求,包括:

  • 一类菜品的不同具体做法,例如水煮鱼包括麻辣水煮鱼、小清新版水煮鱼和家常版水煮鱼等;
  • 通过菜品与食材的关联关系,可以查询家中现有食材可以烹饪哪些菜品;
  • 可以直接显示出每种菜品所需主料,辅料,配料及其具体数量和烹饪方法,与网上的一些菜谱网页相比更加简单直观;
  • 可视化能够对各种菜品及关联关系有一个全局的认识,并能够显示每种菜品对应的图片;
  • 搜索菜谱关键词,显示出和关键词相关的各类菜品信息。

2、先来看看效果

实体间关联关系及实体信息显示

实体间关联关系及实体信息显示

不同类型实体开关显示

不同类型实体开关显示

搜索功能展示

搜索功能展示
怎么样,是不是觉得还有那么点意思。在可视化系统中,同一类实体用相同颜色的节点表示,鼠标位于某个节点上方时显示其相关联的其它实体和之间的关系名称;具有同一类实体显示开关节点显示模式转换,并支持搜索功能;同时,我们对每种菜品的信息栏中显示菜品对应的成品图片,并进行了实体对齐,消除了食品原料中比如“蒜”和“大蒜”这类的冗余信息。

这里展示的是mini版系统,包含10大类,50种菜品之间的关联关系,包括菜品制作的各种食材制作步骤,建议用电脑浏览器打开,如需体验可直接进入Github Page(如果打开没有可视化显示,请尝试多刷新几次)访问入口

3、系统实现流程

3.1 数据爬取

所有菜谱的数据都是从完全公开的网页上爬取的,这些网页上的数据是以半结构化知识呈现的,如图所示:
网页上的数据

使用XPath可以很轻松地从网页上将这些半结构化知识爬取出来,先以树形结构存储菜谱及属性数据:

                       菜品大类|_具体的精品特色菜|_主料|_辅料|_配料|_制作步骤

接着,对于树形结构存储的数据,以三元组的格式:菜品大类-属于-具体的精品特色菜,精品特色菜-主料-主料名,精品特色菜-配料-配料名,精品特色菜-辅料-辅料名,精品特色菜-制作步骤-制作步骤列表表示所有数据。用于可视化的数据分为三元组组成的关系图结构数据vizdata.json和实体属性组成的数据entities_items.json。

三元组组成的关系图结构数据vizdata.json存储的是字典数据,“links”键对应的是所有头实体-关系-尾实体组成的三元组,“nodes”设定了节点的类型、名称和大小等属性。

    "links": [                                                                           {"relation": "选材","source": "山楂红烧肉","target": "五花肉","value": 3},{"relation": "选材","source": "山楂红烧肉","target": "山楂","value": 3},...]"nodes": [{"class": "菜品大类","group": "0","id": "红烧肉","size": "16"},{"class": "精品特色菜","group": "1","id": "家庭版水煮活鱼","size": "10"},...]

实体属性组成的entities_items.json文件存储所有实体属性的字典数据,是以”菜品“为一级索引,对应的主料、辅料、配料和制作步骤分别为二级索引,以及属性值组成的列表,如下所示:

"桂香红烧肉": {    "主料": [    
"五花肉: 两条"    
],    
"辅料": [    
"葱: 一根",    
"姜: 两片",    
"桂皮: 一块",    
"香叶: 两片"    
],    
"配料": [    
"老抽: 一汤匙",    
"生抽: 两汤匙",    
"冰糖: 适量",    
"料酒: 两汤匙"    
],    
"特色": [    
"口味: 咸甜",    
"工艺: 烧",    
"耗时: 一小时",    
"难度: 简单"    
],    
"制作步骤": [    
"1: 五花肉放入沸水中,煮至断生,洗净",    
"2: 准备材料",    
"3: 五花肉切块",    
"4: 取砂锅,热锅冷油,加入葱姜,桂皮,香叶爆香。放入五花肉,加高汤。",    
"5: 加入冰糖,料酒,生抽和老抽,加盖小火煮一个小时,开盖收汁。"    
]    
},... 

3.2 D3可视化

D3是基于数据的文档操作javascript库,D3能够把数据和HTML、SVG、CSS结合起来,创造出可交互的数据图表。我分别用D3知识图谱力导向图和Neo4j分别构建了知识图谱可视化系统,D3在可视化方面具有更好的展示和灵活性,因此选用D3进行知识图谱的可视化。

对于上面得到的关系图数据vizdata.json和实体属性数据entities_itmes.json两个文件可以存储在自己的github项目中,因为D3可视化只支持从web服务读取json数据。由于字数限制,本文给出D3可视化的几个主要模块。

首先,需要设定可视化的样式,具体可以看github中的代码。然后,需要从json文件中读取关系图数据:

var graph;    
d3.json("https://raw.githubusercontent.com/ngl567/CookBook-KG/master/visualization
/vizdata_mimini_aglin.json", function(error, data) 

用vizdata.json中的links数据去驱动两个节点之间的边的线宽:

//边上的文字(实体之间的关系) 
var linktext = svg.append('g')    
.attr("class", "linetexts")    
.selectAll("text")    
.data(graph.links)    
.enter()    
.append("text")    
.style("display","block")    
.style("color","red")    
.text(function(d){    
return d.relation;    
});    

用vizdata.json中的links数据去驱动两个节点之间的边的线宽:

//边上的文字(实体之间的关系)                                                             
var linktext = svg.append('g')    
.attr("class", "linetexts")    
.selectAll("text")    
.data(graph.links)    
.enter()    
.append("text")    
.style("display","block")    
.style("color","red")    
.text(function(d){    
return d.relation;    
});  

添加所有的节点,并对每个节点按照不同的类型设置节点颜色:

// 添加所有的node                                                                           
var node = svg.append('g')    
.attr('class', 'nodes')    
.selectAll('circle')    
.data(graph.nodes)    
.enter().append('circle')    
.attr("r", function(d) {    
return d.size    
})    
.attr('fill', function(d){ // 填充的颜色    
return colors[d.group];    
})    
.attr('stroke', 'none')    // 没有描边    
.attr('name', function(d){    
return d.id;    
})    
.call(d3.drag()             // 绑定d3的拖动函数    
.on("start", dragstarted) // 拖动开始    
.on("drag", dragged)      // 拖动进行    
.on("end", dragended));   // 拖动结束

通过点击圆点和文字两种方式表示节点切换不同的模式:

// 处理模式点击后的事件(这些元素页面上本来有)                                          
$('#mode span').click(function(event) {    
// 把mode里面所有span的active全部去掉    
// 把被点击的这个设置为active    
$('#mode span').removeClass('active')    
$(this).addClass('active')    
if ($(this).text() == 'Circles') {    
// 隐藏所有文本里面的svg元素    
// 把node里面的显示出来    
$('.texts text').hide();    
$('.nodes circle').show();    
}    
else {    
$('.texts text').show();    
$('.nodes circle').hide ();    
}    
});

不同类型的实体有一个开关,决定一类实体节点是否显示:

// 处理开关1点击后的事件(这些元素页面上本来有)                                       
$('#switch1 span').click(function(event) {    
// 把mode里面所有span的active全部去掉    
// 把被点击的这个设置为active    
$('#switch1 span').removeClass('active')    
$(this).addClass('active')    
if ($(this).text() == 'On') {    
sw1 = true;    
d3.select('#svg1 .nodes').selectAll('circle').attr('class', function(d){    
// 当前选中类型实体显示    
if (d.group == 0 && sw1 == true) {    
return '';    
}    
else if (d.group == 1 && sw2 == true){    
return '';    
}    
else if (d.group == 2 && sw3 == true){    
return '';    
}    
else{    
return 'inactive'    
}    
});  

当鼠标悬浮在某个实体节点上方时,实体的属性信息都能够显示出来,如果是精品特色菜类的实体,菜品图片等信息都能显示:

// 增加各个菜品的图片    
if (typeof(info[name]) != "undefined") {    
//avatar_ID = info[name]['ID'][0]    
//if(outlier_avatar_ID.indexOf(avatar_ID) != -1) {    
//    avatar_ID = avatar_ID + '0'    
//}    
if ('主料' in info[name]){    
$('#info').append('<p>' + '<img src="https://raw.githubusercontent.com/ngl567/CookBook-KG
/master/visualization/recipe_photo/' + name + '.jpg" />' + '</p>');    
}    
}    
for (var key in info[name]) {    
value = info[name][key];    
var flag_none = false;    
for (var item in value) {    
if (value[item] == null || value[item] == 'N/A' || value[item] == '') {    
flag_none = true;    
break;    
}    
}     
if (flag_none == true) {              // 排除为空的属性值    
continue;    
}    $('#info').append('<p><span>' + key + '</span></p>');    
var item_info = '';    
count = 0    
for (var food_item in info[name][key]){    
if (count == 0){    
item_info = item_info + info[name][key][food_item];    
}    
else{    
item_info = item_info + "&nbsp;||&nbsp;" + info[name][key][food_item];    
}    
count = count + 1;    
}    
$('#info').append('<p>' + item_info + '</p>');   
} 

设置搜索功能,按照搜索框中的关键词显示所有匹配到关键词的所有节点:

// 搜索框    
$('#search input').keyup(function(event) {    
// 如果输入为空,全部显示出来    
if ($(this).val() == '') {    
d3.select('#svg1 .texts').selectAll('text').attr('class', '');;    
d3.select('#svg1 .nodes').selectAll('circle').attr('class', '');;    
d3.select('#svg1 .links').selectAll('line').attr('class', '');;    
d3.select("#svg1 .linetexts").selectAll('text').attr('fill-opacity', 0);    
}    
else { // 筛选,判断这三个东西里的元素是否包含输入的东西    
var name = $(this).val();    
d3.select('#svg1 .nodes').selectAll('circle').attr('class', function(d) {    
if (d.id.toLowerCase().indexOf(name.toLowerCase()) >= 0) {    
return '';    
} else {    
return 'inactive';    
}    
});    
d3.select('#svg1 .texts').selectAll('text').attr('class', function(d) {    
if (d.id.toLowerCase().indexOf(name.toLowerCase()) >= 0) {    
return '';    
} else {    
return 'inactive';    
}    
});    
d3.select("#svg1 .links").selectAll('line').attr('class', function(d) {    
return 'inactive';    
});    
d3.select("#svg1 .linetexts").selectAll('text').attr('fill-opacity', 0);    
}    
});        

具体一些比如页面设计的代码具体可以看github中的代码,如果有任何问题也可以与我交流讨论,希望这个工作可能帮助大家一起来做点有意思的小项目。

同时,如果对我们的文章感兴趣,欢迎关注知乎专栏“人工智能遇上知识图谱“,也欢迎关注”人工智能遇上知识图谱“微信公众号,我们会力求为您呈上知识图谱领域的精彩内容,让我们一起学习并交流讨论人工智能与知识图谱技术。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI数字人未来十大展望

来源 &#xff1a;商汤智能产业研究院编辑 &#xff1a;刘振航从电影中逼真的CG人物&#xff0c;到能够与我们面对面进行互动的智能服务助手&#xff0c;数字人会经历几级进化&#xff1f;数字人正在从有颜无智的“CG数字模特”&#xff0c;进化为可提高生产力、驱动创新服务的…

知识图谱最新权威综述论文解读:开篇部分

论文地址&#xff1a;http://arxiv.org/abs/2002.00388 这篇综述是数据科学权威 Philip S. Yu 团队对知识图谱领域的最新综述论文&#xff0c;论文从知识图谱的发展历史、知识表示学习、知识获取、知识应用、未来研究方向等方面描述了知识图谱的全局。 首先&#xff0c;咱们先…

耗资52亿美元,历时15年,人类有史以来建造的最复杂机器

来源&#xff1a;世界先进制造技术论坛欧洲大型强子对撞机是现在世界上最大、能量最高的粒子加速器&#xff0c;是一种将质子加速对撞的高能物理设备&#xff0c;英文名称为LHC。LHC是人类迄今建造的最大最复杂的科学设备&#xff0c;它的建设历时15年&#xff0c;耗资52亿美元…

贝叶斯深度学习:一个统一深度学习和概率图模型的框架

来源&#xff1a;AI科技评论 作者&#xff1a;王灏整理&#xff1a;维克多人工智能&#xff08;AI&#xff09;的进展显示&#xff0c;通过构建多层的深度网络&#xff0c;利用大量数据进行学习&#xff0c;可以获得性能的显著提升。但这些进展基本上是发生在感知任务中&#…

知识图谱最新权威综述论文解读:知识表示学习部分

知识图谱最新权威综述论文解读&#xff1a;知识表示学习部分知识图谱表示学习1 表示空间1.1 Point-wise空间1.2 复数向量空间​1.3 高斯分布1.4 流形和群2 打分函数2.1 基于距离的打分函数​2.2 语义匹配模型&#xff1a;​3 编码模型3.1 线性/双线性模型3.2 张量分解模型3.3 神…

对知识图谱的告白:斯坦福大学CS520课程介绍

斯坦福大学CS520知识图谱系列课程&#xff0c;从这个课程的编号就足以看出对计算机科学的告白。 相信大家对斯坦福大学的计算机学科公开课一点也不陌生&#xff0c;对很多人来说&#xff0c;面向计算机视觉的CS231n和面向自然语言处理的CS224n几乎成为了入门人工智能领域以及C…

脑计算将何去何从?

来源&#xff1a;内容由半导体行业观察&#xff08;ID&#xff1a;icbank&#xff09;编译&#xff1a;nature.摘要类脑计算新技术有望通过完全不同的方式处理信息&#xff0c;能效极高&#xff0c;并能处理我们加速产生的大量非结构化和嘈杂的数据。为了实现这一承诺&#xff…

知识图谱最新权威综述论文解读:知识图谱补全部分

上期我们介绍了2020年知识图谱最新权威综述论文《A Survey on Knowledge Graphs: Representation, Acquisition and Applications》的知识表示学习部分&#xff0c;本期我们将一起学习这篇论文的知识图谱补全部分。 论文地址&#xff1a; https://arxiv.org/pdf/2002.00388.p…

神经元的集体行为:大尺度脑活动的动力学模型

来源&#xff1a;集智俱乐部&#xff08;https://mp.weixin.qq.com/s/X88lG7rFhIFlpCJ2jVMLtg&#xff09; 作者&#xff1a;彭崧峻 校对&#xff1a;梁金编辑&#xff1a;邓一雪封面&#xff1a;Sergey Fedotov排版&#xff1a;光影导语 / Introduction大脑由神经元组成&…

知识图谱最新权威综述论文解读:实体发现

上期我们介绍了2020年知识图谱最新权威综述论文《A Survey on Knowledge Graphs: Representation, Acquisition and Applications》的知识图谱补全部分&#xff0c;本期我们将一起学习这篇论文的实体发现部分。 论文地址&#xff1a; https://arxiv.org/pdf/2002.00388.pdf​…

Jurassic-X: 让神经模型学会符号推理

来源&#xff1a;前沿科技解读&#xff1a;Antonio编辑&#xff1a;陈彩娴近期&#xff0c;一家以色列NLP研究机构AI21 Labs开发了一个名叫Jurassic-X的算法系统&#xff0c;它基于该实验室提出来的MRKL&#xff08;它与miracle谐音&#xff09;系统。Jurassic-X的前身是对标GP…

知识图谱最新权威综述论文解读:关系抽取

上期我们介绍了2020年知识图谱最新权威综述论文《A Survey on Knowledge Graphs: Representation, Acquisition and Applications》的知识图谱实体发现部分&#xff0c;本期我们将一起学习这篇论文的关系抽取部分。 论文地址&#xff1a; https://arxiv.org/pdf/2002.00388.p…

斯坦福大学CS520知识图谱系列课程学习笔记:第一讲什么是知识图谱

随着知识图谱在人工智能各个领域的广泛使用&#xff0c;知识图谱受到越来越多AI研究人员的关注和学习&#xff0c;已经成为人工智能迈向认知系统的关键技术之一。之前&#xff0c;斯坦福大学的面向计算机视觉的CS231n和面向自然语言处理的CS224n成为了全球非常多AI研究人员的入…

数学三大核心领域概述:代数、几何、分析

来源 &#xff1a;数学与人工智能摘选自《数学史海揽胜》有删改数学发展到现在&#xff0c;已经成为科学世界中拥有100多个主要分支学科的庞大的“共和国”。大体说来数学有三大核心领域&#xff1a;数学中研究数的部分属于代数学的范畴&#xff1b;研究形的部分&#xff0c;属…

斯坦福大学CS520知识图谱系列课程学习笔记:第二讲如何构建知识图谱

上一讲我们学习了知识图谱的一些基本概念&#xff1a; 斯坦福大学CS520知识图谱系列课程学习笔记&#xff1a;第一讲什么是知识图谱 本节课程关于如何构建知识图谱&#xff0c;因为知识图谱的构建是整个知识图谱领域的一个非常核心且基础的工程&#xff0c;如何将现有的数据以…

神经复杂系统前沿:关于认知大脑的两种观念

来源&#xff1a; 集智俱乐部作者&#xff1a;David L. Barack, John W. Krakauer译者&#xff1a;JawDrin审校&#xff1a;陈贺 编辑&#xff1a;邓一雪 导语人类的高级认知能力怎样从包含上百亿神经元的大脑复杂系统中涌现出来&#xff0c;是神经科学的核心问题之一。学界中存…

斯坦福大学CS520知识图谱系列课程学习笔记:第三讲高级的知识图谱是什么样的

这一讲的主题是&#xff1a;一些高级的知识图谱是什么样的。三位讲者分别从他们各自带领的团队构建出来的高质量的知识图谱实例出发&#xff0c;从中我们可以认识到一些大佬们构建的优秀的知识图谱产品有哪些特点和优势&#xff0c;从中对我们自己构建知识图谱也可以得到一定的…

人工智能与量子计算在新型忆阻器中的融合

EQUINOX GRAPHICS/UNIVERSITY OF VIENNA来源&#xff1a;IEEE电气电子工程师近年来&#xff0c;计算在两个主要方面取得了进展&#xff1a;机器学习的突破&#xff0c;开发出了可根据经验自动改进的算法&#xff1b;量子计算机的研究&#xff0c;从理论上证明了量子计算机比任何…

第一个关于中式菜谱的智能问答机器人小程序正式上线啦

为了满足大家对菜品烹饪的各类问题能直接得到答案的需求&#xff0c;我开发了目前第一个真正关于菜谱的智能问答系统&#xff0c;并在微信小程序发布上线。这套系统支持对于8600多种菜品的问答功能&#xff0c;并能实现快速问答响应&#xff0c;整套系统后端依托于搭建的中式菜…

数学在自然科学中不可思议的有效性

来源&#xff1a;数学争鸣作者&#xff1a;尤金维格纳翻译&#xff1a;鲍永成 校对&#xff1a;袁向东数学在自然科学中不合理的有效性1959年5月11日在纽约大学Courant数学科学讲座上的讲演作者简介&#xff1a;尤金维格纳&#xff08;Eugene P. Wigner&#xff09;美国物理学…