python对GDELT生成简单知识图谱概念图

用python对GDELT events数据中的actor1Name、actor2Name、eventCode字段生成简单的知识图谱图概念图并可视化。

import numpy as np
import pandas as pd
import networkx as nx #图网络包
import matplotlib.pyplot as plt #绘图的包
from mpl_toolkits.mplot3d import Axes3D #3D绘图的包

#代码运行前需自行前往GDELT官网下载数据
data = pd.read_csv(r'E:/WorkSpace/data/GDELT2.0/20231007081500.export.csv', 
	delimiter='\t', encoding='utf-8', low_memory=False, 
	header=None, dtype=str) #保留表头, 读取类型为str
source = []
target = []
relation = []
for line in data.values:
    actor1_name = line[6]
    event_code = line[26]
    actor2_name = line[16]
    if(pd.isna(actor1_name) | pd.isna(event_code) | pd.isna(actor2_name)):
        continue #过滤掉有nan值的数据
    source.append(actor1_name)
    target.append(actor2_name)
    relation.append(event_code)

kg_df = pd.DataFrame({'source':source, 'target':target, 'relation':relation})
f = 'ISRAELI' #选择过滤条件数据: 实体是以色列
# 过滤只含有以色列实体的DataFrame
tmp = kg_df[(kg_df['source']==f) | (kg_df["target"]==f)] 
fig = plt.figure(figsize=(12, 7))
Gd = nx.from_pandas_edgelist(tmp, 'source', 'target', edge_attr=True, 
                             create_using=nx.DiGraph()) #生成无重复边的图G
# G = nx.from_pandas_edgelist(kg_df, 'source', 'target', edge_attr=True, 
#                             create_using=nx.MultiDiGraph()) #生成图G
pos = nx.spring_layout(Gd, k=1)
# 以色列节点为红色, 其余节点为蓝色
node_color = ["red" if node==f else "skyblue" for node in Gd.nodes] 
# 有一个实体是以色列的边为红色
edge_color = ["red" if edge[0]==f or edge[1]==f else "black" for edge in Gd.edges] 

# 绘制2D图
nx.draw(Gd, with_labels=True, node_color=node_color, edge_color=edge_color, 
        edge_cmap=plt.cm.Blues, pos=pos)
# 绘制2D图边的标签, 图用DiGraph才能绘制
nx.draw_networkx_edge_labels(Gd, pos=pos, label_pos=0.5, 
                             edge_labels=nx.get_edge_attributes(Gd,'relation'), 
                             font_size=12, font_color='black', alpha=0.6)
plt.show() #绘制图像. 若后面要绘制3D图像, 需注释从nx.draw到此行代码

生成2D图结果。图中实体以色列、连接以色列的边都是红色。

在这里插入图片描述

下面代码绘制3D图

#绘制3D图
# 生成只含190和194关系的图G
G = nx.from_pandas_edgelist(kg_df[(kg_df['relation']=='190') | (kg_df['relation']=='194')], 
                            'source', 'target', edge_attr=True, create_using=nx.MultiDiGraph())
ax = fig.add_subplot(111, projection='3d')
pos = nx.spring_layout(G, k=2, dim=3)
nodes = np.array([pos[v] for v in sorted(G) if v!=f])
center_node = np.array([pos[v] for v in sorted(G) if v==f]) #以色列节点
edges = np.array([(pos[u], pos[v]) for u,v in G.edges() if v!=f])
# 得到有一个实体是以色列的边
center_edges = np.array([(pos[u], pos[v]) for u,v in G.edges() if u==f or v==f])
ax.scatter(*nodes.T, s=200, ec='w', c='skyblue', alpha=0.5)
ax.scatter(*center_node.T, s=200, c='red', alpha=0.5)
for link in edges:
    ax.plot(*link.T, color='grey', lw=0.5)
for link in center_edges:
    ax.plot(*link.T, color='red', lw=0.5)
for v in sorted(G):
    ax.text(*pos[v].T, s=v) #节点的标签
for key, value in nx.get_edge_attributes(G, 'relation').items():
    ax.text(*((pos[key[0]]+pos[key[1]])/2).T, s=value) #3D图边的标签, MultiDiGraph也能绘制
ax.set(xlabel='x', ylabel='y', zlabel='z', xticklabels=[], yticklabels=[], zticklabels=[])
ax.grid(False)
for dim in (ax.xaxis, ax.yaxis, ax.zaxis):
    dim.set_ticks([])
plt.show()

生成3D图结果,可以看到某些边存在190和194两个标签,因为两个实体之间存在多个关系。图中实体以色列、连接以色列的边都是红色。

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值