基于 Python 构建与分析知识图谱及嵌入模型实战
知识图谱(Knowledge Graph, KG)是一种以图结构表示实体及其关系的数据模型,广泛应用于搜索引擎、推荐系统、医疗诊断等领域。本文将以 Python 为核心工具,演示如何从零构建一个简单的知识图谱,利用 NetworkX 进行结构分析,并通过 Node2Vec 算法生成节点嵌入向量,最后结合聚类算法挖掘数据潜在模式。
本文介绍如何使用 Python 构建知识图谱,利用 NetworkX 进行结构分析与中心性计算,并通过 Node2Vec 算法生成节点嵌入向量。进一步结合 K-Means 与 DBSCAN 聚类算法挖掘数据模式,最后通过可视化展示实体关系与聚类结果,为知识图谱应用提供完整的技术实现路径。

知识图谱(Knowledge Graph, KG)是一种以图结构表示实体及其关系的数据模型,广泛应用于搜索引擎、推荐系统、医疗诊断等领域。本文将以 Python 为核心工具,演示如何从零构建一个简单的知识图谱,利用 NetworkX 进行结构分析,并通过 Node2Vec 算法生成节点嵌入向量,最后结合聚类算法挖掘数据潜在模式。
在开始之前,请确保已安装以下 Python 库:
pip install pandas networkx matplotlib scikit-learn node2vec numpy
我们将使用 Pandas 创建一个包含三元组(头实体、关系、尾实体)的数据集。在实际场景中,这些数据可能来源于数据库或 CSV 文件。
import pandas as pd
# 定义头实体、关系和尾实体
head = ['drugA', 'drugB', 'drugC', 'drugD', 'drugA', 'drugC', 'drugD', 'drugE',
'gene1', 'gene2', 'gene3', 'gene4', 'gene50', 'gene2', 'gene3', 'gene4']
relation = ['treats', 'treats', 'treats', 'treats', 'inhibits', 'inhibits',
'inhibits', 'inhibits', 'associated', 'associated', 'associated',
'associated', 'associated', 'interacts', 'interacts', 'interacts']
tail = ['fever', 'hepatitis', 'bleeding', 'pain', 'gene1', 'gene2', 'gene4',
'gene20', 'obesity', 'heart_attack', 'hepatitis', 'bleeding', 'cancer',
'gene1', 'gene20', 'gene50']
# 创建 DataFrame
df = pd.DataFrame({'head': head, 'relation': relation, 'tail': tail})
print("数据预览:")
print(df.head())
使用 NetworkX 库将 DataFrame 转换为图对象。DataFrame 中的每一行对应图中的一个边,属性中包含关系标签。
import networkx as nx
import matplotlib.pyplot as plt
# 创建无向图
G = nx.Graph()
for _, row in df.iterrows():
# 添加边,并将关系作为边的属性
G.add_edge(row['head'], row['tail'], label=row['relation'])
print(f"节点数量:{G.number_of_nodes()}")
print(f"边数量:{G.number_of_edges()}")
通过 Matplotlib 绘制节点和边,直观展示实体间的连接关系。
# 设置布局
pos = nx.spring_layout(G, seed=42, k=0.9)
labels = nx.get_edge_attributes(G, 'label')
plt.figure(figsize=(12, 10))
nx.draw(G, pos, with_labels=True, font_size=10, node_size=700,
node_color='lightblue', edge_color='gray', alpha=0.6)
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels, font_size=8,
label_pos=0.3, verticalalignment='baseline')
plt.title('知识图谱结构可视化')
plt.show()
对构建好的图谱进行分析,可以揭示实体的重要性和连通性。
num_nodes = G.number_of_nodes()
num_edges = G.number_of_edges()
ratio = round(num_edges / num_nodes, 2) if num_nodes > 0 else 0
print(f'节点数:{num_nodes}')
print(f'边数:{num_edges}')
print(f'平均度(边/节点比):{ratio}')
中心性度量用于评估节点在网络中的重要性。
衡量节点直接连接的邻居数量,反映节点的活跃程度。
degree_centrality = nx.degree_centrality(G)
print("度中心性 Top 3:")
for node, centrality in sorted(degree_centrality.items(), key=lambda x: x[1], reverse=True)[:3]:
print(f'{node}: {centrality:.2f}')
衡量节点位于其他节点最短路径上的频率,反映节点的控制能力或桥梁作用。
betweenness_centrality = nx.betweenness_centrality(G)
print("介数中心性 Top 3:")
for node, centrality in sorted(betweenness_centrality.items(), key=lambda x: x[1], reverse=True)[:3]:
print(f'{node}: {centrality:.2f}')
衡量节点到达图中所有其他节点的平均距离倒数,反映信息传播效率。
closeness_centrality = nx.closeness_centrality(G)
print("接近中心性 Top 3:")
for node, centrality in sorted(closeness_centrality.items(), key=lambda x: x[1], reverse=True)[:3]:
print(f'{node}: {centrality:.2f}')
查找两个特定节点之间的最短路径,有助于理解实体间的关联深度。
source_node = 'gene2'
target_node = 'cancer'
try:
shortest_path = nx.shortest_path(G, source=source_node, target=target_node)
print(f'从 {source_node} 到 {target_node} 的最短路径:{shortest_path}')
# 可视化路径
path_edges = [(shortest_path[i], shortest_path[i + 1]) for i in range(len(shortest_path) - 1)]
plt.figure(figsize=(10, 8))
nx.draw(G, pos, with_labels=True, font_size=10, node_size=700,
node_color='lightblue', edge_color='gray', alpha=0.6)
nx.draw_networkx_edges(G, pos, edgelist=path_edges, edge_color='red', width=2)
plt.title(f'Shortest Path from {source_node} to {target_node}')
plt.show()
except nx.NetworkXNoPath:
print(f"无法找到从 {source_node} 到 {target_node} 的路径")
图嵌入将离散的图结构映射为连续的低维向量空间,便于机器学习模型处理。我们采用 Node2Vec 算法,它结合了深度优先搜索和广度优先搜索策略,能够捕捉局部和全局的图结构信息。
from node2vec import Node2Vec
# 初始化 Node2Vec 模型
# dimensions: 嵌入维度
# walk_length: 随机游走长度
# num_walks: 每个节点生成的游走次数
node2vec = Node2Vec(G, dimensions=64, walk_length=30, num_walks=200, workers=4)
# 训练模型
model = node2vec.fit(window=10, min_count=1, batch_words=4)
# 获取所有节点的嵌入向量
embeddings = np.array([model.wv[node] for node in G.nodes()])
print(f"嵌入矩阵形状:{embeddings.shape}")
使用 t-SNE 将高维嵌入降维至 2D 空间进行可视化,观察节点在向量空间中的分布情况。
from sklearn.manifold import TSNE
# 降维
tsne = TSNE(n_components=2, perplexity=10, n_iter=400, random_state=42)
embeddings_2d = tsne.fit_transform(embeddings)
# 可视化
plt.figure(figsize=(12, 10))
plt.scatter(embeddings_2d[:, 0], embeddings_2d[:, 1], c='blue', alpha=0.7)
# 添加节点标签
for i, node in enumerate(G.nodes()):
plt.text(embeddings_2d[i, 0], embeddings_2d[i, 1], node, fontsize=8)
plt.title('Node2Vec 嵌入可视化 (t-SNE)')
plt.axis('off')
plt.show()
聚类算法用于发现具有相似特征的节点群体,无需预先标记类别。
K-Means 需要指定聚类数量 $K$,适用于簇形状较为规则的场景。
from sklearn.cluster import KMeans
num_clusters = 3
kmeans = KMeans(n_clusters=num_clusters, random_state=42)
cluster_labels = kmeans.fit_predict(embeddings)
# 在嵌入空间可视化
plt.figure(figsize=(12, 10))
plt.scatter(embeddings_2d[:, 0], embeddings_2d[:, 1], c=cluster_labels, cmap=plt.cm.Set1, alpha=0.7)
for i, node in enumerate(G.nodes()):
plt.text(embeddings_2d[i, 0], embeddings_2d[i, 1], node, fontsize=8)
plt.title(f'K-Means Clustering (K={num_clusters})')
plt.colorbar(label="Cluster Label")
plt.show()
# 在原始图上着色
plt.figure(figsize=(12, 10))
nx.draw(G, pos, with_labels=True, font_size=10, node_size=700,
node_color=cluster_labels, cmap=plt.cm.Set1, edge_color='gray', alpha=0.6)
plt.title('Graph Clustering using K-Means')
plt.show()
DBSCAN 基于密度,无需预设聚类数量,并能识别噪声点,适合不规则形状的簇。
from sklearn.cluster import DBSCAN
# eps: 邻域半径,min_samples: 核心点最小样本数
dbscan = DBSCAN(eps=1.0, min_samples=2)
dbscan_labels = dbscan.fit_predict(embeddings)
# 可视化
plt.figure(figsize=(12, 10))
nx.draw(G, pos, with_labels=True, font_size=10, node_size=700,
node_color=dbscan_labels, cmap=plt.cm.Set1, edge_color='gray', alpha=0.6)
plt.title('Graph Clustering using DBSCAN')
plt.show()
本文详细展示了使用 Python 构建和分析知识图谱的全流程:
这些技术是知识图谱应用的基础,可进一步扩展至链接预测、异常检测等高级任务。通过合理的参数调整和算法组合,可以有效提升对复杂数据的理解能力。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online