跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

基于 Python 构建与分析知识图谱及嵌入模型实战

介绍如何使用 Python 构建知识图谱,利用 NetworkX 进行结构分析与中心性计算,并通过 Node2Vec 算法生成节点嵌入向量。进一步结合 K-Means 与 DBSCAN 聚类算法挖掘数据模式,最后通过可视化展示实体关系与聚类结果,为知识图谱应用提供完整的技术实现路径。

MongoKing发布于 2025/2/7更新于 2026/10/2299 浏览
基于 Python 构建与分析知识图谱及嵌入模型实战

基于 Python 构建与分析知识图谱及嵌入模型实战

知识图谱(Knowledge Graph, KG)是一种以图结构表示实体及其关系的数据模型,广泛应用于搜索引擎、推荐系统、医疗诊断等领域。本文将以 Python 为核心工具,演示如何从零构建一个简单的知识图谱,利用 NetworkX 进行结构分析,并通过 Node2Vec 算法生成节点嵌入向量,最后结合聚类算法挖掘数据潜在模式。

环境准备

在开始之前,请确保已安装以下 Python 库:

pip install pandas networkx matplotlib scikit-learn node2vec numpy

构建知识图谱

1. 数据加载与预处理

我们将使用 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', , , , , 
        , , , , , , 
        , , ]


df = pd.DataFrame({: head, : relation, : tail})
()
(df.head())
'pain'
'gene1'
'gene2'
'gene4'
'gene20'
'obesity'
'heart_attack'
'hepatitis'
'bleeding'
'cancer'
'gene1'
'gene20'
'gene50'
# 创建 DataFrame
'head'
'relation'
'tail'
print
"数据预览:"
print

2. 图结构构建

使用 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()}")

3. 可视化图谱

通过 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()

图谱结构分析

对构建好的图谱进行分析,可以揭示实体的重要性和连通性。

1. 基础统计

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}')

2. 节点中心性分析

中心性度量用于评估节点在网络中的重要性。

度中心性 (Degree Centrality)

衡量节点直接连接的邻居数量,反映节点的活跃程度。

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)

衡量节点位于其他节点最短路径上的频率,反映节点的控制能力或桥梁作用。

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)

衡量节点到达图中所有其他节点的平均距离倒数,反映信息传播效率。

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}')

3. 最短路径分析

查找两个特定节点之间的最短路径,有助于理解实体间的关联深度。

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} 的路径")

图嵌入 (Graph Embedding)

图嵌入将离散的图结构映射为连续的低维向量空间,便于机器学习模型处理。我们采用 Node2Vec 算法,它结合了深度优先搜索和广度优先搜索策略,能够捕捉局部和全局的图结构信息。

1. 训练 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}")

2. 降维与可视化

使用 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()

聚类分析

聚类算法用于发现具有相似特征的节点群体,无需预先标记类别。

1. K-Means 聚类

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()

2. DBSCAN 聚类

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 构建和分析知识图谱的全流程:

  1. 数据构建:利用 Pandas 和 NetworkX 建立图结构。
  2. 结构分析:通过中心性指标和最短路径算法挖掘拓扑特征。
  3. 嵌入学习:应用 Node2Vec 将图结构转化为向量表示。
  4. 聚类挖掘:结合 K-Means 和 DBSCAN 发现潜在社区结构。

这些技术是知识图谱应用的基础,可进一步扩展至链接预测、异常检测等高级任务。通过合理的参数调整和算法组合,可以有效提升对复杂数据的理解能力。

目录

  1. 基于 Python 构建与分析知识图谱及嵌入模型实战
  2. 环境准备
  3. 构建知识图谱
  4. 1. 数据加载与预处理
  5. 定义头实体、关系和尾实体
  6. 创建 DataFrame
  7. 2. 图结构构建
  8. 创建无向图
  9. 3. 可视化图谱
  10. 设置布局
  11. 图谱结构分析
  12. 1. 基础统计
  13. 2. 节点中心性分析
  14. 度中心性 (Degree Centrality)
  15. 介数中心性 (Betweenness Centrality)
  16. 接近中心性 (Closeness Centrality)
  17. 3. 最短路径分析
  18. 图嵌入 (Graph Embedding)
  19. 1. 训练 Node2Vec 模型
  20. 初始化 Node2Vec 模型
  21. dimensions: 嵌入维度
  22. walk_length: 随机游走长度
  23. num_walks: 每个节点生成的游走次数
  24. 训练模型
  25. 获取所有节点的嵌入向量
  26. 2. 降维与可视化
  27. 降维
  28. 可视化
  29. 添加节点标签
  30. 聚类分析
  31. 1. K-Means 聚类
  32. 在嵌入空间可视化
  33. 在原始图上着色
  34. 2. DBSCAN 聚类
  35. eps: 邻域半径,min_samples: 核心点最小样本数
  36. 可视化
  37. 总结

更多推荐文章

查看全部
  • 基于 GOT-OCR2.0 与 Qwen2.5-Math 构建 AI 数学辅导系统
  • OKX API 实战指南:基于 python-okx 的量化交易开发
  • Vue 下拉刷新组件开发实战与 Slot 用法详解
  • 基于 Spring Boot 的生鲜农产品智慧物流调度系统设计
  • Flutter 三方库 xpath_selector 在鸿蒙系统的适配与使用指南
  • Llama 开源家族演进:从 Llama-1 到 Llama-3 技术梳理
  • 华为 Eve 多模态模型:弹性视觉专家架构与性能分析
  • Java 开发者利用 Spring AI Alibaba 构建 AI Agent
  • Java 基础(一):发展历程、技术体系与 JDK 环境搭建
  • Minecraft Forge 模组开发框架搭建指南
  • AI 小说生成器本地部署教程
  • C++ 数据结构:单调栈与单调队列总结
  • Triton 编译栈与 RISC-V 生态融合实践
  • React Native HarmonyOS react-native-webview 集成指南
  • 命令行大模型交互工具:MCPHost 实战指南
  • 前端 SSG:静态站点生成实战与架构选择
  • Go、Rust、Kotlin、Python 与 Java 五大主流语言性能与生态对比
  • MySQL ON DUPLICATE KEY UPDATE 实现存在更新不存在插入
  • 算法进阶:前缀和原理与实战应用
  • DevEco Studio 同步云函数与云数据库至本地工程

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online