1、前言
我们在上篇文章中介绍了知识图谱的简单实现,最后使用neo4j进行了展示,对于有些情况我们可能并不想为了查看知识图的结果再去安装一个软件去实现,那么我们能不能直接将三元组画出来呢/
接下来我们就介绍一个可视化的工具pyvis,来实现知识图谱的可视化
2、简单介绍pyvis
2.1 安装pyvis
安装其实很简单,直接pip就可以
python
pip install pyvis
2.2 创建节点
python
from pyvis.network import Network
net = Network(notebook=True)
net.add_node(1, label="张三")
net.add_node(2, label="李四")
net.nodes
#查看节点
[{'color': '#97c2fc', 'id': 1, 'label': '张三', 'shape': 'dot'},
{'color': '#97c2fc', 'id': 2, 'label': '李四', 'shape': 'dot'}]
展示
python
net.show("basic.html")
2.3 创建边
python
net.add_edge(1,2, label="好朋友", color="blue", width=2)
这里的节点是可以拖动的,跟neo4j非常相似
3、知识图谱构建
实体和三元组还是来自于上一节的内容
3.1 创建节点
python
col = ["orange","blue","red","green","purple"]
def pyvis_node_create(net,ner_list_Nh,ner_list_Ni,ner_list_Ns,predicate):
if len(ner_list_Nh)!=0:
for i in range(len(ner_list_Nh)):
#graph.create(Node('人名', name=ner_list_Nh[i]))
net.add_node(i, label=ner_list_Nh[i],title = "人名", color=col[0])
if len(ner_list_Ni)!=0:
for i in range(len(ner_list_Ni)):
#graph.create(Node('机构名', name=ner_list_Ni[i]))
net.add_node( label=ner_list_Ni[i],title = "机构名", color=col[1])
if len(ner_list_Ns)!=0:
for i in range(len(ner_list_Ns)):
#graph.create(Node('地名', name=ner_list_Ns[i]))
net.add_node(100+i, label=ner_list_Ns[i],title = "地名", color=col[2])
if len(predicate)!=0:
for i in range(len(predicate)):
#graph.create(Node('标签', name=predicate[i]))
net.add_node(1000+i, label=predicate[i],title = "标签", color=col[3])
代码只需要将之前在neo4j创建节点的稍微改下就行
3.2 创建边
我们首先要创建一个节点名称和节点ID对应的字典
pyvis创建边必须是id-->id的,所以我们需要根据实体名称得到其在当前的节点ID,我们在进行创建边
python
def create_node_id_dic(net):
dic_node_id={}
for i in net.node_ids:
#print(i)
dic_node_id[str(net.node_map[i]["label"])] = i
return dic_node_id
得到的字典如下
python
{'苏轼': 0,
'黄庭坚': 1,
'常州': 100,
'宋朝的著名文学家': 1000,
'他的好朋友': 1001,
'写词': 1002,
'写诗': 1003}
创建边
python
def pyvis_relationship_create(net,kg_list,node_id_dic):
for m in range(len(kg_list)):
try:
net.add_edge(node_id_dic[kg_list[m][0]], node_id_dic[kg_list[m][2]], label=kg_list[m][1], color="blue", width=2)
except AttributeError as e:
print(e, m)
结果跟在neo4j中是一样的